ref: b5737e87262b69fbfd5750a9485de9fc8b5b06dd
parent: e3a64494e782de289e1c7e12a4b3a2f73e0064e8
author: cinap_lenrek <[email protected]>
date: Tue Sep 1 17:38:20 EDT 2015
libsec: add curve25519 diffie hellman
--- a/sys/include/libsec.h
+++ b/sys/include/libsec.h
@@ -459,3 +459,7 @@
/* Curve25519 elliptic curve, public key function */
void curve25519(uchar mypublic[32], uchar secret[32], uchar basepoint[32]);
+
+/* Curve25519 diffie hellman */
+void curve25519_dh_new(uchar x[32], uchar y[32]);
+void curve25519_dh_finish(uchar x[32], uchar y[32], uchar z[32]);
--- /dev/null
+++ b/sys/src/libsec/port/curve25519_dh.c
@@ -1,0 +1,34 @@
+#include "os.h"
+#include <mp.h>
+#include <libsec.h>
+
+static uchar nine[32] = {9};
+
+void
+curve25519_dh_new(uchar x[32], uchar y[32])
+{
+ uchar b;
+
+ /* new public/private key pair */
+ genrandom(x, 32);
+ b = x[31];
+ x[0] &= ~7; /* clear bit 0,1,2 */
+ x[31] = 0x40 | (b & 0x7f); /* set bit 254, clear bit 255 */
+ curve25519(y, x, nine);
+
+ /* bit 255 is always 0, so make it random */
+ y[31] |= b & 0x80;
+}
+
+void
+curve25519_dh_finish(uchar x[32], uchar y[32], uchar z[32])
+{
+ /* remove the random bit */
+ y[31] &= 0x7f;
+
+ /* calculate dhx key */
+ curve25519(z, x, y);
+
+ memset(x, 0, 32);
+ memset(y, 0, 32);
+}
--- a/sys/src/libsec/port/mkfile
+++ b/sys/src/libsec/port/mkfile
@@ -23,6 +23,7 @@
dh.c\
pbkdf2.c\
curve25519.c\
+ curve25519_dh.c\
ALLOFILES=${CFILES:%.c=%.$O}