summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVadim Sukhomlinov <sukhomlinov@google.com>2021-10-05 19:07:14 -0700
committerCommit Bot <commit-bot@chromium.org>2021-10-06 03:59:44 +0000
commitcc7679235b5b30083cd74a68890b54c71bb61f7f (patch)
tree95ea1e287fc320ad75e839196315cc670559d7e6
parent6a1d61e3e507f8f213b7ca6c5c07e3fc87b72d77 (diff)
downloadchrome-ec-cc7679235b5b30083cd74a68890b54c71bb61f7f.tar.gz
cr50: switch RSA/big numbers to dynamic buffer allocation for RSA 4K
Several bn_* function still use static buffer allocation. Switch to dynamic allocation to enable support for RSA 3K/4K. BUG=none TEST=make BOARD=cr50 CRYPTO_TEST=1; test/tpm_test/tpmtest.py ../../build/tpm_test/bn_test TCG tests Signed-off-by: Vadim Sukhomlinov <sukhomlinov@google.com> Change-Id: I150fa99bde89cc486f7ad945b5a312fe7d787fb0 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3207349 Reviewed-by: Vadim Sukhomlinov <sukhomlinov@chromium.org> Reviewed-by: Andrey Pronin <apronin@chromium.org> Tested-by: Vadim Sukhomlinov <sukhomlinov@chromium.org> Commit-Queue: Vadim Sukhomlinov <sukhomlinov@chromium.org>
-rw-r--r--board/cr50/dcrypto/bn.c30
1 files changed, 17 insertions, 13 deletions
diff --git a/board/cr50/dcrypto/bn.c b/board/cr50/dcrypto/bn.c
index e92f366aeb..a65f496429 100644
--- a/board/cr50/dcrypto/bn.c
+++ b/board/cr50/dcrypto/bn.c
@@ -342,17 +342,19 @@ static void bn_modexp_internal(struct LITE_BIGNUM *output,
{
int i;
uint32_t nprime;
- uint32_t RR_buf[RSA_MAX_WORDS];
- uint32_t acc_buf[RSA_MAX_WORDS];
- uint32_t aR_buf[RSA_MAX_WORDS];
+ uint8_t *buf;
+ size_t n_len;
struct LITE_BIGNUM RR;
struct LITE_BIGNUM acc;
struct LITE_BIGNUM aR;
- bn_init(&RR, RR_buf, bn_size(N));
- bn_init(&acc, acc_buf, bn_size(N));
- bn_init(&aR, aR_buf, bn_size(N));
+ n_len = bn_size(N);
+ /* Combined buffer for acc, RR and aR. */
+ buf = alloca(n_len * 3);
+ bn_init(&acc, buf, n_len);
+ bn_init(&RR, buf + n_len, n_len);
+ bn_init(&aR, buf + n_len + n_len, n_len);
nprime = bn_compute_nprime(BN_DIGIT(N, 0));
bn_compute_RR(&RR, N);
@@ -381,8 +383,8 @@ static void bn_modexp_internal(struct LITE_BIGNUM *output,
bn_mont_mul(output, NULL, &acc, nprime, N); /* Convert out. */
/* Copy to output buffer if necessary. */
- if (acc.d != (struct access_helper *) acc_buf) {
- memcpy(acc.d, acc_buf, bn_size(output));
+ if (acc.d != (struct access_helper *)buf) {
+ memcpy(acc.d, buf, bn_size(output));
*output = acc;
}
@@ -391,9 +393,7 @@ static void bn_modexp_internal(struct LITE_BIGNUM *output,
bn_add(output, N); /* Final reduce. */
output->dmax = N->dmax;
- always_memset(RR_buf, 0, sizeof(RR_buf));
- always_memset(acc_buf, 0, sizeof(acc_buf));
- always_memset(aR_buf, 0, sizeof(aR_buf));
+ always_memset(buf, 0, n_len * 3);
}
/* output = input ^ exp % N */
@@ -623,8 +623,8 @@ static int bn_div_ex(struct LITE_BIGNUM *q,
{
uint32_t vtop;
int s, i, j;
- uint32_t vn[RSA_MAX_WORDS]; /* Normalized v */
- uint32_t un[RSA_MAX_WORDS + 1]; /* Normalized u */
+ uint32_t *vn; /* Normalized v */
+ uint32_t *un; /* Normalized u */
if (m < n || n <= 0)
return 0;
@@ -637,6 +637,10 @@ static int bn_div_ex(struct LITE_BIGNUM *q,
if (n == 1)
return bn_div_word_ex(q, r, u, m, vtop);
+ /* Allocate buffer for vn and un. */
+ vn = alloca((n + m + 1) * sizeof(v->d[0]));
+ un = vn + n; /* un size is m words. */
+
/* Compute shift factor to make v have high bit set */
s = count_leading_zeros(vtop);
vtop <<= s;