int base58dec(char *src, uchar *dst, int len) { mpint *n, *b, *r; char *t; int l; 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); } memset(dst, 0, len); l = (mpsignif(n) + 7) / 8; mptobe(n, dst + (len - l), l, nil); mpfree(n); mpfree(r); mpfree(b); return 0; }
/* * Mptobe but shift right to fill buffer. */ void mptoberjust(mpint *b, uchar *buf, uint len) { int n; n = mptobe(b, buf, len, nil); assert(n >= 0); if(n < len) { len -= n; memmove(buf+len, buf, n); memset(buf, 0, len); } }