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
31struct 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
47struct 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
57struct 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. */
65struct 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 */
91void vb2_sha1_init(struct vb2_sha1_context *ctx);
92void vb2_sha256_init(struct vb2_sha256_context *ctx);
93void 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 */
102void vb2_sha1_update(struct vb2_sha1_context *ctx,
103		     const uint8_t *data,
104		     uint32_t size);
105void vb2_sha256_update(struct vb2_sha256_context *ctx,
106		       const uint8_t *data,
107		       uint32_t size);
108void 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 */
118void vb2_sha1_finalize(struct vb2_sha1_context *ctx, uint8_t *digest);
119void vb2_sha256_finalize(struct vb2_sha256_context *ctx, uint8_t *digest);
120void 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 */
131enum 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 */
139int 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 */
148int 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 */
159int 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 */
173int 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