2 * Copyright (C) 2003-2012 Free Software Foundation, Inc.
4 * Author: Nikos Mavrogiannopoulos
6 * This file is part of GnuTLS.
8 * The GnuTLS is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public License
10 * as published by the Free Software Foundation; either version 3 of
11 * the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>
26 #include <gnutls/x509.h>
27 #include <gnutls/abstract.h>
31 #define MAX_CRQ_EXTENSIONS_SIZE 8*1024
32 #define MAX_OID_SIZE 128
34 #define HASH_OID_SHA1 "1.3.14.3.2.26"
35 #define HASH_OID_MD5 "1.2.840.113549.2.5"
36 #define HASH_OID_MD2 "1.2.840.113549.2.2"
37 #define HASH_OID_RMD160 "1.3.36.3.2.1"
38 #define HASH_OID_SHA224 "2.16.840.1.101.3.4.2.4"
39 #define HASH_OID_SHA256 "2.16.840.1.101.3.4.2.1"
40 #define HASH_OID_SHA384 "2.16.840.1.101.3.4.2.2"
41 #define HASH_OID_SHA512 "2.16.840.1.101.3.4.2.3"
43 typedef struct gnutls_x509_crl_int
47 } gnutls_x509_crl_int
;
49 typedef struct gnutls_x509_crt_int
53 int expanded
; /* a certificate has been expanded */
55 struct pin_info_st pin
;
56 } gnutls_x509_crt_int
;
58 typedef struct gnutls_x509_crq_int
61 } gnutls_x509_crq_int
;
63 typedef struct gnutls_pkcs7_int
68 typedef struct gnutls_x509_privkey_int
70 /* the size of params depends on the public
73 gnutls_pk_params_st params
;
75 gnutls_pk_algorithm_t pk_algorithm
;
78 } gnutls_x509_privkey_int
;
80 int _gnutls_x509_crt_cpy (gnutls_x509_crt_t dest
, gnutls_x509_crt_t src
);
83 int _gnutls_x509_compare_raw_dn (const gnutls_datum_t
* dn1
,
84 const gnutls_datum_t
* dn2
);
87 int _gnutls_x509_crl_cpy (gnutls_x509_crl_t dest
, gnutls_x509_crl_t src
);
88 int _gnutls_x509_crl_get_raw_issuer_dn (gnutls_x509_crl_t crl
,
92 int _gnutls_x509_get_tbs (ASN1_TYPE cert
, const char *tbs_name
,
93 gnutls_datum_t
* tbs
);
94 int _gnutls_x509_pkix_sign (ASN1_TYPE src
, const char *src_name
,
95 gnutls_digest_algorithm_t
,
96 gnutls_x509_crt_t issuer
,
97 gnutls_privkey_t issuer_key
);
100 #define OID_X520_COUNTRY_NAME "2.5.4.6"
101 #define OID_X520_ORGANIZATION_NAME "2.5.4.10"
102 #define OID_X520_ORGANIZATIONAL_UNIT_NAME "2.5.4.11"
103 #define OID_X520_COMMON_NAME "2.5.4.3"
104 #define OID_X520_LOCALITY_NAME "2.5.4.7"
105 #define OID_X520_STATE_OR_PROVINCE_NAME "2.5.4.8"
106 #define OID_LDAP_DC "0.9.2342.19200300.100.1.25"
107 #define OID_LDAP_UID "0.9.2342.19200300.100.1.1"
108 #define OID_PKCS9_EMAIL "1.2.840.113549.1.9.1"
110 int _gnutls_x509_parse_dn (ASN1_TYPE asn1_struct
,
111 const char *asn1_rdn_name
, char *buf
,
112 size_t * sizeof_buf
);
115 _gnutls_x509_parse_dn_oid (ASN1_TYPE asn1_struct
,
116 const char *asn1_rdn_name
,
117 const char *given_oid
, int indx
,
118 unsigned int raw_flag
,
119 gnutls_datum_t
* out
);
121 int _gnutls_x509_set_dn_oid (ASN1_TYPE asn1_struct
,
122 const char *asn1_rdn_name
, const char *oid
,
123 int raw_flag
, const char *name
, int sizeof_name
);
125 int _gnutls_x509_get_dn_oid (ASN1_TYPE asn1_struct
,
126 const char *asn1_rdn_name
,
127 int indx
, void *_oid
, size_t * sizeof_oid
);
129 int _gnutls_parse_general_name (ASN1_TYPE src
, const char *src_name
,
130 int seq
, void *name
, size_t * name_size
,
131 unsigned int *ret_type
, int othername_oid
);
137 int gnutls_x509_crt_is_issuer (gnutls_x509_crt_t cert
,
138 gnutls_x509_crt_t issuer
);
141 _gnutls_x509_verify_algorithm (gnutls_digest_algorithm_t
* hash
,
142 const gnutls_datum_t
* signature
,
143 gnutls_pk_algorithm_t pk
,
144 gnutls_pk_params_st
* issuer_params
);
146 int _gnutls_x509_verify_data (gnutls_digest_algorithm_t algo
,
147 const gnutls_datum_t
* data
,
148 const gnutls_datum_t
* signature
,
149 gnutls_x509_crt_t issuer
);
152 ASN1_TYPE
_gnutls_privkey_decode_pkcs1_rsa_key (const gnutls_datum_t
*
154 gnutls_x509_privkey_t pkey
);
155 ASN1_TYPE
_gnutls_privkey_decode_ecc_key (const gnutls_datum_t
*
157 gnutls_x509_privkey_t pkey
);
160 _gnutls_x509_read_ecc_params (uint8_t * der
, int dersize
, gnutls_pk_params_st
* params
);
162 int _gnutls_asn1_encode_privkey (gnutls_pk_algorithm_t pk
, ASN1_TYPE
* c2
, gnutls_pk_params_st
* params
);
165 int _gnutls_x509_crl_get_extension (gnutls_x509_crl_t crl
,
166 const char *extension_id
, int indx
,
167 gnutls_datum_t
* ret
,
168 unsigned int *_critical
);
170 int _gnutls_x509_crl_get_extension_oid (gnutls_x509_crl_t crl
,
172 size_t * sizeof_oid
);
174 int _gnutls_x509_crl_set_extension (gnutls_x509_crl_t crl
,
176 const gnutls_datum_t
* ext_data
,
177 unsigned int critical
);
179 int _gnutls_x509_crt_get_extension (gnutls_x509_crt_t cert
,
180 const char *extension_id
, int indx
,
181 gnutls_datum_t
* ret
,
182 unsigned int *critical
);
183 int _gnutls_x509_crt_get_extension_oid (gnutls_x509_crt_t cert
,
186 int _gnutls_x509_ext_extract_keyUsage (uint16_t * keyUsage
,
187 uint8_t * extnValue
, int extnValueLen
);
188 int _gnutls_x509_ext_extract_basicConstraints (unsigned int *CA
,
189 int *pathLenConstraint
,
192 int _gnutls_x509_crt_set_extension (gnutls_x509_crt_t cert
,
193 const char *extension_id
,
194 const gnutls_datum_t
* ext_data
,
195 unsigned int critical
);
198 _gnutls_x509_ext_extract_number (uint8_t * number
,
200 uint8_t * extnValue
, int extnValueLen
);
202 _gnutls_x509_ext_gen_number (const uint8_t * nuber
, size_t nr_size
,
203 gnutls_datum_t
* der_ext
);
206 int _gnutls_x509_ext_gen_basicConstraints (int CA
, int pathLenConstraint
,
207 gnutls_datum_t
* der_ext
);
208 int _gnutls_x509_ext_gen_keyUsage (uint16_t usage
, gnutls_datum_t
* der_ext
);
209 int _gnutls_x509_ext_gen_subject_alt_name (gnutls_x509_subject_alt_name_t
210 type
, const void *data
,
211 unsigned int data_size
,
212 gnutls_datum_t
* prev_der_ext
,
213 gnutls_datum_t
* der_ext
);
214 int _gnutls_x509_ext_gen_crl_dist_points (gnutls_x509_subject_alt_name_t type
,
216 unsigned int data_size
,
217 unsigned int reason_flags
,
218 gnutls_datum_t
* der_ext
);
219 int _gnutls_x509_ext_gen_key_id (const void *id
, size_t id_size
,
220 gnutls_datum_t
* der_data
);
221 int _gnutls_x509_ext_gen_auth_key_id (const void *id
, size_t id_size
,
222 gnutls_datum_t
* der_data
);
223 int _gnutls_x509_ext_extract_proxyCertInfo (int *pathLenConstraint
,
224 char **policyLanguage
,
226 size_t * sizeof_policy
,
229 int _gnutls_x509_ext_gen_proxyCertInfo (int pathLenConstraint
,
230 const char *policyLanguage
,
232 size_t sizeof_policy
,
233 gnutls_datum_t
* der_ext
);
236 int _gnutls_x509_crq_get_mpis (gnutls_x509_crq_t cert
,
237 gnutls_pk_params_st
*);
239 int _gnutls_x509_crt_get_mpis (gnutls_x509_crt_t cert
,
240 gnutls_pk_params_st
* params
);
242 int _gnutls_x509_read_pubkey_params (gnutls_pk_algorithm_t
, uint8_t * der
, int dersize
,
243 gnutls_pk_params_st
* params
);
245 int _gnutls_x509_read_pubkey (gnutls_pk_algorithm_t
, uint8_t * der
, int dersize
,
246 gnutls_pk_params_st
* params
);
248 int _gnutls_x509_write_ecc_params (gnutls_pk_params_st
* params
,
249 gnutls_datum_t
* der
);
250 int _gnutls_x509_write_ecc_pubkey (gnutls_pk_params_st
* params
,
251 gnutls_datum_t
* der
);
254 _gnutls_x509_write_pubkey_params (gnutls_pk_algorithm_t algo
,
255 gnutls_pk_params_st
* params
,
256 gnutls_datum_t
* der
);
257 int _gnutls_x509_write_pubkey (gnutls_pk_algorithm_t
, gnutls_pk_params_st
* params
,
258 gnutls_datum_t
* der
);
260 int _gnutls_x509_read_uint (ASN1_TYPE node
, const char *value
,
263 int _gnutls_x509_read_der_int (uint8_t * der
, int dersize
, bigint_t
* out
);
265 int _gnutls_x509_read_int (ASN1_TYPE node
, const char *value
,
267 int _gnutls_x509_write_int (ASN1_TYPE node
, const char *value
, bigint_t mpi
,
269 int _gnutls_x509_write_uint32 (ASN1_TYPE node
, const char *value
,
272 int _gnutls_x509_write_sig_params (ASN1_TYPE dst
, const char *dst_name
,
273 gnutls_pk_algorithm_t pk_algorithm
,
274 gnutls_digest_algorithm_t
);
277 #include <gnutls/pkcs12.h>
279 typedef struct gnutls_pkcs12_int
284 #define MAX_BAG_ELEMENTS 32
289 gnutls_pkcs12_bag_type_t type
;
290 gnutls_datum_t local_key_id
;
294 typedef struct gnutls_pkcs12_bag_int
296 struct bag_element element
[MAX_BAG_ELEMENTS
];
298 } gnutls_pkcs12_bag_int
;
300 #define BAG_PKCS8_KEY "1.2.840.113549.1.12.10.1.1"
301 #define BAG_PKCS8_ENCRYPTED_KEY "1.2.840.113549.1.12.10.1.2"
302 #define BAG_CERTIFICATE "1.2.840.113549.1.12.10.1.3"
303 #define BAG_CRL "1.2.840.113549.1.12.10.1.4"
304 #define BAG_SECRET "1.2.840.113549.1.12.10.1.5"
308 #define DATA_OID "1.2.840.113549.1.7.1"
309 #define ENC_DATA_OID "1.2.840.113549.1.7.6"
313 #define FRIENDLY_NAME_OID "1.2.840.113549.1.9.20"
314 #define KEY_ID_OID "1.2.840.113549.1.9.21"
317 _gnutls_pkcs12_string_to_key (unsigned int id
, const uint8_t * salt
,
318 unsigned int salt_size
, unsigned int iter
,
319 const char *pw
, unsigned int req_keylen
,
322 int _gnutls_pkcs7_decrypt_data (const gnutls_datum_t
* data
,
323 const char *password
, gnutls_datum_t
* dec
);
325 typedef enum schema_id
327 PBES2_GENERIC
, /* when the algorithm is unknown, temporal use when reading only */
328 PBES2_3DES
, /* the stuff in PKCS #5 */
332 PKCS12_3DES_SHA1
, /* the stuff in PKCS #12 */
337 int _gnutls_pkcs_flags_to_schema (unsigned int flags
);
338 int _gnutls_pkcs7_encrypt_data (schema_id schema
,
339 const gnutls_datum_t
* data
,
340 const char *password
, gnutls_datum_t
* enc
);
341 int _pkcs12_decode_safe_contents (const gnutls_datum_t
* content
,
342 gnutls_pkcs12_bag_t bag
);
345 _pkcs12_encode_safe_contents (gnutls_pkcs12_bag_t bag
, ASN1_TYPE
* content
,
348 int _pkcs12_decode_crt_bag (gnutls_pkcs12_bag_type_t type
,
349 const gnutls_datum_t
* in
, gnutls_datum_t
* out
);
350 int _pkcs12_encode_crt_bag (gnutls_pkcs12_bag_type_t type
,
351 const gnutls_datum_t
* raw
, gnutls_datum_t
* out
);
354 int _gnutls_x509_crq_set_extension (gnutls_x509_crq_t crq
,
356 const gnutls_datum_t
* ext_data
,
357 unsigned int critical
);
360 _gnutls_x509_verify_certificate (const gnutls_x509_crt_t
* certificate_list
,
362 const gnutls_x509_crt_t
* trusted_cas
,
365 gnutls_verify_output_function func
);
368 _gnutls_is_same_dn (gnutls_x509_crt_t cert1
, gnutls_x509_crt_t cert2
);
371 _gnutls_x509_crt_check_revocation (gnutls_x509_crt_t cert
,
372 const gnutls_x509_crl_t
* crl_list
,
374 gnutls_verify_output_function func
);