libsec: add diffie-hellman functions

This commit is contained in:
cinap_lenrek 2014-09-14 02:29:18 +02:00
parent 4cf00ca6cb
commit 6c68876db6
3 changed files with 60 additions and 0 deletions

View file

@ -439,3 +439,22 @@ void base58enc(uchar *, char *, int);
int base58dec(char *, uchar *, int);
DigestState* ripemd160(uchar *, ulong, uchar *, DigestState *);
/*
* Diffie-Hellman key exchange
*/
typedef struct DHstate DHstate;
struct DHstate
{
mpint *g; /* base g */
mpint *p; /* large prime */
mpint *x; /* random secret */
mpint *y; /* public key y = g ^ x % p */
};
/* generate new public key: y = g ^ x % p */
mpint* dh_new(DHstate *dh, mpint *p, mpint *g);
/* calculate shared key: k = pub ^ x % p */
mpint* dh_finish(DHstate *dh, mpint *pub);

40
sys/src/libsec/port/dh.c Normal file
View file

@ -0,0 +1,40 @@
#include "os.h"
#include <mp.h>
#include <libsec.h>
mpint*
dh_new(DHstate *dh, mpint *p, mpint *g)
{
memset(dh, 0, sizeof(*dh));
dh->g = mpcopy(g);
dh->p = mpcopy(p);
if(dh->g != nil && dh->p != nil){
dh->x = mprand(mpsignif(dh->p), genrandom, nil);
dh->y = mpnew(0);
if(dh->x != nil && dh->y != nil){
mpexp(dh->g, dh->x, dh->p, dh->y);
return dh->y;
}
}
dh_finish(dh, nil);
return nil;
}
mpint*
dh_finish(DHstate *dh, mpint *pub)
{
mpint *k;
k = nil;
if(pub != nil && dh->x != nil && dh->p != nil){
if((k = mpnew(0)) != nil)
mpexp(pub, dh->x, dh->p, k);
}
mpfree(dh->g);
mpfree(dh->p);
mpfree(dh->x);
mpfree(dh->y);
memset(dh, 0, sizeof(*dh));
return k;
}

View file

@ -20,6 +20,7 @@ CFILES = des.c desmodes.c desECB.c desCBC.c des3ECB.c des3CBC.c\
aes_xts.c \
ecc.c\
ripemd.c\
dh.c\
ALLOFILES=${CFILES:%.c=%.$O}