blob: e63b4740aea2bd1f876b3b7709c2e1e2b2af3cad [file] [log] [blame]
Juan Castillo11abdcd2014-10-21 11:30:42 +01001/*
Pankaj Guptadd906e62020-12-09 14:02:38 +05302 * Copyright (c) 2015-2021, ARM Limited and Contributors. All rights reserved.
Juan Castillo11abdcd2014-10-21 11:30:42 +01003 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Juan Castillo11abdcd2014-10-21 11:30:42 +01005 */
6
Antonio Nino Diaz5eb88372018-11-08 10:20:19 +00007#ifndef CERT_H
8#define CERT_H
Juan Castillo11abdcd2014-10-21 11:30:42 +01009
10#include <openssl/ossl_typ.h>
11#include <openssl/x509.h>
Juan Castilloe6d30e92015-06-12 11:27:59 +010012#include "ext.h"
Juan Castillo11abdcd2014-10-21 11:30:42 +010013#include "key.h"
14
Manish Pandey0a658842020-05-22 12:27:28 +010015#define CERT_MAX_EXT 9
Juan Castilloe6d30e92015-06-12 11:27:59 +010016
Juan Castillo11abdcd2014-10-21 11:30:42 +010017/*
18 * This structure contains information related to the generation of the
19 * certificates. All these fields must be known and specified at build time
20 * except for the file name, which is picked up from the command line at
21 * run time.
22 *
23 * One instance of this structure must be created for each of the certificates
24 * present in the chain of trust.
25 *
26 * If the issuer points to this same instance, the generated certificate will
27 * be self-signed.
28 */
29typedef struct cert_s cert_t;
30struct cert_s {
31 int id; /* Unique identifier */
32
Juan Castillo1218dd52015-07-03 16:23:16 +010033 const char *opt; /* Command line option to pass filename */
Juan Castillo11abdcd2014-10-21 11:30:42 +010034 const char *fn; /* Filename to save the certificate */
Juan Castillo11abdcd2014-10-21 11:30:42 +010035 const char *cn; /* Subject CN (Company Name) */
Juan Castillo212f7382015-12-15 16:37:57 +000036 const char *help_msg; /* Help message */
Juan Castillo11abdcd2014-10-21 11:30:42 +010037
Juan Castilloe6d30e92015-06-12 11:27:59 +010038 /* These fields must be defined statically */
39 int key; /* Key to be signed */
40 int issuer; /* Issuer certificate */
41 int ext[CERT_MAX_EXT]; /* Certificate extensions */
42 int num_ext; /* Number of extensions in the certificate */
Juan Castillo11abdcd2014-10-21 11:30:42 +010043
Juan Castilloe6d30e92015-06-12 11:27:59 +010044 X509 *x; /* X509 certificate container */
Juan Castillo11abdcd2014-10-21 11:30:42 +010045};
46
Juan Castilloe6d30e92015-06-12 11:27:59 +010047/* Exported API */
Juan Castillo1218dd52015-07-03 16:23:16 +010048int cert_init(void);
49cert_t *cert_get_by_opt(const char *opt);
Juan Castillo11abdcd2014-10-21 11:30:42 +010050int cert_add_ext(X509 *issuer, X509 *subject, int nid, char *value);
Qixiang Xu76a5a9b2017-11-09 13:51:58 +080051int cert_new(
Qixiang Xu76a5a9b2017-11-09 13:51:58 +080052 int md_alg,
53 cert_t *cert,
54 int days,
55 int ca,
56 STACK_OF(X509_EXTENSION) * sk);
Juan Castillo11abdcd2014-10-21 11:30:42 +010057
Juan Castilloe6d30e92015-06-12 11:27:59 +010058/* Macro to register the certificates used in the CoT */
59#define REGISTER_COT(_certs) \
Pankaj Guptadd906e62020-12-09 14:02:38 +053060 cert_t *def_certs = &_certs[0]; \
61 const unsigned int num_def_certs = sizeof(_certs)/sizeof(_certs[0])
62
63/* Macro to register the platform defined certificates used in the CoT */
64#define PLAT_REGISTER_COT(_pdef_certs) \
65 cert_t *pdef_certs = &_pdef_certs[0]; \
66 const unsigned int num_pdef_certs = sizeof(_pdef_certs)/sizeof(_pdef_certs[0])
Juan Castilloe6d30e92015-06-12 11:27:59 +010067
68/* Exported variables */
Pankaj Guptadd906e62020-12-09 14:02:38 +053069extern cert_t *def_certs;
70extern const unsigned int num_def_certs;
71extern cert_t *pdef_certs;
72extern const unsigned int num_pdef_certs;
Juan Castilloe6d30e92015-06-12 11:27:59 +010073
Pankaj Guptadd906e62020-12-09 14:02:38 +053074extern cert_t *certs;
75extern unsigned int num_certs;
Antonio Nino Diaz5eb88372018-11-08 10:20:19 +000076#endif /* CERT_H */