diff options
author | aiju <aiju@phicode.de> | 2012-06-06 16:43:15 +0200 |
---|---|---|
committer | aiju <aiju@phicode.de> | 2012-06-06 16:43:15 +0200 |
commit | d2357e6961b3b3a80c51f03e0e01e7c80c5c0415 (patch) | |
tree | 18ef8ba9afbb3f1b2585465c0501c3f7454ab58b /sys/src/libsec | |
parent | 46efa642ad05b65dfb62cf1fa86edfe3ce75ee86 (diff) |
added ecdsa to factotum
Diffstat (limited to 'sys/src/libsec')
-rw-r--r-- | sys/src/libsec/port/ecc.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/sys/src/libsec/port/ecc.c b/sys/src/libsec/port/ecc.c index eb5c593af..27e647d46 100644 --- a/sys/src/libsec/port/ecc.c +++ b/sys/src/libsec/port/ecc.c @@ -482,3 +482,58 @@ ecdsaverify(ECdomain *dom, ECpub *pub, uchar *dig, int len, mpint *r, mpint *s) mpfree(S.y); return ret; } + +static char *code = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; + +void +base58enc(uchar *src, char *dst, int len) +{ + mpint *n, *r, *b; + char *sdst, t; + + sdst = dst; + n = betomp(src, len, nil); + b = uitomp(58, nil); + r = mpnew(0); + while(mpcmp(n, mpzero) != 0){ + mpdiv(n, b, n, r); + *dst++ = code[mptoui(r)]; + } + for(; *src == 0; src++) + *dst++ = code[0]; + dst--; + while(dst > sdst){ + t = *sdst; + *sdst++ = *dst; + *dst-- = t; + } +} + +int +base58dec(char *src, uchar *dst, int len) +{ + mpint *n, *b, *r; + char *t; + + n = mpnew(0); + r = mpnew(0); + b = uitomp(58, nil); + for(; *src; src++){ + t = strchr(code, *src); + if(t == nil){ + mpfree(n); + mpfree(r); + mpfree(b); + werrstr("invalid base58 char"); + return -1; + } + uitomp(t - code, r); + mpmul(n, b, n); + mpadd(n, r, n); + } + mptobe(n, dst, len, nil); + mpfree(n); + mpfree(r); + mpfree(b); + return 0; +} |