diff options
author | Simon Josefsson <simon@josefsson.org> | 2009-11-15 13:52:55 +0100 |
---|---|---|
committer | Simon Josefsson <simon@josefsson.org> | 2009-11-15 13:52:55 +0100 |
commit | 24a6641b053b7fc8bf13b4149722e85d77db9920 (patch) | |
tree | 5a3b67c696f402a9e9cce665bf86009bd8f292f6 /lib/gc-pbkdf2-sha1.c | |
parent | a86ea846c82189cec7b2fad8679377d5475211c1 (diff) | |
download | gnulib-24a6641b053b7fc8bf13b4149722e85d77db9920.tar.gz |
lib/gc-pbkdf2-sha1.c: Remove comments from RFC 2898.
Diffstat (limited to 'lib/gc-pbkdf2-sha1.c')
-rw-r--r-- | lib/gc-pbkdf2-sha1.c | 99 |
1 files changed, 8 insertions, 91 deletions
diff --git a/lib/gc-pbkdf2-sha1.c b/lib/gc-pbkdf2-sha1.c index 3c864c6d63..0f5211b2fa 100644 --- a/lib/gc-pbkdf2-sha1.c +++ b/lib/gc-pbkdf2-sha1.c @@ -1,5 +1,5 @@ /* gc-pbkdf2-sha1.c --- Password-Based Key Derivation Function a'la PKCS#5 - Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2002, 2003, 2004, 2005, 2006, 2009 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -15,8 +15,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -/* Written by Simon Josefsson. The comments in this file are taken - from RFC 2898. */ +/* Written by Simon Josefsson. */ #include <config.h> @@ -25,32 +24,12 @@ #include <stdlib.h> #include <string.h> -/* - * 5.2 PBKDF2 - * - * PBKDF2 applies a pseudorandom function (see Appendix B.1 for an - * example) to derive keys. The length of the derived key is essentially - * unbounded. (However, the maximum effective search space for the - * derived key may be limited by the structure of the underlying - * pseudorandom function. See Appendix B.1 for further discussion.) - * PBKDF2 is recommended for new applications. - * - * PBKDF2 (P, S, c, dkLen) - * - * Options: PRF underlying pseudorandom function (hLen - * denotes the length in octets of the - * pseudorandom function output) - * - * Input: P password, an octet string (ASCII or UTF-8) - * S salt, an octet string - * c iteration count, a positive integer - * dkLen intended length in octets of the derived - * key, a positive integer, at most - * (2^32 - 1) * hLen - * - * Output: DK derived key, a dkLen-octet string - */ - +/* Implement PKCS#5 PBKDF2 as per RFC 2898. The PRF to use is hard + coded to be HMAC-SHA1. Inputs are the password P of length PLEN, + the salt S of length SLEN, the iteration counter C (> 0), and the + desired derived output length DKLEN. Output buffer is DK which + must have room for at least DKLEN octets. The output buffer will + be filled with the derived data. */ Gc_rc gc_pbkdf2_sha1 (const char *P, size_t Plen, const char *S, size_t Slen, @@ -75,74 +54,12 @@ gc_pbkdf2_sha1 (const char *P, size_t Plen, if (dkLen == 0) return GC_PKCS5_INVALID_DERIVED_KEY_LENGTH; - /* - * - * Steps: - * - * 1. If dkLen > (2^32 - 1) * hLen, output "derived key too long" and - * stop. - */ - if (dkLen > 4294967295U) return GC_PKCS5_DERIVED_KEY_TOO_LONG; - /* - * 2. Let l be the number of hLen-octet blocks in the derived key, - * rounding up, and let r be the number of octets in the last - * block: - * - * l = CEIL (dkLen / hLen) , - * r = dkLen - (l - 1) * hLen . - * - * Here, CEIL (x) is the "ceiling" function, i.e. the smallest - * integer greater than, or equal to, x. - */ - l = ((dkLen - 1) / hLen) + 1; r = dkLen - (l - 1) * hLen; - /* - * 3. For each block of the derived key apply the function F defined - * below to the password P, the salt S, the iteration count c, and - * the block index to compute the block: - * - * T_1 = F (P, S, c, 1) , - * T_2 = F (P, S, c, 2) , - * ... - * T_l = F (P, S, c, l) , - * - * where the function F is defined as the exclusive-or sum of the - * first c iterates of the underlying pseudorandom function PRF - * applied to the password P and the concatenation of the salt S - * and the block index i: - * - * F (P, S, c, i) = U_1 \xor U_2 \xor ... \xor U_c - * - * where - * - * U_1 = PRF (P, S || INT (i)) , - * U_2 = PRF (P, U_1) , - * ... - * U_c = PRF (P, U_{c-1}) . - * - * Here, INT (i) is a four-octet encoding of the integer i, most - * significant octet first. - * - * 4. Concatenate the blocks and extract the first dkLen octets to - * produce a derived key DK: - * - * DK = T_1 || T_2 || ... || T_l<0..r-1> - * - * 5. Output the derived key DK. - * - * Note. The construction of the function F follows a "belt-and- - * suspenders" approach. The iterates U_i are computed recursively to - * remove a degree of parallelism from an opponent; they are exclusive- - * ored together to reduce concerns about the recursion degenerating - * into a small set of values. - * - */ - tmp = malloc (tmplen); if (tmp == NULL) return GC_MALLOC_ERROR; |