]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[rng] Use SHA-256 for Hash_df, and validate the hash function strength
authorMichael Brown <mcb30@ipxe.org>
Mon, 5 Mar 2012 16:21:49 +0000 (16:21 +0000)
committerMichael Brown <mcb30@ipxe.org>
Mon, 5 Mar 2012 23:51:54 +0000 (23:51 +0000)
ANS X9.82 Part 4 (April 2011 Draft) Section 13.3.4.2 states that "When
using the derivation function based on a hash function, the output
length of the hash function shall meet or exceed the security strength
indicated by the min_entropy parameter in the Get_entropy_input call",
although this criteria is missing from the pseudocode provided in the
same section.

Add a test for this condition, and upgrade from SHA-1 to SHA-256 since
SHA-1 has an output length of 160 bits, which is insufficient for
generating the (128 * 3/2 = 192) bits required when instantiating the
128-bit strength DRBG.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/include/ipxe/entropy.h

index 7208ac87acd9e3d4e61bd647a3d0a1d2ea6c7a86..02dde2f1d7c0dfe2849ad7bebca48cbd21ec145f 100644 (file)
@@ -14,7 +14,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
 #include <assert.h>
 #include <ipxe/api.h>
 #include <ipxe/hash_df.h>
-#include <ipxe/sha1.h>
+#include <ipxe/sha256.h>
 #include <config/entropy.h>
 
 /**
@@ -100,14 +100,14 @@ int get_noise ( noise_sample_t *noise );
 extern int get_entropy_input_tmp ( unsigned int num_samples,
                                   uint8_t *tmp, size_t tmp_len );
 
-/** Use SHA-1 as the underlying hash algorithm for Hash_df
+/** Use SHA-256 as the underlying hash algorithm for Hash_df
  *
- * Hash_df using SHA-1 is an Approved algorithm in ANS X9.82.
+ * Hash_df using SHA-256 is an Approved algorithm in ANS X9.82.
  */
-#define entropy_hash_df_algorithm sha1_algorithm
+#define entropy_hash_df_algorithm sha256_algorithm
 
 /** Underlying hash algorithm output length (in bytes) */
-#define ENTROPY_HASH_DF_OUTLEN_BYTES SHA1_DIGEST_SIZE
+#define ENTROPY_HASH_DF_OUTLEN_BYTES SHA256_DIGEST_SIZE
 
 /**
  * Obtain entropy input
@@ -166,6 +166,13 @@ get_entropy_input ( unsigned int min_entropy_bits, void *data, size_t min_len,
        linker_assert ( __builtin_constant_p ( num_samples ),
                        num_samples_not_constant );
 
+       /* (Unnumbered).  The output length of the hash function shall
+        * meet or exceed the security strength indicated by the
+        * min_entropy parameter.
+        */
+       linker_assert ( ( ( 8 * ENTROPY_HASH_DF_OUTLEN_BYTES ) >=
+                         min_entropy_bits ), hash_df_algorithm_too_weak );
+
        /* 1.  If ( min_length > max_length ), then return ( FAILURE, Null ) */
        linker_assert ( ( min_len <= max_len ), min_len_greater_than_max_len );