diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-09-02 11:30:17 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-09-02 11:30:17 +0200 |
commit | 7ed22aaeec7a09f2215d08003e2e5c824f903d5d (patch) | |
tree | db47c1b5071849b751a30cfcc060d6a01bb5e83c /sys/src/libsec | |
parent | b749f36baa4800e116bea6fcd0abc23c28e7078f (diff) |
libsec: add rfc5869 hmac-based key derivation function hkdf_x()
Diffstat (limited to 'sys/src/libsec')
-rw-r--r-- | sys/src/libsec/port/hkdf.c | 39 | ||||
-rw-r--r-- | sys/src/libsec/port/mkfile | 3 |
2 files changed, 41 insertions, 1 deletions
diff --git a/sys/src/libsec/port/hkdf.c b/sys/src/libsec/port/hkdf.c new file mode 100644 index 000000000..6ad32d35b --- /dev/null +++ b/sys/src/libsec/port/hkdf.c @@ -0,0 +1,39 @@ +#include "os.h" +#include <mp.h> +#include <libsec.h> + +/* rfc5869 */ +void +hkdf_x(salt, nsalt, info, ninfo, key, nkey, d, dlen, x, xlen) + uchar *salt, *info, *key, *d; + ulong nsalt, ninfo, nkey, dlen; + DigestState* (*x)(uchar*, ulong, uchar*, ulong, uchar*, DigestState*); + int xlen; +{ + uchar prk[256], tmp[256], cnt; + DigestState *ds; + + assert(xlen <= sizeof(tmp)); + + memset(tmp, 0, xlen); + if(nsalt == 0){ + salt = tmp; + nsalt = xlen; + } + /* note that salt and key are swapped in this case */ + (*x)(key, nkey, salt, nsalt, prk, nil); + ds = nil; + for(cnt=1;; cnt++) { + if(ninfo > 0) + ds = (*x)(info, ninfo, prk, xlen, nil, ds); + (*x)(&cnt, 1, prk, xlen, tmp, ds); + if(dlen <= xlen){ + memmove(d, tmp, dlen); + break; + } + memmove(d, tmp, xlen); + dlen -= xlen; + d += xlen; + ds = (*x)(tmp, xlen, prk, xlen, nil, nil); + } +} diff --git a/sys/src/libsec/port/mkfile b/sys/src/libsec/port/mkfile index bc9134a0c..f49420114 100644 --- a/sys/src/libsec/port/mkfile +++ b/sys/src/libsec/port/mkfile @@ -21,9 +21,10 @@ CFILES = des.c desmodes.c desECB.c desCBC.c des3ECB.c des3CBC.c\ ecc.c\ ripemd.c\ dh.c\ - pbkdf2.c\ curve25519.c\ curve25519_dh.c\ + pbkdf2.c\ + hkdf.c\ ALLOFILES=${CFILES:%.c=%.$O} |