1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-29 19:08:12 +00:00

simplify divmod58

This commit is contained in:
Pavol Rusnak 2013-09-25 12:39:23 +02:00
parent 74a5b04b81
commit 7ed18947ba
3 changed files with 16 additions and 37 deletions

View File

@ -502,41 +502,23 @@ void bn_substract_noprime(const bignum256 *a, const bignum256 *b, bignum256 *res
res->val[8] = a->val[8] - b->val[8] - carry; res->val[8] = a->val[8] - b->val[8] - carry;
} }
// a / 58 = q (+r) // a / 58 = a (+r)
void bn_divmod58(const bignum256 *a, bignum256 *q, uint32_t *r) void bn_divmod58(bignum256 *a, uint32_t *r)
{ {
bignum256 i58, rem; int i;
int na, i; uint32_t rem, tmp;
rem = a->val[8] % 58;
bn_zero(q); a->val[8] /= 58;
bn_zero(&i58); i58.val[0] = 58; for (i = 7; i >= 0; i--) {
// 2^30 == 18512790*58 + 4
if (bn_is_less(a, &i58)) { tmp = rem * 4 + a->val[i];
*r = a->val[0]; a->val[i] = rem * 18512790 + (tmp / 58);
rem = tmp % 58;
} }
*r = rem;
na = bn_bitlen(a);
for (i = 0; i < 9; i++) {
rem.val[i] = a->val[i];
}
for (i = 0; i <= na - 6; i++) {
bn_lshift(&i58);
}
for (i = na - 5; i >= 0; --i) {
bn_lshift(q);
if (!bn_is_less(&rem, &i58)) {
bn_substract_noprime(&rem, &i58, &rem);
q->val[0] |= 1;
}
bn_rshift(&i58);
}
*r = rem.val[0];
} }
#if 0 #if 0
void bn_print(const bignum256 *a) void bn_print(const bignum256 *a)
{ {

View File

@ -82,7 +82,7 @@ void bn_substract(const bignum256 *a, const bignum256 *b, bignum256 *res);
void bn_substract_noprime(const bignum256 *a, const bignum256 *b, bignum256 *res); void bn_substract_noprime(const bignum256 *a, const bignum256 *b, bignum256 *res);
void bn_divmod58(const bignum256 *a, bignum256 *q, uint32_t *r); void bn_divmod58(bignum256 *a, uint32_t *r);
#if 0 #if 0
void bn_print(const bignum256 *a); void bn_print(const bignum256 *a);

View File

@ -279,7 +279,7 @@ void ecdsa_get_address(const uint8_t *pub_key, char version, char *addr)
char *p = addr, s; char *p = addr, s;
uint8_t a[32], b[21]; uint8_t a[32], b[21];
uint32_t r; uint32_t r;
bignum256 c, q; bignum256 c;
int i, l; int i, l;
SHA256_Raw(pub_key, 33, a); SHA256_Raw(pub_key, 33, a);
@ -296,12 +296,9 @@ void ecdsa_get_address(const uint8_t *pub_key, char version, char *addr)
bn_read_be(a, &c); bn_read_be(a, &c);
while (!bn_is_zero(&c)) { while (!bn_is_zero(&c)) {
bn_divmod58(&c, &q, &r); bn_divmod58(&c, &r);
*p = code[r]; *p = code[r];
p++; p++;
for (i = 0; i < 9; i++) {
c.val[i] = q.val[i];
}
} }
if (a[0] == 0) { if (a[0] == 0) {