]> granicus.if.org Git - apache/blob - modules/md/md_crypt.h
Fix alignment in a <highlight> block.
[apache] / modules / md / md_crypt.h
1 /* Licensed to the Apache Software Foundation (ASF) under one or more
2  * contributor license agreements.  See the NOTICE file distributed with
3  * this work for additional information regarding copyright ownership.
4  * The ASF licenses this file to You under the Apache License, Version 2.0
5  * (the "License"); you may not use this file except in compliance with
6  * the License.  You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef mod_md_md_crypt_h
18 #define mod_md_md_crypt_h
19
20 #include <apr_file_io.h>
21
22 struct apr_array_header_t;
23 struct md_t;
24 struct md_http_response_t;
25 struct md_cert_t;
26 struct md_pkey_t;
27 struct md_data_t;
28
29
30 /**************************************************************************************************/
31 /* random */
32
33 apr_status_t md_rand_bytes(unsigned char *buf, apr_size_t len, apr_pool_t *p);
34
35 apr_time_t md_asn1_generalized_time_get(void *ASN1_GENERALIZEDTIME);
36
37 /**************************************************************************************************/
38 /* digests */
39 apr_status_t md_crypt_sha256_digest64(const char **pdigest64, apr_pool_t *p, 
40                                       const struct md_data_t *data);
41 apr_status_t md_crypt_sha256_digest_hex(const char **pdigesthex, apr_pool_t *p, 
42                                         const struct md_data_t *data);
43
44 #define MD_DATA_SET_STR(d, s)       do { (d)->data = (s); (d)->len = strlen(s); } while(0)
45
46 /**************************************************************************************************/
47 /* private keys */
48
49 typedef struct md_pkey_t md_pkey_t;
50
51 typedef enum {
52     MD_PKEY_TYPE_DEFAULT,
53     MD_PKEY_TYPE_RSA,
54 } md_pkey_type_t;
55
56 typedef struct md_pkey_rsa_spec_t {
57     apr_uint32_t bits;
58 } md_pkey_rsa_spec_t;
59
60 typedef struct md_pkey_spec_t {
61     md_pkey_type_t type;
62     union {
63         md_pkey_rsa_spec_t rsa;
64     } params;
65 } md_pkey_spec_t;
66
67 apr_status_t md_crypt_init(apr_pool_t *pool);
68
69 apr_status_t md_pkey_gen(md_pkey_t **ppkey, apr_pool_t *p, md_pkey_spec_t *spec);
70 void md_pkey_free(md_pkey_t *pkey);
71
72 const char *md_pkey_get_rsa_e64(md_pkey_t *pkey, apr_pool_t *p);
73 const char *md_pkey_get_rsa_n64(md_pkey_t *pkey, apr_pool_t *p);
74
75 apr_status_t md_pkey_fload(md_pkey_t **ppkey, apr_pool_t *p, 
76                            const char *pass_phrase, apr_size_t pass_len,
77                            const char *fname);
78 apr_status_t md_pkey_fsave(md_pkey_t *pkey, apr_pool_t *p, 
79                            const char *pass_phrase, apr_size_t pass_len, 
80                            const char *fname, apr_fileperms_t perms);
81
82 apr_status_t md_crypt_sign64(const char **psign64, md_pkey_t *pkey, apr_pool_t *p, 
83                              const char *d, size_t dlen);
84
85 void *md_pkey_get_EVP_PKEY(struct md_pkey_t *pkey);
86
87 struct md_json_t *md_pkey_spec_to_json(const md_pkey_spec_t *spec, apr_pool_t *p);
88 md_pkey_spec_t *md_pkey_spec_from_json(struct md_json_t *json, apr_pool_t *p);
89 int md_pkey_spec_eq(md_pkey_spec_t *spec1, md_pkey_spec_t *spec2);
90
91 /**************************************************************************************************/
92 /* X509 certificates */
93
94 typedef struct md_cert_t md_cert_t;
95
96 typedef enum {
97     MD_CERT_UNKNOWN,
98     MD_CERT_VALID,
99     MD_CERT_EXPIRED
100 } md_cert_state_t;
101
102 /**
103  * Create a holder of the certificate that will free its memmory when the
104  * pool is destroyed.
105  */
106 md_cert_t *md_cert_make(apr_pool_t *p, void *x509);
107
108 /**
109  * Wrap a x509 certificate into our own structure, without taking ownership
110  * of its memory. The caller remains responsible.
111  */
112 md_cert_t *md_cert_wrap(apr_pool_t *p, void *x509);
113
114 void *md_cert_get_X509(const md_cert_t *cert);
115
116 apr_status_t md_cert_fload(md_cert_t **pcert, apr_pool_t *p, const char *fname);
117 apr_status_t md_cert_fsave(md_cert_t *cert, apr_pool_t *p, 
118                            const char *fname, apr_fileperms_t perms);
119
120 /**
121  * Read a x509 certificate from a http response.
122  * Will return APR_ENOENT if content-type is not recognized (currently
123  * only "application/pkix-cert" is supported).
124  */
125 apr_status_t md_cert_read_http(md_cert_t **pcert, apr_pool_t *pool, 
126                                const struct md_http_response_t *res);
127
128 /**
129  * Read one or even a chain of certificates from a http response.
130  * Will return APR_ENOENT if content-type is not recognized (currently
131  * supports only "application/pem-certificate-chain" and "application/pkix-cert").
132  * @param chain    must be non-NULL, retrieved certificates will be added.
133  */
134 apr_status_t md_cert_chain_read_http(struct apr_array_header_t *chain,
135                                      apr_pool_t *pool, const struct md_http_response_t *res);
136
137 md_cert_state_t md_cert_state_get(const md_cert_t *cert);
138 int md_cert_is_valid_now(const md_cert_t *cert);
139 int md_cert_has_expired(const md_cert_t *cert);
140 int md_cert_covers_domain(md_cert_t *cert, const char *domain_name);
141 int md_cert_covers_md(md_cert_t *cert, const struct md_t *md);
142 int md_cert_must_staple(const md_cert_t *cert);
143 apr_time_t md_cert_get_not_after(const md_cert_t *cert);
144 apr_time_t md_cert_get_not_before(const md_cert_t *cert);
145
146 apr_status_t md_cert_get_issuers_uri(const char **puri, const md_cert_t *cert, apr_pool_t *p);
147 apr_status_t md_cert_get_alt_names(apr_array_header_t **pnames, const md_cert_t *cert, apr_pool_t *p);
148
149 apr_status_t md_cert_to_base64url(const char **ps64, const md_cert_t *cert, apr_pool_t *p);
150 apr_status_t md_cert_from_base64url(md_cert_t **pcert, const char *s64, apr_pool_t *p);
151
152 apr_status_t md_cert_to_sha256_digest(struct md_data_t **pdigest, const md_cert_t *cert, apr_pool_t *p);
153 apr_status_t md_cert_to_sha256_fingerprint(const char **pfinger, const md_cert_t *cert, apr_pool_t *p);
154
155 const char *md_cert_get_serial_number(const md_cert_t *cert, apr_pool_t *p);
156
157 apr_status_t md_chain_fload(struct apr_array_header_t **pcerts, 
158                             apr_pool_t *p, const char *fname);
159 apr_status_t md_chain_fsave(struct apr_array_header_t *certs, 
160                             apr_pool_t *p, const char *fname, apr_fileperms_t perms);
161 apr_status_t md_chain_fappend(struct apr_array_header_t *certs, 
162                               apr_pool_t *p, const char *fname);
163
164 apr_status_t md_cert_req_create(const char **pcsr_der_64, const char *name,
165                                 apr_array_header_t *domains, int must_staple, 
166                                 md_pkey_t *pkey, apr_pool_t *p);
167
168 /**
169  * Create a self-signed cerftificate with the given cn, key and list
170  * of alternate domain names.
171  */
172 apr_status_t md_cert_self_sign(md_cert_t **pcert, const char *cn, 
173                                struct apr_array_header_t *domains, md_pkey_t *pkey,
174                                apr_interval_time_t valid_for, apr_pool_t *p);
175    
176 /**
177  * Create a certificate for answering "tls-alpn-01" ACME challenges 
178  * (see <https://tools.ietf.org/html/draft-ietf-acme-tls-alpn-01>).
179  */
180 apr_status_t md_cert_make_tls_alpn_01(md_cert_t **pcert, const char *domain, 
181                                       const char *acme_id, md_pkey_t *pkey, 
182                                       apr_interval_time_t valid_for, apr_pool_t *p);
183
184 apr_status_t md_cert_get_ct_scts(apr_array_header_t *scts, apr_pool_t *p, const md_cert_t *cert);
185
186
187 /**************************************************************************************************/
188 /* X509 certificate transparency */
189
190 const char *md_nid_get_sname(int nid);
191 const char *md_nid_get_lname(int nid);
192
193 typedef struct md_sct md_sct;
194 struct md_sct {
195     int version;
196     apr_time_t timestamp;
197     struct md_data_t *logid;
198     int signature_type_nid;
199     struct md_data_t *signature;
200 };
201
202 #endif /* md_crypt_h */