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 
      6 #ifndef VBOOT_REFERENCE_2SHA_H_
      7 #define VBOOT_REFERENCE_2SHA_H_
      8 
      9 #include "2crypto.h"
     10 #include "2struct.h"
     11 
     12 /* Hash algorithms may be disabled individually to save code space */
     13 
     14 #ifndef VB2_SUPPORT_SHA1
     15 #define VB2_SUPPORT_SHA1 1
     16 #endif
     17 
     18 #ifndef VB2_SUPPORT_SHA256
     19 #define VB2_SUPPORT_SHA256 1
     20 #endif
     21 
     22 #ifndef VB2_SUPPORT_SHA512
     23 #define VB2_SUPPORT_SHA512 1
     24 #endif
     25 
     26 #define VB2_SHA1_DIGEST_SIZE 20
     27 #define VB2_SHA1_BLOCK_SIZE 64
     28 
     29 /* Context structs for hash algorithms */
     30 
     31 struct vb2_sha1_context {
     32 	uint32_t count;
     33 	uint32_t state[5];
     34 #if defined(HAVE_ENDIAN_H) && defined(HAVE_LITTLE_ENDIAN)
     35 	union {
     36 		uint8_t b[VB2_SHA1_BLOCK_SIZE];
     37 		uint32_t w[VB2_SHA1_BLOCK_SIZE / sizeof(uint32_t)];
     38 	} buf;
     39 #else
     40 	uint8_t buf[VB2_SHA1_BLOCK_SIZE];
     41 #endif
     42 };
     43 
     44 #define VB2_SHA256_DIGEST_SIZE 32
     45 #define VB2_SHA256_BLOCK_SIZE 64
     46 
     47 struct vb2_sha256_context {
     48 	uint32_t h[8];
     49 	uint32_t total_size;
     50 	uint32_t size;
     51 	uint8_t block[2 * VB2_SHA256_BLOCK_SIZE];
     52 };
     53 
     54 #define VB2_SHA512_DIGEST_SIZE 64
     55 #define VB2_SHA512_BLOCK_SIZE 128
     56 
     57 struct vb2_sha512_context {
     58 	uint64_t h[8];
     59 	uint32_t total_size;
     60 	uint32_t size;
     61 	uint8_t block[2 * VB2_SHA512_BLOCK_SIZE];
     62 };
     63 
     64 /* Hash algorithm independent digest context; includes all of the above. */
     65 struct vb2_digest_context {
     66 	/* Context union for all algorithms */
     67 	union {
     68 #if VB2_SUPPORT_SHA1
     69 		struct vb2_sha1_context sha1;
     70 #endif
     71 #if VB2_SUPPORT_SHA256
     72 		struct vb2_sha256_context sha256;
     73 #endif
     74 #if VB2_SUPPORT_SHA512
     75 		struct vb2_sha512_context sha512;
     76 #endif
     77 	};
     78 
     79 	/* Current hash algorithm */
     80 	enum vb2_hash_algorithm hash_alg;
     81 
     82 	/* 1 if digest is computed with vb2ex_hwcrypto routines, else 0 */
     83 	int using_hwcrypto;
     84 };
     85 
     86 /**
     87  * Initialize a hash context.
     88  *
     89  * @param ctx		Hash context
     90  */
     91 void vb2_sha1_init(struct vb2_sha1_context *ctx);
     92 void vb2_sha256_init(struct vb2_sha256_context *ctx);
     93 void vb2_sha512_init(struct vb2_sha512_context *ctx);
     94 
     95 /**
     96  * Update (extend) a hash.
     97  *
     98  * @param ctx		Hash context
     99  * @param data		Data to hash
    100  * @param size		Length of data in bytes
    101  */
    102 void vb2_sha1_update(struct vb2_sha1_context *ctx,
    103 		     const uint8_t *data,
    104 		     uint32_t size);
    105 void vb2_sha256_update(struct vb2_sha256_context *ctx,
    106 		       const uint8_t *data,
    107 		       uint32_t size);
    108 void vb2_sha512_update(struct vb2_sha512_context *ctx,
    109 		       const uint8_t *data,
    110 		       uint32_t size);
    111 
    112 /**
    113  * Finalize a hash digest.
    114  *
    115  * @param ctx		Hash context
    116  * @param digest	Destination for hash; must be VB_SHA*_DIGEST_SIZE bytes
    117  */
    118 void vb2_sha1_finalize(struct vb2_sha1_context *ctx, uint8_t *digest);
    119 void vb2_sha256_finalize(struct vb2_sha256_context *ctx, uint8_t *digest);
    120 void vb2_sha512_finalize(struct vb2_sha512_context *ctx, uint8_t *digest);
    121 
    122 /**
    123  * Convert vb2_crypto_algorithm to vb2_hash_algorithm.
    124  *
    125  * @param algorithm	Crypto algorithm (vb2_crypto_algorithm)
    126  *
    127  * @return The hash algorithm for that crypto algorithm, or VB2_HASH_INVALID if
    128  * the crypto algorithm or its corresponding hash algorithm is invalid or not
    129  * supported.
    130  */
    131 enum vb2_hash_algorithm vb2_crypto_to_hash(uint32_t algorithm);
    132 
    133 /**
    134  * Return the size of the digest for a hash algorithm.
    135  *
    136  * @param hash_alg	Hash algorithm
    137  * @return The size of the digest, or 0 if error.
    138  */
    139 int vb2_digest_size(enum vb2_hash_algorithm hash_alg);
    140 
    141 /**
    142  * Initialize a digest context for doing block-style digesting.
    143  *
    144  * @param dc		Digest context
    145  * @param hash_alg	Hash algorithm
    146  * @return VB2_SUCCESS, or non-zero on error.
    147  */
    148 int vb2_digest_init(struct vb2_digest_context *dc,
    149 		    enum vb2_hash_algorithm hash_alg);
    150 
    151 /**
    152  * Extend a digest's hash with another block of data.
    153  *
    154  * @param dc		Digest context
    155  * @param buf		Data to hash
    156  * @param size		Length of data in bytes
    157  * @return VB2_SUCCESS, or non-zero on error.
    158  */
    159 int vb2_digest_extend(struct vb2_digest_context *dc,
    160 		      const uint8_t *buf,
    161 		      uint32_t size);
    162 
    163 /**
    164  * Finalize a digest and store the result.
    165  *
    166  * The destination digest should be at least vb2_digest_size(algorithm).
    167  *
    168  * @param dc		Digest context
    169  * @param digest	Destination for digest
    170  * @param digest_size	Length of digest buffer in bytes.
    171  * @return VB2_SUCCESS, or non-zero on error.
    172  */
    173 int vb2_digest_finalize(struct vb2_digest_context *dc,
    174 			uint8_t *digest,
    175 			uint32_t digest_size);
    176 
    177 #endif  /* VBOOT_REFERENCE_2SHA_H_ */
    178