]> git.sur5r.net Git - freertos/blob - FreeRTOS-Labs/Source/mbedtls/include/mbedtls/x509.h
Add the Labs projects provided in the V10.2.1_191129 zip file.
[freertos] / FreeRTOS-Labs / Source / mbedtls / include / mbedtls / x509.h
1 /**\r
2  * \file x509.h\r
3  *\r
4  * \brief X.509 generic defines and structures\r
5  */\r
6 /*\r
7  *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\r
8  *  SPDX-License-Identifier: Apache-2.0\r
9  *\r
10  *  Licensed under the Apache License, Version 2.0 (the "License"); you may\r
11  *  not use this file except in compliance with the License.\r
12  *  You may obtain a copy of the License at\r
13  *\r
14  *  http://www.apache.org/licenses/LICENSE-2.0\r
15  *\r
16  *  Unless required by applicable law or agreed to in writing, software\r
17  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT\r
18  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
19  *  See the License for the specific language governing permissions and\r
20  *  limitations under the License.\r
21  *\r
22  *  This file is part of mbed TLS (https://tls.mbed.org)\r
23  */\r
24 #ifndef MBEDTLS_X509_H\r
25 #define MBEDTLS_X509_H\r
26 \r
27 #if !defined(MBEDTLS_CONFIG_FILE)\r
28 #include "config.h"\r
29 #else\r
30 #include MBEDTLS_CONFIG_FILE\r
31 #endif\r
32 \r
33 #include "asn1.h"\r
34 #include "pk.h"\r
35 \r
36 #if defined(MBEDTLS_RSA_C)\r
37 #include "rsa.h"\r
38 #endif\r
39 \r
40 /**\r
41  * \addtogroup x509_module\r
42  * \{\r
43  */\r
44 \r
45 #if !defined(MBEDTLS_X509_MAX_INTERMEDIATE_CA)\r
46 /**\r
47  * Maximum number of intermediate CAs in a verification chain.\r
48  * That is, maximum length of the chain, excluding the end-entity certificate\r
49  * and the trusted root certificate.\r
50  *\r
51  * Set this to a low value to prevent an adversary from making you waste\r
52  * resources verifying an overlong certificate chain.\r
53  */\r
54 #define MBEDTLS_X509_MAX_INTERMEDIATE_CA   8\r
55 #endif\r
56 \r
57 /**\r
58  * \name X509 Error codes\r
59  * \{\r
60  */\r
61 #define MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE              -0x2080  /**< Unavailable feature, e.g. RSA hashing/encryption combination. */\r
62 #define MBEDTLS_ERR_X509_UNKNOWN_OID                      -0x2100  /**< Requested OID is unknown. */\r
63 #define MBEDTLS_ERR_X509_INVALID_FORMAT                   -0x2180  /**< The CRT/CRL/CSR format is invalid, e.g. different type expected. */\r
64 #define MBEDTLS_ERR_X509_INVALID_VERSION                  -0x2200  /**< The CRT/CRL/CSR version element is invalid. */\r
65 #define MBEDTLS_ERR_X509_INVALID_SERIAL                   -0x2280  /**< The serial tag or value is invalid. */\r
66 #define MBEDTLS_ERR_X509_INVALID_ALG                      -0x2300  /**< The algorithm tag or value is invalid. */\r
67 #define MBEDTLS_ERR_X509_INVALID_NAME                     -0x2380  /**< The name tag or value is invalid. */\r
68 #define MBEDTLS_ERR_X509_INVALID_DATE                     -0x2400  /**< The date tag or value is invalid. */\r
69 #define MBEDTLS_ERR_X509_INVALID_SIGNATURE                -0x2480  /**< The signature tag or value invalid. */\r
70 #define MBEDTLS_ERR_X509_INVALID_EXTENSIONS               -0x2500  /**< The extension tag or value is invalid. */\r
71 #define MBEDTLS_ERR_X509_UNKNOWN_VERSION                  -0x2580  /**< CRT/CRL/CSR has an unsupported version number. */\r
72 #define MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG                  -0x2600  /**< Signature algorithm (oid) is unsupported. */\r
73 #define MBEDTLS_ERR_X509_SIG_MISMATCH                     -0x2680  /**< Signature algorithms do not match. (see \c ::mbedtls_x509_crt sig_oid) */\r
74 #define MBEDTLS_ERR_X509_CERT_VERIFY_FAILED               -0x2700  /**< Certificate verification failed, e.g. CRL, CA or signature check failed. */\r
75 #define MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT              -0x2780  /**< Format not recognized as DER or PEM. */\r
76 #define MBEDTLS_ERR_X509_BAD_INPUT_DATA                   -0x2800  /**< Input invalid. */\r
77 #define MBEDTLS_ERR_X509_ALLOC_FAILED                     -0x2880  /**< Allocation of memory failed. */\r
78 #define MBEDTLS_ERR_X509_FILE_IO_ERROR                    -0x2900  /**< Read/write of file failed. */\r
79 #define MBEDTLS_ERR_X509_BUFFER_TOO_SMALL                 -0x2980  /**< Destination buffer is too small. */\r
80 #define MBEDTLS_ERR_X509_FATAL_ERROR                      -0x3000  /**< A fatal error occurred, eg the chain is too long or the vrfy callback failed. */\r
81 /* \} name */\r
82 \r
83 /**\r
84  * \name X509 Verify codes\r
85  * \{\r
86  */\r
87 /* Reminder: update x509_crt_verify_strings[] in library/x509_crt.c */\r
88 #define MBEDTLS_X509_BADCERT_EXPIRED             0x01  /**< The certificate validity has expired. */\r
89 #define MBEDTLS_X509_BADCERT_REVOKED             0x02  /**< The certificate has been revoked (is on a CRL). */\r
90 #define MBEDTLS_X509_BADCERT_CN_MISMATCH         0x04  /**< The certificate Common Name (CN) does not match with the expected CN. */\r
91 #define MBEDTLS_X509_BADCERT_NOT_TRUSTED         0x08  /**< The certificate is not correctly signed by the trusted CA. */\r
92 #define MBEDTLS_X509_BADCRL_NOT_TRUSTED          0x10  /**< The CRL is not correctly signed by the trusted CA. */\r
93 #define MBEDTLS_X509_BADCRL_EXPIRED              0x20  /**< The CRL is expired. */\r
94 #define MBEDTLS_X509_BADCERT_MISSING             0x40  /**< Certificate was missing. */\r
95 #define MBEDTLS_X509_BADCERT_SKIP_VERIFY         0x80  /**< Certificate verification was skipped. */\r
96 #define MBEDTLS_X509_BADCERT_OTHER             0x0100  /**< Other reason (can be used by verify callback) */\r
97 #define MBEDTLS_X509_BADCERT_FUTURE            0x0200  /**< The certificate validity starts in the future. */\r
98 #define MBEDTLS_X509_BADCRL_FUTURE             0x0400  /**< The CRL is from the future */\r
99 #define MBEDTLS_X509_BADCERT_KEY_USAGE         0x0800  /**< Usage does not match the keyUsage extension. */\r
100 #define MBEDTLS_X509_BADCERT_EXT_KEY_USAGE     0x1000  /**< Usage does not match the extendedKeyUsage extension. */\r
101 #define MBEDTLS_X509_BADCERT_NS_CERT_TYPE      0x2000  /**< Usage does not match the nsCertType extension. */\r
102 #define MBEDTLS_X509_BADCERT_BAD_MD            0x4000  /**< The certificate is signed with an unacceptable hash. */\r
103 #define MBEDTLS_X509_BADCERT_BAD_PK            0x8000  /**< The certificate is signed with an unacceptable PK alg (eg RSA vs ECDSA). */\r
104 #define MBEDTLS_X509_BADCERT_BAD_KEY         0x010000  /**< The certificate is signed with an unacceptable key (eg bad curve, RSA too short). */\r
105 #define MBEDTLS_X509_BADCRL_BAD_MD           0x020000  /**< The CRL is signed with an unacceptable hash. */\r
106 #define MBEDTLS_X509_BADCRL_BAD_PK           0x040000  /**< The CRL is signed with an unacceptable PK alg (eg RSA vs ECDSA). */\r
107 #define MBEDTLS_X509_BADCRL_BAD_KEY          0x080000  /**< The CRL is signed with an unacceptable key (eg bad curve, RSA too short). */\r
108 \r
109 /* \} name */\r
110 /* \} addtogroup x509_module */\r
111 \r
112 /*\r
113  * X.509 v3 Subject Alternative Name types.\r
114  *      otherName                       [0]     OtherName,\r
115  *      rfc822Name                      [1]     IA5String,\r
116  *      dNSName                         [2]     IA5String,\r
117  *      x400Address                     [3]     ORAddress,\r
118  *      directoryName                   [4]     Name,\r
119  *      ediPartyName                    [5]     EDIPartyName,\r
120  *      uniformResourceIdentifier       [6]     IA5String,\r
121  *      iPAddress                       [7]     OCTET STRING,\r
122  *      registeredID                    [8]     OBJECT IDENTIFIER\r
123  */\r
124 #define MBEDTLS_X509_SAN_OTHER_NAME                      0\r
125 #define MBEDTLS_X509_SAN_RFC822_NAME                     1\r
126 #define MBEDTLS_X509_SAN_DNS_NAME                        2\r
127 #define MBEDTLS_X509_SAN_X400_ADDRESS_NAME               3\r
128 #define MBEDTLS_X509_SAN_DIRECTORY_NAME                  4\r
129 #define MBEDTLS_X509_SAN_EDI_PARTY_NAME                  5\r
130 #define MBEDTLS_X509_SAN_UNIFORM_RESOURCE_IDENTIFIER     6\r
131 #define MBEDTLS_X509_SAN_IP_ADDRESS                      7\r
132 #define MBEDTLS_X509_SAN_REGISTERED_ID                   8\r
133 \r
134 /*\r
135  * X.509 v3 Key Usage Extension flags\r
136  * Reminder: update x509_info_key_usage() when adding new flags.\r
137  */\r
138 #define MBEDTLS_X509_KU_DIGITAL_SIGNATURE            (0x80)  /* bit 0 */\r
139 #define MBEDTLS_X509_KU_NON_REPUDIATION              (0x40)  /* bit 1 */\r
140 #define MBEDTLS_X509_KU_KEY_ENCIPHERMENT             (0x20)  /* bit 2 */\r
141 #define MBEDTLS_X509_KU_DATA_ENCIPHERMENT            (0x10)  /* bit 3 */\r
142 #define MBEDTLS_X509_KU_KEY_AGREEMENT                (0x08)  /* bit 4 */\r
143 #define MBEDTLS_X509_KU_KEY_CERT_SIGN                (0x04)  /* bit 5 */\r
144 #define MBEDTLS_X509_KU_CRL_SIGN                     (0x02)  /* bit 6 */\r
145 #define MBEDTLS_X509_KU_ENCIPHER_ONLY                (0x01)  /* bit 7 */\r
146 #define MBEDTLS_X509_KU_DECIPHER_ONLY              (0x8000)  /* bit 8 */\r
147 \r
148 /*\r
149  * Netscape certificate types\r
150  * (http://www.mozilla.org/projects/security/pki/nss/tech-notes/tn3.html)\r
151  */\r
152 \r
153 #define MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT         (0x80)  /* bit 0 */\r
154 #define MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER         (0x40)  /* bit 1 */\r
155 #define MBEDTLS_X509_NS_CERT_TYPE_EMAIL              (0x20)  /* bit 2 */\r
156 #define MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING     (0x10)  /* bit 3 */\r
157 #define MBEDTLS_X509_NS_CERT_TYPE_RESERVED           (0x08)  /* bit 4 */\r
158 #define MBEDTLS_X509_NS_CERT_TYPE_SSL_CA             (0x04)  /* bit 5 */\r
159 #define MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA           (0x02)  /* bit 6 */\r
160 #define MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA  (0x01)  /* bit 7 */\r
161 \r
162 /*\r
163  * X.509 extension types\r
164  *\r
165  * Comments refer to the status for using certificates. Status can be\r
166  * different for writing certificates or reading CRLs or CSRs.\r
167  *\r
168  * Those are defined in oid.h as oid.c needs them in a data structure. Since\r
169  * these were previously defined here, let's have aliases for compatibility.\r
170  */\r
171 #define MBEDTLS_X509_EXT_AUTHORITY_KEY_IDENTIFIER MBEDTLS_OID_X509_EXT_AUTHORITY_KEY_IDENTIFIER\r
172 #define MBEDTLS_X509_EXT_SUBJECT_KEY_IDENTIFIER   MBEDTLS_OID_X509_EXT_SUBJECT_KEY_IDENTIFIER\r
173 #define MBEDTLS_X509_EXT_KEY_USAGE                MBEDTLS_OID_X509_EXT_KEY_USAGE\r
174 #define MBEDTLS_X509_EXT_CERTIFICATE_POLICIES     MBEDTLS_OID_X509_EXT_CERTIFICATE_POLICIES\r
175 #define MBEDTLS_X509_EXT_POLICY_MAPPINGS          MBEDTLS_OID_X509_EXT_POLICY_MAPPINGS\r
176 #define MBEDTLS_X509_EXT_SUBJECT_ALT_NAME         MBEDTLS_OID_X509_EXT_SUBJECT_ALT_NAME         /* Supported (DNS) */\r
177 #define MBEDTLS_X509_EXT_ISSUER_ALT_NAME          MBEDTLS_OID_X509_EXT_ISSUER_ALT_NAME\r
178 #define MBEDTLS_X509_EXT_SUBJECT_DIRECTORY_ATTRS  MBEDTLS_OID_X509_EXT_SUBJECT_DIRECTORY_ATTRS\r
179 #define MBEDTLS_X509_EXT_BASIC_CONSTRAINTS        MBEDTLS_OID_X509_EXT_BASIC_CONSTRAINTS        /* Supported */\r
180 #define MBEDTLS_X509_EXT_NAME_CONSTRAINTS         MBEDTLS_OID_X509_EXT_NAME_CONSTRAINTS\r
181 #define MBEDTLS_X509_EXT_POLICY_CONSTRAINTS       MBEDTLS_OID_X509_EXT_POLICY_CONSTRAINTS\r
182 #define MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE       MBEDTLS_OID_X509_EXT_EXTENDED_KEY_USAGE\r
183 #define MBEDTLS_X509_EXT_CRL_DISTRIBUTION_POINTS  MBEDTLS_OID_X509_EXT_CRL_DISTRIBUTION_POINTS\r
184 #define MBEDTLS_X509_EXT_INIHIBIT_ANYPOLICY       MBEDTLS_OID_X509_EXT_INIHIBIT_ANYPOLICY\r
185 #define MBEDTLS_X509_EXT_FRESHEST_CRL             MBEDTLS_OID_X509_EXT_FRESHEST_CRL\r
186 #define MBEDTLS_X509_EXT_NS_CERT_TYPE             MBEDTLS_OID_X509_EXT_NS_CERT_TYPE\r
187 \r
188 /*\r
189  * Storage format identifiers\r
190  * Recognized formats: PEM and DER\r
191  */\r
192 #define MBEDTLS_X509_FORMAT_DER                 1\r
193 #define MBEDTLS_X509_FORMAT_PEM                 2\r
194 \r
195 #define MBEDTLS_X509_MAX_DN_NAME_SIZE         256 /**< Maximum value size of a DN entry */\r
196 \r
197 #ifdef __cplusplus\r
198 extern "C" {\r
199 #endif\r
200 \r
201 /**\r
202  * \addtogroup x509_module\r
203  * \{ */\r
204 \r
205 /**\r
206  * \name Structures for parsing X.509 certificates, CRLs and CSRs\r
207  * \{\r
208  */\r
209 \r
210 /**\r
211  * Type-length-value structure that allows for ASN1 using DER.\r
212  */\r
213 typedef mbedtls_asn1_buf mbedtls_x509_buf;\r
214 \r
215 /**\r
216  * Container for ASN1 bit strings.\r
217  */\r
218 typedef mbedtls_asn1_bitstring mbedtls_x509_bitstring;\r
219 \r
220 /**\r
221  * Container for ASN1 named information objects.\r
222  * It allows for Relative Distinguished Names (e.g. cn=localhost,ou=code,etc.).\r
223  */\r
224 typedef mbedtls_asn1_named_data mbedtls_x509_name;\r
225 \r
226 /**\r
227  * Container for a sequence of ASN.1 items\r
228  */\r
229 typedef mbedtls_asn1_sequence mbedtls_x509_sequence;\r
230 \r
231 /** Container for date and time (precision in seconds). */\r
232 typedef struct mbedtls_x509_time\r
233 {\r
234     int year, mon, day;         /**< Date. */\r
235     int hour, min, sec;         /**< Time. */\r
236 }\r
237 mbedtls_x509_time;\r
238 \r
239 /** \} name Structures for parsing X.509 certificates, CRLs and CSRs */\r
240 /** \} addtogroup x509_module */\r
241 \r
242 /**\r
243  * \brief          Store the certificate DN in printable form into buf;\r
244  *                 no more than size characters will be written.\r
245  *\r
246  * \param buf      Buffer to write to\r
247  * \param size     Maximum size of buffer\r
248  * \param dn       The X509 name to represent\r
249  *\r
250  * \return         The length of the string written (not including the\r
251  *                 terminated nul byte), or a negative error code.\r
252  */\r
253 int mbedtls_x509_dn_gets( char *buf, size_t size, const mbedtls_x509_name *dn );\r
254 \r
255 /**\r
256  * \brief          Store the certificate serial in printable form into buf;\r
257  *                 no more than size characters will be written.\r
258  *\r
259  * \param buf      Buffer to write to\r
260  * \param size     Maximum size of buffer\r
261  * \param serial   The X509 serial to represent\r
262  *\r
263  * \return         The length of the string written (not including the\r
264  *                 terminated nul byte), or a negative error code.\r
265  */\r
266 int mbedtls_x509_serial_gets( char *buf, size_t size, const mbedtls_x509_buf *serial );\r
267 \r
268 /**\r
269  * \brief          Check a given mbedtls_x509_time against the system time\r
270  *                 and tell if it's in the past.\r
271  *\r
272  * \note           Intended usage is "if( is_past( valid_to ) ) ERROR".\r
273  *                 Hence the return value of 1 if on internal errors.\r
274  *\r
275  * \param to       mbedtls_x509_time to check\r
276  *\r
277  * \return         1 if the given time is in the past or an error occurred,\r
278  *                 0 otherwise.\r
279  */\r
280 int mbedtls_x509_time_is_past( const mbedtls_x509_time *to );\r
281 \r
282 /**\r
283  * \brief          Check a given mbedtls_x509_time against the system time\r
284  *                 and tell if it's in the future.\r
285  *\r
286  * \note           Intended usage is "if( is_future( valid_from ) ) ERROR".\r
287  *                 Hence the return value of 1 if on internal errors.\r
288  *\r
289  * \param from     mbedtls_x509_time to check\r
290  *\r
291  * \return         1 if the given time is in the future or an error occurred,\r
292  *                 0 otherwise.\r
293  */\r
294 int mbedtls_x509_time_is_future( const mbedtls_x509_time *from );\r
295 \r
296 #if defined(MBEDTLS_SELF_TEST)\r
297 \r
298 /**\r
299  * \brief          Checkup routine\r
300  *\r
301  * \return         0 if successful, or 1 if the test failed\r
302  */\r
303 int mbedtls_x509_self_test( int verbose );\r
304 \r
305 #endif /* MBEDTLS_SELF_TEST */\r
306 \r
307 /*\r
308  * Internal module functions. You probably do not want to use these unless you\r
309  * know you do.\r
310  */\r
311 int mbedtls_x509_get_name( unsigned char **p, const unsigned char *end,\r
312                    mbedtls_x509_name *cur );\r
313 int mbedtls_x509_get_alg_null( unsigned char **p, const unsigned char *end,\r
314                        mbedtls_x509_buf *alg );\r
315 int mbedtls_x509_get_alg( unsigned char **p, const unsigned char *end,\r
316                   mbedtls_x509_buf *alg, mbedtls_x509_buf *params );\r
317 #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)\r
318 int mbedtls_x509_get_rsassa_pss_params( const mbedtls_x509_buf *params,\r
319                                 mbedtls_md_type_t *md_alg, mbedtls_md_type_t *mgf_md,\r
320                                 int *salt_len );\r
321 #endif\r
322 int mbedtls_x509_get_sig( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *sig );\r
323 int mbedtls_x509_get_sig_alg( const mbedtls_x509_buf *sig_oid, const mbedtls_x509_buf *sig_params,\r
324                       mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg,\r
325                       void **sig_opts );\r
326 int mbedtls_x509_get_time( unsigned char **p, const unsigned char *end,\r
327                    mbedtls_x509_time *t );\r
328 int mbedtls_x509_get_serial( unsigned char **p, const unsigned char *end,\r
329                      mbedtls_x509_buf *serial );\r
330 int mbedtls_x509_get_ext( unsigned char **p, const unsigned char *end,\r
331                   mbedtls_x509_buf *ext, int tag );\r
332 int mbedtls_x509_sig_alg_gets( char *buf, size_t size, const mbedtls_x509_buf *sig_oid,\r
333                        mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg,\r
334                        const void *sig_opts );\r
335 int mbedtls_x509_key_size_helper( char *buf, size_t buf_size, const char *name );\r
336 int mbedtls_x509_string_to_names( mbedtls_asn1_named_data **head, const char *name );\r
337 int mbedtls_x509_set_extension( mbedtls_asn1_named_data **head, const char *oid, size_t oid_len,\r
338                         int critical, const unsigned char *val,\r
339                         size_t val_len );\r
340 int mbedtls_x509_write_extensions( unsigned char **p, unsigned char *start,\r
341                            mbedtls_asn1_named_data *first );\r
342 int mbedtls_x509_write_names( unsigned char **p, unsigned char *start,\r
343                       mbedtls_asn1_named_data *first );\r
344 int mbedtls_x509_write_sig( unsigned char **p, unsigned char *start,\r
345                     const char *oid, size_t oid_len,\r
346                     unsigned char *sig, size_t size );\r
347 \r
348 #define MBEDTLS_X509_SAFE_SNPRINTF                          \\r
349     do {                                                    \\r
350         if( ret < 0 || (size_t) ret >= n )                  \\r
351             return( MBEDTLS_ERR_X509_BUFFER_TOO_SMALL );    \\r
352                                                             \\r
353         n -= (size_t) ret;                                  \\r
354         p += (size_t) ret;                                  \\r
355     } while( 0 )\r
356 \r
357 #ifdef __cplusplus\r
358 }\r
359 #endif\r
360 \r
361 #endif /* x509.h */\r