Subversion Repositories planix.SVN

Rev

Rev 33 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
26 7u83 1
#include "os.h"
2
#include <libsec.h>
3
 
4
/* rfc2898 */
5
void
6
pbkdf2_x(p, plen, s, slen, rounds, d, dlen, x, xlen)
7
	uchar *p, *s, *d;
8
	ulong plen, slen, dlen, rounds;
9
	DigestState* (*x)(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
10
	int xlen;
11
{
12
	uchar block[256], tmp[256];
13
	ulong i, j, k, n;
14
	DigestState *ds;
15
 
16
	assert(xlen <= sizeof(tmp));
17
 
18
	for(i = 1; dlen > 0; i++, d += n, dlen -= n){
19
		tmp[3] = i;
20
		tmp[2] = i >> 8;
21
		tmp[1] = i >> 16;
22
		tmp[0] = i >> 24;
23
		ds = (*x)(s, slen, p, plen, nil, nil);
24
		(*x)(tmp, 4, p, plen, block, ds);
25
		memmove(tmp, block, xlen);
26
		for(j = 1; j < rounds; j++){
27
			(*x)(tmp, xlen, p, plen, tmp, nil);
28
			for(k=0; k<xlen; k++)
29
				block[k] ^= tmp[k];
30
		}
31
		n = dlen > xlen ? xlen : dlen;
32
		memmove(d, block, n); 
33
	}
34
}