rand: remove unimplemented librandom stub code
[openssl.git] / doc / man3 / CMS_verify.pod
1 =pod
2
3 =head1 NAME
4
5 CMS_verify, CMS_SignedData_verify,
6 CMS_get0_signers - verify a CMS SignedData structure
7
8 =head1 SYNOPSIS
9
10  #include <openssl/cms.h>
11
12  int CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs, X509_STORE *store,
13                 BIO *detached_data, BIO *out, unsigned int flags);
14  BIO *CMS_SignedData_verify(CMS_SignedData *sd, BIO *detached_data,
15                             STACK_OF(X509) *scerts, X509_STORE *store,
16                             STACK_OF(X509) *extra, STACK_OF(X509_CRL) *crls,
17                             unsigned int flags,
18                             OSSL_LIB_CTX *libctx, const char *propq);
19
20  STACK_OF(X509) *CMS_get0_signers(CMS_ContentInfo *cms);
21
22 =head1 DESCRIPTION
23
24 CMS_verify() is very similar to L<PKCS7_verify(3)>. It verifies a
25 B<CMS SignedData> structure contained in a structure of type B<CMS_ContentInfo>.
26 I<cms> points to the B<CMS_ContentInfo> structure to verify.
27 The optional I<certs> parameter refers to a set of certificates
28 in which to search for signing certificates.
29 I<cms> may contain extra untrusted CA certificates that may be used for
30 chain building as well as CRLs that may be used for certificate validation.
31 I<store> may be NULL or point to
32 the trusted certificate store to use for chain verification.
33 I<detached_data> refers to the signed data if the content is detached from I<cms>.
34 Otherwise I<detached_data> should be NULL and the signed data must be in I<cms>.
35 The content is written to the BIO I<out> unless it is NULL.
36 I<flags> is an optional set of flags, which can be used to modify the operation.
37
38 CMS_SignedData_verify() is like CMS_verify() except that
39 it operates on B<CMS SignedData> input in the I<sd> argument,
40 it has some additional parameters described next,
41 and on success it returns the verified content as a memory BIO.
42 The optional I<extra> parameter may be used to provide untrusted CA
43 certificates that may be helpful for chain building in certificate validation.
44 This list of certificates must not contain duplicates.
45 The optional I<crls> parameter may be used to provide extra CRLs.
46 Also the list of CRLs must not contain duplicates.
47 The optional parameters library context I<libctx> and property query I<propq>
48 are used when retrieving algorithms from providers.
49
50 CMS_get0_signers() retrieves the signing certificate(s) from I<cms>; it may only
51 be called after a successful CMS_verify() or CMS_SignedData_verify() operation.
52
53 =head1 VERIFY PROCESS
54
55 Normally the verify process proceeds as follows.
56
57 Initially some sanity checks are performed on I<cms>. The type of I<cms> must
58 be SignedData. There must be at least one signature on the data and if
59 the content is detached I<detached_data> cannot be NULL.
60
61 An attempt is made to locate all the signing certificate(s), first looking in
62 the I<certs> parameter (if it is not NULL) and then looking in any
63 certificates contained in the I<cms> structure unless B<CMS_NOINTERN> is set.
64 If any signing certificate cannot be located the operation fails.
65
66 Each signing certificate is chain verified using the I<smimesign> purpose and
67 using the trusted certificate store I<store> if supplied.
68 Any internal certificates in the message, which may have been added using
69 L<CMS_add1_cert(3)>, are used as untrusted CAs.
70 If CRL checking is enabled in I<store> and B<CMS_NOCRL> is not set,
71 any internal CRLs, which may have been added using L<CMS_add1_crl(3)>,
72 are used in addition to attempting to look them up in I<store>.
73 If I<store> is not NULL and any chain verify fails an error code is returned.
74
75 Finally the signed content is read (and written to I<out> unless it is NULL)
76 and the signature is checked.
77
78 If all signatures verify correctly then the function is successful.
79
80 Any of the following flags (ored together) can be passed in the I<flags>
81 parameter to change the default verify behaviour.
82
83 If B<CMS_NOINTERN> is set the certificates in the message itself are not
84 searched when locating the signing certificate(s).
85 This means that all the signing certificates must be in the I<certs> parameter.
86
87 If B<CMS_NOCRL> is set and CRL checking is enabled in I<store> then any
88 CRLs in the message itself and provided via the I<crls> parameter are ignored.
89
90 If the B<CMS_TEXT> flag is set MIME headers for type C<text/plain> are deleted
91 from the content. If the content is not of type C<text/plain> then an error is
92 returned.
93
94 If B<CMS_NO_SIGNER_CERT_VERIFY> is set the signing certificates are not
95 chain verified, unless B<CMS_CADES> flag is also set.
96
97 If B<CMS_NO_ATTR_VERIFY> is set the signed attributes signature is not
98 verified, unless CMS_CADES flag is also set.
99
100 If B<CMS_CADES> is set, each signer certificate is checked against the
101 ESS signingCertificate or ESS signingCertificateV2 extension
102 that is required in the signed attributes of the signature.
103
104 If B<CMS_NO_CONTENT_VERIFY> is set then the content digest is not checked.
105
106 =head1 NOTES
107
108 One application of B<CMS_NOINTERN> is to only accept messages signed by
109 a small number of certificates. The acceptable certificates would be passed
110 in the I<certs> parameter. In this case if the signer certificate is not one
111 of the certificates supplied in I<certs> then the verify will fail because the
112 signer cannot be found.
113
114 In some cases the standard techniques for looking up and validating
115 certificates are not appropriate: for example an application may wish to
116 lookup certificates in a database or perform customised verification. This
117 can be achieved by setting and verifying the signer certificates manually
118 using the signed data utility functions.
119
120 Care should be taken when modifying the default verify behaviour, for example
121 setting B<CMS_NO_CONTENT_VERIFY> will totally disable all content verification
122 and any modified content will be considered valid. This combination is however
123 useful if one merely wishes to write the content to I<out> and its validity
124 is not considered important.
125
126 Chain verification should arguably be performed using the signing time rather
127 than the current time. However, since the signing time is supplied by the
128 signer it cannot be trusted without additional evidence (such as a trusted
129 timestamp).
130
131 =head1 RETURN VALUES
132
133 CMS_verify() returns 1 for a successful verification and 0 if an error occurred.
134
135 CMS_SignedData_verify() returns a memory BIO containing the verified content,
136 or NULL on error.
137
138 CMS_get0_signers() returns all signers or NULL if an error occurred.
139
140 The error can be obtained from L<ERR_get_error(3)>.
141
142 =head1 BUGS
143
144 The trusted certificate store is not searched for the signing certificate.
145 This is primarily due to the inadequacies of the current B<X509_STORE>
146 functionality.
147
148 The lack of single pass processing means that the signed content must all
149 be held in memory if it is not detached.
150
151 =head1 SEE ALSO
152
153 L<PKCS7_verify(3)>, L<CMS_add1_cert(3)>, L<CMS_add1_crl(3)>,
154 L<OSSL_ESS_check_signing_certs(3)>,
155 L<ERR_get_error(3)>, L<CMS_sign(3)>
156
157 =head1 HISTORY
158
159 CMS_SignedData_verify() was added in OpenSSL 3.2.
160
161 =head1 COPYRIGHT
162
163 Copyright 2008-2023 The OpenSSL Project Authors. All Rights Reserved.
164
165 Licensed under the Apache License 2.0 (the "License").  You may not use
166 this file except in compliance with the License.  You can obtain a copy
167 in the file LICENSE in the source distribution or at
168 L<https://www.openssl.org/source/license.html>.
169
170 =cut