1 /*
2  * Copyright (c) 2015-2022, Arm Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef KEY_H
8 #define KEY_H
9 
10 #include <openssl/ossl_typ.h>
11 
12 /* Error codes */
13 enum {
14 	KEY_ERR_NONE,
15 	KEY_ERR_MALLOC,
16 	KEY_ERR_FILENAME,
17 	KEY_ERR_OPEN,
18 	KEY_ERR_LOAD
19 };
20 
21 /* Supported key algorithms */
22 enum {
23 	KEY_ALG_RSA,		/* RSA PSS as defined by PKCS#1 v2.1 (default) */
24 #ifndef OPENSSL_NO_EC
25 	KEY_ALG_ECDSA_NIST,
26 	KEY_ALG_ECDSA_BRAINPOOL_R,
27 	KEY_ALG_ECDSA_BRAINPOOL_T,
28 #endif /* OPENSSL_NO_EC */
29 	KEY_ALG_MAX_NUM
30 };
31 
32 /* Maximum number of valid key sizes per algorithm */
33 #define KEY_SIZE_MAX_NUM	4
34 
35 /* Supported hash algorithms */
36 enum{
37 	HASH_ALG_SHA256,
38 	HASH_ALG_SHA384,
39 	HASH_ALG_SHA512,
40 };
41 
42 /* Supported key sizes */
43 /* NOTE: the first item in each array is the default key size */
44 static const unsigned int KEY_SIZES[KEY_ALG_MAX_NUM][KEY_SIZE_MAX_NUM] = {
45 	{ 2048, 1024, 3072, 4096 },	/* KEY_ALG_RSA */
46 #ifndef OPENSSL_NO_EC
47 	{},				/* KEY_ALG_ECDSA_NIST */
48 	{},				/* KEY_ALG_ECDSA_BRAINPOOL_R */
49 	{}				/* KEY_ALG_ECDSA_BRAINPOOL_T */
50 #endif /* OPENSSL_NO_EC */
51 };
52 
53 /*
54  * This structure contains the relevant information to create the keys
55  * required to sign the certificates.
56  *
57  * One instance of this structure must be created for each key, usually in an
58  * array fashion. The filename is obtained at run time from the command line
59  * parameters
60  */
61 typedef struct key_s {
62 	int id;			/* Key id */
63 	const char *opt;	/* Command line option to specify a key */
64 	const char *help_msg;	/* Help message */
65 	const char *desc;	/* Key description (debug purposes) */
66 	char *fn;		/* Filename to load/store the key */
67 	EVP_PKEY *key;		/* Key container */
68 } key_t;
69 
70 /* Exported API */
71 int key_init(void);
72 key_t *key_get_by_opt(const char *opt);
73 #if !USING_OPENSSL3
74 int key_new(key_t *key);
75 #endif
76 int key_create(key_t *key, int type, int key_bits);
77 int key_load(key_t *key, unsigned int *err_code);
78 int key_store(key_t *key);
79 void key_cleanup(void);
80 
81 /* Macro to register the keys used in the CoT */
82 #define REGISTER_KEYS(_keys) \
83 	key_t *def_keys = &_keys[0]; \
84 	const unsigned int num_def_keys = sizeof(_keys)/sizeof(_keys[0])
85 
86 /* Macro to register the platform defined keys used in the CoT */
87 #define PLAT_REGISTER_KEYS(_pdef_keys) \
88 	key_t *pdef_keys = &_pdef_keys[0]; \
89 	const unsigned int num_pdef_keys = sizeof(_pdef_keys)/sizeof(_pdef_keys[0])
90 
91 /* Exported variables */
92 extern key_t *def_keys;
93 extern const unsigned int num_def_keys;
94 extern key_t *pdef_keys;
95 extern const unsigned int num_pdef_keys;
96 
97 extern key_t *keys;
98 extern unsigned int num_keys;
99 #endif /* KEY_H */
100