Re: crypto: crypto_memneq - add equality testing of memory regions w/o timing leaks

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Sep 26, 2013 at 02:20:39AM -0600, James Yonan wrote:
> 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 <james@xxxxxxxxxxx>
> Signed-off-by: Daniel Borkmann <dborkman@xxxxxxxxxx>
> Cc: Florian Weimer <fw@xxxxxxxxxxxxx>

Patch applied.  Thanks everyone.
-- 
Email: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Kernel]     [Gnu Classpath]     [Gnu Crypto]     [DM Crypt]     [Netfilter]     [Bugtraq]

  Powered by Linux