]> git.ipfire.org Git - thirdparty/openssl.git/blob - doc/man3/OSSL_CMP_CTX_new.pod
Strengthen chain building for CMP
[thirdparty/openssl.git] / doc / man3 / OSSL_CMP_CTX_new.pod
1 =pod
2
3 =head1 NAME
4
5 OSSL_CMP_CTX_new,
6 OSSL_CMP_CTX_free,
7 OSSL_CMP_CTX_reinit,
8 OSSL_CMP_CTX_set_option,
9 OSSL_CMP_CTX_get_option,
10 OSSL_CMP_CTX_set_log_cb,
11 OSSL_CMP_CTX_set_log_verbosity,
12 OSSL_CMP_CTX_print_errors,
13 OSSL_CMP_CTX_set1_serverPath,
14 OSSL_CMP_CTX_set1_server,
15 OSSL_CMP_CTX_set_serverPort,
16 OSSL_CMP_CTX_set1_proxy,
17 OSSL_CMP_CTX_set1_no_proxy,
18 OSSL_CMP_CTX_set_http_cb,
19 OSSL_CMP_CTX_set_http_cb_arg,
20 OSSL_CMP_CTX_get_http_cb_arg,
21 OSSL_CMP_transfer_cb_t,
22 OSSL_CMP_CTX_set_transfer_cb,
23 OSSL_CMP_CTX_set_transfer_cb_arg,
24 OSSL_CMP_CTX_get_transfer_cb_arg,
25 OSSL_CMP_CTX_set1_srvCert,
26 OSSL_CMP_CTX_set1_expected_sender,
27 OSSL_CMP_CTX_set0_trustedStore,
28 OSSL_CMP_CTX_get0_trustedStore,
29 OSSL_CMP_CTX_set1_untrusted_certs,
30 OSSL_CMP_CTX_get0_untrusted_certs,
31 OSSL_CMP_CTX_set1_cert,
32 OSSL_CMP_CTX_build_cert_chain,
33 OSSL_CMP_CTX_set1_pkey,
34 OSSL_CMP_CTX_set1_referenceValue,
35 OSSL_CMP_CTX_set1_secretValue,
36 OSSL_CMP_CTX_set1_recipient,
37 OSSL_CMP_CTX_push0_geninfo_ITAV,
38 OSSL_CMP_CTX_set1_extraCertsOut,
39 OSSL_CMP_CTX_set0_newPkey,
40 OSSL_CMP_CTX_get0_newPkey,
41 OSSL_CMP_CTX_set1_issuer,
42 OSSL_CMP_CTX_set1_subjectName,
43 OSSL_CMP_CTX_push1_subjectAltName,
44 OSSL_CMP_CTX_set0_reqExtensions,
45 OSSL_CMP_CTX_reqExtensions_have_SAN,
46 OSSL_CMP_CTX_push0_policy,
47 OSSL_CMP_CTX_set1_oldCert,
48 OSSL_CMP_CTX_set1_p10CSR,
49 OSSL_CMP_CTX_push0_genm_ITAV,
50 OSSL_CMP_certConf_cb_t,
51 OSSL_CMP_CTX_set_certConf_cb,
52 OSSL_CMP_CTX_set_certConf_cb_arg,
53 OSSL_CMP_CTX_get_certConf_cb_arg,
54 OSSL_CMP_CTX_get_status,
55 OSSL_CMP_CTX_get0_statusString,
56 OSSL_CMP_CTX_get_failInfoCode,
57 OSSL_CMP_CTX_get0_newCert,
58 OSSL_CMP_CTX_get1_newChain,
59 OSSL_CMP_CTX_get1_caPubs,
60 OSSL_CMP_CTX_get1_extraCertsIn,
61 OSSL_CMP_CTX_set1_transactionID,
62 OSSL_CMP_CTX_set1_senderNonce
63 - functions for managing the CMP client context data structure
64
65 =head1 SYNOPSIS
66
67 #include <openssl/cmp.h>
68
69 OSSL_CMP_CTX *OSSL_CMP_CTX_new(OPENSSL_CTX *libctx, const char *propq);
70 void OSSL_CMP_CTX_free(OSSL_CMP_CTX *ctx);
71 int OSSL_CMP_CTX_reinit(OSSL_CMP_CTX *ctx);
72 int OSSL_CMP_CTX_set_option(OSSL_CMP_CTX *ctx, int opt, int val);
73 int OSSL_CMP_CTX_get_option(const OSSL_CMP_CTX *ctx, int opt);
74
75 /* logging and error reporting: */
76 int OSSL_CMP_CTX_set_log_cb(OSSL_CMP_CTX *ctx, OSSL_CMP_log_cb_t cb);
77 #define OSSL_CMP_CTX_set_log_verbosity(ctx, level)
78 void OSSL_CMP_CTX_print_errors(const OSSL_CMP_CTX *ctx);
79
80 /* message transfer: */
81 int OSSL_CMP_CTX_set1_serverPath(OSSL_CMP_CTX *ctx, const char *path);
82 int OSSL_CMP_CTX_set1_server(OSSL_CMP_CTX *ctx, const char *address);
83 int OSSL_CMP_CTX_set_serverPort(OSSL_CMP_CTX *ctx, int port);
84 int OSSL_CMP_CTX_set1_proxy(OSSL_CMP_CTX *ctx, const char *name);
85 int OSSL_CMP_CTX_set1_no_proxy(OSSL_CMP_CTX *ctx, const char *names);
86 int OSSL_CMP_CTX_set_http_cb(OSSL_CMP_CTX *ctx, HTTP_bio_cb_t cb);
87 int OSSL_CMP_CTX_set_http_cb_arg(OSSL_CMP_CTX *ctx, void *arg);
88 void *OSSL_CMP_CTX_get_http_cb_arg(const OSSL_CMP_CTX *ctx);
89 typedef OSSL_CMP_MSG *(*OSSL_CMP_transfer_cb_t)(OSSL_CMP_CTX *ctx,
90 const OSSL_CMP_MSG *req);
91 int OSSL_CMP_CTX_set_transfer_cb(OSSL_CMP_CTX *ctx,
92 OSSL_CMP_transfer_cb_t cb);
93 int OSSL_CMP_CTX_set_transfer_cb_arg(OSSL_CMP_CTX *ctx, void *arg);
94 void *OSSL_CMP_CTX_get_transfer_cb_arg(const OSSL_CMP_CTX *ctx);
95
96 /* server authentication: */
97 int OSSL_CMP_CTX_set1_srvCert(OSSL_CMP_CTX *ctx, X509 *cert);
98 int OSSL_CMP_CTX_set1_expected_sender(OSSL_CMP_CTX *ctx,
99 const X509_NAME *name);
100 int OSSL_CMP_CTX_set0_trustedStore(OSSL_CMP_CTX *ctx, X509_STORE *store);
101 X509_STORE *OSSL_CMP_CTX_get0_trustedStore(const OSSL_CMP_CTX *ctx);
102 int OSSL_CMP_CTX_set1_untrusted_certs(OSSL_CMP_CTX *ctx,
103 STACK_OF(X509) *certs);
104 STACK_OF(X509) *OSSL_CMP_CTX_get0_untrusted_certs(const OSSL_CMP_CTX *ctx);
105
106 /* client authentication: */
107 int OSSL_CMP_CTX_set1_cert(OSSL_CMP_CTX *ctx, X509 *cert);
108 int OSSL_CMP_CTX_build_cert_chain(OSSL_CMP_CTX *ctx, X509_STORE *own_trusted,
109 STACK_OF(X509) *candidates);
110 int OSSL_CMP_CTX_set1_pkey(OSSL_CMP_CTX *ctx, EVP_PKEY *pkey);
111 int OSSL_CMP_CTX_set1_referenceValue(OSSL_CMP_CTX *ctx,
112 const unsigned char *ref, int len);
113 int OSSL_CMP_CTX_set1_secretValue(OSSL_CMP_CTX *ctx, const unsigned char *sec,
114 const int len);
115
116 /* CMP message header and extra certificates: */
117 int OSSL_CMP_CTX_set1_recipient(OSSL_CMP_CTX *ctx, const X509_NAME *name);
118 int OSSL_CMP_CTX_push0_geninfo_ITAV(OSSL_CMP_CTX *ctx, OSSL_CMP_ITAV *itav);
119 int OSSL_CMP_CTX_set1_extraCertsOut(OSSL_CMP_CTX *ctx,
120 STACK_OF(X509) *extraCertsOut);
121
122 /* certificate template: */
123 int OSSL_CMP_CTX_set0_newPkey(OSSL_CMP_CTX *ctx, int priv, EVP_PKEY *pkey);
124 EVP_PKEY *OSSL_CMP_CTX_get0_newPkey(const OSSL_CMP_CTX *ctx, int priv);
125 int OSSL_CMP_CTX_set1_issuer(OSSL_CMP_CTX *ctx, const X509_NAME *name);
126 int OSSL_CMP_CTX_set1_subjectName(OSSL_CMP_CTX *ctx, const X509_NAME *name);
127 int OSSL_CMP_CTX_push1_subjectAltName(OSSL_CMP_CTX *ctx,
128 const GENERAL_NAME *name);
129 int OSSL_CMP_CTX_set0_reqExtensions(OSSL_CMP_CTX *ctx, X509_EXTENSIONS *exts);
130 int OSSL_CMP_CTX_reqExtensions_have_SAN(OSSL_CMP_CTX *ctx);
131 int OSSL_CMP_CTX_push0_policy(OSSL_CMP_CTX *ctx, POLICYINFO *pinfo);
132 int OSSL_CMP_CTX_set1_oldCert(OSSL_CMP_CTX *ctx, X509 *cert);
133 int OSSL_CMP_CTX_set1_p10CSR(OSSL_CMP_CTX *ctx, const X509_REQ *csr);
134
135 /* misc body contents: */
136 int OSSL_CMP_CTX_push0_genm_ITAV(OSSL_CMP_CTX *ctx, OSSL_CMP_ITAV *itav);
137
138 /* certificate confirmation: */
139 typedef int (*OSSL_CMP_certConf_cb_t)(OSSL_CMP_CTX *ctx, X509 *cert,
140 int fail_info, const char **txt);
141 int OSSL_CMP_CTX_set_certConf_cb(OSSL_CMP_CTX *ctx, OSSL_CMP_certConf_cb_t cb);
142 int OSSL_CMP_CTX_set_certConf_cb_arg(OSSL_CMP_CTX *ctx, void *arg);
143 void *OSSL_CMP_CTX_get_certConf_cb_arg(const OSSL_CMP_CTX *ctx);
144
145 /* result fetching: */
146 int OSSL_CMP_CTX_get_status(const OSSL_CMP_CTX *ctx);
147 OSSL_CMP_PKIFREETEXT *OSSL_CMP_CTX_get0_statusString(const OSSL_CMP_CTX *ctx);
148 int OSSL_CMP_CTX_get_failInfoCode(const OSSL_CMP_CTX *ctx);
149
150 X509 *OSSL_CMP_CTX_get0_newCert(const OSSL_CMP_CTX *ctx);
151 STACK_OF(X509) *OSSL_CMP_CTX_get1_newChain(const OSSL_CMP_CTX *ctx);
152 STACK_OF(X509) *OSSL_CMP_CTX_get1_caPubs(const OSSL_CMP_CTX *ctx);
153 STACK_OF(X509) *OSSL_CMP_CTX_get1_extraCertsIn(const OSSL_CMP_CTX *ctx);
154
155 /* for testing and debugging purposes: */
156 int OSSL_CMP_CTX_set1_transactionID(OSSL_CMP_CTX *ctx,
157 const ASN1_OCTET_STRING *id);
158 int OSSL_CMP_CTX_set1_senderNonce(OSSL_CMP_CTX *ctx,
159 const ASN1_OCTET_STRING *nonce);
160
161 =head1 DESCRIPTION
162
163 This is the context API for using CMP (Certificate Management Protocol) with
164 OpenSSL.
165
166 OSSL_CMP_CTX_new() allocates an B<OSSL_CMP_CTX> structure associated with
167 the library context I<libctx> and property query string I<propq>,
168 both of which may be NULL to select the defaults.
169 It initializes the remaining fields to their default values - for instance,
170 the logging verbosity is set to OSSL_CMP_LOG_INFO,
171 the message timeout is set to 120 seconds,
172 and the proof-of-possession method is set to OSSL_CRMF_POPO_SIGNATURE.
173
174 OSSL_CMP_CTX_free() deallocates an OSSL_CMP_CTX structure.
175
176 OSSL_CMP_CTX_reinit() prepares the given B<ctx> for a further transaction by
177 clearing the internal CMP transaction (aka session) status, PKIStatusInfo,
178 and any previous results (newCert, newChain, caPubs, and extraCertsIn)
179 from the last executed transaction.
180 All other field values (i.e., CMP options) are retained for potential re-use.
181
182 OSSL_CMP_CTX_set_option() sets the given value for the given option
183 (e.g., OSSL_CMP_OPT_IMPLICIT_CONFIRM) in the given OSSL_CMP_CTX structure.
184
185 The following options can be set:
186
187 =over 4
188
189 =item B<OSSL_CMP_OPT_LOG_VERBOSITY>
190
191 The level of severity needed for actually outputting log messages
192 due to errors, warnings, general info, debugging, etc.
193 Default is OSSL_CMP_LOG_INFO. See also L<OSSL_CMP_log_open(3)>.
194
195 =item B<OSSL_CMP_OPT_MSG_TIMEOUT>
196
197 Number of seconds (or 0 for infinite) a CMP message round trip is
198 allowed to take before a timeout error is returned. Default is 120.
199
200 =item B<OSSL_CMP_OPT_TOTAL_TIMEOUT>
201
202 Maximum total number of seconds an enrollment (including polling)
203 may take. Default is 0 (infinite).
204
205 =item B<OSSL_CMP_OPT_VALIDITY_DAYS>
206
207 Number of days new certificates are asked to be valid for.
208
209 =item B<OSSL_CMP_OPT_SUBJECTALTNAME_NODEFAULT>
210
211 Do not take default Subject Alternative Names
212 from the reference certificate.
213
214 =item B<OSSL_CMP_OPT_SUBJECTALTNAME_CRITICAL>
215
216 Demand that the given Subject Alternative Names are flagged as critical.
217
218 =item B<OSSL_CMP_OPT_POLICIES_CRITICAL>
219
220 Demand that the given policies are flagged as critical.
221
222 =item B<OSSL_CMP_OPT_POPO_METHOD>
223
224 Select the proof of possession method to use. Possible values are:
225
226 OSSL_CRMF_POPO_NONE - ProofOfPossession field omitted
227 OSSL_CRMF_POPO_RAVERIFIED - assert that the RA has already
228 verified the PoPo
229 OSSL_CRMF_POPO_SIGNATURE - sign a value with private key,
230 which is the default.
231 OSSL_CRMF_POPO_KEYENC - decrypt the encrypted certificate
232 ("indirect method")
233
234 Note that a signature-based POPO can only be produced if a private key
235 is provided as the newPkey or client pkey component of the CMP context.
236
237 =item B<OSSL_CMP_OPT_DIGEST_ALGNID>
238
239 The NID of the digest algorithm to be used in RFC 4210's MSG_SIG_ALG
240 for signature-based message protection and Proof-of-Possession (POPO).
241 Default is SHA256.
242
243 =item B<OSSL_CMP_OPT_OWF_ALGNID>
244 The NID of the digest algorithm to be used as one-way function (OWF)
245 in RFC 4210's MSG_MAC_ALG for PBM-based message protection.
246 Default is SHA256.
247
248 =item B<OSSL_CMP_OPT_MAC_ALGNID>
249 The NID of the MAC algorithm to be used in RFC 4210's MSG_MAC_ALG
250 for PBM-based message protection.
251 Default is HMAC-SHA1 as per RFC 4210.
252
253 =item B<OSSL_CMP_OPT_REVOCATION_REASON>
254
255 The reason code to be included in a Revocation Request (RR);
256 values: 0..10 (RFC 5210, 5.3.1) or -1 for none, which is the default.
257
258 =item B<OSSL_CMP_OPT_IMPLICIT_CONFIRM>
259
260 Request server to enable implicit confirm mode, where the client
261 does not need to send confirmation upon receiving the
262 certificate. If the server does not enable implicit confirmation
263 in the return message, then confirmation is sent anyway.
264
265 =item B<OSSL_CMP_OPT_DISABLE_CONFIRM>
266
267 Do not confirm enrolled certificates, to cope with broken servers
268 not supporting implicit confirmation correctly.
269 B<WARNING:> This setting leads to unspecified behavior and it is meant
270 exclusively to allow interoperability with server implementations violating
271 RFC 4210.
272
273 =item B<OSSL_CMP_OPT_UNPROTECTED_SEND>
274
275 Send messages without CMP-level protection.
276
277 =item B<OSSL_CMP_OPT_UNPROTECTED_ERRORS>
278
279 Accept unprotected error responses which are either explicitly
280 unprotected or where protection verification failed. Applies to regular
281 error messages as well as certificate responses (IP/CP/KUP) and
282 revocation responses (RP) with rejection.
283 B<WARNING:> This setting leads to unspecified behavior and it is meant
284 exclusively to allow interoperability with server implementations violating
285 RFC 4210.
286
287 =item B<OSSL_CMP_OPT_IGNORE_KEYUSAGE>
288
289 Ignore key usage restrictions in signer certificate when
290 validating signature-based protection in received CMP messages.
291 Else, 'digitalSignature' must be allowed by CMP signer certificates.
292
293 =item B<OSSL_CMP_OPT_PERMIT_TA_IN_EXTRACERTS_FOR_IR>
294
295 Allow retrieving a trust anchor from extraCerts and using that
296 to validate the certificate chain of an IP message.
297
298 =back
299
300 OSSL_CMP_CTX_get_option() reads the current value of the given option
301 (e.g., OSSL_CMP_OPT_IMPLICIT_CONFIRM) from the given OSSL_CMP_CTX structure.
302
303 OSSL_CMP_CTX_set_log_cb() sets in B<ctx> the callback function C<cb>
304 for handling error queue entries and logging messages.
305 When C<cb> is NULL errors are printed to STDERR (if available, else ignored)
306 any log messages are ignored.
307 Alternatively, L<OSSL_CMP_log_open(3)> may be used to direct logging to STDOUT.
308
309 OSSL_CMP_CTX_set_log_verbosity() is a macro setting the
310 OSSL_CMP_OPT_LOG_VERBOSITY context option to the given level.
311
312 OSSL_CMP_CTX_print_errors() outputs any entries in the OpenSSL error queue.
313 It is similar to B<ERR_print_errors_cb()> but uses the CMP log callback function
314 if set in the C<ctx> for uniformity with CMP logging if given. Otherwise it uses
315 B<ERR_print_errors(3)> to print to STDERR (unless OPENSSL_NO_STDIO is defined).
316
317 OSSL_CMP_CTX_set1_serverPath() sets the HTTP path of the CMP server on the host,
318 also known as "CMP alias".
319 The default is I</>.
320
321 OSSL_CMP_CTX_set1_server() sets the given server B<address>
322 (which may be a hostname or IP address or NULL) in the given B<ctx>.
323
324 OSSL_CMP_CTX_set_serverPort() sets the port of the CMP server to connect to.
325 If not used or the B<port> argument is 0
326 the default port applies, which is 80 for HTTP and 443 for HTTPS.
327
328 OSSL_CMP_CTX_set1_proxy() sets the HTTP proxy to be used for connecting to
329 the given CMP server unless overruled by any "no_proxy" settings (see below).
330 If TLS is not used this defaults to the value of
331 the environment variable B<http_proxy> if set, else B<HTTP_PROXY>.
332 Otherwise defaults to the value of B<https_proxy> if set, else B<HTTPS_PROXY>.
333 An empty proxy string specifies not to use a proxy.
334 Else the format is I<[http[s]://]address[:port][/path]>,
335 where any path given is ignored.
336 The default port number is 80, or 443 in case I<https:> is given.
337
338 OSSL_CMP_CTX_set1_no_proxy() sets the list of server hostnames not to use
339 an HTTP proxy for. The names may be separated by commas and/or whitespace.
340 Defaults to the environment variable B<no_proxy> if set, else B<NO_PROXY>.
341
342 OSSL_CMP_CTX_set_http_cb() sets the optional BIO connect/disconnect callback
343 function, which has the prototype
344
345 typedef BIO *(*HTTP_bio_cb_t) (BIO *bio, void *ctx, int connect, int detail);
346
347 The callback may modify the BIO B<bio> provided by OSSL_CMP_MSG_http_perform(),
348 whereby it may make use of a custom defined argument B<ctx>
349 stored in the OSSL_CMP_CTX by means of OSSL_CMP_CTX_set_http_cb_arg().
350 During connection establishment, just after calling BIO_do_connect_retry(),
351 the function is invoked with the B<connect> argument being 1 and the B<detail>
352 argument being 1 if HTTPS is requested, i.e., SSL/TLS should be enabled. On
353 disconnect B<connect> is 0 and B<detail> is 1 in case no error occurred, else 0.
354 For instance, on connect the function may prepend a TLS BIO to implement HTTPS;
355 after disconnect it may do some diagnostic output and/or specific cleanup.
356 The function should return NULL to indicate failure.
357 After disconnect the modified BIO will be deallocated using BIO_free_all().
358
359 OSSL_CMP_CTX_set_http_cb_arg() sets an argument, respectively a pointer to
360 a structure containing arguments,
361 optionally to be used by the http connect/disconnect callback function.
362 B<arg> is not consumed, and it must therefore explicitly be freed when not
363 needed any more. B<arg> may be NULL to clear the entry.
364
365 OSSL_CMP_CTX_get_http_cb_arg() gets the argument, respectively the pointer to a
366 structure containing arguments, previously set by
367 OSSL_CMP_CTX_set_http_cb_arg() or NULL if unset.
368
369 OSSL_CMP_CTX_set_transfer_cb() sets the message transfer callback function,
370 which has the type
371
372 typedef OSSL_CMP_MSG *(*OSSL_CMP_transfer_cb_t) (OSSL_CMP_CTX *ctx,
373 const OSSL_CMP_MSG *req);
374
375 Returns 1 on success, 0 on error.
376
377 Default is NULL, which implies the use of L<OSSL_CMP_MSG_http_perform(3)>.
378 The callback should send the CMP request message it obtains via the B<req>
379 parameter and on success return the response, else it must return NULL.
380 The transfer callback may make use of a custom defined argument stored in
381 the ctx by means of OSSL_CMP_CTX_set_transfer_cb_arg(), which may be retrieved
382 again through OSSL_CMP_CTX_get_transfer_cb_arg().
383
384 OSSL_CMP_CTX_set_transfer_cb_arg() sets an argument, respectively a pointer to a
385 structure containing arguments, optionally to be used by the transfer callback.
386 B<arg> is not consumed, and it must therefore explicitly be freed when not
387 needed any more. B<arg> may be NULL to clear the entry.
388
389 OSSL_CMP_CTX_get_transfer_cb_arg() gets the argument, respectively the pointer
390 to a structure containing arguments, previously set by
391 OSSL_CMP_CTX_set_transfer_cb_arg() or NULL if unset.
392
393 OSSL_CMP_CTX_set1_srvCert() sets the expected server cert B<srvCert> and trusts
394 it directly (even if it is expired) when verifying signed response messages.
395 May be used alternatively to OSSL_CMP_CTX_set0_trustedStore()
396 to pin the accepted server.
397 Any previously set value is freed.
398 The B<cert> argument may be NULL to clear the entry.
399 If set, the subject of the certificate is also used
400 as default value for the recipient of CMP requests
401 and as default value for the expected sender of CMP responses.
402
403 OSSL_CMP_CTX_set1_expected_sender() sets the Distinguished Name (DN)
404 expected in the sender field of CMP response messages.
405 Defaults to the subject of the pinned server certificate B<-srvcert>, if any.
406 This can be used to make sure that only a particular entity is accepted as
407 CMP message signer, and attackers are not able to use arbitrary certificates
408 of a trusted PKI hierarchy to fraudulently pose as CMP server.
409 Note that this gives slightly more freedom than OSSL_CMP_CTX_set1_srvCert(),
410 which pins the server to the holder of a particular certificate, while the
411 expected sender name will continue to match after updates of the server cert.
412
413 OSSL_CMP_CTX_set0_trustedStore() sets the certificate store of type X509_STORE
414 containing trusted (root) CA certificates.
415 The store may also hold CRLs and
416 a certificate verification callback function used for CMP server authentication.
417 Any store entry already set before is freed.
418 When given a NULL parameter the entry is cleared.
419
420 OSSL_CMP_CTX_get0_trustedStore() returns a pointer to the currently set
421 certificate store containing trusted cert etc., or an empty store if unset.
422
423 OSSL_CMP_CTX_set1_untrusted_certs() sets up a list of non-trusted certificates
424 of intermediate CAs that may be useful for path construction for the CMP client
425 certificate, for the TLS client certificate (if any), when verifying
426 the CMP server certificate, and when verifying newly enrolled certificates.
427 The reference counts of those certificates handled successfully are increased.
428
429 OSSL_CMP_CTX_get0_untrusted_certs(OSSL_CMP_CTX *ctx) returns a pointer to the
430 list of untrusted certs, which may be empty if unset.
431
432 OSSL_CMP_CTX_set1_cert() sets the certificate used for CMP message protection.
433 The public key of this B<cert> must correspond to
434 the private key set via B<OSSL_CMP_CTX_set1_pkey()>.
435 When using signature-based protection of CMP request messages
436 this "protection certificate" will be included first in the extraCerts field.
437 The subject of this B<cert> will be used as the sender field of outgoing
438 messages, while the subject of any cert set via B<OSSL_CMP_CTX_set1_oldCert()>
439 and any value set via B<OSSL_CMP_CTX_set1_subjectName()> are used as fallback.
440 The B<cert> argument may be NULL to clear the entry.
441
442 OSSL_CMP_CTX_build_cert_chain() builds a certificate chain for the CMP signer
443 certificate previously set in the B<ctx>. It adds the optional B<candidates>,
444 a list of intermediate CA certs that may already constitute the targeted chain,
445 to the untrusted certs that may already exist in the B<ctx>.
446 Then the function uses this augumented set of certs for chain construction.
447 If I<own_trusted> is NULL it builds the chain as far down as possible and
448 ignores any verification errors. Else the CMP signer certificate must be
449 verifiable where the chain reaches a trust anchor contained in I<own_trusted>.
450 On success the function stores the resulting chain in B<ctx>
451 for inclusion in the extraCerts field of signature-protected messages.
452 Calling this function is optional; by default a chain construction
453 is performed on demand that is equivalent to calling this function
454 with the B<candidates> and I<own_trusted> arguments being NULL.
455
456 OSSL_CMP_CTX_set1_pkey() sets the private key corresponding to the
457 protection certificate B<cert> set via B<OSSL_CMP_CTX_set1_cert()>.
458 This key is used create signature-based protection (protectionAlg = MSG_SIG_ALG)
459 of outgoing messages
460 unless a PBM secret has been set via B<OSSL_CMP_CTX_set1_secretValue()>.
461 The B<pkey> argument may be NULL to clear the entry.
462
463 OSSL_CMP_CTX_set1_secretValue() sets the byte string B<sec> with length B<len>
464 as PBM secret in the given B<ctx> or clears it if the B<sec> argument is NULL.
465 If present, this secret is used to create PBM-based protection of outgoing
466 messages and to verify any PBM-based protection of incoming messages
467 (protectionAlg = MSG_MAC_ALG). PBM stands for Password-Based MAC.
468 PBM-based protection takes precedence over signature-based protection.
469
470 OSSL_CMP_CTX_set1_referenceValue() sets the given referenceValue B<ref> with
471 length B<len> in the given B<ctx> or clears it if the B<ref> argument is NULL.
472 According to RFC 4210 section 5.1.1, if no value for the sender field in
473 CMP message headers can be determined (i.e., no protection certificate B<cert>
474 and no B<subjectName> is given) then the sender field will contain the NULL-DN
475 and the senderKID field of the CMP message header must be set.
476 When signature-based protection is used the senderKID will be set to
477 the subjectKeyIdentifier of the protection B<cert> as far as present.
478 If not present or when PBM-based protection is used
479 the B<ref> value is taken as the fallback value for the senderKID.
480
481 OSSL_CMP_CTX_set1_recipient() sets the recipient name that will be used in the
482 PKIHeader of CMP request messages, i.e. the X509 name of the (CA) server.
483
484 The recipient field in the header of a CMP message is mandatory.
485 If not given explicitly the recipient is determined in the following order:
486 the subject of the CMP server certificate set using OSSL_CMP_CTX_set1_srvCert(),
487 the value set using OSSL_CMP_CTX_set1_issuer(),
488 the issuer of the certificate set using OSSL_CMP_CTX_set1_oldCert(),
489 the issuer of the protection certificate (B<cert>),
490 as far as any of those is present, else the NULL-DN as last resort.
491
492 OSSL_CMP_CTX_push0_geninfo_ITAV() adds B<itav> to the stack in the B<ctx> to be
493 added to the GeneralInfo field of the CMP PKIMessage header of a request
494 message sent with this context.
495
496 OSSL_CMP_CTX_set1_extraCertsOut() sets the stack of extraCerts that will be
497 sent to remote.
498
499 OSSL_CMP_CTX_set0_newPkey() can be used to explicitly set the given EVP_PKEY
500 structure as the private or public key to be certified in the CMP context.
501 The B<priv> parameter must be 0 if and only if the given key is a public key.
502
503 OSSL_CMP_CTX_get0_newPkey() gives the key to use for certificate enrollment
504 dependent on fields of the CMP context structure:
505 the newPkey (which may be a private or public key) if present,
506 else the public key in the p10CSR if present, else the client private key.
507 If the B<priv> parameter is not 0 and the selected key does not have a
508 private component then NULL is returned.
509
510 OSSL_CMP_CTX_set1_issuer() sets the name of the intended issuer that
511 will be set in the CertTemplate, i.e., the X509 name of the CA server.
512
513 OSSL_CMP_CTX_set1_subjectName() sets the subject DN that will be used in
514 the CertTemplate structure when requesting a new cert. For Key Update Requests
515 (KUR), it defaults to the subject DN of the B<reference certificate>,
516 see B<OSSL_CMP_CTX_set1_oldCert()>. This default is used for Initialization
517 Requests (IR) and Certification Requests (CR) only if no SANs are set.
518 The B<subjectName> is also used as fallback for the sender field
519 of outgoing CMP messages if no B<cert> and no B<oldcert> are available.
520
521 OSSL_CMP_CTX_push1_subjectAltName() adds the given X509 name to the list of
522 alternate names on the certificate template request. This cannot be used if
523 any Subject Alternative Name extension is set via
524 OSSL_CMP_CTX_set0_reqExtensions().
525 By default, unless OSSL_CMP_OPT_SUBJECTALTNAME_NODEFAULT has been set,
526 the Subject Alternative Names are copied from the B<reference certificate>,
527 see B<OSSL_CMP_CTX_set1_oldCert()>.
528 If set and the subject DN is not set with OSSL_CMP_CTX_set1_subjectName(), then
529 the certificate template of an IR and CR will not be filled with the default
530 subject DN from the B<reference certificate>.
531 If a subject DN is desired it needs to be set explicitly with
532 OSSL_CMP_CTX_set1_subjectName().
533
534 OSSL_CMP_CTX_set0_reqExtensions() sets the X.509v3 extensions to be used in
535 IR/CR/KUR.
536
537 OSSL_CMP_CTX_reqExtensions_have_SAN() returns 1 if the context contains
538 a Subject Alternative Name extension, else 0 or -1 on error.
539
540 OSSL_CMP_CTX_push0_policy() adds the certificate policy info object
541 to the X509_EXTENSIONS of the requested certificate template.
542
543 OSSL_CMP_CTX_set1_oldCert() sets the old certificate to be updated in
544 Key Update Requests (KUR) or to be revoked in Revocation Requests (RR).
545 It must be given for RR, else it defaults to the protection B<cert>.
546 The B<reference certificate> determined in this way, if any, is also used for
547 deriving default subject DN and Subject Alternative Names for IR, CR, and KUR.
548 Its subject is used as sender in CMP message headers if no protection cert is given.
549 Its issuer is used as default recipient in CMP message headers.
550
551 OSSL_CMP_CTX_set1_p10CSR() sets the PKCS#10 CSR to be used in P10CR.
552
553 OSSL_CMP_CTX_push0_genm_ITAV() adds B<itav> to the stack in the B<ctx> which
554 will be the body of a General Message sent with this context.
555
556 OSSL_CMP_CTX_set_certConf_cb() sets the callback used for evaluating the newly
557 enrolled certificate before the library sends, depending on its result,
558 a positive or negative certConf message to the server. The callback has type
559
560 typedef int (*OSSL_CMP_certConf_cb_t) (OSSL_CMP_CTX *ctx, X509 *cert,
561 int fail_info, const char **txt);
562
563 and should inspect the certificate it obtains via the B<cert> parameter and may
564 overrule the pre-decision given in the B<fail_info> and B<*txt> parameters.
565 If it accepts the certificate it must return 0, indicating success. Else it must
566 return a bit field reflecting PKIFailureInfo with at least one failure bit and
567 may set the B<*txt> output parameter to point to a string constant with more
568 detail. The transfer callback may make use of a custom defined argument stored
569 in the B<ctx> by means of OSSL_CMP_CTX_set_certConf_cb_arg(), which may be
570 retrieved again through OSSL_CMP_CTX_get_certConf_cb_arg().
571 Typically, the callback will check at least that the certificate can be verified
572 using a set of trusted certificates.
573 It also could compare the subject DN and other fields of the newly
574 enrolled certificate with the certificate template of the request.
575
576 OSSL_CMP_CTX_set_certConf_cb_arg() sets an argument, respectively a pointer to a
577 structure containing arguments, optionally to be used by the certConf callback.
578 B<arg> is not consumed, and it must therefore explicitly be freed when not
579 needed any more. B<arg> may be NULL to clear the entry.
580
581 OSSL_CMP_CTX_get_certConf_cb_arg() gets the argument, respectively the pointer
582 to a structure containing arguments, previously set by
583 OSSL_CMP_CTX_set_certConf_cb_arg(), or NULL if unset.
584
585 OSSL_CMP_CTX_get_status() returns the PKIstatus from the last received
586 CertRepMessage or Revocation Response or error message, or -1 if unset.
587
588 OSSL_CMP_CTX_get0_statusString() returns the statusString from the last received
589 CertRepMessage or Revocation Response or error message, or NULL if unset.
590
591 OSSL_CMP_CTX_get_failInfoCode() returns the error code from the failInfo field
592 of the last received CertRepMessage or Revocation Response or error message.
593 This is a bit field and the flags for it are specified in the header file
594 F<< <openssl/cmp.h> >>.
595 The flags start with OSSL_CMP_CTX_FAILINFO, for example:
596 OSSL_CMP_CTX_FAILINFO_badAlg. Returns -1 if the failInfoCode field is unset.
597
598 OSSL_CMP_CTX_get0_newCert() returns the pointer to the newly obtained
599 certificate in case it is available, else NULL.
600
601 OSSL_CMP_CTX_get1_newChain() returns a pointer to a duplicate of the stack of
602 X.509 certificates computed by OSSL_CMP_certConf_cb() (if this function has
603 been called) on the last received certificate response message IP/CP/KUP.
604
605 OSSL_CMP_CTX_get1_caPubs() returns a pointer to a duplicate of the stack of
606 X.509 certificates received in the caPubs field of last received certificate
607 response message IP/CP/KUP.
608
609 OSSL_CMP_CTX_get1_extraCertsIn() returns a pointer to a duplicate of the stack
610 of X.509 certificates received in the last received nonempty extraCerts field.
611 Returns an empty stack if no extraCerts have been received in the current
612 transaction.
613
614 OSSL_CMP_CTX_set1_transactionID() sets the given transaction ID in the given
615 OSSL_CMP_CTX structure.
616
617 OSSL_CMP_CTX_set1_senderNonce() stores the last sent sender B<nonce> in
618 the B<ctx>. This will be used to validate the recipNonce in incoming messages.
619
620 =head1 NOTES
621
622 CMP is defined in RFC 4210 (and CRMF in RFC 4211).
623
624 =head1 RETURN VALUES
625
626 OSSL_CMP_CTX_free() and OSSL_CMP_CTX_print_errors() do not return anything.
627
628 OSSL_CMP_CTX_new(),
629 OSSL_CMP_CTX_get_http_cb_arg(),
630 OSSL_CMP_CTX_get_transfer_cb_arg(),
631 OSSL_CMP_CTX_get0_trustedStore(),
632 OSSL_CMP_CTX_get0_untrusted_certs(),
633 OSSL_CMP_CTX_get0_newPkey(),
634 OSSL_CMP_CTX_get_certConf_cb_arg(),
635 OSSL_CMP_CTX_get0_statusString(),
636 OSSL_CMP_CTX_get0_newCert(),
637 OSSL_CMP_CTX_get0_newChain(),
638 OSSL_CMP_CTX_get1_caPubs(), and
639 OSSL_CMP_CTX_get1_extraCertsIn()
640 return the intended pointer value as described above or NULL on error.
641
642 OSSL_CMP_CTX_get_option(),
643 OSSL_CMP_CTX_reqExtensions_have_SAN(),
644 OSSL_CMP_CTX_get_status(), and
645 OSSL_CMP_CTX_get_failInfoCode()
646 return the intended value as described above or -1 on error.
647
648 All other functions return 1 on success, 0 on error.
649
650 =head1 EXAMPLES
651
652 The following code omits error handling.
653
654 Set up a CMP client context for sending requests and verifying responses:
655
656 cmp_ctx = OSSL_CMP_CTX_new();
657 OSSL_CMP_CTX_set1_server(cmp_ctx, name_or_address);
658 OSSL_CMP_CTX_set1_serverPort(cmp_ctx, port_string);
659 OSSL_CMP_CTX_set1_serverPath(cmp_ctx, path_or_alias);
660 OSSL_CMP_CTX_set0_trustedStore(cmp_ctx, ts);
661
662 Set up client credentials for password-based protection (PBM):
663
664 OSSL_CMP_CTX_set1_referenceValue(cmp_ctx, ref, ref_len);
665 OSSL_CMP_CTX_set1_secretValue(cmp_ctx, sec, sec_len);
666
667 Set up the details for certificate requests:
668
669 OSSL_CMP_CTX_set1_subjectName(cmp_ctx, name);
670 OSSL_CMP_CTX_set0_newPkey(cmp_ctx, 1, initialKey);
671
672 Perform an Initialization Request transaction:
673
674 initialCert = OSSL_CMP_exec_IR_ses(cmp_ctx);
675
676 Reset the transaction state of the CMP context and the credentials:
677
678 OSSL_CMP_CTX_reinit(cmp_ctx);
679 OSSL_CMP_CTX_set1_referenceValue(cmp_ctx, NULL, 0);
680 OSSL_CMP_CTX_set1_secretValue(cmp_ctx, NULL, 0);
681
682 Perform a Certification Request transaction, making use of the new credentials:
683
684 OSSL_CMP_CTX_set1_cert(cmp_ctx, initialCert);
685 OSSL_CMP_CTX_set1_pkey(cmp_ctx, initialKey);
686 OSSL_CMP_CTX_set0_newPkey(cmp_ctx, 1, curentKey);
687 currentCert = OSSL_CMP_exec_CR_ses(cmp_ctx);
688
689 Perform a Key Update Request, signed using the cert (and key) to be updated:
690
691 OSSL_CMP_CTX_reinit(cmp_ctx);
692 OSSL_CMP_CTX_set1_cert(cmp_ctx, currentCert);
693 OSSL_CMP_CTX_set1_pkey(cmp_ctx, currentKey);
694 OSSL_CMP_CTX_set0_newPkey(cmp_ctx, 1, updatedKey);
695 currentCert = OSSL_CMP_exec_KUR_ses(cmp_ctx);
696 currentKey = updatedKey;
697
698 Perform a General Message transaction including, as an example,
699 the id-it-signKeyPairTypes OID and prints info on the General Response contents:
700
701 OSSL_CMP_CTX_reinit(cmp_ctx);
702
703 ASN1_OBJECT *type = OBJ_txt2obj("1.3.6.1.5.5.7.4.2", 1);
704 OSSL_CMP_ITAV *itav = OSSL_CMP_ITAV_new(type, NULL);
705 OSSL_CMP_CTX_push0_genm_ITAV(cmp_ctx, itav);
706
707 STACK_OF(OSSL_CMP_ITAV) *itavs;
708 itavs = OSSL_CMP_exec_GENM_ses(cmp_ctx);
709 print_itavs(itavs);
710 sk_OSSL_CMP_ITAV_pop_free(itavs, OSSL_CMP_ITAV_free);
711
712 =head1 SEE ALSO
713
714 L<OSSL_CMP_exec_IR_ses(3)>, L<OSSL_CMP_exec_CR_ses(3)>,
715 L<OSSL_CMP_exec_KUR_ses(3)>, L<OSSL_CMP_exec_GENM_ses(3)>,
716 L<OSSL_CMP_exec_certreq(3)>
717
718 =head1 HISTORY
719
720 The OpenSSL CMP support was added in OpenSSL 3.0.
721
722 =head1 COPYRIGHT
723
724 Copyright 2007-2020 The OpenSSL Project Authors. All Rights Reserved.
725
726 Licensed under the Apache License 2.0 (the "License"). You may not use
727 this file except in compliance with the License. You can obtain a copy
728 in the file LICENSE in the source distribution or at
729 L<https://www.openssl.org/source/license.html>.
730
731 =cut