xref: /aosp_15_r20/external/vboot_reference/host/lib21/host_key.c (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2014 The ChromiumOS Authors
2*8617a60dSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
3*8617a60dSAndroid Build Coastguard Worker  * found in the LICENSE file.
4*8617a60dSAndroid Build Coastguard Worker  *
5*8617a60dSAndroid Build Coastguard Worker  * Host functions for keys.
6*8617a60dSAndroid Build Coastguard Worker  */
7*8617a60dSAndroid Build Coastguard Worker 
8*8617a60dSAndroid Build Coastguard Worker #include <stdio.h>
9*8617a60dSAndroid Build Coastguard Worker 
10*8617a60dSAndroid Build Coastguard Worker #include <openssl/pem.h>
11*8617a60dSAndroid Build Coastguard Worker 
12*8617a60dSAndroid Build Coastguard Worker #include "2common.h"
13*8617a60dSAndroid Build Coastguard Worker #include "2rsa.h"
14*8617a60dSAndroid Build Coastguard Worker #include "2sha.h"
15*8617a60dSAndroid Build Coastguard Worker #include "2sysincludes.h"
16*8617a60dSAndroid Build Coastguard Worker #include "host_common.h"
17*8617a60dSAndroid Build Coastguard Worker #include "host_common21.h"
18*8617a60dSAndroid Build Coastguard Worker #include "host_key21.h"
19*8617a60dSAndroid Build Coastguard Worker #include "host_misc.h"
20*8617a60dSAndroid Build Coastguard Worker #include "host_p11.h"
21*8617a60dSAndroid Build Coastguard Worker #include "openssl_compat.h"
22*8617a60dSAndroid Build Coastguard Worker #include "util_misc.h"
23*8617a60dSAndroid Build Coastguard Worker 
vb21_private_key_unpack_raw(const uint8_t * buf,uint32_t size,struct vb2_private_key * key)24*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb21_private_key_unpack_raw(const uint8_t *buf, uint32_t size,
25*8617a60dSAndroid Build Coastguard Worker 					       struct vb2_private_key *key)
26*8617a60dSAndroid Build Coastguard Worker {
27*8617a60dSAndroid Build Coastguard Worker 	const struct vb21_packed_private_key *pkey =
28*8617a60dSAndroid Build Coastguard Worker 		(const struct vb21_packed_private_key *)buf;
29*8617a60dSAndroid Build Coastguard Worker 	const unsigned char *start;
30*8617a60dSAndroid Build Coastguard Worker 	uint32_t min_offset = 0;
31*8617a60dSAndroid Build Coastguard Worker 
32*8617a60dSAndroid Build Coastguard Worker 	/*
33*8617a60dSAndroid Build Coastguard Worker 	 * Check magic number.
34*8617a60dSAndroid Build Coastguard Worker 	 *
35*8617a60dSAndroid Build Coastguard Worker 	 * TODO: If it doesn't match, pass through to the old packed key format.
36*8617a60dSAndroid Build Coastguard Worker 	 */
37*8617a60dSAndroid Build Coastguard Worker 	if (pkey->c.magic != VB21_MAGIC_PACKED_PRIVATE_KEY)
38*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_UNPACK_PRIVATE_KEY_MAGIC;
39*8617a60dSAndroid Build Coastguard Worker 
40*8617a60dSAndroid Build Coastguard Worker 	if (vb21_verify_common_header(buf, size))
41*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_UNPACK_PRIVATE_KEY_HEADER;
42*8617a60dSAndroid Build Coastguard Worker 
43*8617a60dSAndroid Build Coastguard Worker 	/* Make sure key data is inside */
44*8617a60dSAndroid Build Coastguard Worker 	if (vb21_verify_common_member(pkey, &min_offset,
45*8617a60dSAndroid Build Coastguard Worker 				     pkey->key_offset, pkey->key_size))
46*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_UNPACK_PRIVATE_KEY_DATA;
47*8617a60dSAndroid Build Coastguard Worker 
48*8617a60dSAndroid Build Coastguard Worker 	/*
49*8617a60dSAndroid Build Coastguard Worker 	 * Check for compatible version.  No need to check minor version, since
50*8617a60dSAndroid Build Coastguard Worker 	 * that's compatible across readers matching the major version, and we
51*8617a60dSAndroid Build Coastguard Worker 	 * haven't added any new fields.
52*8617a60dSAndroid Build Coastguard Worker 	 */
53*8617a60dSAndroid Build Coastguard Worker 	if (pkey->c.struct_version_major !=
54*8617a60dSAndroid Build Coastguard Worker 	    VB21_PACKED_PRIVATE_KEY_VERSION_MAJOR)
55*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_UNPACK_PRIVATE_KEY_STRUCT_VERSION;
56*8617a60dSAndroid Build Coastguard Worker 
57*8617a60dSAndroid Build Coastguard Worker 	/* Copy key algorithms and ID */
58*8617a60dSAndroid Build Coastguard Worker 	key->key_location = PRIVATE_KEY_LOCAL;
59*8617a60dSAndroid Build Coastguard Worker 	key->sig_alg = pkey->sig_alg;
60*8617a60dSAndroid Build Coastguard Worker 	key->hash_alg = pkey->hash_alg;
61*8617a60dSAndroid Build Coastguard Worker 	key->id = pkey->id;
62*8617a60dSAndroid Build Coastguard Worker 
63*8617a60dSAndroid Build Coastguard Worker 	/* Unpack RSA key */
64*8617a60dSAndroid Build Coastguard Worker 	if (pkey->sig_alg == VB2_SIG_NONE) {
65*8617a60dSAndroid Build Coastguard Worker 		if (pkey->key_size != 0)
66*8617a60dSAndroid Build Coastguard Worker 			return VB2_ERROR_UNPACK_PRIVATE_KEY_HASH;
67*8617a60dSAndroid Build Coastguard Worker 	} else {
68*8617a60dSAndroid Build Coastguard Worker 		start = (const unsigned char *)(buf + pkey->key_offset);
69*8617a60dSAndroid Build Coastguard Worker 		key->rsa_private_key = d2i_RSAPrivateKey(0, &start,
70*8617a60dSAndroid Build Coastguard Worker 							 pkey->key_size);
71*8617a60dSAndroid Build Coastguard Worker 		if (!key->rsa_private_key)
72*8617a60dSAndroid Build Coastguard Worker 			return VB2_ERROR_UNPACK_PRIVATE_KEY_RSA;
73*8617a60dSAndroid Build Coastguard Worker 	}
74*8617a60dSAndroid Build Coastguard Worker 
75*8617a60dSAndroid Build Coastguard Worker 	/* Key description */
76*8617a60dSAndroid Build Coastguard Worker 	if (pkey->c.desc_size) {
77*8617a60dSAndroid Build Coastguard Worker 		if (vb2_private_key_set_desc(key, (const char *)(buf + pkey->c.fixed_size)))
78*8617a60dSAndroid Build Coastguard Worker 			return VB2_ERROR_UNPACK_PRIVATE_KEY_DESC;
79*8617a60dSAndroid Build Coastguard Worker 	}
80*8617a60dSAndroid Build Coastguard Worker 
81*8617a60dSAndroid Build Coastguard Worker 	return VB2_SUCCESS;
82*8617a60dSAndroid Build Coastguard Worker }
83*8617a60dSAndroid Build Coastguard Worker 
vb21_private_key_unpack(struct vb2_private_key ** key_ptr,const uint8_t * buf,uint32_t size)84*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb21_private_key_unpack(struct vb2_private_key **key_ptr, const uint8_t *buf,
85*8617a60dSAndroid Build Coastguard Worker 				    uint32_t size)
86*8617a60dSAndroid Build Coastguard Worker {
87*8617a60dSAndroid Build Coastguard Worker 	*key_ptr = NULL;
88*8617a60dSAndroid Build Coastguard Worker 	struct vb2_private_key *key = (struct vb2_private_key *)calloc(sizeof(*key), 1);
89*8617a60dSAndroid Build Coastguard Worker 	if (!key)
90*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_UNPACK_PRIVATE_KEY_ALLOC;
91*8617a60dSAndroid Build Coastguard Worker 
92*8617a60dSAndroid Build Coastguard Worker 	vb2_error_t rv = vb21_private_key_unpack_raw(buf, size, key);
93*8617a60dSAndroid Build Coastguard Worker 	if (rv != VB2_SUCCESS) {
94*8617a60dSAndroid Build Coastguard Worker 		vb2_free_private_key(key);
95*8617a60dSAndroid Build Coastguard Worker 		return rv;
96*8617a60dSAndroid Build Coastguard Worker 	}
97*8617a60dSAndroid Build Coastguard Worker 	*key_ptr = key;
98*8617a60dSAndroid Build Coastguard Worker 	return VB2_SUCCESS;
99*8617a60dSAndroid Build Coastguard Worker }
100*8617a60dSAndroid Build Coastguard Worker 
vb2_private_key_read_pem(struct vb2_private_key ** key_ptr,const char * filename)101*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2_private_key_read_pem(struct vb2_private_key **key_ptr,
102*8617a60dSAndroid Build Coastguard Worker 				     const char *filename)
103*8617a60dSAndroid Build Coastguard Worker {
104*8617a60dSAndroid Build Coastguard Worker 	struct vb2_private_key *key;
105*8617a60dSAndroid Build Coastguard Worker 	FILE *f;
106*8617a60dSAndroid Build Coastguard Worker 
107*8617a60dSAndroid Build Coastguard Worker 	*key_ptr = NULL;
108*8617a60dSAndroid Build Coastguard Worker 
109*8617a60dSAndroid Build Coastguard Worker 	/* Allocate the new key */
110*8617a60dSAndroid Build Coastguard Worker 	key = calloc(1, sizeof(*key));
111*8617a60dSAndroid Build Coastguard Worker 	if (!key)
112*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_READ_PEM_ALLOC;
113*8617a60dSAndroid Build Coastguard Worker 
114*8617a60dSAndroid Build Coastguard Worker 	/* Read private key */
115*8617a60dSAndroid Build Coastguard Worker 	f = fopen(filename, "rb");
116*8617a60dSAndroid Build Coastguard Worker 	if (!f) {
117*8617a60dSAndroid Build Coastguard Worker 		free(key);
118*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_READ_PEM_FILE_OPEN;
119*8617a60dSAndroid Build Coastguard Worker 	}
120*8617a60dSAndroid Build Coastguard Worker 
121*8617a60dSAndroid Build Coastguard Worker 	key->rsa_private_key = PEM_read_RSAPrivateKey(f, NULL, NULL, NULL);
122*8617a60dSAndroid Build Coastguard Worker 	fclose(f);
123*8617a60dSAndroid Build Coastguard Worker 
124*8617a60dSAndroid Build Coastguard Worker 	if (!key->rsa_private_key) {
125*8617a60dSAndroid Build Coastguard Worker 		free(key);
126*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_READ_PEM_RSA;
127*8617a60dSAndroid Build Coastguard Worker 	}
128*8617a60dSAndroid Build Coastguard Worker 
129*8617a60dSAndroid Build Coastguard Worker 	*key_ptr = key;
130*8617a60dSAndroid Build Coastguard Worker 	return VB2_SUCCESS;
131*8617a60dSAndroid Build Coastguard Worker }
132*8617a60dSAndroid Build Coastguard Worker 
vb2_private_key_set_desc(struct vb2_private_key * key,const char * desc)133*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2_private_key_set_desc(struct vb2_private_key *key,
134*8617a60dSAndroid Build Coastguard Worker 				     const char *desc)
135*8617a60dSAndroid Build Coastguard Worker {
136*8617a60dSAndroid Build Coastguard Worker 	if (key->desc)
137*8617a60dSAndroid Build Coastguard Worker 		free(key->desc);
138*8617a60dSAndroid Build Coastguard Worker 
139*8617a60dSAndroid Build Coastguard Worker 	if (desc) {
140*8617a60dSAndroid Build Coastguard Worker 		key->desc = strdup(desc);
141*8617a60dSAndroid Build Coastguard Worker 		if (!key->desc)
142*8617a60dSAndroid Build Coastguard Worker 			return VB2_ERROR_PRIVATE_KEY_SET_DESC;
143*8617a60dSAndroid Build Coastguard Worker 	} else {
144*8617a60dSAndroid Build Coastguard Worker 		key->desc = NULL;
145*8617a60dSAndroid Build Coastguard Worker 	}
146*8617a60dSAndroid Build Coastguard Worker 
147*8617a60dSAndroid Build Coastguard Worker 	return VB2_SUCCESS;
148*8617a60dSAndroid Build Coastguard Worker }
149*8617a60dSAndroid Build Coastguard Worker 
vb21_private_key_write(const struct vb2_private_key * key,const char * filename)150*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb21_private_key_write(const struct vb2_private_key *key,
151*8617a60dSAndroid Build Coastguard Worker 				   const char *filename)
152*8617a60dSAndroid Build Coastguard Worker {
153*8617a60dSAndroid Build Coastguard Worker 	struct vb21_packed_private_key pkey = {
154*8617a60dSAndroid Build Coastguard Worker 		.c.magic = VB21_MAGIC_PACKED_PRIVATE_KEY,
155*8617a60dSAndroid Build Coastguard Worker 		.c.struct_version_major = VB21_PACKED_PRIVATE_KEY_VERSION_MAJOR,
156*8617a60dSAndroid Build Coastguard Worker 		.c.struct_version_minor = VB21_PACKED_PRIVATE_KEY_VERSION_MINOR,
157*8617a60dSAndroid Build Coastguard Worker 		.c.fixed_size = sizeof(pkey),
158*8617a60dSAndroid Build Coastguard Worker 		.sig_alg = key->sig_alg,
159*8617a60dSAndroid Build Coastguard Worker 		.hash_alg = key->hash_alg,
160*8617a60dSAndroid Build Coastguard Worker 		.id = key->id,
161*8617a60dSAndroid Build Coastguard Worker 	};
162*8617a60dSAndroid Build Coastguard Worker 	uint8_t *buf;
163*8617a60dSAndroid Build Coastguard Worker 	uint8_t *rsabuf = NULL;
164*8617a60dSAndroid Build Coastguard Worker 	int rsalen = 0;
165*8617a60dSAndroid Build Coastguard Worker 	vb2_error_t rv;
166*8617a60dSAndroid Build Coastguard Worker 
167*8617a60dSAndroid Build Coastguard Worker 	memcpy(&pkey.id, &key->id, sizeof(pkey.id));
168*8617a60dSAndroid Build Coastguard Worker 
169*8617a60dSAndroid Build Coastguard Worker 	pkey.c.desc_size = vb2_desc_size(key->desc);
170*8617a60dSAndroid Build Coastguard Worker 
171*8617a60dSAndroid Build Coastguard Worker 	if (key->sig_alg != VB2_SIG_NONE) {
172*8617a60dSAndroid Build Coastguard Worker 		/* Pack RSA key */
173*8617a60dSAndroid Build Coastguard Worker 		rsalen = i2d_RSAPrivateKey(key->rsa_private_key, &rsabuf);
174*8617a60dSAndroid Build Coastguard Worker 		if (rsalen <= 0 || !rsabuf)
175*8617a60dSAndroid Build Coastguard Worker 			return VB2_ERROR_PRIVATE_KEY_WRITE_RSA;
176*8617a60dSAndroid Build Coastguard Worker 	}
177*8617a60dSAndroid Build Coastguard Worker 
178*8617a60dSAndroid Build Coastguard Worker 	pkey.key_offset = pkey.c.fixed_size + pkey.c.desc_size;
179*8617a60dSAndroid Build Coastguard Worker 	pkey.key_size = roundup32(rsalen);
180*8617a60dSAndroid Build Coastguard Worker 	pkey.c.total_size = pkey.key_offset + pkey.key_size;
181*8617a60dSAndroid Build Coastguard Worker 
182*8617a60dSAndroid Build Coastguard Worker 	/* Pack private key */
183*8617a60dSAndroid Build Coastguard Worker 	buf = calloc(1, pkey.c.total_size);
184*8617a60dSAndroid Build Coastguard Worker 	if (!buf) {
185*8617a60dSAndroid Build Coastguard Worker 		free(rsabuf);
186*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_PRIVATE_KEY_WRITE_ALLOC;
187*8617a60dSAndroid Build Coastguard Worker 	}
188*8617a60dSAndroid Build Coastguard Worker 
189*8617a60dSAndroid Build Coastguard Worker 	memcpy(buf, &pkey, sizeof(pkey));
190*8617a60dSAndroid Build Coastguard Worker 
191*8617a60dSAndroid Build Coastguard Worker 	/* strcpy() is ok here because we checked the length above */
192*8617a60dSAndroid Build Coastguard Worker 	if (pkey.c.desc_size)
193*8617a60dSAndroid Build Coastguard Worker 		strcpy((char *)buf + pkey.c.fixed_size, key->desc);
194*8617a60dSAndroid Build Coastguard Worker 
195*8617a60dSAndroid Build Coastguard Worker 	if (rsabuf) {
196*8617a60dSAndroid Build Coastguard Worker 		memcpy(buf + pkey.key_offset, rsabuf, rsalen);
197*8617a60dSAndroid Build Coastguard Worker 		free(rsabuf);
198*8617a60dSAndroid Build Coastguard Worker 	}
199*8617a60dSAndroid Build Coastguard Worker 
200*8617a60dSAndroid Build Coastguard Worker 	rv = vb21_write_object(filename, buf);
201*8617a60dSAndroid Build Coastguard Worker 	free(buf);
202*8617a60dSAndroid Build Coastguard Worker 
203*8617a60dSAndroid Build Coastguard Worker 	return rv ? VB2_ERROR_PRIVATE_KEY_WRITE_FILE : VB2_SUCCESS;
204*8617a60dSAndroid Build Coastguard Worker }
205*8617a60dSAndroid Build Coastguard Worker 
vb2_private_key_hash(const struct vb2_private_key ** key_ptr,enum vb2_hash_algorithm hash_alg)206*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2_private_key_hash(const struct vb2_private_key **key_ptr,
207*8617a60dSAndroid Build Coastguard Worker 				 enum vb2_hash_algorithm hash_alg)
208*8617a60dSAndroid Build Coastguard Worker {
209*8617a60dSAndroid Build Coastguard Worker 	*key_ptr = NULL;
210*8617a60dSAndroid Build Coastguard Worker 
211*8617a60dSAndroid Build Coastguard Worker 	switch (hash_alg) {
212*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA1
213*8617a60dSAndroid Build Coastguard Worker 	case VB2_HASH_SHA1:
214*8617a60dSAndroid Build Coastguard Worker 		{
215*8617a60dSAndroid Build Coastguard Worker 			static const struct vb2_private_key key = {
216*8617a60dSAndroid Build Coastguard Worker 				.hash_alg = VB2_HASH_SHA1,
217*8617a60dSAndroid Build Coastguard Worker 				.sig_alg = VB2_SIG_NONE,
218*8617a60dSAndroid Build Coastguard Worker 				.desc = (char *)"Unsigned SHA1",
219*8617a60dSAndroid Build Coastguard Worker 				.id = VB2_ID_NONE_SHA1,
220*8617a60dSAndroid Build Coastguard Worker 			};
221*8617a60dSAndroid Build Coastguard Worker 			*key_ptr = &key;
222*8617a60dSAndroid Build Coastguard Worker 			return VB2_SUCCESS;
223*8617a60dSAndroid Build Coastguard Worker 		}
224*8617a60dSAndroid Build Coastguard Worker #endif
225*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA256
226*8617a60dSAndroid Build Coastguard Worker 	case VB2_HASH_SHA256:
227*8617a60dSAndroid Build Coastguard Worker 		{
228*8617a60dSAndroid Build Coastguard Worker 			static const struct vb2_private_key key = {
229*8617a60dSAndroid Build Coastguard Worker 				.hash_alg = VB2_HASH_SHA256,
230*8617a60dSAndroid Build Coastguard Worker 				.sig_alg = VB2_SIG_NONE,
231*8617a60dSAndroid Build Coastguard Worker 				.desc = (char *)"Unsigned SHA-256",
232*8617a60dSAndroid Build Coastguard Worker 				.id = VB2_ID_NONE_SHA256,
233*8617a60dSAndroid Build Coastguard Worker 			};
234*8617a60dSAndroid Build Coastguard Worker 			*key_ptr = &key;
235*8617a60dSAndroid Build Coastguard Worker 			return VB2_SUCCESS;
236*8617a60dSAndroid Build Coastguard Worker 		}
237*8617a60dSAndroid Build Coastguard Worker #endif
238*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA512
239*8617a60dSAndroid Build Coastguard Worker 	case VB2_HASH_SHA512:
240*8617a60dSAndroid Build Coastguard Worker 		{
241*8617a60dSAndroid Build Coastguard Worker 			static const struct vb2_private_key key = {
242*8617a60dSAndroid Build Coastguard Worker 				.hash_alg = VB2_HASH_SHA512,
243*8617a60dSAndroid Build Coastguard Worker 				.sig_alg = VB2_SIG_NONE,
244*8617a60dSAndroid Build Coastguard Worker 				.desc = (char *)"Unsigned SHA-512",
245*8617a60dSAndroid Build Coastguard Worker 				.id = VB2_ID_NONE_SHA512,
246*8617a60dSAndroid Build Coastguard Worker 			};
247*8617a60dSAndroid Build Coastguard Worker 			*key_ptr = &key;
248*8617a60dSAndroid Build Coastguard Worker 			return VB2_SUCCESS;
249*8617a60dSAndroid Build Coastguard Worker 		}
250*8617a60dSAndroid Build Coastguard Worker #endif
251*8617a60dSAndroid Build Coastguard Worker 	default:
252*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_PRIVATE_KEY_HASH;
253*8617a60dSAndroid Build Coastguard Worker 	}
254*8617a60dSAndroid Build Coastguard Worker }
255*8617a60dSAndroid Build Coastguard Worker 
vb2_public_key_alloc(struct vb2_public_key ** key_ptr,enum vb2_signature_algorithm sig_alg)256*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2_public_key_alloc(struct vb2_public_key **key_ptr,
257*8617a60dSAndroid Build Coastguard Worker 				 enum vb2_signature_algorithm sig_alg)
258*8617a60dSAndroid Build Coastguard Worker {
259*8617a60dSAndroid Build Coastguard Worker 	struct vb2_public_key *key;
260*8617a60dSAndroid Build Coastguard Worker 	uint32_t key_data_size = vb2_packed_key_size(sig_alg);
261*8617a60dSAndroid Build Coastguard Worker 
262*8617a60dSAndroid Build Coastguard Worker 	/* The buffer contains the key, its ID, and its packed data */
263*8617a60dSAndroid Build Coastguard Worker 	uint32_t buf_size = sizeof(*key) + sizeof(struct vb2_id) +
264*8617a60dSAndroid Build Coastguard Worker 		key_data_size;
265*8617a60dSAndroid Build Coastguard Worker 
266*8617a60dSAndroid Build Coastguard Worker 	if (!key_data_size)
267*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_PUBLIC_KEY_ALLOC_SIZE;
268*8617a60dSAndroid Build Coastguard Worker 
269*8617a60dSAndroid Build Coastguard Worker 	key = calloc(1, buf_size);
270*8617a60dSAndroid Build Coastguard Worker 	if (!key)
271*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_PUBLIC_KEY_ALLOC;
272*8617a60dSAndroid Build Coastguard Worker 
273*8617a60dSAndroid Build Coastguard Worker 	key->id = (struct vb2_id *)(key + 1);
274*8617a60dSAndroid Build Coastguard Worker 	key->sig_alg = sig_alg;
275*8617a60dSAndroid Build Coastguard Worker 
276*8617a60dSAndroid Build Coastguard Worker 	*key_ptr = key;
277*8617a60dSAndroid Build Coastguard Worker 
278*8617a60dSAndroid Build Coastguard Worker 	return VB2_SUCCESS;
279*8617a60dSAndroid Build Coastguard Worker }
280*8617a60dSAndroid Build Coastguard Worker 
vb2_public_key_free(struct vb2_public_key * key)281*8617a60dSAndroid Build Coastguard Worker void vb2_public_key_free(struct vb2_public_key *key)
282*8617a60dSAndroid Build Coastguard Worker {
283*8617a60dSAndroid Build Coastguard Worker 	if (!key)
284*8617a60dSAndroid Build Coastguard Worker 		return;
285*8617a60dSAndroid Build Coastguard Worker 
286*8617a60dSAndroid Build Coastguard Worker 	if (key->desc)
287*8617a60dSAndroid Build Coastguard Worker 		free((void *)key->desc);
288*8617a60dSAndroid Build Coastguard Worker 
289*8617a60dSAndroid Build Coastguard Worker 	free(key);
290*8617a60dSAndroid Build Coastguard Worker }
291*8617a60dSAndroid Build Coastguard Worker 
vb2_public_key_packed_data(struct vb2_public_key * key)292*8617a60dSAndroid Build Coastguard Worker uint8_t *vb2_public_key_packed_data(struct vb2_public_key *key)
293*8617a60dSAndroid Build Coastguard Worker {
294*8617a60dSAndroid Build Coastguard Worker 	return (uint8_t *)(key->id + 1);
295*8617a60dSAndroid Build Coastguard Worker }
296*8617a60dSAndroid Build Coastguard Worker 
vb2_public_key_read_keyb(struct vb2_public_key ** key_ptr,const char * filename)297*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2_public_key_read_keyb(struct vb2_public_key **key_ptr,
298*8617a60dSAndroid Build Coastguard Worker 				     const char *filename)
299*8617a60dSAndroid Build Coastguard Worker {
300*8617a60dSAndroid Build Coastguard Worker 	struct vb2_public_key *key = NULL;
301*8617a60dSAndroid Build Coastguard Worker 	uint8_t *key_data, *key_buf;
302*8617a60dSAndroid Build Coastguard Worker 	uint32_t key_size;
303*8617a60dSAndroid Build Coastguard Worker 	enum vb2_signature_algorithm sig_alg;
304*8617a60dSAndroid Build Coastguard Worker 
305*8617a60dSAndroid Build Coastguard Worker 	*key_ptr = NULL;
306*8617a60dSAndroid Build Coastguard Worker 
307*8617a60dSAndroid Build Coastguard Worker 	if (vb2_read_file(filename, &key_data, &key_size))
308*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_READ_KEYB_DATA;
309*8617a60dSAndroid Build Coastguard Worker 
310*8617a60dSAndroid Build Coastguard Worker 	/* Guess the signature algorithm from the key size
311*8617a60dSAndroid Build Coastguard Worker 	 * Note: This only considers exponent F4 keys, as there is no way to
312*8617a60dSAndroid Build Coastguard Worker 	 * distinguish between exp 3 and F4 based on size. Vboot API 2.1 is
313*8617a60dSAndroid Build Coastguard Worker 	 * required to make proper use of exp 3 keys. */
314*8617a60dSAndroid Build Coastguard Worker 	for (sig_alg = VB2_SIG_RSA1024; sig_alg <= VB2_SIG_RSA8192; sig_alg++) {
315*8617a60dSAndroid Build Coastguard Worker 		if (key_size == vb2_packed_key_size(sig_alg))
316*8617a60dSAndroid Build Coastguard Worker 			break;
317*8617a60dSAndroid Build Coastguard Worker 	}
318*8617a60dSAndroid Build Coastguard Worker 	if (sig_alg > VB2_SIG_RSA8192) {
319*8617a60dSAndroid Build Coastguard Worker 		free(key_data);
320*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_READ_KEYB_SIZE;
321*8617a60dSAndroid Build Coastguard Worker 	}
322*8617a60dSAndroid Build Coastguard Worker 
323*8617a60dSAndroid Build Coastguard Worker 	if (vb2_public_key_alloc(&key, sig_alg)) {
324*8617a60dSAndroid Build Coastguard Worker 		free(key_data);
325*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_READ_KEYB_ALLOC;
326*8617a60dSAndroid Build Coastguard Worker 	}
327*8617a60dSAndroid Build Coastguard Worker 
328*8617a60dSAndroid Build Coastguard Worker 	/* Copy data from the file buffer to the public key buffer */
329*8617a60dSAndroid Build Coastguard Worker 	key_buf = vb2_public_key_packed_data(key);
330*8617a60dSAndroid Build Coastguard Worker 	memcpy(key_buf, key_data, key_size);
331*8617a60dSAndroid Build Coastguard Worker 	free(key_data);
332*8617a60dSAndroid Build Coastguard Worker 
333*8617a60dSAndroid Build Coastguard Worker 	if (vb2_unpack_key_data(key, key_buf, key_size)) {
334*8617a60dSAndroid Build Coastguard Worker 		vb2_public_key_free(key);
335*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_READ_KEYB_UNPACK;
336*8617a60dSAndroid Build Coastguard Worker 	}
337*8617a60dSAndroid Build Coastguard Worker 
338*8617a60dSAndroid Build Coastguard Worker 	*key_ptr = key;
339*8617a60dSAndroid Build Coastguard Worker 
340*8617a60dSAndroid Build Coastguard Worker 	return VB2_SUCCESS;
341*8617a60dSAndroid Build Coastguard Worker }
342*8617a60dSAndroid Build Coastguard Worker 
vb2_public_key_set_desc(struct vb2_public_key * key,const char * desc)343*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2_public_key_set_desc(struct vb2_public_key *key,
344*8617a60dSAndroid Build Coastguard Worker 				    const char *desc)
345*8617a60dSAndroid Build Coastguard Worker {
346*8617a60dSAndroid Build Coastguard Worker 	if (key->desc)
347*8617a60dSAndroid Build Coastguard Worker 		free((void *)key->desc);
348*8617a60dSAndroid Build Coastguard Worker 
349*8617a60dSAndroid Build Coastguard Worker 	if (desc) {
350*8617a60dSAndroid Build Coastguard Worker 		key->desc = strdup(desc);
351*8617a60dSAndroid Build Coastguard Worker 		if (!key->desc)
352*8617a60dSAndroid Build Coastguard Worker 			return VB2_ERROR_PUBLIC_KEY_SET_DESC;
353*8617a60dSAndroid Build Coastguard Worker 	} else {
354*8617a60dSAndroid Build Coastguard Worker 		key->desc = NULL;
355*8617a60dSAndroid Build Coastguard Worker 	}
356*8617a60dSAndroid Build Coastguard Worker 
357*8617a60dSAndroid Build Coastguard Worker 	return VB2_SUCCESS;
358*8617a60dSAndroid Build Coastguard Worker }
359*8617a60dSAndroid Build Coastguard Worker 
vb21_packed_key_read(struct vb21_packed_key ** key_ptr,const char * filename)360*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb21_packed_key_read(struct vb21_packed_key **key_ptr,
361*8617a60dSAndroid Build Coastguard Worker 				 const char *filename)
362*8617a60dSAndroid Build Coastguard Worker {
363*8617a60dSAndroid Build Coastguard Worker 	struct vb2_public_key key;
364*8617a60dSAndroid Build Coastguard Worker 	uint8_t *buf;
365*8617a60dSAndroid Build Coastguard Worker 	uint32_t size;
366*8617a60dSAndroid Build Coastguard Worker 
367*8617a60dSAndroid Build Coastguard Worker 	*key_ptr = NULL;
368*8617a60dSAndroid Build Coastguard Worker 
369*8617a60dSAndroid Build Coastguard Worker 	if (vb2_read_file(filename, &buf, &size))
370*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_READ_PACKED_KEY_DATA;
371*8617a60dSAndroid Build Coastguard Worker 
372*8617a60dSAndroid Build Coastguard Worker 	/* Validity check: make sure key unpacks properly */
373*8617a60dSAndroid Build Coastguard Worker 	if (vb21_unpack_key(&key, buf, size))
374*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_READ_PACKED_KEY;
375*8617a60dSAndroid Build Coastguard Worker 
376*8617a60dSAndroid Build Coastguard Worker 	*key_ptr = (struct vb21_packed_key *)buf;
377*8617a60dSAndroid Build Coastguard Worker 
378*8617a60dSAndroid Build Coastguard Worker 	return VB2_SUCCESS;
379*8617a60dSAndroid Build Coastguard Worker }
380*8617a60dSAndroid Build Coastguard Worker 
vb21_public_key_pack(struct vb21_packed_key ** key_ptr,const struct vb2_public_key * pubk)381*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb21_public_key_pack(struct vb21_packed_key **key_ptr,
382*8617a60dSAndroid Build Coastguard Worker 				 const struct vb2_public_key *pubk)
383*8617a60dSAndroid Build Coastguard Worker {
384*8617a60dSAndroid Build Coastguard Worker 	struct vb21_packed_key key = {
385*8617a60dSAndroid Build Coastguard Worker 		.c.magic = VB21_MAGIC_PACKED_KEY,
386*8617a60dSAndroid Build Coastguard Worker 		.c.struct_version_major = VB21_PACKED_KEY_VERSION_MAJOR,
387*8617a60dSAndroid Build Coastguard Worker 		.c.struct_version_minor = VB21_PACKED_KEY_VERSION_MINOR,
388*8617a60dSAndroid Build Coastguard Worker 	};
389*8617a60dSAndroid Build Coastguard Worker 	uint8_t *buf;
390*8617a60dSAndroid Build Coastguard Worker 	uint32_t *buf32;
391*8617a60dSAndroid Build Coastguard Worker 
392*8617a60dSAndroid Build Coastguard Worker 	*key_ptr = NULL;
393*8617a60dSAndroid Build Coastguard Worker 
394*8617a60dSAndroid Build Coastguard Worker 	/* Calculate sizes and offsets */
395*8617a60dSAndroid Build Coastguard Worker 	key.c.fixed_size = sizeof(key);
396*8617a60dSAndroid Build Coastguard Worker 	key.c.desc_size = vb2_desc_size(pubk->desc);
397*8617a60dSAndroid Build Coastguard Worker 	key.key_offset = key.c.fixed_size + key.c.desc_size;
398*8617a60dSAndroid Build Coastguard Worker 
399*8617a60dSAndroid Build Coastguard Worker 	if (pubk->sig_alg != VB2_SIG_NONE) {
400*8617a60dSAndroid Build Coastguard Worker 		key.key_size = vb2_packed_key_size(pubk->sig_alg);
401*8617a60dSAndroid Build Coastguard Worker 		if (!key.key_size)
402*8617a60dSAndroid Build Coastguard Worker 			return VB2_ERROR_PUBLIC_KEY_PACK_SIZE;
403*8617a60dSAndroid Build Coastguard Worker 	}
404*8617a60dSAndroid Build Coastguard Worker 
405*8617a60dSAndroid Build Coastguard Worker 	key.c.total_size = key.key_offset + key.key_size;
406*8617a60dSAndroid Build Coastguard Worker 
407*8617a60dSAndroid Build Coastguard Worker 	/* Copy/initialize fields */
408*8617a60dSAndroid Build Coastguard Worker 	key.key_version = pubk->version;
409*8617a60dSAndroid Build Coastguard Worker 	key.sig_alg = pubk->sig_alg;
410*8617a60dSAndroid Build Coastguard Worker 	key.hash_alg = pubk->hash_alg;
411*8617a60dSAndroid Build Coastguard Worker 	key.id = *pubk->id;
412*8617a60dSAndroid Build Coastguard Worker 
413*8617a60dSAndroid Build Coastguard Worker 	/* Allocate the new buffer */
414*8617a60dSAndroid Build Coastguard Worker 	buf = calloc(1, key.c.total_size);
415*8617a60dSAndroid Build Coastguard Worker 
416*8617a60dSAndroid Build Coastguard Worker 	/* Copy data into the buffer */
417*8617a60dSAndroid Build Coastguard Worker 	memcpy(buf, &key, sizeof(key));
418*8617a60dSAndroid Build Coastguard Worker 
419*8617a60dSAndroid Build Coastguard Worker 	/* strcpy() is safe because we allocated above based on strlen() */
420*8617a60dSAndroid Build Coastguard Worker 	if (pubk->desc && *pubk->desc) {
421*8617a60dSAndroid Build Coastguard Worker 		strcpy((char *)(buf + key.c.fixed_size), pubk->desc);
422*8617a60dSAndroid Build Coastguard Worker 		buf[key.c.fixed_size + key.c.desc_size - 1] = 0;
423*8617a60dSAndroid Build Coastguard Worker 	}
424*8617a60dSAndroid Build Coastguard Worker 
425*8617a60dSAndroid Build Coastguard Worker 	if (pubk->sig_alg != VB2_SIG_NONE) {
426*8617a60dSAndroid Build Coastguard Worker 		/* Re-pack the key arrays */
427*8617a60dSAndroid Build Coastguard Worker 		buf32 = (uint32_t *)(buf + key.key_offset);
428*8617a60dSAndroid Build Coastguard Worker 		buf32[0] = pubk->arrsize;
429*8617a60dSAndroid Build Coastguard Worker 		buf32[1] = pubk->n0inv;
430*8617a60dSAndroid Build Coastguard Worker 		memcpy(buf32 + 2, pubk->n, pubk->arrsize * sizeof(uint32_t));
431*8617a60dSAndroid Build Coastguard Worker 		memcpy(buf32 + 2 + pubk->arrsize, pubk->rr,
432*8617a60dSAndroid Build Coastguard Worker 		       pubk->arrsize * sizeof(uint32_t));
433*8617a60dSAndroid Build Coastguard Worker 	}
434*8617a60dSAndroid Build Coastguard Worker 
435*8617a60dSAndroid Build Coastguard Worker 	*key_ptr = (struct vb21_packed_key *)buf;
436*8617a60dSAndroid Build Coastguard Worker 
437*8617a60dSAndroid Build Coastguard Worker 	return VB2_SUCCESS;
438*8617a60dSAndroid Build Coastguard Worker }
439*8617a60dSAndroid Build Coastguard Worker 
vb2_public_key_hash(struct vb2_public_key * key,enum vb2_hash_algorithm hash_alg)440*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2_public_key_hash(struct vb2_public_key *key,
441*8617a60dSAndroid Build Coastguard Worker 				enum vb2_hash_algorithm hash_alg)
442*8617a60dSAndroid Build Coastguard Worker {
443*8617a60dSAndroid Build Coastguard Worker 	switch (hash_alg) {
444*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA1
445*8617a60dSAndroid Build Coastguard Worker 	case VB2_HASH_SHA1:
446*8617a60dSAndroid Build Coastguard Worker 		key->desc = "Unsigned SHA1";
447*8617a60dSAndroid Build Coastguard Worker 		break;
448*8617a60dSAndroid Build Coastguard Worker #endif
449*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA256
450*8617a60dSAndroid Build Coastguard Worker 	case VB2_HASH_SHA256:
451*8617a60dSAndroid Build Coastguard Worker 		key->desc = "Unsigned SHA-256";
452*8617a60dSAndroid Build Coastguard Worker 		break;
453*8617a60dSAndroid Build Coastguard Worker #endif
454*8617a60dSAndroid Build Coastguard Worker #if VB2_SUPPORT_SHA512
455*8617a60dSAndroid Build Coastguard Worker 	case VB2_HASH_SHA512:
456*8617a60dSAndroid Build Coastguard Worker 		key->desc = "Unsigned SHA-512";
457*8617a60dSAndroid Build Coastguard Worker 		break;
458*8617a60dSAndroid Build Coastguard Worker #endif
459*8617a60dSAndroid Build Coastguard Worker 	default:
460*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_PUBLIC_KEY_HASH;
461*8617a60dSAndroid Build Coastguard Worker 	}
462*8617a60dSAndroid Build Coastguard Worker 
463*8617a60dSAndroid Build Coastguard Worker 	key->sig_alg = VB2_SIG_NONE;
464*8617a60dSAndroid Build Coastguard Worker 	key->hash_alg = hash_alg;
465*8617a60dSAndroid Build Coastguard Worker 	key->id = vb2_hash_id(hash_alg);
466*8617a60dSAndroid Build Coastguard Worker 	return VB2_SUCCESS;
467*8617a60dSAndroid Build Coastguard Worker }
468*8617a60dSAndroid Build Coastguard Worker 
vb2_rsa_sig_alg(struct rsa_st * rsa)469*8617a60dSAndroid Build Coastguard Worker enum vb2_signature_algorithm vb2_rsa_sig_alg(struct rsa_st *rsa)
470*8617a60dSAndroid Build Coastguard Worker {
471*8617a60dSAndroid Build Coastguard Worker 	const BIGNUM *e, *n;
472*8617a60dSAndroid Build Coastguard Worker 	uint32_t exp, bits;
473*8617a60dSAndroid Build Coastguard Worker 
474*8617a60dSAndroid Build Coastguard Worker 	RSA_get0_key(rsa, &n, &e, NULL);
475*8617a60dSAndroid Build Coastguard Worker 	exp = BN_get_word(e);
476*8617a60dSAndroid Build Coastguard Worker 	bits = BN_num_bits(n);
477*8617a60dSAndroid Build Coastguard Worker 
478*8617a60dSAndroid Build Coastguard Worker 	return vb2_get_sig_alg(exp, bits);
479*8617a60dSAndroid Build Coastguard Worker }
480*8617a60dSAndroid Build Coastguard Worker 
vb21_public_key_write(const struct vb2_public_key * key,const char * filename)481*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb21_public_key_write(const struct vb2_public_key *key,
482*8617a60dSAndroid Build Coastguard Worker 				  const char *filename)
483*8617a60dSAndroid Build Coastguard Worker {
484*8617a60dSAndroid Build Coastguard Worker 	struct vb21_packed_key *pkey;
485*8617a60dSAndroid Build Coastguard Worker 	int ret;
486*8617a60dSAndroid Build Coastguard Worker 
487*8617a60dSAndroid Build Coastguard Worker 	ret = vb21_public_key_pack(&pkey, key);
488*8617a60dSAndroid Build Coastguard Worker 	if (ret)
489*8617a60dSAndroid Build Coastguard Worker 		return ret;
490*8617a60dSAndroid Build Coastguard Worker 
491*8617a60dSAndroid Build Coastguard Worker 	ret = vb21_write_object(filename, pkey);
492*8617a60dSAndroid Build Coastguard Worker 
493*8617a60dSAndroid Build Coastguard Worker 	free(pkey);
494*8617a60dSAndroid Build Coastguard Worker 	return ret;
495*8617a60dSAndroid Build Coastguard Worker }
496*8617a60dSAndroid Build Coastguard Worker 
vb21_unpack_key(struct vb2_public_key * key,const uint8_t * buf,uint32_t size)497*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb21_unpack_key(struct vb2_public_key *key, const uint8_t *buf,
498*8617a60dSAndroid Build Coastguard Worker 			    uint32_t size)
499*8617a60dSAndroid Build Coastguard Worker {
500*8617a60dSAndroid Build Coastguard Worker 	const struct vb21_packed_key *pkey =
501*8617a60dSAndroid Build Coastguard Worker 		(const struct vb21_packed_key *)buf;
502*8617a60dSAndroid Build Coastguard Worker 	uint32_t sig_size;
503*8617a60dSAndroid Build Coastguard Worker 	uint32_t min_offset = 0;
504*8617a60dSAndroid Build Coastguard Worker 	vb2_error_t rv;
505*8617a60dSAndroid Build Coastguard Worker 
506*8617a60dSAndroid Build Coastguard Worker 	/* Check magic number */
507*8617a60dSAndroid Build Coastguard Worker 	if (pkey->c.magic != VB21_MAGIC_PACKED_KEY)
508*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_UNPACK_KEY_MAGIC;
509*8617a60dSAndroid Build Coastguard Worker 
510*8617a60dSAndroid Build Coastguard Worker 	rv = vb21_verify_common_header(buf, size);
511*8617a60dSAndroid Build Coastguard Worker 	if (rv)
512*8617a60dSAndroid Build Coastguard Worker 		return rv;
513*8617a60dSAndroid Build Coastguard Worker 
514*8617a60dSAndroid Build Coastguard Worker 	/* Make sure key data is inside */
515*8617a60dSAndroid Build Coastguard Worker 	rv = vb21_verify_common_member(pkey, &min_offset,
516*8617a60dSAndroid Build Coastguard Worker 				       pkey->key_offset, pkey->key_size);
517*8617a60dSAndroid Build Coastguard Worker 	if (rv)
518*8617a60dSAndroid Build Coastguard Worker 		return rv;
519*8617a60dSAndroid Build Coastguard Worker 
520*8617a60dSAndroid Build Coastguard Worker 	/*
521*8617a60dSAndroid Build Coastguard Worker 	 * Check for compatible version.  No need to check minor version, since
522*8617a60dSAndroid Build Coastguard Worker 	 * that's compatible across readers matching the major version, and we
523*8617a60dSAndroid Build Coastguard Worker 	 * haven't added any new fields.
524*8617a60dSAndroid Build Coastguard Worker 	 */
525*8617a60dSAndroid Build Coastguard Worker 	if (pkey->c.struct_version_major != VB21_PACKED_KEY_VERSION_MAJOR)
526*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_UNPACK_KEY_STRUCT_VERSION;
527*8617a60dSAndroid Build Coastguard Worker 
528*8617a60dSAndroid Build Coastguard Worker 	/* Copy key algorithms */
529*8617a60dSAndroid Build Coastguard Worker 	key->hash_alg = pkey->hash_alg;
530*8617a60dSAndroid Build Coastguard Worker 	if (!vb2_digest_size(key->hash_alg))
531*8617a60dSAndroid Build Coastguard Worker 		return VB2_ERROR_UNPACK_KEY_HASH_ALGORITHM;
532*8617a60dSAndroid Build Coastguard Worker 
533*8617a60dSAndroid Build Coastguard Worker 	key->sig_alg = pkey->sig_alg;
534*8617a60dSAndroid Build Coastguard Worker 	if (key->sig_alg != VB2_SIG_NONE) {
535*8617a60dSAndroid Build Coastguard Worker 		sig_size = vb2_rsa_sig_size(key->sig_alg);
536*8617a60dSAndroid Build Coastguard Worker 		if (!sig_size)
537*8617a60dSAndroid Build Coastguard Worker 			return VB2_ERROR_UNPACK_KEY_SIG_ALGORITHM;
538*8617a60dSAndroid Build Coastguard Worker 		rv = vb2_unpack_key_data(
539*8617a60dSAndroid Build Coastguard Worker 				key,
540*8617a60dSAndroid Build Coastguard Worker 				(const uint8_t *)pkey + pkey->key_offset,
541*8617a60dSAndroid Build Coastguard Worker 				pkey->key_size);
542*8617a60dSAndroid Build Coastguard Worker 		if (rv)
543*8617a60dSAndroid Build Coastguard Worker 			return rv;
544*8617a60dSAndroid Build Coastguard Worker 	}
545*8617a60dSAndroid Build Coastguard Worker 
546*8617a60dSAndroid Build Coastguard Worker 	/* Key description */
547*8617a60dSAndroid Build Coastguard Worker 	key->desc = vb21_common_desc(pkey);
548*8617a60dSAndroid Build Coastguard Worker 	key->version = pkey->key_version;
549*8617a60dSAndroid Build Coastguard Worker 	key->id = &pkey->id;
550*8617a60dSAndroid Build Coastguard Worker 
551*8617a60dSAndroid Build Coastguard Worker 	return VB2_SUCCESS;
552*8617a60dSAndroid Build Coastguard Worker }
553