]> git.lizzy.rs Git - plan9front.git/commitdiff
libsec: add rfc5869 hmac-based key derivation function hkdf_x()
authorcinap_lenrek <cinap_lenrek@felloff.net>
Wed, 2 Sep 2015 09:30:17 +0000 (11:30 +0200)
committercinap_lenrek <cinap_lenrek@felloff.net>
Wed, 2 Sep 2015 09:30:17 +0000 (11:30 +0200)
sys/include/libsec.h
sys/src/libsec/port/hkdf.c [new file with mode: 0644]
sys/src/libsec/port/mkfile

index e46180829719851006be66871b28f920d705aa7a..d5c3b85fb2bfbb64b43d1e071036daa61ad74a8e 100644 (file)
@@ -464,3 +464,8 @@ void curve25519_dh_finish(uchar x[32], uchar y[32], uchar z[32]);
 /* 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);
+
+/* hmac-based key derivation function (rfc5869) */
+void hkdf_x(uchar *salt, ulong nsalt, uchar *info, ulong ninfo, uchar *key, ulong nkey, uchar *d, ulong dlen,
+       DigestState* (*x)(uchar*, ulong, uchar*, ulong, uchar*, DigestState*), int xlen);
+
diff --git a/sys/src/libsec/port/hkdf.c b/sys/src/libsec/port/hkdf.c
new file mode 100644 (file)
index 0000000..6ad32d3
--- /dev/null
@@ -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);
+       }
+}
index bc9134a0ccdf61e72a055d4cf4e6e868b803d985..f49420114f77a93885892e298dc7461e228b74ca 100644 (file)
@@ -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}