crypto: hash - add zero length message hash for shax and md5
authorLABBE Corentin <clabbe.montjoie@gmail.com>
Thu, 17 Dec 2015 12:45:39 +0000 (13:45 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 22 Dec 2015 12:43:35 +0000 (20:43 +0800)
Some crypto drivers cannot process empty data message and return a
precalculated hash for md5/sha1/sha224/sha256.

This patch add thoses precalculated hash in include/crypto.

Signed-off-by: LABBE Corentin <clabbe.montjoie@gmail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/md5.c
crypto/sha1_generic.c
crypto/sha256_generic.c
include/crypto/md5.h
include/crypto/sha.h

index 33d17e9a87025e7847e592371d659a58bae8d854..2355a7c25c458d0052239dbf188d18a58b758ef6 100644 (file)
 #include <linux/cryptohash.h>
 #include <asm/byteorder.h>
 
 #include <linux/cryptohash.h>
 #include <asm/byteorder.h>
 
+const u8 md5_zero_message_hash[MD5_DIGEST_SIZE] = {
+       0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04,
+       0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e,
+};
+EXPORT_SYMBOL_GPL(md5_zero_message_hash);
+
 /* XXX: this stuff can be optimized */
 static inline void le32_to_cpu_array(u32 *buf, unsigned int words)
 {
 /* XXX: this stuff can be optimized */
 static inline void le32_to_cpu_array(u32 *buf, unsigned int words)
 {
index 39e3acc438d95c1ed1c15aaf9916b9489febbade..6877cbb9105fbb24cb0a65f441f0c9f272a22733 100644 (file)
 #include <crypto/sha1_base.h>
 #include <asm/byteorder.h>
 
 #include <crypto/sha1_base.h>
 #include <asm/byteorder.h>
 
+const u8 sha1_zero_message_hash[SHA1_DIGEST_SIZE] = {
+       0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d,
+       0x32, 0x55, 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90,
+       0xaf, 0xd8, 0x07, 0x09
+};
+EXPORT_SYMBOL_GPL(sha1_zero_message_hash);
+
 static void sha1_generic_block_fn(struct sha1_state *sst, u8 const *src,
                                  int blocks)
 {
 static void sha1_generic_block_fn(struct sha1_state *sst, u8 const *src,
                                  int blocks)
 {
index 78431163ed3c77eebb89db84852959cf45aee369..8f9c47e1a96e4792a52454a79312ab6696ede007 100644 (file)
 #include <asm/byteorder.h>
 #include <asm/unaligned.h>
 
 #include <asm/byteorder.h>
 #include <asm/unaligned.h>
 
+const u8 sha224_zero_message_hash[SHA224_DIGEST_SIZE] = {
+       0xd1, 0x4a, 0x02, 0x8c, 0x2a, 0x3a, 0x2b, 0xc9, 0x47,
+       0x61, 0x02, 0xbb, 0x28, 0x82, 0x34, 0xc4, 0x15, 0xa2,
+       0xb0, 0x1f, 0x82, 0x8e, 0xa6, 0x2a, 0xc5, 0xb3, 0xe4,
+       0x2f
+};
+EXPORT_SYMBOL_GPL(sha224_zero_message_hash);
+
+const u8 sha256_zero_message_hash[SHA256_DIGEST_SIZE] = {
+       0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14,
+       0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24,
+       0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
+       0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55
+};
+EXPORT_SYMBOL_GPL(sha256_zero_message_hash);
+
 static inline u32 Ch(u32 x, u32 y, u32 z)
 {
        return z ^ (x & (y ^ z));
 static inline u32 Ch(u32 x, u32 y, u32 z)
 {
        return z ^ (x & (y ^ z));
index 146af825eedba1813ce3bea39c2b6cbcf2c2a1e4..327deac963c08f01de978ba5fd02ee4da10a70ea 100644 (file)
@@ -13,6 +13,8 @@
 #define MD5_H2 0x98badcfeUL
 #define MD5_H3 0x10325476UL
 
 #define MD5_H2 0x98badcfeUL
 #define MD5_H3 0x10325476UL
 
+extern const u8 md5_zero_message_hash[MD5_DIGEST_SIZE];
+
 struct md5_state {
        u32 hash[MD5_HASH_WORDS];
        u32 block[MD5_BLOCK_WORDS];
 struct md5_state {
        u32 hash[MD5_HASH_WORDS];
        u32 block[MD5_BLOCK_WORDS];
index dd7905a3c22e92c9ae1fc1b6b39524cf3ce51618..c94d3eb1cefdef3dc9437554d1b5a2eeb1879092 100644 (file)
 #define SHA512_H6      0x1f83d9abfb41bd6bULL
 #define SHA512_H7      0x5be0cd19137e2179ULL
 
 #define SHA512_H6      0x1f83d9abfb41bd6bULL
 #define SHA512_H7      0x5be0cd19137e2179ULL
 
+extern const u8 sha1_zero_message_hash[SHA1_DIGEST_SIZE];
+
+extern const u8 sha224_zero_message_hash[SHA224_DIGEST_SIZE];
+
+extern const u8 sha256_zero_message_hash[SHA256_DIGEST_SIZE];
+
 struct sha1_state {
        u32 state[SHA1_DIGEST_SIZE / 4];
        u64 count;
 struct sha1_state {
        u32 state[SHA1_DIGEST_SIZE / 4];
        u64 count;