crypto: get sha256 support to build.
[akaros.git] / kern / include / crypto / 2common.h
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 #pragma once
9
10 #include "2api.h"
11 #include "2return_codes.h"
12 #include "2sha.h"
13 #include "2struct.h"
14
15 struct vb2_public_key;
16
17 /*
18  * Return the greater of A and B.  This is used in macros which calculate the
19  * required buffer size, so can't be turned into a static inline function.
20  */
21 #ifndef VB2_MAX
22 #define VB2_MAX(A, B) ((A) > (B) ? (A) : (B))
23 #endif
24
25 /* Return the number of elements in an array */
26 #ifndef ARRAY_SIZE
27 #define ARRAY_SIZE(array) (sizeof(array)/sizeof(array[0]))
28 #endif
29
30 /* Debug output printf() for tests.  Otherwise, it's platform-dependent. */
31 #if defined(VBOOT_DEBUG)
32 #  if defined(FOR_TEST)
33 #    define VB2_DEBUG(format, args...) printf(format, ## args)
34 #  else
35 #    define VB2_DEBUG(format, args...) vb2ex_printf(__func__, format, ## args)
36 #  endif
37 #else
38 #  define VB2_DEBUG(format, args...)
39 #endif
40
41 /*
42  * Alignment for work buffer pointers/allocations should be useful for any
43  * data type. When declaring workbuf buffers on the stack, the caller should
44  * use explicit alignment to avoid run-time errors. For example:
45  *
46  *    int foo(void)
47  *    {
48  *        struct vb2_workbuf wb;
49  *        uint8_t buf[NUM] __attribute__ ((aligned (VB2_WORKBUF_ALIGN)));
50  *        wb.buf = buf;
51  *        wb.size = sizeof(buf);
52  */
53
54 /* We might get away with using __alignof__(void *), but since GCC defines a
55  * macro for us we'll be safe and use that. */
56 #define VB2_WORKBUF_ALIGN __BIGGEST_ALIGNMENT__
57
58 /* Work buffer */
59 struct vb2_workbuf {
60         uint8_t *buf;
61         uint32_t size;
62 };
63
64 /**
65  * Initialize a work buffer.
66  *
67  * @param wb            Work buffer to init
68  * @param buf           Pointer to work buffer data
69  * @param size          Size of work buffer data in bytes
70  */
71 void vb2_workbuf_init(struct vb2_workbuf *wb, uint8_t *buf, uint32_t size);
72
73 /**
74  * Allocate space in a work buffer.
75  *
76  * Note that the returned buffer will always be aligned to VB2_WORKBUF_ALIGN.
77  *
78  * The work buffer acts like a stack, and detailed tracking of allocs and frees
79  * is not done.  The caller must track the size of each allocation and free via
80  * vb2_workbuf_free() in the reverse order they were allocated.
81  *
82  * An acceptable alternate workflow inside a function is to pass in a const
83  * work buffer, then make a local copy.  Allocations done to the local copy
84  * then don't change the passed-in work buffer, and will effectively be freed
85  * when the local copy goes out of scope.
86  *
87  * @param wb            Work buffer
88  * @param size          Requested size in bytes
89  * @return A pointer to the allocated space, or NULL if error.
90  */
91 void *vb2_workbuf_alloc(struct vb2_workbuf *wb, uint32_t size);
92
93 /**
94  * Reallocate space in a work buffer.
95  *
96  * Note that the returned buffer will always be aligned to VB2_WORKBUF_ALIGN.
97  * The work buffer acts like a stack, so this must only be done to the most
98  * recently allocated buffer.
99  *
100  * @param wb            Work buffer
101  * @param oldsize       Old allocation size in bytes
102  * @param newsize       Requested size in bytes
103  * @return A pointer to the allocated space, or NULL if error.
104  */
105 void *vb2_workbuf_realloc(struct vb2_workbuf *wb,
106                           uint32_t oldsize,
107                           uint32_t newsize);
108
109 /**
110  * Free the preceding allocation.
111  *
112  * Note that the work buffer acts like a stack, and detailed tracking of
113  * allocs and frees is not done.  The caller must track the size of each
114  * allocation and free them in reverse order.
115  *
116  * @param wb            Work buffer
117  * @param size          Size of data to free
118  */
119 void vb2_workbuf_free(struct vb2_workbuf *wb, uint32_t size);
120
121 /* Check if a pointer is aligned on an align-byte boundary */
122 #define vb2_aligned(ptr, align) (!(((uintptr_t)(ptr)) & ((align) - 1)))
123
124 /**
125  * Safer memcmp() for use in crypto.
126  *
127  * Compares the buffers to see if they are equal.  Time taken to perform
128  * the comparison is dependent only on the size, not the relationship of
129  * the match between the buffers.  Note that unlike memcmp(), this only
130  * indicates inequality, not which buffer is lesser.
131  *
132  * @param s1            First buffer
133  * @param s2            Second buffer
134  * @param size          Number of bytes to compare
135  * @return 0 if match or size=0, non-zero if at least one byte mismatched.
136  */
137 int vb2_safe_memcmp(const void *s1, const void *s2, size_t size);
138
139 /**
140  * Align a buffer and check its size.
141  *
142  * @param **ptr         Pointer to pointer to align
143  * @param *size         Points to size of buffer pointed to by *ptr
144  * @param align         Required alignment (must be power of 2)
145  * @param want_size     Required size
146  * @return VB2_SUCCESS, or non-zero if error.
147  */
148 int vb2_align(uint8_t **ptr,
149               uint32_t *size,
150               uint32_t align,
151               uint32_t want_size);
152
153 /**
154  * Return offset of ptr from base.
155  *
156  * @param base          Base pointer
157  * @param ptr           Pointer at some offset from base
158  * @return The offset of ptr from base.
159  */
160 ptrdiff_t vb2_offset_of(const void *base, const void *ptr);
161
162 /**
163  * Return expected signature size for a signature/hash algorithm pair
164  *
165  * @param sig_alg       Signature algorithm
166  * @param hash_alg      Hash algorithm
167  * @return The signature size, or zero if error / unsupported algorithm.
168  */
169 uint32_t vb2_sig_size(enum vb2_signature_algorithm sig_alg,
170                       enum vb2_hash_algorithm hash_alg);
171
172 /**
173  * Return a key ID for an unsigned hash algorithm.
174  *
175  * @param hash_alg      Hash algorithm to return key for
176  * @return A pointer to the key ID for that hash algorithm with
177  *         sig_alg=VB2_SIG_NONE, or NULL if error.
178  */
179 const struct vb2_id *vb2_hash_id(enum vb2_hash_algorithm hash_alg);
180
181 /* Size of work buffer sufficient for vb2_verify_digest() worst case. */
182 #define VB2_VERIFY_DIGEST_WORKBUF_BYTES VB2_VERIFY_RSA_DIGEST_WORKBUF_BYTES
183
184 /* Size of work buffer sufficient for vb2_verify_data() worst case. */
185 #define VB2_VERIFY_DATA_WORKBUF_BYTES                                   \
186         (VB2_SHA512_DIGEST_SIZE +                                       \
187          VB2_MAX(VB2_VERIFY_DIGEST_WORKBUF_BYTES,                       \
188                  sizeof(struct vb2_digest_context)))
189
190 /* Size of work buffer sufficient for vb2_verify_keyblock() worst case. */
191 #define VB2_KEY_BLOCK_VERIFY_WORKBUF_BYTES VB2_VERIFY_DATA_WORKBUF_BYTES
192
193 /* Size of work buffer sufficient for vb2_verify_fw_preamble() worst case. */
194 #define VB2_VERIFY_FIRMWARE_PREAMBLE_WORKBUF_BYTES VB2_VERIFY_DATA_WORKBUF_BYTES
195