Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(583)

Unified Diff: host/lib/host_key.c

Issue 2762009: Add vbutil_key (Closed) Base URL: ssh://gitrw.chromium.org/vboot_reference.git
Patch Set: Util to pack/unpack .vbpubk files Created 10 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « host/lib/host_common.c ('k') | host/lib/host_misc.c » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: host/lib/host_key.c
diff --git a/host/lib/host_key.c b/host/lib/host_key.c
index 00770db3b6e63e03b430b9e27fd90f370a9c5f44..388a2d4e8350f68ef0066779d5f0ac3cde359f3e 100644
--- a/host/lib/host_key.c
+++ b/host/lib/host_key.c
@@ -19,7 +19,7 @@
#include "host_key.h"
#include "cryptolib.h"
-#include "file_keys.h"
+#include "host_misc.h"
#include "utility.h"
#include "vboot_common.h"
@@ -80,6 +80,7 @@ void PublicKeyInit(VbPublicKey* key, uint8_t* key_data, uint64_t key_size) {
}
+/* Allocate a new public key with space for a [key_size] byte key. */
VbPublicKey* PublicKeyAlloc(uint64_t key_size, uint64_t algorithm,
uint64_t version) {
VbPublicKey* key = (VbPublicKey*)Malloc(sizeof(VbPublicKey) + key_size);
@@ -94,6 +95,9 @@ VbPublicKey* PublicKeyAlloc(uint64_t key_size, uint64_t algorithm,
}
+/* Copy a public key from [src] to [dest].
+ *
+ * Returns zero if success, non-zero if error. */
int PublicKeyCopy(VbPublicKey* dest, const VbPublicKey* src) {
if (dest->key_size < src->key_size)
return 1;
@@ -106,28 +110,31 @@ int PublicKeyCopy(VbPublicKey* dest, const VbPublicKey* src) {
}
-VbPublicKey* PublicKeyRead(const char* filename, uint64_t algorithm,
- uint64_t version) {
-
+VbPublicKey* PublicKeyReadKeyb(const char* filename, uint64_t algorithm,
+ uint64_t version) {
VbPublicKey* key;
uint8_t* key_data;
uint64_t key_size;
if (algorithm >= kNumAlgorithms) {
- debug("PublicKeyRead() called with invalid algorithm!\n");
+ debug("PublicKeyReadKeyb() called with invalid algorithm!\n");
return NULL;
}
if (version > 0xFFFF) {
/* Currently, TPM only supports 16-bit version */
- debug("PublicKeyRead() called with invalid version!\n");
+ debug("PublicKeyReadKeyb() called with invalid version!\n");
return NULL;
}
- key_data = BufferFromFile(filename, &key_size);
+ key_data = ReadFile(filename, &key_size);
if (!key_data)
return NULL;
- /* TODO: sanity-check key length based on algorithm */
+ if (RSAProcessedKeySize(algorithm) != key_size) {
+ debug("PublicKeyReadKeyb() wrong key size for algorithm\n");
+ Free(key_data);
+ return NULL;
+ }
key = PublicKeyAlloc(key_size, algorithm, version);
if (!key) {
@@ -139,3 +146,78 @@ VbPublicKey* PublicKeyRead(const char* filename, uint64_t algorithm,
Free(key_data);
return key;
}
+
+
+VbPublicKey* PublicKeyRead(const char* filename) {
+ VbPublicKey* key;
+ uint64_t file_size;
+
+ key = (VbPublicKey*)ReadFile(filename, &file_size);
+ if (!key)
+ return NULL;
+
+ do {
+ /* Sanity-check key data */
+ if (0 != VerifyPublicKeyInside(key, file_size, key)) {
+ debug("PublicKeyRead() not a VbPublicKey\n");
+ break;
+ }
+ if (key->algorithm >= kNumAlgorithms) {
+ debug("PublicKeyRead() invalid algorithm\n");
+ break;
+ }
+ if (key->key_version > 0xFFFF) {
+ debug("PublicKeyRead() invalid version\n");
+ break; /* Currently, TPM only supports 16-bit version */
+ }
+ if (RSAProcessedKeySize(key->algorithm) != key->key_size) {
+ debug("PublicKeyRead() wrong key size for algorithm\n");
+ break;
+ }
+
+ /* Success */
+ return key;
+
+ } while(0);
+
+ /* Error */
+ Free(key);
+ return NULL;
+}
+
+
+int PublicKeyWrite(const char* filename, const VbPublicKey* key) {
+ VbPublicKey* kcopy = NULL;
+ FILE* f = NULL;
+ int rv = 1;
+
+ do {
+ f = fopen(filename, "wb");
+ if (!f) {
+ debug("PublicKeyWrite() unable to open file %s\n", filename);
+ break;
+ }
+
+ /* Copy the key, so its data is contiguous with the header */
+ kcopy = PublicKeyAlloc(key->key_size, 0, 0);
+ if (!kcopy || 0 != PublicKeyCopy(kcopy, key))
+ break;
+
+ if (1 != fwrite(kcopy, kcopy->key_offset + kcopy->key_size, 1, f))
+ break;
+
+ /* Success */
+ rv = 0;
+
+ } while(0);
+
+ if (kcopy)
+ Free(kcopy);
+ if (f)
+ fclose(f);
+
+ if (0 != rv)
+ unlink(filename); /* Delete any partial file */
+
+ return rv;
+}
« no previous file with comments | « host/lib/host_common.c ('k') | host/lib/host_misc.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698