diff options
author | Paul Selkirk <paul@psgd.org> | 2018-09-19 17:09:56 -0400 |
---|---|---|
committer | Paul Selkirk <paul@psgd.org> | 2018-09-19 17:09:56 -0400 |
commit | a4469079c753ff2c3146704f1e4eec3e3e1bb30b (patch) | |
tree | 99b35bb1a3b834aa42825c132703d49b9589dd1c | |
parent | 7219e78b554a7b7e792a344b0c6cf133affe88b2 (diff) |
Make hal_core_alloc2 a little smarter.hal_core_alloc2-fix
Currently the only use of hal_core_alloc2 is to allocate two modexp cores.
If the bitstream only has one, we'd allocate that one, then try to allocate
it again, and spin forever.
Added a check for that, and let rsa_crt fall back to trying with one modexp
core if it can't find two.
-rw-r--r-- | core.c | 7 | ||||
-rw-r--r-- | rsa.c | 10 |
2 files changed, 16 insertions, 1 deletions
@@ -254,6 +254,13 @@ hal_error_t hal_core_alloc2(const char *name1, hal_core_t **pcore1, hal_core_lru { const int clear = pcore1 != NULL && *pcore1 == NULL; + if (name1 == name2 || strcmp(name1, name2) == 0) { + hal_core_t *core1; + if (((core1 = hal_core_find(name1, NULL)) == NULL) || + (hal_core_find(name1, core1) == NULL)) + return HAL_ERROR_CORE_NOT_FOUND; + } + for (;;) { hal_error_t err = hal_core_alloc_no_wait(name1, pcore1, pomace1); @@ -539,7 +539,15 @@ static hal_error_t rsa_crt(hal_core_t *core1, hal_core_t *core2, hal_rsa_key_t * */ if ((err = modexp2(precalc, msg, core1, key->dP, key->p, m1, key->pC, sizeof(key->pC), key->pF, sizeof(key->pF), - core2, key->dQ, key->q, m2, key->qC, sizeof(key->qC), key->qF, sizeof(key->qF))) != HAL_OK) + core2, key->dQ, key->q, m2, key->qC, sizeof(key->qC), key->qF, sizeof(key->qF))) == HAL_ERROR_CORE_NOT_FOUND) { + /* Couldn't get two modexp cores, fall back to trying with one. */ + if ((err = modexp(core1, precalc, msg, key->dP, key->p, m1, + key->pC, sizeof(key->pC), key->pF, sizeof(key->pF))) != HAL_OK || + (err = modexp(core1, precalc, msg, key->dQ, key->q, m2, + key->qC, sizeof(key->qC), key->qF, sizeof(key->qF))) != HAL_OK) + goto fail; + } + else if (err != HAL_OK) goto fail; if (precalc) |