libsec: add curve25519 diffie hellman
This commit is contained in:
parent
e3a64494e7
commit
b5737e8726
3 changed files with 39 additions and 0 deletions
|
@ -459,3 +459,7 @@ void pbkdf2_hmac_sha1(uchar *p, ulong plen, uchar *s, ulong slen, ulong rounds,
|
|||
|
||||
/* 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]);
|
||||
|
|
34
sys/src/libsec/port/curve25519_dh.c
Normal file
34
sys/src/libsec/port/curve25519_dh.c
Normal file
|
@ -0,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);
|
||||
}
|
|
@ -23,6 +23,7 @@ CFILES = des.c desmodes.c desECB.c desCBC.c des3ECB.c des3CBC.c\
|
|||
dh.c\
|
||||
pbkdf2.c\
|
||||
curve25519.c\
|
||||
curve25519_dh.c\
|
||||
|
||||
ALLOFILES=${CFILES:%.c=%.$O}
|
||||
|
||||
|
|
Loading…
Reference in a new issue