5 #include "sw/device/silicon_creator/lib/sigverify/mod_exp_ibex.h"
26 for (
size_t i = 0; i <
ARRAYSIZE(a->data); ++i) {
27 uint32_t temp = a->data[i] - borrow;
30 borrow = (a->data[i] < borrow) + (temp < key->n.data[i]);
31 a->data[i] = temp - key->n.data[i];
48 if (a->data[i] != key->n.data[i]) {
49 return a->data[i] > key->n.data[i];
66 const uint32_t msb = a->data[
ARRAYSIZE(a->data) - 1] >> 31;
67 for (
size_t i =
ARRAYSIZE(a->data) - 1; i > 0; --i) {
68 a->data[i] = (a->data[i] << 1) | (a->data[i - 1] >> 31);
94 memset(result->data, 0,
sizeof(result->data));
96 for (
size_t i = 0; i <
ARRAYSIZE(x->data); ++i) {
107 uint64_t acc0 = (uint64_t)x->data[i] * y->data[0] + result->data[0];
108 const uint32_t u_i = (uint32_t)acc0 * key->n0_inv[0];
110 uint64_t acc1 = (uint64_t)u_i * key->n.data[0] + (uint32_t)acc0;
113 for (
size_t j = 1; j <
ARRAYSIZE(result->data); ++j) {
114 acc0 = (uint64_t)x->data[i] * y->data[j] + result->data[j] + (acc0 >> 32);
115 acc1 = (uint64_t)u_i * key->n.data[j] + (uint32_t)acc0 + (acc1 >> 32);
116 result->data[j - 1] = (uint32_t)acc1;
118 acc0 = (acc0 >> 32) + (acc1 >> 32);
119 result->data[
ARRAYSIZE(result->data) - 1] = (uint32_t)acc0;
145 memset(buf.data, 0,
sizeof(result->data));
153 for (
size_t i = 0; i < 96; ++i) {
154 uint32_t msb = shift_left(&buf);
157 while (msb > 0 || greater_equal_modulus(key, &buf)) {
158 msb -= subtract_modulus(key, &buf);
163 mont_mul(key, &buf, &buf, result);
164 for (
size_t i = 0; i < 2; ++i) {
165 mont_mul(key, result, result, &buf);
166 mont_mul(key, &buf, &buf, result);
175 if (greater_equal_modulus(key, sig)) {
176 return kErrorSigverifyLargeRsaSignature;
182 calc_r_square(key, result);
184 mont_mul(key, sig, result, &buf);
185 for (
size_t i = 0; i < 8; ++i) {
187 mont_mul(key, &buf, &buf, result);
189 mont_mul(key, result, result, &buf);
192 mont_mul(key, &buf, sig, result);
197 if (greater_equal_modulus(key, result)) {