This requires Tinycrypt 0.2.7.
Signed-off-by: Szymon Janc <szymon.janc@codecoup.pl>
diff --git a/boot/bootutil/src/image_ec256.c b/boot/bootutil/src/image_ec256.c
index e0e4f73..3c6fd7d 100644
--- a/boot/bootutil/src/image_ec256.c
+++ b/boot/bootutil/src/image_ec256.c
@@ -42,7 +42,7 @@
* Parse the public key used for signing.
*/
static int
-tinycrypt_import_key(EccPoint *pubkey, uint8_t *cp, uint8_t *end)
+tinycrypt_import_key(uint8_t *pubkey, uint8_t *cp, uint8_t *end)
{
size_t len;
mbedtls_asn1_buf alg;
@@ -79,8 +79,8 @@
return -9;
}
- ecc_bytes2native(pubkey->x, cp + 1);
- ecc_bytes2native(pubkey->y, cp + 1 + NUM_ECC_BYTES);
+ /* TODO avoid this copy? */
+ memcpy(pubkey, cp + 1, 2 * NUM_ECC_BYTES);
return 0;
}
@@ -90,22 +90,21 @@
* Verify the tag, and that the length is 32 bytes.
*/
static int
-tinycrypt_read_bigint(uint32_t i[NUM_ECC_DIGITS], uint8_t **cp, uint8_t *end)
+tinycrypt_read_bigint(uint8_t i[NUM_ECC_BYTES], uint8_t **cp, uint8_t *end)
{
size_t len;
- uint8_t bigint[NUM_ECC_BYTES];
if (mbedtls_asn1_get_tag(cp, end, &len, MBEDTLS_ASN1_INTEGER)) {
return -3;
}
+
if (len > NUM_ECC_BYTES) {
- memcpy(bigint, *cp + len - NUM_ECC_BYTES, NUM_ECC_BYTES);
+ memcpy(i, *cp + len - NUM_ECC_BYTES, NUM_ECC_BYTES);
} else {
- memset(bigint, 0, NUM_ECC_BYTES - len);
- memcpy(bigint + NUM_ECC_BYTES - len, *cp, len);
+ memset(i + NUM_ECC_BYTES, 0, NUM_ECC_BYTES - len);
+ memcpy(i + NUM_ECC_BYTES - len, *cp, len);
}
*cp += len;
- ecc_bytes2native(i, bigint);
return 0;
}
@@ -113,8 +112,7 @@
* Read in signature. Signature has r and s encoded as integers.
*/
static int
-tinycrypt_decode_sig(uint32_t r[NUM_ECC_DIGITS], uint32_t s[NUM_ECC_DIGITS],
- uint8_t *cp, uint8_t *end)
+tinycrypt_decode_sig(uint8_t signature[NUM_ECC_BYTES * 2], uint8_t *cp, uint8_t *end)
{
int rc;
size_t len;
@@ -127,11 +125,12 @@
if (cp + len > end) {
return -2;
}
- rc = tinycrypt_read_bigint(r, &cp, end);
+
+ rc = tinycrypt_read_bigint(signature, &cp, end);
if (rc) {
return -3;
}
- rc = tinycrypt_read_bigint(s, &cp, end);
+ rc = tinycrypt_read_bigint(signature + NUM_ECC_BYTES, &cp, end);
if (rc) {
return -4;
}
@@ -145,20 +144,19 @@
int rc;
uint8_t *cp;
uint8_t *end;
- EccPoint ctx;
- uint32_t r[NUM_ECC_DIGITS];
- uint32_t s[NUM_ECC_DIGITS];
- uint32_t hash_t[NUM_ECC_DIGITS];
+
+ uint8_t public_key[2 * NUM_ECC_BYTES];
+ uint8_t signature[2 * NUM_ECC_BYTES];
cp = (uint8_t *)bootutil_keys[key_id].key;
end = cp + *bootutil_keys[key_id].len;
- rc = tinycrypt_import_key(&ctx, cp, end);
+ rc = tinycrypt_import_key(public_key, cp, end);
if (rc) {
return -1;
}
- rc = tinycrypt_decode_sig(r, s, sig, sig + slen);
+ rc = tinycrypt_decode_sig(signature, sig, sig + slen);
if (rc) {
return -1;
}
@@ -170,8 +168,7 @@
return -1;
}
- ecc_bytes2native(hash_t, hash);
- rc = ecdsa_verify(&ctx, hash_t, r, s);
+ rc = uECC_verify(public_key, hash, NUM_ECC_BYTES, signature, uECC_secp256r1());
if (rc == 1) {
return 0;
} else {