summaryrefslogtreecommitdiffstats
path: root/tools/cert_create/include/key.h
blob: e0ecdaed2e91c499bba4c4824eeed9eba242ae4d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*
 * Copyright (c) 2015-2023, Arm Limited and Contributors. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#ifndef KEY_H
#define KEY_H

#include <openssl/ossl_typ.h>

/* Error codes */
enum {
	KEY_ERR_NONE,
	KEY_ERR_MALLOC,
	KEY_ERR_FILENAME,
	KEY_ERR_OPEN,
	KEY_ERR_LOAD
};

/* Supported key algorithms */
enum {
	KEY_ALG_RSA,		/* RSA PSS as defined by PKCS#1 v2.1 (default) */
#ifndef OPENSSL_NO_EC
	KEY_ALG_ECDSA_NIST,
	KEY_ALG_ECDSA_BRAINPOOL_R,
	KEY_ALG_ECDSA_BRAINPOOL_T,
#endif /* OPENSSL_NO_EC */
	KEY_ALG_MAX_NUM
};

/* Maximum number of valid key sizes per algorithm */
#define KEY_SIZE_MAX_NUM	4

/* Supported hash algorithms */
enum{
	HASH_ALG_SHA256,
	HASH_ALG_SHA384,
	HASH_ALG_SHA512,
};

/* Supported key sizes */
/* NOTE: the first item in each array is the default key size */
static const unsigned int KEY_SIZES[KEY_ALG_MAX_NUM][KEY_SIZE_MAX_NUM] = {
	{ 2048, 1024, 3072, 4096 },	/* KEY_ALG_RSA */
#ifndef OPENSSL_NO_EC
	{ 256, 384 },			/* KEY_ALG_ECDSA_NIST */
	{},				/* KEY_ALG_ECDSA_BRAINPOOL_R */
	{}				/* KEY_ALG_ECDSA_BRAINPOOL_T */
#endif /* OPENSSL_NO_EC */
};

/*
 * This structure contains the relevant information to create the keys
 * required to sign the certificates.
 *
 * One instance of this structure must be created for each key, usually in an
 * array fashion. The filename is obtained at run time from the command line
 * parameters
 */
typedef struct key_s {
	int id;			/* Key id */
	const char *opt;	/* Command line option to specify a key */
	const char *help_msg;	/* Help message */
	const char *desc;	/* Key description (debug purposes) */
	char *fn;		/* Filename to load/store the key */
	EVP_PKEY *key;		/* Key container */
} key_t;

/* Exported API */
int key_init(void);
key_t *key_get_by_opt(const char *opt);
#if !USING_OPENSSL3
int key_new(key_t *key);
#endif
int key_create(key_t *key, int type, int key_bits);
unsigned int key_load(key_t *key);
int key_store(key_t *key);
void key_cleanup(void);

/* Macro to register the keys used in the CoT */
#define REGISTER_KEYS(_keys) \
	key_t *def_keys = &_keys[0]; \
	const unsigned int num_def_keys = sizeof(_keys)/sizeof(_keys[0])

/* Macro to register the platform defined keys used in the CoT */
#define PLAT_REGISTER_KEYS(_pdef_keys) \
	key_t *pdef_keys = &_pdef_keys[0]; \
	const unsigned int num_pdef_keys = sizeof(_pdef_keys)/sizeof(_pdef_keys[0])

/* Exported variables */
extern key_t *def_keys;
extern const unsigned int num_def_keys;
extern key_t *pdef_keys;
extern const unsigned int num_pdef_keys;

extern key_t *keys;
extern unsigned int num_keys;
#endif /* KEY_H */