diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-09-02 11:28:11 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-09-02 11:28:11 +0200 |
commit | b749f36baa4800e116bea6fcd0abc23c28e7078f (patch) | |
tree | e14d41caa2a00c303c5572e1a417578923dd13f0 /sys/src/libsec | |
parent | 4c52aedfe92da7efe85e3b855855acb94863e084 (diff) |
libsec: generalize pbkdf2_hmac_sha1() to pbkdf2_x() passing the hmac as an argument
Diffstat (limited to 'sys/src/libsec')
-rw-r--r-- | sys/src/libsec/port/pbkdf2.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/sys/src/libsec/port/pbkdf2.c b/sys/src/libsec/port/pbkdf2.c index 95c26422f..7df01dc25 100644 --- a/sys/src/libsec/port/pbkdf2.c +++ b/sys/src/libsec/port/pbkdf2.c @@ -2,28 +2,34 @@ #include <mp.h> #include <libsec.h> +/* rfc2898 */ void -pbkdf2_hmac_sha1(uchar *p, ulong plen, uchar *s, ulong slen, ulong rounds, uchar *d, ulong dlen) +pbkdf2_x(p, plen, s, slen, rounds, d, dlen, x, xlen) + uchar *p, *s, *d; + ulong plen, slen, dlen, rounds; + DigestState* (*x)(uchar*, ulong, uchar*, ulong, uchar*, DigestState*); + int xlen; { - uchar block[SHA1dlen], tmp[SHA1dlen], tmp2[SHA1dlen]; + uchar block[256], tmp[256]; ulong i, j, k, n; DigestState *ds; + assert(xlen <= sizeof(tmp)); + for(i = 1; dlen > 0; i++, d += n, dlen -= n){ tmp[3] = i; tmp[2] = i >> 8; tmp[1] = i >> 16; tmp[0] = i >> 24; - ds = hmac_sha1(s, slen, p, plen, nil, nil); - hmac_sha1(tmp, 4, p, plen, block, ds); - memmove(tmp, block, sizeof(tmp)); + ds = (*x)(s, slen, p, plen, nil, nil); + (*x)(tmp, 4, p, plen, block, ds); + memmove(tmp, block, xlen); for(j = 1; j < rounds; j++){ - hmac_sha1(tmp, sizeof(tmp), p, plen, tmp2, nil); - memmove(tmp, tmp2, sizeof(tmp)); - for(k=0; k<sizeof(tmp); k++) + (*x)(tmp, xlen, p, plen, tmp, nil); + for(k=0; k<xlen; k++) block[k] ^= tmp[k]; } - n = dlen > sizeof(block) ? sizeof(block) : dlen; + n = dlen > xlen ? xlen : dlen; memmove(d, block, n); } } |