Index: src/platform/vboot_reference/crypto/rsa_utility.c |
diff --git a/src/platform/vboot_reference/crypto/rsa_utility.c b/src/platform/vboot_reference/crypto/rsa_utility.c |
index e0071c16d48b53d7e67bfd76fbd68002503b333f..9b419d03b66e81ef1e47f399c975bf3168e0bdb4 100644 |
--- a/src/platform/vboot_reference/crypto/rsa_utility.c |
+++ b/src/platform/vboot_reference/crypto/rsa_utility.c |
@@ -20,6 +20,13 @@ int RSAProcessedKeySize(int algorithm) { |
return (2 * key_len + sizeof(int) + sizeof(uint32_t)); |
} |
+RSAPublicKey* RSAPublicKeyNew(void) { |
+ RSAPublicKey* key = (RSAPublicKey*) Malloc(sizeof(RSAPublicKey)); |
+ key->n = NULL; |
+ key->rr = NULL; |
+ return key; |
+} |
+ |
void RSAPublicKeyFree(RSAPublicKey* key) { |
if (key) { |
Free(key->n); |
@@ -29,15 +36,24 @@ void RSAPublicKeyFree(RSAPublicKey* key) { |
} |
RSAPublicKey* RSAPublicKeyFromBuf(const uint8_t* buf, int len) { |
- RSAPublicKey* key = (RSAPublicKey*) Malloc(sizeof(RSAPublicKey)); |
+ RSAPublicKey* key = RSAPublicKeyNew(); |
MemcpyState st; |
int key_len; |
st.remaining_buf = (uint8_t*) buf; |
st.remaining_len = len; |
- |
StatefulMemcpy(&st, &key->len, sizeof(key->len)); |
key_len = key->len * sizeof(uint32_t); /* key length in bytes. */ |
+ |
+ /* Sanity Check the key length. */ |
+ if (RSA1024NUMBYTES != key_len && |
+ RSA2048NUMBYTES != key_len && |
+ RSA4096NUMBYTES != key_len && |
+ RSA8192NUMBYTES != key_len) { |
+ RSAPublicKeyFree(key); |
+ return NULL; |
+ } |
+ |
key->n = (uint32_t*) Malloc(key_len); |
key->rr = (uint32_t*) Malloc(key_len); |
@@ -45,9 +61,7 @@ RSAPublicKey* RSAPublicKeyFromBuf(const uint8_t* buf, int len) { |
StatefulMemcpy(&st, key->n, key_len); |
StatefulMemcpy(&st, key->rr, key_len); |
if (st.remaining_len != 0) { /* Underrun or overrun. */ |
- Free(key->n); |
- Free(key->rr); |
- Free(key); |
+ RSAPublicKeyFree(key); |
return NULL; |
} |