diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-02-01 21:34:49 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-02-01 21:34:49 +0100 |
commit | a291bbdeddfd41a2f0907ecbd7b819f0eedffdaf (patch) | |
tree | c5dd22efd770099846596d546dd36ba4b2d7ffc6 /sys/src/libsec/port/ecc.c | |
parent | 0bfac109a491e61d7cd585060b88e1251da1e928 (diff) |
libsec: ecdsa client support for tlshand, cleanups
Diffstat (limited to 'sys/src/libsec/port/ecc.c')
-rw-r--r-- | sys/src/libsec/port/ecc.c | 80 |
1 files changed, 78 insertions, 2 deletions
diff --git a/sys/src/libsec/port/ecc.c b/sys/src/libsec/port/ecc.c index 04d130c5b..7d3e32648 100644 --- a/sys/src/libsec/port/ecc.c +++ b/sys/src/libsec/port/ecc.c @@ -407,7 +407,7 @@ ecgen(ECdomain *dom, ECpriv *p) if(mpcmp(p->d, mpzero) > 0 && mpcmp(p->d, dom->n) < 0) break; } - ecmul(dom, dom->G, p->d, p); + ecmul(dom, &dom->G, p->d, p); return p; } @@ -468,7 +468,7 @@ ecdsaverify(ECdomain *dom, ECpub *pub, uchar *dig, int len, mpint *r, mpint *s) mpmod(u1, dom->n, u1); mpmul(r, t, u2); mpmod(u2, dom->n, u2); - ecmul(dom, dom->G, u1, &R); + ecmul(dom, &dom->G, u1, &R); ecmul(dom, pub, u2, &S); ecadd(dom, &R, &S, &R); ret = 0; @@ -540,3 +540,79 @@ base58dec(char *src, uchar *dst, int len) mpfree(b); return 0; } + +void +ecdominit(ECdomain *dom, void (*init)(mpint *p, mpint *a, mpint *b, mpint *x, mpint *y, mpint *n, mpint *h)) +{ + memset(dom, 0, sizeof(*dom)); + dom->p = mpnew(0); + dom->a = mpnew(0); + dom->b = mpnew(0); + dom->G.x = mpnew(0); + dom->G.y = mpnew(0); + dom->n = mpnew(0); + dom->h = mpnew(0); + if(init){ + (*init)(dom->p, dom->a, dom->b, dom->G.x, dom->G.y, dom->n, dom->h); + dom->p = mpfield(dom->p); + } +} + +void +ecdomfree(ECdomain *dom) +{ + mpfree(dom->p); + mpfree(dom->a); + mpfree(dom->b); + mpfree(dom->G.x); + mpfree(dom->G.y); + mpfree(dom->n); + mpfree(dom->h); + memset(dom, 0, sizeof(*dom)); +} + +int +ecencodepub(ECdomain *dom, ECpub *pub, uchar *data, int len) +{ + int n; + + n = (mpsignif(dom->p)+7)/8; + if(len < 1 + 2*n) + return 0; + len = 1 + 2*n; + data[0] = 0x04; + mptober(pub->x, data+1, n); + mptober(pub->y, data+1+n, n); + return len; +} + +ECpub* +ecdecodepub(ECdomain *dom, uchar *data, int len) +{ + ECpub *pub; + int n; + + n = (mpsignif(dom->p)+7)/8; + if(len != 1 + 2*n || data[0] != 0x04) + return nil; + pub = mallocz(sizeof(*pub), 1); + if(pub == nil) + return nil; + pub->x = betomp(data+1, n, nil); + pub->y = betomp(data+1+n, n, nil); + if(!ecpubverify(dom, pub)){ + ecpubfree(pub); + pub = nil; + } + return pub; +} + +void +ecpubfree(ECpub *p) +{ + if(p == nil) + return; + mpfree(p->x); + mpfree(p->y); + free(p); +} |