You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
236 lines
7.3 KiB
236 lines
7.3 KiB
/* Copyright (c) 2014 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-side functions for verified boot key structures
|
|
*/
|
|
|
|
#ifndef VBOOT_REFERENCE_HOST_KEY2_H_
|
|
#define VBOOT_REFERENCE_HOST_KEY2_H_
|
|
|
|
#include "2struct.h"
|
|
|
|
struct vb2_public_key;
|
|
|
|
/* Private key data, in-memory format for use in signing calls. */
|
|
struct vb2_private_key {
|
|
struct rsa_st *rsa_private_key; /* Private key data */
|
|
enum vb2_hash_algorithm hash_alg; /* Hash algorithm */
|
|
enum vb2_signature_algorithm sig_alg; /* Signature algorithm */
|
|
char *desc; /* Description */
|
|
struct vb2_guid guid; /* Key GUID */
|
|
};
|
|
|
|
/* Convert between enums and human-readable form. Terminated with {0, 0}. */
|
|
struct vb2_text_vs_enum {
|
|
const char *name;
|
|
unsigned int num;
|
|
};
|
|
|
|
/**
|
|
* @param table Table to search
|
|
* @param num Enum value to search for
|
|
* @return pointer to table entry or NULL if no match
|
|
*/
|
|
const struct vb2_text_vs_enum *vb2_lookup_by_num(
|
|
const struct vb2_text_vs_enum *table,
|
|
const unsigned int num);
|
|
|
|
/**
|
|
* @param table Table to search
|
|
* @param name String value to search for
|
|
* @return pointer to table entry or NULL if no match
|
|
*/
|
|
const struct vb2_text_vs_enum *vb2_lookup_by_name(
|
|
const struct vb2_text_vs_enum *table,
|
|
const char *name);
|
|
|
|
extern struct vb2_text_vs_enum vb2_text_vs_algorithm[];
|
|
extern struct vb2_text_vs_enum vb2_text_vs_sig[];
|
|
extern struct vb2_text_vs_enum vb2_text_vs_hash[];
|
|
|
|
/**
|
|
* Free a private key.
|
|
*
|
|
* @param key Key containing internal data to free.
|
|
*/
|
|
void vb2_private_key_free(struct vb2_private_key *key);
|
|
|
|
/**
|
|
* Unpack a private key from vb2_packed_private_key format.
|
|
*
|
|
* @param key_ptr Destination for newly allocated key; this must be
|
|
* freed with vb2_private_key_free().
|
|
* @param buf Source buffer containing packed key
|
|
* @param size Size of buffer in bytes
|
|
* @return VB2_SUCCESS, or non-zero error code if error.
|
|
*/
|
|
int vb2_private_key_unpack(struct vb2_private_key **key_ptr,
|
|
const uint8_t *buf,
|
|
uint32_t size);
|
|
|
|
/**
|
|
* Read a private key from vb2_packed_private_key format.
|
|
*
|
|
* @param key_ptr Destination for newly allocated key; this must be
|
|
* freed with vb2_private_key_free().
|
|
* @param filename File to read key data from.
|
|
* @return VB2_SUCCESS, or non-zero error code if error.
|
|
*/
|
|
int vb2_private_key_read(struct vb2_private_key **key_ptr,
|
|
const char *filename);
|
|
|
|
/**
|
|
* Read a private key from a .pem file.
|
|
*
|
|
* This only reads the internal data for the key. It does not set any of the
|
|
* other fields in *key_ptr, since those are not contained in the .pem file.
|
|
*
|
|
* @param key_ptr Destination for newly allocated key; this must be
|
|
* freed with vb2_private_key_free().
|
|
* @param filename File to read key data from.
|
|
* @return VB2_SUCCESS, or non-zero error code if error.
|
|
*/
|
|
int vb2_private_key_read_pem(struct vb2_private_key **key_ptr,
|
|
const char *filename);
|
|
|
|
/**
|
|
* Set the description of a private key.
|
|
*
|
|
* @param key Key to set description for
|
|
* @param desc Description string, or NULL if no description.
|
|
* @return VB2_SUCCESS, or non-zero error code if error.
|
|
*/
|
|
int vb2_private_key_set_desc(struct vb2_private_key *key, const char *desc);
|
|
|
|
/**
|
|
* Write a private key to vb2_packed_private_key format.
|
|
*
|
|
* @param key Key to write
|
|
* @param filename File to write key data to.
|
|
* @return VB2_SUCCESS, or non-zero error code if error.
|
|
*/
|
|
int vb2_private_key_write(const struct vb2_private_key *key,
|
|
const char *filename);
|
|
|
|
/**
|
|
* Get a private key for an unsigned hash
|
|
*
|
|
* @param key_ptr Destination for pointer to key. The key is statically
|
|
* allocated and must not be freed.
|
|
* @param hash_alg Hash algorithm to use
|
|
* @return VB2_SUCCESS, or non-zero error code if error.
|
|
*/
|
|
int vb2_private_key_hash(const struct vb2_private_key **key_ptr,
|
|
enum vb2_hash_algorithm hash_alg);
|
|
|
|
/**
|
|
* Allocate a public key buffer of sufficient size for the signature algorithm.
|
|
*
|
|
* This only initializes the sig_alg field and the guid field to an empty
|
|
* guid. It does not set any of the other fields in *key_ptr.
|
|
*
|
|
* @param key_ptr Destination for newly allocated key; this must be
|
|
* freed with vb2_public_key_free().
|
|
* @param sig_alg Signature algorithm for key.
|
|
* @return VB2_SUCCESS, or non-zero error code if error.
|
|
*/
|
|
int vb2_public_key_alloc(struct vb2_public_key **key_ptr,
|
|
enum vb2_signature_algorithm sig_alg);
|
|
|
|
/**
|
|
* Return the packed data for a key allocated with vb2_public_key_alloc().
|
|
*
|
|
* The packed data is in the same buffer, following the key struct and GUID.
|
|
*/
|
|
uint8_t *vb2_public_key_packed_data(struct vb2_public_key *key);
|
|
|
|
/**
|
|
* Free a public key allocated by one of the functions below.
|
|
*
|
|
* Note that this should ONLY be called for public keys allocated via one
|
|
* of those functions; public keys created or filled in other ways (such as
|
|
* vb2_unpack_key()) do not allocate memory for sub-fields in the same way.
|
|
*
|
|
* @param key Key to free
|
|
*/
|
|
void vb2_public_key_free(struct vb2_public_key *key);
|
|
|
|
/**
|
|
* Read a public key from a .keyb file.
|
|
*
|
|
* Guesses the signature algorithm based on the size of the .keyb file. Does
|
|
* not set the hash_alg, guid, or desc fields, since those are not contained in
|
|
* the .keyb file.
|
|
*
|
|
* @param key_ptr Destination for newly allocated key; this must be
|
|
* freed with vb2_public_key_free().
|
|
* @param filename File to read key from.
|
|
* @return VB2_SUCCESS, or non-zero error code if error.
|
|
*/
|
|
|
|
int vb2_public_key_read_keyb(struct vb2_public_key **key_ptr,
|
|
const char *filename);
|
|
|
|
/**
|
|
* Set the description of a public key.
|
|
*
|
|
* @param key Key to set description for
|
|
* @param desc Description string, or NULL if no description.
|
|
* @return VB2_SUCCESS, or non-zero error code if error.
|
|
*/
|
|
int vb2_public_key_set_desc(struct vb2_public_key *key, const char *desc);
|
|
|
|
/**
|
|
* Read a public key in vb2_packed_key format.
|
|
*
|
|
* @param key_ptr On success, points to the newly allocated key buffer.
|
|
* Caller is responsible for calling free() on this.
|
|
* @return VB2_SUCCESS, or non-zero if error.
|
|
*/
|
|
int vb2_packed_key_read(struct vb2_packed_key **key_ptr,
|
|
const char *filename);
|
|
|
|
/**
|
|
* Pack a public key into vb2_packed_key format.
|
|
*
|
|
* @param pubk Public key to pack
|
|
* @param key_ptr On success, points to a newly allocated packed key
|
|
* buffer. Caller is responsible for calling free() on
|
|
* this.
|
|
* @return VB2_SUCCESS, or non-zero if error.
|
|
*/
|
|
int vb2_public_key_pack(struct vb2_packed_key **key_ptr,
|
|
const struct vb2_public_key *pubk);
|
|
|
|
/**
|
|
* Get a public key for an unsigned hash.
|
|
*
|
|
* @param key Destination for key data.
|
|
* @param hash_alg Hash algorithm to use
|
|
* @return VB2_SUCCESS, or non-zero error code if error.
|
|
*/
|
|
int vb2_public_key_hash(struct vb2_public_key *key,
|
|
enum vb2_hash_algorithm hash_alg);
|
|
|
|
|
|
/**
|
|
* Return the signature algorithm implied by the bit length of an RSA key
|
|
*
|
|
* @param rsa RSA key
|
|
* @return vb2 signature algorithm
|
|
*/
|
|
enum vb2_signature_algorithm vb2_rsa_sig_alg(struct rsa_st *rsa);
|
|
|
|
/**
|
|
* Write a public key to the vb2_packed_key format.
|
|
*
|
|
* @param key Key to write
|
|
* @param filename File to write key data to.
|
|
* @return VB2_SUCCESS, or non-zero error code if error.
|
|
*/
|
|
int vb2_public_key_write(const struct vb2_public_key *key,
|
|
const char *filename);
|
|
|
|
#endif /* VBOOT_REFERENCE_HOST_KEY2_H_ */
|