futility: add separate check function for VPbublicKey

Provide a PublicKeyLooksOkay() function to sanity-check VbPublicKey structs.
This was just part of PublicKeyRead(), but I want to separate the reading
from the checking.

BUG=chromium:224734
BRANCH=ToT
TEST=make runtests

Change-Id: I1dd808e623e2a7fdc2789e02305619111a7b01e6
Signed-off-by: Bill Richardson <wfrichar@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/214621
Reviewed-by: Randall Spangler <rspangler@chromium.org>
This commit is contained in:
Bill Richardson
2014-08-27 15:37:47 -07:00
committed by chrome-internal-fetch
parent 0e6ae29eec
commit f16ed87879
2 changed files with 33 additions and 25 deletions

View File

@@ -201,40 +201,46 @@ VbPublicKey* PublicKeyReadKeyb(const char* filename, uint64_t algorithm,
}
int PublicKeyLooksOkay(VbPublicKey *key, uint64_t file_size)
{
uint64_t key_size;
/* Sanity-check key data */
if (0 != VerifyPublicKeyInside(key, file_size, key)) {
VBDEBUG(("PublicKeyRead() not a VbPublicKey\n"));
return 0;
}
if (key->algorithm >= kNumAlgorithms) {
VBDEBUG(("PublicKeyRead() invalid algorithm\n"));
return 0;
}
if (key->key_version > 0xFFFF) {
VBDEBUG(("PublicKeyRead() invalid version\n"));
return 0; /* Currently, TPM only supports 16-bit version */
}
if (!RSAProcessedKeySize(key->algorithm, &key_size) ||
key_size != key->key_size) {
VBDEBUG(("PublicKeyRead() wrong key size for algorithm\n"));
return 0;
}
/* Success */
return 1;
}
VbPublicKey* PublicKeyRead(const char* filename) {
VbPublicKey* key;
uint64_t file_size;
uint64_t key_size;
key = (VbPublicKey*)ReadFile(filename, &file_size);
if (!key)
return NULL;
do {
/* Sanity-check key data */
if (0 != VerifyPublicKeyInside(key, file_size, key)) {
VBDEBUG(("PublicKeyRead() not a VbPublicKey\n"));
break;
}
if (key->algorithm >= kNumAlgorithms) {
VBDEBUG(("PublicKeyRead() invalid algorithm\n"));
break;
}
if (key->key_version > 0xFFFF) {
VBDEBUG(("PublicKeyRead() invalid version\n"));
break; /* Currently, TPM only supports 16-bit version */
}
if (!RSAProcessedKeySize(key->algorithm, &key_size) ||
key_size != key->key_size) {
VBDEBUG(("PublicKeyRead() wrong key size for algorithm\n"));
break;
}
/* Success */
if (PublicKeyLooksOkay(key, file_size))
return key;
} while(0);
/* Error */
free(key);
return NULL;

View File

@@ -52,6 +52,8 @@ VbPublicKey* PublicKeyAlloc(uint64_t key_size, uint64_t algorithm,
* Returns NULL if error. */
VbPublicKey* PublicKeyRead(const char* filename);
/* Return true if the public key struct appears correct. */
int PublicKeyLooksOkay(VbPublicKey *key, uint64_t file_size);
/* Read a public key from a .keyb file. Caller owns the returned
* pointer, and must free it with Free().