libsec: add pbkdf2_hmac_sha1() (from wpapsk factotum module)
This commit is contained in:
parent
d3f05df5d6
commit
a40c4006d2
4 changed files with 34 additions and 27 deletions
|
@ -456,3 +456,6 @@ mpint* dh_new(DHstate *dh, mpint *p, mpint *g);
|
||||||
|
|
||||||
/* calculate shared key: k = pub ^ x % p */
|
/* calculate shared key: k = pub ^ x % p */
|
||||||
mpint* dh_finish(DHstate *dh, mpint *pub);
|
mpint* dh_finish(DHstate *dh, mpint *pub);
|
||||||
|
|
||||||
|
/* password-based key derivation function 2 (RFC 2898) */
|
||||||
|
void pbkdf2_hmac_sha1(uchar *p, ulong plen, uchar *s, ulong slen, ulong rounds, uchar *d, ulong dlen);
|
||||||
|
|
|
@ -35,32 +35,6 @@ struct State
|
||||||
uchar resp[PTKlen];
|
uchar resp[PTKlen];
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
|
||||||
pbkdf2(uchar *p, ulong plen, uchar *s, ulong slen, ulong rounds, uchar *d, ulong dlen)
|
|
||||||
{
|
|
||||||
uchar block[SHA1dlen], tmp[SHA1dlen], tmp2[SHA1dlen];
|
|
||||||
ulong i, j, k, n;
|
|
||||||
DigestState *ds;
|
|
||||||
|
|
||||||
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));
|
|
||||||
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++)
|
|
||||||
block[k] ^= tmp[k];
|
|
||||||
}
|
|
||||||
n = dlen > sizeof(block) ? sizeof(block) : dlen;
|
|
||||||
memmove(d, block, n);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
hextob(char *s, char **sp, uchar *b, int n)
|
hextob(char *s, char **sp, uchar *b, int n)
|
||||||
{
|
{
|
||||||
|
@ -89,7 +63,7 @@ pass2pmk(char *pass, char *ssid, uchar pmk[PMKlen])
|
||||||
{
|
{
|
||||||
if(hextob(pass, nil, pmk, PMKlen) == PMKlen)
|
if(hextob(pass, nil, pmk, PMKlen) == PMKlen)
|
||||||
return;
|
return;
|
||||||
pbkdf2((uchar*)pass, strlen(pass), (uchar*)ssid, strlen(ssid), 4096, pmk, PMKlen);
|
pbkdf2_hmac_sha1((uchar*)pass, strlen(pass), (uchar*)ssid, strlen(ssid), 4096, pmk, PMKlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -21,6 +21,7 @@ CFILES = des.c desmodes.c desECB.c desCBC.c des3ECB.c des3CBC.c\
|
||||||
ecc.c\
|
ecc.c\
|
||||||
ripemd.c\
|
ripemd.c\
|
||||||
dh.c\
|
dh.c\
|
||||||
|
pbkdf2.c\
|
||||||
|
|
||||||
ALLOFILES=${CFILES:%.c=%.$O}
|
ALLOFILES=${CFILES:%.c=%.$O}
|
||||||
|
|
||||||
|
|
29
sys/src/libsec/port/pbkdf2.c
Normal file
29
sys/src/libsec/port/pbkdf2.c
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#include "os.h"
|
||||||
|
#include <mp.h>
|
||||||
|
#include <libsec.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
pbkdf2_hmac_sha1(uchar *p, ulong plen, uchar *s, ulong slen, ulong rounds, uchar *d, ulong dlen)
|
||||||
|
{
|
||||||
|
uchar block[SHA1dlen], tmp[SHA1dlen], tmp2[SHA1dlen];
|
||||||
|
ulong i, j, k, n;
|
||||||
|
DigestState *ds;
|
||||||
|
|
||||||
|
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));
|
||||||
|
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++)
|
||||||
|
block[k] ^= tmp[k];
|
||||||
|
}
|
||||||
|
n = dlen > sizeof(block) ? sizeof(block) : dlen;
|
||||||
|
memmove(d, block, n);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue