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 * Utility functions for message digest functions. 6 */ 7 8#include "2sysincludes.h" 9#include "2common.h" 10#include "2rsa.h" 11#include "2sha.h" 12 13#if VB2_SUPPORT_SHA1 14#define CTH_SHA1 VB2_HASH_SHA1 15#else 16#define CTH_SHA1 VB2_HASH_INVALID 17#endif 18 19#if VB2_SUPPORT_SHA256 20#define CTH_SHA256 VB2_HASH_SHA256 21#else 22#define CTH_SHA256 VB2_HASH_INVALID 23#endif 24 25#if VB2_SUPPORT_SHA512 26#define CTH_SHA512 VB2_HASH_SHA512 27#else 28#define CTH_SHA512 VB2_HASH_INVALID 29#endif 30 31static const uint8_t crypto_to_hash[] = { 32 CTH_SHA1, 33 CTH_SHA256, 34 CTH_SHA512, 35 CTH_SHA1, 36 CTH_SHA256, 37 CTH_SHA512, 38 CTH_SHA1, 39 CTH_SHA256, 40 CTH_SHA512, 41 CTH_SHA1, 42 CTH_SHA256, 43 CTH_SHA512, 44}; 45 46/** 47 * Convert vb2_crypto_algorithm to vb2_hash_algorithm. 48 * 49 * @param algorithm Crypto algorithm (vb2_crypto_algorithm) 50 * 51 * @return The hash algorithm for that crypto algorithm, or VB2_HASH_INVALID if 52 * the crypto algorithm or its corresponding hash algorithm is invalid or not 53 * supported. 54 */ 55enum vb2_hash_algorithm vb2_crypto_to_hash(uint32_t algorithm) 56{ 57 if (algorithm < ARRAY_SIZE(crypto_to_hash)) 58 return crypto_to_hash[algorithm]; 59 else 60 return VB2_HASH_INVALID; 61} 62 63int vb2_digest_size(enum vb2_hash_algorithm hash_alg) 64{ 65 switch (hash_alg) { 66#if VB2_SUPPORT_SHA1 67 case VB2_HASH_SHA1: 68 return VB2_SHA1_DIGEST_SIZE; 69#endif 70#if VB2_SUPPORT_SHA256 71 case VB2_HASH_SHA256: 72 return VB2_SHA256_DIGEST_SIZE; 73#endif 74#if VB2_SUPPORT_SHA512 75 case VB2_HASH_SHA512: 76 return VB2_SHA512_DIGEST_SIZE; 77#endif 78 default: 79 return 0; 80 } 81} 82 83int vb2_digest_init(struct vb2_digest_context *dc, 84 enum vb2_hash_algorithm hash_alg) 85{ 86 dc->hash_alg = hash_alg; 87 dc->using_hwcrypto = 0; 88 89 switch (dc->hash_alg) { 90#if VB2_SUPPORT_SHA1 91 case VB2_HASH_SHA1: 92 vb2_sha1_init(&dc->sha1); 93 return VB2_SUCCESS; 94#endif 95#if VB2_SUPPORT_SHA256 96 case VB2_HASH_SHA256: 97 vb2_sha256_init(&dc->sha256); 98 return VB2_SUCCESS; 99#endif 100#if VB2_SUPPORT_SHA512 101 case VB2_HASH_SHA512: 102 vb2_sha512_init(&dc->sha512); 103 return VB2_SUCCESS; 104#endif 105 default: 106 return VB2_ERROR_SHA_INIT_ALGORITHM; 107 } 108} 109 110int vb2_digest_extend(struct vb2_digest_context *dc, 111 const uint8_t *buf, 112 uint32_t size) 113{ 114 switch (dc->hash_alg) { 115#if VB2_SUPPORT_SHA1 116 case VB2_HASH_SHA1: 117 vb2_sha1_update(&dc->sha1, buf, size); 118 return VB2_SUCCESS; 119#endif 120#if VB2_SUPPORT_SHA256 121 case VB2_HASH_SHA256: 122 vb2_sha256_update(&dc->sha256, buf, size); 123 return VB2_SUCCESS; 124#endif 125#if VB2_SUPPORT_SHA512 126 case VB2_HASH_SHA512: 127 vb2_sha512_update(&dc->sha512, buf, size); 128 return VB2_SUCCESS; 129#endif 130 default: 131 return VB2_ERROR_SHA_EXTEND_ALGORITHM; 132 } 133} 134 135int vb2_digest_finalize(struct vb2_digest_context *dc, 136 uint8_t *digest, 137 uint32_t digest_size) 138{ 139 if (digest_size < vb2_digest_size(dc->hash_alg)) 140 return VB2_ERROR_SHA_FINALIZE_DIGEST_SIZE; 141 142 switch (dc->hash_alg) { 143#if VB2_SUPPORT_SHA1 144 case VB2_HASH_SHA1: 145 vb2_sha1_finalize(&dc->sha1, digest); 146 return VB2_SUCCESS; 147#endif 148#if VB2_SUPPORT_SHA256 149 case VB2_HASH_SHA256: 150 vb2_sha256_finalize(&dc->sha256, digest); 151 return VB2_SUCCESS; 152#endif 153#if VB2_SUPPORT_SHA512 154 case VB2_HASH_SHA512: 155 vb2_sha512_finalize(&dc->sha512, digest); 156 return VB2_SUCCESS; 157#endif 158 default: 159 return VB2_ERROR_SHA_FINALIZE_ALGORITHM; 160 } 161} 162