aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cryptech.h3
-rw-r--r--rsa.c32
-rw-r--r--tests/test-rsa.c4
3 files changed, 13 insertions, 26 deletions
diff --git a/cryptech.h b/cryptech.h
index 81f23f5..d8f1208 100644
--- a/cryptech.h
+++ b/cryptech.h
@@ -641,8 +641,7 @@ extern hal_error_t hal_rsa_decrypt(hal_rsa_key_t key,
extern hal_error_t hal_rsa_key_gen(hal_rsa_key_t *key,
void *keybuf, const size_t keybuf_len,
const unsigned key_length,
- const unsigned long public_exponent);
-
+ const uint8_t * const public_exponent, const size_t public_exponent_len);
extern hal_error_t hal_rsa_key_to_der(hal_rsa_key_t key,
uint8_t *der, size_t *der_len, const size_t der_max);
diff --git a/rsa.c b/rsa.c
index 9fe2c47..28365ae 100644
--- a/rsa.c
+++ b/rsa.c
@@ -201,7 +201,7 @@ static hal_error_t create_blinding_factors(struct rsa_key *key, fp_int *bf, fp_i
{
assert(key != NULL && bf != NULL && ubf != NULL);
- uint8_t rnd[(fp_unsigned_bin_size(&key->n) + 7) & ~7];
+ uint8_t rnd[fp_unsigned_bin_size(&key->n)];
hal_error_t err = HAL_OK;
if ((err = hal_get_random(rnd, sizeof(rnd))) != HAL_OK)
@@ -443,7 +443,7 @@ static hal_error_t find_prime(unsigned prime_length, fp_int *e, fp_int *result)
hal_error_t hal_rsa_key_gen(hal_rsa_key_t *key_,
void *keybuf, const size_t keybuf_len,
const unsigned key_length,
- const unsigned long public_exponent)
+ const uint8_t * const public_exponent, const size_t public_exponent_len)
{
struct rsa_key *key = keybuf;
hal_error_t err = HAL_OK;
@@ -452,30 +452,16 @@ hal_error_t hal_rsa_key_gen(hal_rsa_key_t *key_,
if (key_ == NULL || keybuf == NULL || keybuf_len < sizeof(struct rsa_key))
return HAL_ERROR_BAD_ARGUMENTS;
- switch (key_length) {
- case bitsToBytes(1024):
- case bitsToBytes(2048):
- case bitsToBytes(4096):
- case bitsToBytes(8192):
- break;
- default:
- return HAL_ERROR_UNSUPPORTED_KEY;
- }
+ memset(keybuf, 0, keybuf_len);
+ key->type = HAL_RSA_PRIVATE;
+ fp_read_unsigned_bin(&key->e, (uint8_t *) public_exponent, public_exponent_len);
- switch (public_exponent) {
- case 0x010001:
- break;
- default:
+ if (key_length != bitsToBytes(1024) && key_length != bitsToBytes(2048) &&
+ key_length != bitsToBytes(4096) && key_length != bitsToBytes(8192))
return HAL_ERROR_UNSUPPORTED_KEY;
- }
- /*
- * Initialize key
- */
-
- memset(keybuf, 0, keybuf_len);
- key->type = HAL_RSA_PRIVATE;
- fp_set(&key->e, public_exponent);
+ if (fp_cmp_d(&key->e, 0x010001) != FP_EQ)
+ return HAL_ERROR_UNSUPPORTED_KEY;
/*
* Find a good pair of prime numbers.
diff --git a/tests/test-rsa.c b/tests/test-rsa.c
index 9b346b5..03ea8bb 100644
--- a/tests/test-rsa.c
+++ b/tests/test-rsa.c
@@ -133,7 +133,9 @@ static int test_gen(const char * const kind, const rsa_tc_t * const tc)
hal_error_t err = HAL_OK;
FILE *f;
- if ((err = hal_rsa_key_gen(&key1, keybuf1, sizeof(keybuf1), bitsToBytes(tc->size), 0x010001)) != HAL_OK) {
+ const uint8_t f4[] = { 0x01, 0x00, 0x01 };
+
+ if ((err = hal_rsa_key_gen(&key1, keybuf1, sizeof(keybuf1), bitsToBytes(tc->size), f4, sizeof(f4))) != HAL_OK) {
printf("RSA key generation failed: %s\n", hal_error_string(err));
return 0;
}