--- /n/sources/plan9/sys/src/libsec/port/mkfile Fri Mar 26 04:11:53 2010 +++ /sys/src/libsec/port/mkfile Mon Apr 17 00:00:00 2017 @@ -17,6 +17,7 @@ egsign.c egverify.c \ dsagen.c dsaalloc.c dsaprivtopub.c dsasign.c dsaverify.c \ tlshand.c thumb.c readcert.c \ + pbkdf2.c\ ALLOFILES=${CFILES:%.c=%.$O} --- /sys/src/libsec/port/pbkdf2.c Mon Apr 17 12:22:53 2017 +++ /sys/src/libsec/port/pbkdf2.c Mon Apr 17 00:00:00 2017 @@ -0,0 +1,34 @@ +#include "os.h" +#include + +/* rfc2898 */ +void +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[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 = (*x)(s, slen, p, plen, nil, nil); + (*x)(tmp, 4, p, plen, block, ds); + memmove(tmp, block, xlen); + for(j = 1; j < rounds; j++){ + (*x)(tmp, xlen, p, plen, tmp, nil); + for(k=0; k xlen ? xlen : dlen; + memmove(d, block, n); + } +} --- /n/sources/plan9/sys/include/libsec.h Tue Sep 17 01:03:04 2013 +++ /sys/include/libsec.h Mon Apr 17 00:00:00 2017 @@ -402,3 +402,7 @@ /* readcert.c */ uchar *readcert(char *filename, int *pcertlen); PEMChain*readcertchain(char *filename); + +/* password-based key derivation function 2 (rfc2898) */ +void pbkdf2_x(uchar *p, ulong plen, uchar *s, ulong slen, ulong rounds, uchar *d, ulong dlen, + DigestState* (*x)(uchar*, ulong, uchar*, ulong, uchar*, DigestState*), int xlen);