mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-26 09:28:13 +00:00
simplify divmod58
This commit is contained in:
parent
74a5b04b81
commit
7ed18947ba
44
bignum.c
44
bignum.c
@ -502,40 +502,22 @@ void bn_substract_noprime(const bignum256 *a, const bignum256 *b, bignum256 *res
|
||||
res->val[8] = a->val[8] - b->val[8] - carry;
|
||||
}
|
||||
|
||||
// a / 58 = q (+r)
|
||||
void bn_divmod58(const bignum256 *a, bignum256 *q, uint32_t *r)
|
||||
// a / 58 = a (+r)
|
||||
void bn_divmod58(bignum256 *a, uint32_t *r)
|
||||
{
|
||||
bignum256 i58, rem;
|
||||
int na, i;
|
||||
|
||||
bn_zero(q);
|
||||
bn_zero(&i58); i58.val[0] = 58;
|
||||
|
||||
if (bn_is_less(a, &i58)) {
|
||||
*r = a->val[0];
|
||||
int i;
|
||||
uint32_t rem, tmp;
|
||||
rem = a->val[8] % 58;
|
||||
a->val[8] /= 58;
|
||||
for (i = 7; i >= 0; i--) {
|
||||
// 2^30 == 18512790*58 + 4
|
||||
tmp = rem * 4 + a->val[i];
|
||||
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
|
||||
void bn_print(const bignum256 *a)
|
||||
|
2
bignum.h
2
bignum.h
@ -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_divmod58(const bignum256 *a, bignum256 *q, uint32_t *r);
|
||||
void bn_divmod58(bignum256 *a, uint32_t *r);
|
||||
|
||||
#if 0
|
||||
void bn_print(const bignum256 *a);
|
||||
|
7
ecdsa.c
7
ecdsa.c
@ -279,7 +279,7 @@ void ecdsa_get_address(const uint8_t *pub_key, char version, char *addr)
|
||||
char *p = addr, s;
|
||||
uint8_t a[32], b[21];
|
||||
uint32_t r;
|
||||
bignum256 c, q;
|
||||
bignum256 c;
|
||||
int i, l;
|
||||
|
||||
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);
|
||||
|
||||
while (!bn_is_zero(&c)) {
|
||||
bn_divmod58(&c, &q, &r);
|
||||
bn_divmod58(&c, &r);
|
||||
*p = code[r];
|
||||
p++;
|
||||
for (i = 0; i < 9; i++) {
|
||||
c.val[i] = q.val[i];
|
||||
}
|
||||
}
|
||||
|
||||
if (a[0] == 0) {
|
||||
|
Loading…
Reference in New Issue
Block a user