Home | History | Annotate | Download | only in include
      1 /* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
      2  * Use of this source code is governed by a BSD-style license that can be
      3  * found in the LICENSE file.
      4  *
      5  * Common functions between firmware and kernel verified boot.
      6  */
      7 
      8 #ifndef VBOOT_REFERENCE_VB2_COMMON_H_
      9 #define VBOOT_REFERENCE_VB2_COMMON_H_
     10 
     11 #include "2api.h"
     12 #include "2common.h"
     13 #include "2return_codes.h"
     14 #include "2sha.h"
     15 #include "2struct.h"
     16 #include "vb2_struct.h"
     17 
     18 /*
     19  * Helper functions to get data pointed to by a public key or signature.
     20  */
     21 
     22 const uint8_t *vb2_packed_key_data(const struct vb2_packed_key *key);
     23 uint8_t *vb2_signature_data(struct vb2_signature *sig);
     24 
     25 /**
     26  * Verify the data pointed to by a subfield is inside the parent data.
     27  *
     28  * The subfield has a header pointed to by member, and a separate data
     29  * field at an offset relative to the header.  That is:
     30  *
     31  *   struct parent {
     32  *     (possibly other parent fields)
     33  *     struct member {
     34  *        (member header fields)
     35  *     };
     36  *     (possibly other parent fields)
     37  *   };
     38  *   (possibly some other parent data)
     39  *   (member data)
     40  *   (possibly some other parent data)
     41  *
     42  * @param parent		Parent data
     43  * @param parent_size		Parent size in bytes
     44  * @param member		Subfield header
     45  * @param member_size		Size of subfield header in bytes
     46  * @param member_data_offset	Offset of member data from start of member
     47  * @param member_data_size	Size of member data in bytes
     48  * @return VB2_SUCCESS, or non-zero if error.
     49  */
     50 int vb2_verify_member_inside(const void *parent, size_t parent_size,
     51 			     const void *member, size_t member_size,
     52 			     ptrdiff_t member_data_offset,
     53 			     size_t member_data_size);
     54 
     55 /**
     56  * Verify a signature is fully contained in its parent data
     57  *
     58  * @param parent	Parent data
     59  * @param parent_size	Parent size in bytes
     60  * @param sig		Signature pointer
     61  * @return VB2_SUCCESS, or non-zero if error.
     62  */
     63 int vb2_verify_signature_inside(const void *parent,
     64 				uint32_t parent_size,
     65 				const struct vb2_signature *sig);
     66 
     67 
     68 /**
     69  * Verify a packed key is fully contained in its parent data
     70  *
     71  * @param parent	Parent data
     72  * @param parent_size	Parent size in bytes
     73  * @param key		Packed key pointer
     74  * @return VB2_SUCCESS, or non-zero if error.
     75  */
     76 int vb2_verify_packed_key_inside(const void *parent,
     77 				 uint32_t parent_size,
     78 				 const struct vb2_packed_key *key);
     79 
     80 /**
     81  * Unpack a vboot1-format key for use in verification
     82  *
     83  * The elements of the unpacked key will point into the source buffer, so don't
     84  * free the source buffer until you're done with the key.
     85  *
     86  * @param key		Destintion for unpacked key
     87  * @param buf		Source buffer containing packed key
     88  * @param size		Size of buffer in bytes
     89  * @return VB2_SUCCESS, or non-zero error code if error.
     90  */
     91 int vb2_unpack_key(struct vb2_public_key *key,
     92 		   const uint8_t *buf,
     93 		   uint32_t size);
     94 
     95 /**
     96  * Verify a signature against an expected hash digest.
     97  *
     98  * @param key		Key to use in signature verification
     99  * @param sig		Signature to verify (may be destroyed in process)
    100  * @param digest	Digest of signed data
    101  * @param wb		Work buffer
    102  * @return VB2_SUCCESS, or non-zero if error.
    103  */
    104 int vb2_verify_digest(const struct vb2_public_key *key,
    105 		      struct vb2_signature *sig,
    106 		      const uint8_t *digest,
    107 		      const struct vb2_workbuf *wb);
    108 
    109 /**
    110  * Verify data matches signature.
    111  *
    112  * @param data		Data to verify
    113  * @param size		Size of data buffer.  Note that amount of data to
    114  *			actually validate is contained in sig->data_size.
    115  * @param sig		Signature of data (destroyed in process)
    116  * @param key		Key to use to validate signature
    117  * @param wb		Work buffer
    118  * @return VB2_SUCCESS, or non-zero error code if error.
    119  */
    120 int vb2_verify_data(const uint8_t *data,
    121 		    uint32_t size,
    122 		    struct vb2_signature *sig,
    123 		    const struct vb2_public_key *key,
    124 		    const struct vb2_workbuf *wb);
    125 
    126 /**
    127  * Check the sanity of a key block using a public key.
    128  *
    129  * Header fields are also checked for sanity.  Does not verify key index or key
    130  * block flags.  Signature inside block is destroyed during check.
    131  *
    132  * @param block		Key block to verify
    133  * @param size		Size of key block buffer
    134  * @param key		Key to use to verify block
    135  * @param wb		Work buffer
    136  * @return VB2_SUCCESS, or non-zero error code if error.
    137  */
    138 int vb2_verify_keyblock(struct vb2_keyblock *block,
    139 			uint32_t size,
    140 			const struct vb2_public_key *key,
    141 			const struct vb2_workbuf *wb);
    142 
    143 /**
    144  * Check the sanity of a firmware preamble using a public key.
    145  *
    146  * The signature in the preamble is destroyed during the check.
    147  *
    148  * @param preamble     	Preamble to verify
    149  * @param size		Size of preamble buffer
    150  * @param key		Key to use to verify preamble
    151  * @param wb		Work buffer
    152  * @return VB2_SUCCESS, or non-zero error code if error.
    153  */
    154 int vb2_verify_fw_preamble(struct vb2_fw_preamble *preamble,
    155 			   uint32_t size,
    156 			   const struct vb2_public_key *key,
    157 			   const struct vb2_workbuf *wb);
    158 
    159 #endif  /* VBOOT_REFERENCE_VB2_COMMON_H_ */
    160