159c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved. 259c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * Use of this source code is governed by a BSD-style license that can be 359c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * found in the LICENSE file. 459c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * 559c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * Host-side functions for verified boot key structures 659c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler */ 759c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler 859c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler#ifndef VBOOT_REFERENCE_HOST_KEY2_H_ 959c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler#define VBOOT_REFERENCE_HOST_KEY2_H_ 1059c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler 1159c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler#include "2struct.h" 1259c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler 13fc73f087653ee67193a9f2b897433db2cd532f8cRandall Spanglerstruct vb2_public_key; 14fc73f087653ee67193a9f2b897433db2cd532f8cRandall Spangler 1559c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler/* Private key data, in-memory format for use in signing calls. */ 1659c29202d2d67b97f587152b5457ed89f7430a77Randall Spanglerstruct vb2_private_key { 1759c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler struct rsa_st *rsa_private_key; /* Private key data */ 1859c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler enum vb2_hash_algorithm hash_alg; /* Hash algorithm */ 1959c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler enum vb2_signature_algorithm sig_alg; /* Signature algorithm */ 2059c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler char *desc; /* Description */ 2159c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler struct vb2_guid guid; /* Key GUID */ 2259c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler}; 2359c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler 244e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson/* Convert between enums and human-readable form. Terminated with {0, 0}. */ 254e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardsonstruct vb2_text_vs_enum { 264e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson const char *name; 274e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson unsigned int num; 284e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson}; 294e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson 304e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson/** 314e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * @param table Table to search 324e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * @param num Enum value to search for 334e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * @return pointer to table entry or NULL if no match 344e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson */ 354e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardsonconst struct vb2_text_vs_enum *vb2_lookup_by_num( 364e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson const struct vb2_text_vs_enum *table, 374e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson const unsigned int num); 384e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson 394e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson/** 404e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * @param table Table to search 414e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * @param name String value to search for 424e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * @return pointer to table entry or NULL if no match 434e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson */ 444e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardsonconst struct vb2_text_vs_enum *vb2_lookup_by_name( 454e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson const struct vb2_text_vs_enum *table, 464e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson const char *name); 474e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson 484e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardsonextern struct vb2_text_vs_enum vb2_text_vs_algorithm[]; 494e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardsonextern struct vb2_text_vs_enum vb2_text_vs_sig[]; 504e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardsonextern struct vb2_text_vs_enum vb2_text_vs_hash[]; 514e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson 5259c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler/** 5359c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * Free a private key. 5459c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * 5559c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param key Key containing internal data to free. 5659c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler */ 5759c29202d2d67b97f587152b5457ed89f7430a77Randall Spanglervoid vb2_private_key_free(struct vb2_private_key *key); 5859c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler 5959c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler/** 60308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler * Unpack a private key from vb2_packed_private_key format. 6159c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * 6259c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param key_ptr Destination for newly allocated key; this must be 6359c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * freed with vb2_private_key_free(). 6459c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param buf Source buffer containing packed key 6559c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param size Size of buffer in bytes 6659c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @return VB2_SUCCESS, or non-zero error code if error. 6759c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler */ 6859c29202d2d67b97f587152b5457ed89f7430a77Randall Spanglerint vb2_private_key_unpack(struct vb2_private_key **key_ptr, 6959c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler const uint8_t *buf, 7059c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler uint32_t size); 7159c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler 7259c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler/** 73308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler * Read a private key from vb2_packed_private_key format. 7459c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * 7559c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param key_ptr Destination for newly allocated key; this must be 7659c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * freed with vb2_private_key_free(). 7759c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param filename File to read key data from. 7859c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @return VB2_SUCCESS, or non-zero error code if error. 7959c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler */ 8059c29202d2d67b97f587152b5457ed89f7430a77Randall Spanglerint vb2_private_key_read(struct vb2_private_key **key_ptr, 8159c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler const char *filename); 8259c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler 8359c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler/** 8459c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * Read a private key from a .pem file. 8559c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * 8659c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * This only reads the internal data for the key. It does not set any of the 8759c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * other fields in *key_ptr, since those are not contained in the .pem file. 8859c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * 8959c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param key_ptr Destination for newly allocated key; this must be 9059c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * freed with vb2_private_key_free(). 9159c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param filename File to read key data from. 9259c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @return VB2_SUCCESS, or non-zero error code if error. 9359c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler */ 9459c29202d2d67b97f587152b5457ed89f7430a77Randall Spanglerint vb2_private_key_read_pem(struct vb2_private_key **key_ptr, 9559c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler const char *filename); 9659c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler 9759c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler/** 9859c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * Set the description of a private key. 9959c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * 10059c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param key Key to set description for 10159c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param desc Description string, or NULL if no description. 10259c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @return VB2_SUCCESS, or non-zero error code if error. 10359c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler */ 10459c29202d2d67b97f587152b5457ed89f7430a77Randall Spanglerint vb2_private_key_set_desc(struct vb2_private_key *key, const char *desc); 10559c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler 10659c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler/** 107308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler * Write a private key to vb2_packed_private_key format. 10859c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * 10959c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param key Key to write 11059c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param filename File to write key data to. 11159c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @return VB2_SUCCESS, or non-zero error code if error. 11259c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler */ 11359c29202d2d67b97f587152b5457ed89f7430a77Randall Spanglerint vb2_private_key_write(const struct vb2_private_key *key, 11459c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler const char *filename); 11559c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler 11659c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler/** 117fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler * Get a private key for an unsigned hash 118fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler * 119fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler * @param key_ptr Destination for pointer to key. The key is statically 120fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler * allocated and must not be freed. 121fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler * @param hash_alg Hash algorithm to use 122fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler * @return VB2_SUCCESS, or non-zero error code if error. 123fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler */ 124fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spanglerint vb2_private_key_hash(const struct vb2_private_key **key_ptr, 125fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler enum vb2_hash_algorithm hash_alg); 126fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler 127fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler/** 1284e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * Allocate a public key buffer of sufficient size for the signature algorithm. 1294e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * 1304e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * This only initializes the sig_alg field and the guid field to an empty 1314e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * guid. It does not set any of the other fields in *key_ptr. 1324e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * 1334e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * @param key_ptr Destination for newly allocated key; this must be 1344e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * freed with vb2_public_key_free(). 1354e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * @param sig_alg Signature algorithm for key. 1364e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * @return VB2_SUCCESS, or non-zero error code if error. 1374e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson */ 1384e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardsonint vb2_public_key_alloc(struct vb2_public_key **key_ptr, 1394e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson enum vb2_signature_algorithm sig_alg); 1404e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson 1414e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson/** 1424e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * Return the packed data for a key allocated with vb2_public_key_alloc(). 1434e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * 1444e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * The packed data is in the same buffer, following the key struct and GUID. 1454e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson */ 1464e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardsonuint8_t *vb2_public_key_packed_data(struct vb2_public_key *key); 1474e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson 1484e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson/** 14959c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * Free a public key allocated by one of the functions below. 15059c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * 15159c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * Note that this should ONLY be called for public keys allocated via one 15259c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * of those functions; public keys created or filled in other ways (such as 153308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler * vb2_unpack_key()) do not allocate memory for sub-fields in the same way. 15459c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * 15559c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param key Key to free 15659c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler */ 15759c29202d2d67b97f587152b5457ed89f7430a77Randall Spanglervoid vb2_public_key_free(struct vb2_public_key *key); 15859c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler 15959c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler/** 16059c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * Read a public key from a .keyb file. 16159c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * 16259c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * Guesses the signature algorithm based on the size of the .keyb file. Does 16359c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * not set the hash_alg, guid, or desc fields, since those are not contained in 16459c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * the .keyb file. 16559c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * 16659c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param key_ptr Destination for newly allocated key; this must be 16759c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * freed with vb2_public_key_free(). 16859c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param filename File to read key from. 16959c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @return VB2_SUCCESS, or non-zero error code if error. 17059c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler */ 17159c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler 17259c29202d2d67b97f587152b5457ed89f7430a77Randall Spanglerint vb2_public_key_read_keyb(struct vb2_public_key **key_ptr, 17359c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler const char *filename); 17459c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler 17559c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler/** 17659c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * Set the description of a public key. 17759c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * 17859c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param key Key to set description for 17959c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param desc Description string, or NULL if no description. 18059c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @return VB2_SUCCESS, or non-zero error code if error. 18159c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler */ 18259c29202d2d67b97f587152b5457ed89f7430a77Randall Spanglerint vb2_public_key_set_desc(struct vb2_public_key *key, const char *desc); 18359c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler 18459c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler/** 185308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler * Read a public key in vb2_packed_key format. 18659c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * 18759c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param key_ptr On success, points to the newly allocated key buffer. 18859c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * Caller is responsible for calling free() on this. 18959c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @return VB2_SUCCESS, or non-zero if error. 19059c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler */ 191308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spanglerint vb2_packed_key_read(struct vb2_packed_key **key_ptr, 19259c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler const char *filename); 19359c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler 19459c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler/** 195308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spangler * Pack a public key into vb2_packed_key format. 19659c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * 19759c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param pubk Public key to pack 19859c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @param key_ptr On success, points to a newly allocated packed key 19959c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * buffer. Caller is responsible for calling free() on 20059c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * this. 20159c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler * @return VB2_SUCCESS, or non-zero if error. 20259c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler */ 203308d2540929cd95e2a565be95ce0b1d45d2fbed2Randall Spanglerint vb2_public_key_pack(struct vb2_packed_key **key_ptr, 20459c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler const struct vb2_public_key *pubk); 20559c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler 206fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler/** 207fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler * Get a public key for an unsigned hash. 208fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler * 209fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler * @param key Destination for key data. 210fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler * @param hash_alg Hash algorithm to use 211fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler * @return VB2_SUCCESS, or non-zero error code if error. 212fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler */ 213fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spanglerint vb2_public_key_hash(struct vb2_public_key *key, 214fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler enum vb2_hash_algorithm hash_alg); 215fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler 216fb9a216dd677d97f3d6963f668a9b84d349ef339Randall Spangler 2174e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson/** 2184e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * Return the signature algorithm implied by the bit length of an RSA key 2194e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * 2204e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * @param rsa RSA key 2214e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * @return vb2 signature algorithm 2224e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson */ 2234e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardsonenum vb2_signature_algorithm vb2_rsa_sig_alg(struct rsa_st *rsa); 2244e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson 2254e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson/** 2264e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * Write a public key to the vb2_packed_key format. 2274e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * 2284e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * @param key Key to write 2294e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * @param filename File to write key data to. 2304e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson * @return VB2_SUCCESS, or non-zero error code if error. 2314e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson */ 2324e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardsonint vb2_public_key_write(const struct vb2_public_key *key, 2334e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson const char *filename); 2344e4c19602edf3834b50d66d3ba067e895aca6fa0Bill Richardson 23559c29202d2d67b97f587152b5457ed89f7430a77Randall Spangler#endif /* VBOOT_REFERENCE_HOST_KEY2_H_ */ 236