07 Oct, 2013

1 commit

  • When comparing MAC hashes, AEAD authentication tags, or other hash
    values in the context of authentication or integrity checking, it
    is important not to leak timing information to a potential attacker,
    i.e. when communication happens over a network.

    Bytewise memory comparisons (such as memcmp) are usually optimized so
    that they return a nonzero value as soon as a mismatch is found. E.g,
    on x86_64/i5 for 512 bytes this can be ~50 cyc for a full mismatch
    and up to ~850 cyc for a full match (cold). This early-return behavior
    can leak timing information as a side channel, allowing an attacker to
    iteratively guess the correct result.

    This patch adds a new method crypto_memneq ("memory not equal to each
    other") to the crypto API that compares memory areas of the same length
    in roughly "constant time" (cache misses could change the timing, but
    since they don't reveal information about the content of the strings
    being compared, they are effectively benign). Iow, best and worst case
    behaviour take the same amount of time to complete (in contrast to
    memcmp).

    Note that crypto_memneq (unlike memcmp) can only be used to test for
    equality or inequality, NOT for lexicographical order. This, however,
    is not an issue for its use-cases within the crypto API.

    We tried to locate all of the places in the crypto API where memcmp was
    being used for authentication or integrity checking, and convert them
    over to crypto_memneq.

    crypto_memneq is declared noinline, placed in its own source file,
    and compiled with optimizations that might increase code size disabled
    ("Os") because a smart compiler (or LTO) might notice that the return
    value is always compared against zero/nonzero, and might then
    reintroduce the same early-return optimization that we are trying to
    avoid.

    Using #pragma or __attribute__ optimization annotations of the code
    for disabling optimization was avoided as it seems to be considered
    broken or unmaintained for long time in GCC [1]. Therefore, we work
    around that by specifying the compile flag for memneq.o directly in
    the Makefile. We found that this seems to be most appropriate.

    As we use ("Os"), this patch also provides a loop-free "fast-path" for
    frequently used 16 byte digests. Similarly to kernel library string
    functions, leave an option for future even further optimized architecture
    specific assembler implementations.

    This was a joint work of James Yonan and Daniel Borkmann. Also thanks
    for feedback from Florian Weimer on this and earlier proposals [2].

    [1] http://gcc.gnu.org/ml/gcc/2012-07/msg00211.html
    [2] https://lkml.org/lkml/2013/2/10/131

    Signed-off-by: James Yonan
    Signed-off-by: Daniel Borkmann
    Cc: Florian Weimer
    Signed-off-by: Herbert Xu

    James Yonan
     

03 May, 2013

1 commit

  • Pull crypto update from Herbert Xu:

    - XTS mode optimisation for twofish/cast6/camellia/aes on x86

    - AVX2/x86_64 implementation for blowfish/twofish/serpent/camellia

    - SSSE3/AVX/AVX2 optimisations for sha256/sha512

    - Added driver for SAHARA2 crypto accelerator

    - Fix for GMAC when used in non-IPsec secnarios

    - Added generic CMAC implementation (including IPsec glue)

    - IP update for crypto/atmel

    - Support for more than one device in hwrng/timeriomem

    - Added Broadcom BCM2835 RNG driver

    - Misc fixes

    * git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: (59 commits)
    crypto: caam - fix job ring cleanup code
    crypto: camellia - add AVX2/AES-NI/x86_64 assembler implementation of camellia cipher
    crypto: serpent - add AVX2/x86_64 assembler implementation of serpent cipher
    crypto: twofish - add AVX2/x86_64 assembler implementation of twofish cipher
    crypto: blowfish - add AVX2/x86_64 implementation of blowfish cipher
    crypto: tcrypt - add async cipher speed tests for blowfish
    crypto: testmgr - extend camellia test-vectors for camellia-aesni/avx2
    crypto: aesni_intel - fix Kconfig problem with CRYPTO_GLUE_HELPER_X86
    crypto: aesni_intel - add more optimized XTS mode for x86-64
    crypto: x86/camellia-aesni-avx - add more optimized XTS code
    crypto: cast6-avx: use new optimized XTS code
    crypto: x86/twofish-avx - use optimized XTS code
    crypto: x86 - add more optimized XTS-mode for serpent-avx
    xfrm: add rfc4494 AES-CMAC-96 support
    crypto: add CMAC support to CryptoAPI
    crypto: testmgr - add empty test vectors for null ciphers
    crypto: testmgr - add AES GMAC test vectors
    crypto: gcm - fix rfc4543 to handle async crypto correctly
    crypto: gcm - make GMAC work when dst and src are different
    hwrng: timeriomem - added devicetree hooks
    ...

    Linus Torvalds
     

25 Apr, 2013

2 commits


02 Apr, 2013

1 commit

  • rfc4543(gcm(*)) code for GMAC assumes that assoc scatterlist always contains
    only one segment and only makes use of this first segment. However ipsec passes
    assoc with three segments when using 'extended sequence number' thus in this
    case rfc4543(gcm(*)) fails to function correctly. Patch fixes this issue.

    Reported-by: Chaoxing Lin
    Tested-by: Chaoxing Lin
    Cc: stable@vger.kernel.org
    Signed-off-by: Jussi Kivilinna
    Signed-off-by: Herbert Xu

    Jussi Kivilinna
     

04 Feb, 2013

1 commit

  • Replace PTR_ERR followed by ERR_PTR by ERR_CAST, to be more concise.

    The semantic patch that makes this change is as follows:
    (http://coccinelle.lip6.fr/)

    //
    @@
    expression err,x;
    @@
    - err = PTR_ERR(x);
    if (IS_ERR(x))
    - return ERR_PTR(err);
    + return ERR_CAST(x);
    //

    Signed-off-by: Julia Lawall
    Signed-off-by: Herbert Xu

    Julia Lawall
     

02 Dec, 2010

1 commit


17 Jan, 2010

1 commit

  • This patch adds the RFC4543 (GMAC) wrapper for GCM similar to the
    existing RFC4106 wrapper. The main differences between GCM and GMAC are
    the contents of the AAD and that the plaintext is empty for the latter.

    Signed-off-by: Tobias Brunner
    Signed-off-by: Herbert Xu

    Tobias Brunner
     

16 Nov, 2009

1 commit

  • The flow of the complete function (xxx_done) in gcm.c is as follow:

    void complete(struct crypto_async_request *areq, int err)
    {
    struct aead_request *req = areq->data;

    if (!err) {
    err = async_next_step();
    if (err == -EINPROGRESS || err == -EBUSY)
    return;
    }

    complete_for_next_step(areq, err);
    }

    But *areq may be destroyed in async_next_step(), this makes
    complete_for_next_step() can not work properly. To fix this, one of
    following methods is used for each complete function.

    - Add a __complete() for each complete(), which accept struct
    aead_request *req instead of areq, so avoid using areq after it is
    destroyed.

    - Expand complete_for_next_step().

    The fixing method is based on the idea of Herbert Xu.

    Signed-off-by: Huang Ying
    Signed-off-by: Herbert Xu

    Huang Ying
     

06 Aug, 2009

1 commit

  • Remove the dedicated GHASH implementation in GCM, and uses the GHASH
    digest algorithm instead. This will make GCM uses hardware accelerated
    GHASH implementation automatically if available.

    ahash instead of shash interface is used, because some hardware
    accelerated GHASH implementation needs asynchronous interface.

    Signed-off-by: Huang Ying
    Signed-off-by: Herbert Xu

    Huang Ying
     

11 Jan, 2008

13 commits

  • This patch introduces the rfc4106 wrapper for GCM just as we have an
    rfc4309 wrapper for CCM. The purpose of the wrapper is to include part
    of the IV in the key so that it can be negotiated by IPsec.

    Signed-off-by: Herbert Xu

    Herbert Xu
     
  • This patch converts the gcm algorithm over to crypto_grab_skcipher
    which is a prerequisite for IV generation.

    Signed-off-by: Herbert Xu

    Herbert Xu
     
  • This patch adds the gcm_base template which takes a block cipher
    parameter instead of cipher. This allows the user to specify a
    specific CTR implementation.

    This also fixes a leak of the cipher algorithm that was previously
    looked up but never freed.

    Signed-off-by: Herbert Xu

    Herbert Xu
     
  • This patch adds the necessary changes for GCM to be used with async
    ciphers. This would allow it to be used with hardware devices that
    support CTR.

    Signed-off-by: Herbert Xu

    Herbert Xu
     
  • As discussed previously, this patch moves the basic CTR functionality
    into a chainable algorithm called ctr. The IPsec-specific variant of
    it is now placed on top with the name rfc3686.

    So ctr(aes) gives a chainable cipher with IV size 16 while the IPsec
    variant will be called rfc3686(ctr(aes)). This patch also adjusts
    gcm accordingly.

    Signed-off-by: Herbert Xu

    Herbert Xu
     
  • This patch fixes the request context alignment so that it is actually
    aligned to the value required by the algorithm.

    Signed-off-by: Herbert Xu

    Herbert Xu
     
  • The abreq structure is currently allocated on the stack. This is broken
    if the underlying algorithm is asynchronous. This patch changes it so
    that it's taken from the private context instead which has been enlarged
    accordingly.

    Signed-off-by: Herbert Xu

    Herbert Xu
     
  • Unfortunately the generic chaining hasn't been ported to all architectures
    yet, and notably not s390. So this patch restores the chainging that we've
    been using previously which does work everywhere.

    Signed-off-by: Herbert Xu

    Herbert Xu
     
  • The scatterwalk infrastructure is used by algorithms so it needs to
    move out of crypto for future users that may live in drivers/crypto
    or asm/*/crypto.

    Signed-off-by: Herbert Xu

    Herbert Xu
     
  • This patch changes gcm/authenc to return EBADMSG instead of EINVAL for
    ICV mismatches. This convention has already been adopted by IPsec.

    Signed-off-by: Herbert Xu

    Herbert Xu
     
  • The crypto_aead convention for ICVs is to include it directly in the
    output. If we decided to change this in future then we would make
    the ICV (if the algorithm has an explicit one) available in the
    request itself.

    For now no algorithm needs this so this patch changes gcm to conform
    to this convention. It also adjusts the tcrypt aead tests to take
    this into account.

    Signed-off-by: Herbert Xu

    Herbert Xu
     
  • As it is authsize is an algorithm paramter which cannot be changed at
    run-time. This is inconvenient because hardware that implements such
    algorithms would have to register each authsize that they support
    separately.

    Since authsize is a property common to all AEAD algorithms, we can add
    a function setauthsize that sets it at run-time, just like setkey.

    This patch does exactly that and also changes authenc so that authsize
    is no longer a parameter of its template.

    Signed-off-by: Herbert Xu

    Herbert Xu
     
  • Add GCM/GMAC support to cryptoapi.

    GCM (Galois/Counter Mode) is an AEAD mode of operations for any block cipher
    with a block size of 16. The typical example is AES-GCM.

    Signed-off-by: Mikko Herranen
    Reviewed-by: Mika Kukkonen
    Signed-off-by: Herbert Xu

    Mikko Herranen