Subversion Repositories planix.SVN

Rev

Rev 26 | 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
/* rfc5869 */
5
void
6
hkdf_x(salt, nsalt, info, ninfo, key, nkey, d, dlen, x, xlen)
7
	uchar *salt, *info, *key, *d;
8
	ulong nsalt, ninfo, nkey, dlen;
9
	DigestState* (*x)(uchar*, ulong, uchar*, ulong, uchar*, DigestState*);
10
	int xlen;
11
{
12
	uchar prk[256], tmp[256], cnt;
13
	DigestState *ds;
14
 
15
	assert(xlen <= sizeof(tmp));
16
 
17
	memset(tmp, 0, xlen);
18
	if(nsalt == 0){
19
		salt = tmp;
20
		nsalt = xlen;
21
	}
22
	/* note that salt and key are swapped in this case */
23
	(*x)(key, nkey, salt, nsalt, prk, nil);
24
	ds = nil;
25
	for(cnt=1;; cnt++) {
26
		if(ninfo > 0)
27
			ds = (*x)(info, ninfo, prk, xlen, nil, ds);
28
		(*x)(&cnt, 1, prk, xlen, tmp, ds);
29
		if(dlen <= xlen){
30
			memmove(d, tmp, dlen);
31
			break;
32
		}
33
		memmove(d, tmp, xlen);
34
		dlen -= xlen;
35
		d += xlen;
36
		ds = (*x)(tmp, xlen, prk, xlen, nil, nil);
37
	}
38
}