summaryrefslogtreecommitdiff
path: root/sys/src/libsec
diff options
context:
space:
mode:
authoraiju <aiju@phicode.de>2012-06-06 16:43:15 +0200
committeraiju <aiju@phicode.de>2012-06-06 16:43:15 +0200
commitd2357e6961b3b3a80c51f03e0e01e7c80c5c0415 (patch)
tree18ef8ba9afbb3f1b2585465c0501c3f7454ab58b /sys/src/libsec
parent46efa642ad05b65dfb62cf1fa86edfe3ce75ee86 (diff)
added ecdsa to factotum
Diffstat (limited to 'sys/src/libsec')
-rw-r--r--sys/src/libsec/port/ecc.c55
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;
+}