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;
|
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)
|
||||||
|
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_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);
|
||||||
|
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;
|
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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user