summaryrefslogtreecommitdiff
path: root/host/lib/host_key2.c
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/host_key2.c')
-rw-r--r--host/lib/host_key2.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/host/lib/host_key2.c b/host/lib/host_key2.c
new file mode 100644
index 00000000..28f02af5
--- /dev/null
+++ b/host/lib/host_key2.c
@@ -0,0 +1,105 @@
+/* Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * Host functions for keys.
+ */
+
+/* TODO: change all 'return 0', 'return 1' into meaningful return codes */
+
+#include <openssl/pem.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "2sysincludes.h"
+#include "2common.h"
+#include "2rsa.h"
+#include "2sha.h"
+#include "cryptolib.h"
+#include "host_common.h"
+#include "host_key.h"
+#include "host_key2.h"
+#include "host_misc.h"
+#include "vb2_common.h"
+#include "vboot_common.h"
+
+struct vb2_private_key *vb2_read_private_key(const char *filename)
+{
+ uint8_t *buf = NULL;
+ uint32_t bufsize = 0;
+ if (VB2_SUCCESS != vb2_read_file(filename, &buf, &bufsize)) {
+ VbExError("unable to read from file %s\n", filename);
+ return NULL;
+ }
+
+ struct vb2_private_key *key =
+ (struct vb2_private_key *)calloc(sizeof(*key), 1);
+ if (!key) {
+ VbExError("Unable to allocate private key\n");
+ free(buf);
+ return NULL;
+ }
+
+ uint64_t alg = *(uint64_t *)buf;
+ key->hash_alg = vb2_crypto_to_hash(alg);
+ key->sig_alg = vb2_crypto_to_signature(alg);
+ const unsigned char *start = buf + sizeof(alg);
+
+ key->rsa_private_key =
+ d2i_RSAPrivateKey(0, &start, bufsize - sizeof(alg));
+
+ if (!key->rsa_private_key) {
+ VbExError("Unable to parse RSA private key\n");
+ free(buf);
+ free(key);
+ return NULL;
+ }
+
+ free(buf);
+ return key;
+}
+
+struct vb2_private_key *vb2_read_private_key_pem(
+ const char* filename,
+ enum vb2_crypto_algorithm algorithm)
+{
+ RSA *rsa_key;
+ FILE *f;
+
+ if (algorithm >= VB2_ALG_COUNT) {
+ VB2_DEBUG("%s() called with invalid algorithm!\n",
+ __FUNCTION__);
+ return NULL;
+ }
+
+ /* Read private key */
+ f = fopen(filename, "r");
+ if (!f) {
+ VB2_DEBUG("%s(): Couldn't open key file: %s\n",
+ __FUNCTION__, filename);
+ return NULL;
+ }
+ rsa_key = PEM_read_RSAPrivateKey(f, NULL, NULL, NULL);
+ fclose(f);
+ if (!rsa_key) {
+ VB2_DEBUG("%s(): Couldn't read private key from file: %s\n",
+ __FUNCTION__, filename);
+ return NULL;
+ }
+
+ /* Store key and algorithm in our struct */
+ struct vb2_private_key *key =
+ (struct vb2_private_key *)calloc(sizeof(*key), 1);
+ if (!key) {
+ RSA_free(rsa_key);
+ return NULL;
+ }
+ key->rsa_private_key = rsa_key;
+ key->hash_alg = vb2_crypto_to_hash(algorithm);
+ key->sig_alg = vb2_crypto_to_signature(algorithm);
+
+ /* Return the key */
+ return key;
+}