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>
diff --git a/host/lib/host_key.c b/host/lib/host_key.c
index e2736f9..c9efa85 100644
--- a/host/lib/host_key.c
+++ b/host/lib/host_key.c
@@ -201,39 +201,45 @@
 }
 
 
+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 */
-    return key;
-
-  } while(0);
+  if (PublicKeyLooksOkay(key, file_size))
+      return key;
 
   /* Error */
   free(key);
diff --git a/host/lib/include/host_key.h b/host/lib/include/host_key.h
index 018c25d..85aef24 100644
--- a/host/lib/include/host_key.h
+++ b/host/lib/include/host_key.h
@@ -52,6 +52,8 @@
  * 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().