1 /* $OpenBSD: cms.h,v 1.15 2019/08/11 10:15:30 jsing Exp $ */
2 /*
3  * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
4  * project.
5  */
6 /* ====================================================================
7  * Copyright (c) 2008 The OpenSSL Project.  All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in
18  *    the documentation and/or other materials provided with the
19  *    distribution.
20  *
21  * 3. All advertising materials mentioning features or use of this
22  *    software must display the following acknowledgment:
23  *    "This product includes software developed by the OpenSSL Project
24  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
25  *
26  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
27  *    endorse or promote products derived from this software without
28  *    prior written permission. For written permission, please contact
29  *    licensing@OpenSSL.org.
30  *
31  * 5. Products derived from this software may not be called "OpenSSL"
32  *    nor may "OpenSSL" appear in their names without prior written
33  *    permission of the OpenSSL Project.
34  *
35  * 6. Redistributions of any form whatsoever must retain the following
36  *    acknowledgment:
37  *    "This product includes software developed by the OpenSSL Project
38  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
39  *
40  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
41  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
43  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
44  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
46  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
49  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
50  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
51  * OF THE POSSIBILITY OF SUCH DAMAGE.
52  * ====================================================================
53  */
54 module libressl_d.openssl.cms;
55 
56 
57 private static import core.stdc.config;
58 private static import libressl_d.compat.stdio;
59 private static import libressl_d.compat.sys.types;
60 private static import libressl_d.compat.time;
61 private static import libressl_d.openssl.asn1;
62 private static import libressl_d.openssl.bio;
63 private static import libressl_d.openssl.ossl_typ;
64 private static import libressl_d.openssl.pem;
65 private static import libressl_d.openssl.stack;
66 private static import libressl_d.openssl.x509v3;
67 public import libressl_d.openssl.opensslconf;
68 
69 version (OPENSSL_NO_CMS) {
70 } else {
71 	public import libressl_d.openssl.x509;
72 	public import libressl_d.openssl.x509v3;
73 
74 	extern (C):
75 	nothrow @nogc:
76 
77 	struct CMS_ContentInfo_st;
78 	struct CMS_SignerInfo_st;
79 	struct CMS_CertificateChoices;
80 	struct CMS_RevocationInfoChoice_st;
81 	struct CMS_RecipientInfo_st;
82 	struct CMS_ReceiptRequest_st;
83 	struct CMS_Receipt_st;
84 	struct CMS_RecipientEncryptedKey_st;
85 	struct CMS_OtherKeyAttribute_st;
86 
87 	alias CMS_ContentInfo = .CMS_ContentInfo_st;
88 	alias CMS_SignerInfo = .CMS_SignerInfo_st;
89 	alias CMS_RevocationInfoChoice = .CMS_RevocationInfoChoice_st;
90 	alias CMS_RecipientInfo = .CMS_RecipientInfo_st;
91 	alias CMS_ReceiptRequest = .CMS_ReceiptRequest_st;
92 	alias CMS_Receipt = .CMS_Receipt_st;
93 	alias CMS_RecipientEncryptedKey = .CMS_RecipientEncryptedKey_st;
94 	alias CMS_OtherKeyAttribute = .CMS_OtherKeyAttribute_st;
95 
96 	//DECLARE_STACK_OF(CMS_SignerInfo)
97 	struct stack_st_CMS_SignerInfo
98 	{
99 		libressl_d.openssl.stack._STACK stack;
100 	}
101 
102 	//DECLARE_STACK_OF(CMS_RecipientEncryptedKey)
103 	struct stack_st_CMS_RecipientEncryptedKey
104 	{
105 		libressl_d.openssl.stack._STACK stack;
106 	}
107 
108 	//DECLARE_STACK_OF(CMS_RecipientInfo)
109 	struct stack_st_CMS_RecipientInfo
110 	{
111 		libressl_d.openssl.stack._STACK stack;
112 	}
113 
114 	//DECLARE_STACK_OF(CMS_RevocationInfoChoice)
115 	struct stack_st_CMS_RevocationInfoChoice
116 	{
117 		libressl_d.openssl.stack._STACK stack;
118 	}
119 
120 	.CMS_ContentInfo* CMS_ContentInfo_new();
121 	void CMS_ContentInfo_free(.CMS_ContentInfo* a);
122 	.CMS_ContentInfo* d2i_CMS_ContentInfo(.CMS_ContentInfo** a, const (ubyte)** in_, core.stdc.config.c_long len);
123 	int i2d_CMS_ContentInfo(.CMS_ContentInfo* a, ubyte** out_);
124 	extern __gshared const libressl_d.openssl.ossl_typ.ASN1_ITEM CMS_ContentInfo_it;
125 	.CMS_ReceiptRequest* CMS_ReceiptRequest_new();
126 	void CMS_ReceiptRequest_free(.CMS_ReceiptRequest* a);
127 	.CMS_ReceiptRequest* d2i_CMS_ReceiptRequest(.CMS_ReceiptRequest** a, const (ubyte)** in_, core.stdc.config.c_long len);
128 	int i2d_CMS_ReceiptRequest(.CMS_ReceiptRequest* a, ubyte** out_);
129 	extern __gshared const libressl_d.openssl.ossl_typ.ASN1_ITEM CMS_ReceiptRequest_it;
130 	int CMS_ContentInfo_print_ctx(libressl_d.openssl.bio.BIO* out_, .CMS_ContentInfo* x, int indent, const (libressl_d.openssl.ossl_typ.ASN1_PCTX)* pctx);
131 
132 	enum CMS_SIGNERINFO_ISSUER_SERIAL = 0;
133 	enum CMS_SIGNERINFO_KEYIDENTIFIER = 1;
134 
135 	enum CMS_RECIPINFO_NONE = -1;
136 	enum CMS_RECIPINFO_TRANS = 0;
137 	enum CMS_RECIPINFO_AGREE = 1;
138 	enum CMS_RECIPINFO_KEK = 2;
139 	enum CMS_RECIPINFO_PASS = 3;
140 	enum CMS_RECIPINFO_OTHER = 4;
141 
142 	/* S/MIME related flags */
143 
144 	enum CMS_TEXT = 0x01;
145 	enum CMS_NOCERTS = 0x02;
146 	enum CMS_NO_CONTENT_VERIFY = 0x04;
147 	enum CMS_NO_ATTR_VERIFY = 0x08;
148 	enum CMS_NOSIGS = .CMS_NO_CONTENT_VERIFY | .CMS_NO_ATTR_VERIFY;
149 	enum CMS_NOINTERN = 0x10;
150 	enum CMS_NO_SIGNER_CERT_VERIFY = 0x20;
151 	enum CMS_NOVERIFY = 0x20;
152 	enum CMS_DETACHED = 0x40;
153 	enum CMS_BINARY = 0x80;
154 	enum CMS_NOATTR = 0x0100;
155 	enum CMS_NOSMIMECAP = 0x0200;
156 	enum CMS_NOOLDMIMETYPE = 0x0400;
157 	enum CMS_CRLFEOL = 0x0800;
158 	enum CMS_STREAM = 0x1000;
159 	enum CMS_NOCRL = 0x2000;
160 	enum CMS_PARTIAL = 0x4000;
161 	enum CMS_REUSE_DIGEST = 0x8000;
162 	enum CMS_USE_KEYID = 0x010000;
163 	enum CMS_DEBUG_DECRYPT = 0x020000;
164 	enum CMS_KEY_PARAM = 0x040000;
165 	enum CMS_ASCIICRLF = 0x080000;
166 
167 	const (libressl_d.openssl.asn1.ASN1_OBJECT)* CMS_get0_type(const (.CMS_ContentInfo)* cms);
168 
169 	libressl_d.openssl.bio.BIO* CMS_dataInit(.CMS_ContentInfo* cms, libressl_d.openssl.bio.BIO* icont);
170 	int CMS_dataFinal(.CMS_ContentInfo* cms, libressl_d.openssl.bio.BIO* bio);
171 
172 	libressl_d.openssl.ossl_typ.ASN1_OCTET_STRING** CMS_get0_content(.CMS_ContentInfo* cms);
173 	int CMS_is_detached(.CMS_ContentInfo* cms);
174 	int CMS_set_detached(.CMS_ContentInfo* cms, int detached);
175 
176 	static assert(libressl_d.openssl.pem.HEADER_PEM_H);
177 	.CMS_ContentInfo* PEM_read_bio_CMS(libressl_d.openssl.bio.BIO* bp, .CMS_ContentInfo** x, libressl_d.openssl.pem.pem_password_cb* cb, void* u);
178 	.CMS_ContentInfo* PEM_read_CMS(libressl_d.compat.stdio.FILE* fp, .CMS_ContentInfo** x, libressl_d.openssl.pem.pem_password_cb* cb, void* u);
179 	int PEM_write_bio_CMS(libressl_d.openssl.bio.BIO* bp, const (.CMS_ContentInfo)* x);
180 	int PEM_write_CMS(libressl_d.compat.stdio.FILE* fp, const (.CMS_ContentInfo)* x);
181 
182 	int CMS_stream(ubyte*** boundary, .CMS_ContentInfo* cms);
183 	.CMS_ContentInfo* d2i_CMS_bio(libressl_d.openssl.bio.BIO* bp, .CMS_ContentInfo** cms);
184 	int i2d_CMS_bio(libressl_d.openssl.bio.BIO* bp, .CMS_ContentInfo* cms);
185 
186 	libressl_d.openssl.bio.BIO* BIO_new_CMS(libressl_d.openssl.bio.BIO* out_, .CMS_ContentInfo* cms);
187 	int i2d_CMS_bio_stream(libressl_d.openssl.bio.BIO* out_, .CMS_ContentInfo* cms, libressl_d.openssl.bio.BIO* in_, int flags);
188 	int PEM_write_bio_CMS_stream(libressl_d.openssl.bio.BIO* out_, .CMS_ContentInfo* cms, libressl_d.openssl.bio.BIO* in_, int flags);
189 	.CMS_ContentInfo* SMIME_read_CMS(libressl_d.openssl.bio.BIO* bio, libressl_d.openssl.bio.BIO** bcont);
190 	int SMIME_write_CMS(libressl_d.openssl.bio.BIO* bio, .CMS_ContentInfo* cms, libressl_d.openssl.bio.BIO* data, int flags);
191 
192 	int CMS_final(.CMS_ContentInfo* cms, libressl_d.openssl.bio.BIO* data, libressl_d.openssl.bio.BIO* dcont, uint flags);
193 
194 	.CMS_ContentInfo* CMS_sign(libressl_d.openssl.ossl_typ.X509* signcert, libressl_d.openssl.ossl_typ.EVP_PKEY* pkey, libressl_d.openssl.x509.stack_st_X509* certs, libressl_d.openssl.bio.BIO* data, uint flags);
195 
196 	.CMS_ContentInfo* CMS_sign_receipt(.CMS_SignerInfo* si, libressl_d.openssl.ossl_typ.X509* signcert, libressl_d.openssl.ossl_typ.EVP_PKEY* pkey, libressl_d.openssl.x509.stack_st_X509* certs, uint flags);
197 
198 	int CMS_data(.CMS_ContentInfo* cms, libressl_d.openssl.bio.BIO* out_, uint flags);
199 	.CMS_ContentInfo* CMS_data_create(libressl_d.openssl.bio.BIO* in_, uint flags);
200 
201 	int CMS_digest_verify(.CMS_ContentInfo* cms, libressl_d.openssl.bio.BIO* dcont, libressl_d.openssl.bio.BIO* out_, uint flags);
202 	.CMS_ContentInfo* CMS_digest_create(libressl_d.openssl.bio.BIO* in_, const (libressl_d.openssl.ossl_typ.EVP_MD)* md, uint flags);
203 
204 	int CMS_EncryptedData_decrypt(.CMS_ContentInfo* cms, const (ubyte)* key, size_t keylen, libressl_d.openssl.bio.BIO* dcont, libressl_d.openssl.bio.BIO* out_, uint flags);
205 
206 	.CMS_ContentInfo* CMS_EncryptedData_encrypt(libressl_d.openssl.bio.BIO* in_, const (libressl_d.openssl.ossl_typ.EVP_CIPHER)* cipher, const (ubyte)* key, size_t keylen, uint flags);
207 
208 	int CMS_EncryptedData_set1_key(.CMS_ContentInfo* cms, const (libressl_d.openssl.ossl_typ.EVP_CIPHER)* ciph, const (ubyte)* key, size_t keylen);
209 
210 	int CMS_verify(.CMS_ContentInfo* cms, libressl_d.openssl.x509.stack_st_X509* certs, libressl_d.openssl.ossl_typ.X509_STORE* store, libressl_d.openssl.bio.BIO* dcont, libressl_d.openssl.bio.BIO* out_, uint flags);
211 
212 	int CMS_verify_receipt(.CMS_ContentInfo* rcms, .CMS_ContentInfo* ocms, libressl_d.openssl.x509.stack_st_X509* certs, libressl_d.openssl.ossl_typ.X509_STORE* store, uint flags);
213 
214 	libressl_d.openssl.x509.stack_st_X509* CMS_get0_signers(.CMS_ContentInfo* cms);
215 
216 	.CMS_ContentInfo* CMS_encrypt(libressl_d.openssl.x509.stack_st_X509* certs, libressl_d.openssl.bio.BIO* in_, const (libressl_d.openssl.ossl_typ.EVP_CIPHER)* cipher, uint flags);
217 
218 	int CMS_decrypt(.CMS_ContentInfo* cms, libressl_d.openssl.ossl_typ.EVP_PKEY* pkey, libressl_d.openssl.ossl_typ.X509* cert, libressl_d.openssl.bio.BIO* dcont, libressl_d.openssl.bio.BIO* out_, uint flags);
219 
220 	int CMS_decrypt_set1_pkey(.CMS_ContentInfo* cms, libressl_d.openssl.ossl_typ.EVP_PKEY* pk, libressl_d.openssl.ossl_typ.X509* cert);
221 	int CMS_decrypt_set1_key(.CMS_ContentInfo* cms, ubyte* key, size_t keylen, const (ubyte)* id, size_t idlen);
222 	int CMS_decrypt_set1_password(.CMS_ContentInfo* cms, ubyte* pass, libressl_d.compat.sys.types.ssize_t passlen);
223 
224 	.stack_st_CMS_RecipientInfo* CMS_get0_RecipientInfos(.CMS_ContentInfo* cms);
225 	int CMS_RecipientInfo_type(.CMS_RecipientInfo* ri);
226 	libressl_d.openssl.ossl_typ.EVP_PKEY_CTX* CMS_RecipientInfo_get0_pkey_ctx(.CMS_RecipientInfo* ri);
227 	.CMS_ContentInfo* CMS_EnvelopedData_create(const (libressl_d.openssl.ossl_typ.EVP_CIPHER)* cipher);
228 	.CMS_RecipientInfo* CMS_add1_recipient_cert(.CMS_ContentInfo* cms, libressl_d.openssl.ossl_typ.X509* recip, uint flags);
229 	int CMS_RecipientInfo_set0_pkey(.CMS_RecipientInfo* ri, libressl_d.openssl.ossl_typ.EVP_PKEY* pkey);
230 	int CMS_RecipientInfo_ktri_cert_cmp(.CMS_RecipientInfo* ri, libressl_d.openssl.ossl_typ.X509* cert);
231 	int CMS_RecipientInfo_ktri_get0_algs(.CMS_RecipientInfo* ri, libressl_d.openssl.ossl_typ.EVP_PKEY** pk, libressl_d.openssl.ossl_typ.X509** recip, libressl_d.openssl.ossl_typ.X509_ALGOR** palg);
232 	int CMS_RecipientInfo_ktri_get0_signer_id(.CMS_RecipientInfo* ri, libressl_d.openssl.ossl_typ.ASN1_OCTET_STRING** keyid, libressl_d.openssl.ossl_typ.X509_NAME** issuer, libressl_d.openssl.ossl_typ.ASN1_INTEGER** sno);
233 
234 	.CMS_RecipientInfo* CMS_add0_recipient_key(.CMS_ContentInfo* cms, int nid, ubyte* key, size_t keylen, ubyte* id, size_t idlen, libressl_d.openssl.ossl_typ.ASN1_GENERALIZEDTIME* date, libressl_d.openssl.asn1.ASN1_OBJECT* otherTypeId, libressl_d.openssl.asn1.ASN1_TYPE* otherType);
235 
236 	int CMS_RecipientInfo_kekri_get0_id(.CMS_RecipientInfo* ri, libressl_d.openssl.ossl_typ.X509_ALGOR** palg, libressl_d.openssl.ossl_typ.ASN1_OCTET_STRING** pid, libressl_d.openssl.ossl_typ.ASN1_GENERALIZEDTIME** pdate, libressl_d.openssl.asn1.ASN1_OBJECT** potherid, libressl_d.openssl.asn1.ASN1_TYPE** pothertype);
237 
238 	int CMS_RecipientInfo_set0_key(.CMS_RecipientInfo* ri, ubyte* key, size_t keylen);
239 
240 	int CMS_RecipientInfo_kekri_id_cmp(.CMS_RecipientInfo* ri, const (ubyte)* id, size_t idlen);
241 
242 	int CMS_RecipientInfo_set0_password(.CMS_RecipientInfo* ri, ubyte* pass, libressl_d.compat.sys.types.ssize_t passlen);
243 
244 	.CMS_RecipientInfo* CMS_add0_recipient_password(.CMS_ContentInfo* cms, int iter, int wrap_nid, int pbe_nid, ubyte* pass, libressl_d.compat.sys.types.ssize_t passlen, const (libressl_d.openssl.ossl_typ.EVP_CIPHER)* kekciph);
245 
246 	int CMS_RecipientInfo_decrypt(.CMS_ContentInfo* cms, .CMS_RecipientInfo* ri);
247 	int CMS_RecipientInfo_encrypt(.CMS_ContentInfo* cms, .CMS_RecipientInfo* ri);
248 
249 	int CMS_uncompress(.CMS_ContentInfo* cms, libressl_d.openssl.bio.BIO* dcont, libressl_d.openssl.bio.BIO* out_, uint flags);
250 	.CMS_ContentInfo* CMS_compress(libressl_d.openssl.bio.BIO* in_, int comp_nid, uint flags);
251 
252 	int CMS_set1_eContentType(.CMS_ContentInfo* cms, const (libressl_d.openssl.asn1.ASN1_OBJECT)* oid);
253 	const (libressl_d.openssl.asn1.ASN1_OBJECT)* CMS_get0_eContentType(.CMS_ContentInfo* cms);
254 
255 	.CMS_CertificateChoices* CMS_add0_CertificateChoices(.CMS_ContentInfo* cms);
256 	int CMS_add0_cert(.CMS_ContentInfo* cms, libressl_d.openssl.ossl_typ.X509* cert);
257 	int CMS_add1_cert(.CMS_ContentInfo* cms, libressl_d.openssl.ossl_typ.X509* cert);
258 	libressl_d.openssl.x509.stack_st_X509* CMS_get1_certs(.CMS_ContentInfo* cms);
259 
260 	.CMS_RevocationInfoChoice* CMS_add0_RevocationInfoChoice(.CMS_ContentInfo* cms);
261 	int CMS_add0_crl(.CMS_ContentInfo* cms, libressl_d.openssl.ossl_typ.X509_CRL* crl);
262 	int CMS_add1_crl(.CMS_ContentInfo* cms, libressl_d.openssl.ossl_typ.X509_CRL* crl);
263 	libressl_d.openssl.x509.stack_st_X509_CRL* CMS_get1_crls(.CMS_ContentInfo* cms);
264 
265 	int CMS_SignedData_init(.CMS_ContentInfo* cms);
266 	.CMS_SignerInfo* CMS_add1_signer(.CMS_ContentInfo* cms, libressl_d.openssl.ossl_typ.X509* signer, libressl_d.openssl.ossl_typ.EVP_PKEY* pk, const (libressl_d.openssl.ossl_typ.EVP_MD)* md, uint flags);
267 	libressl_d.openssl.ossl_typ.EVP_PKEY_CTX* CMS_SignerInfo_get0_pkey_ctx(.CMS_SignerInfo* si);
268 	libressl_d.openssl.ossl_typ.EVP_MD_CTX* CMS_SignerInfo_get0_md_ctx(.CMS_SignerInfo* si);
269 	.stack_st_CMS_SignerInfo* CMS_get0_SignerInfos(.CMS_ContentInfo* cms);
270 
271 	void CMS_SignerInfo_set1_signer_cert(.CMS_SignerInfo* si, libressl_d.openssl.ossl_typ.X509* signer);
272 	int CMS_SignerInfo_get0_signer_id(.CMS_SignerInfo* si, libressl_d.openssl.ossl_typ.ASN1_OCTET_STRING** keyid, libressl_d.openssl.ossl_typ.X509_NAME** issuer, libressl_d.openssl.ossl_typ.ASN1_INTEGER** sno);
273 	int CMS_SignerInfo_cert_cmp(.CMS_SignerInfo* si, libressl_d.openssl.ossl_typ.X509* cert);
274 	int CMS_set1_signers_certs(.CMS_ContentInfo* cms, libressl_d.openssl.x509.stack_st_X509* certs, uint flags);
275 	void CMS_SignerInfo_get0_algs(.CMS_SignerInfo* si, libressl_d.openssl.ossl_typ.EVP_PKEY** pk, libressl_d.openssl.ossl_typ.X509** signer, libressl_d.openssl.ossl_typ.X509_ALGOR** pdig, libressl_d.openssl.ossl_typ.X509_ALGOR** psig);
276 	libressl_d.openssl.ossl_typ.ASN1_OCTET_STRING* CMS_SignerInfo_get0_signature(.CMS_SignerInfo* si);
277 	int CMS_SignerInfo_sign(.CMS_SignerInfo* si);
278 	int CMS_SignerInfo_verify(.CMS_SignerInfo* si);
279 	int CMS_SignerInfo_verify_content(.CMS_SignerInfo* si, libressl_d.openssl.bio.BIO* chain);
280 
281 	int CMS_add_smimecap(.CMS_SignerInfo* si, libressl_d.openssl.asn1.stack_st_X509_ALGOR* algs);
282 	int CMS_add_simple_smimecap(libressl_d.openssl.asn1.stack_st_X509_ALGOR** algs, int algnid, int keysize);
283 	int CMS_add_standard_smimecap(libressl_d.openssl.asn1.stack_st_X509_ALGOR** smcap);
284 
285 	int CMS_signed_get_attr_count(const (.CMS_SignerInfo)* si);
286 	int CMS_signed_get_attr_by_NID(const (.CMS_SignerInfo)* si, int nid, int lastpos);
287 	int CMS_signed_get_attr_by_OBJ(const (.CMS_SignerInfo)* si, const (libressl_d.openssl.asn1.ASN1_OBJECT)* obj, int lastpos);
288 	libressl_d.openssl.x509.X509_ATTRIBUTE* CMS_signed_get_attr(const (.CMS_SignerInfo)* si, int loc);
289 	libressl_d.openssl.x509.X509_ATTRIBUTE* CMS_signed_delete_attr(.CMS_SignerInfo* si, int loc);
290 	int CMS_signed_add1_attr(.CMS_SignerInfo* si, libressl_d.openssl.x509.X509_ATTRIBUTE* attr);
291 	int CMS_signed_add1_attr_by_OBJ(.CMS_SignerInfo* si, const (libressl_d.openssl.asn1.ASN1_OBJECT)* obj, int type, const (void)* bytes, int len);
292 	int CMS_signed_add1_attr_by_NID(.CMS_SignerInfo* si, int nid, int type, const (void)* bytes, int len);
293 	int CMS_signed_add1_attr_by_txt(.CMS_SignerInfo* si, const (char)* attrname, int type, const (void)* bytes, int len);
294 	void* CMS_signed_get0_data_by_OBJ(.CMS_SignerInfo* si, const (libressl_d.openssl.asn1.ASN1_OBJECT)* oid, int lastpos, int type);
295 
296 	int CMS_unsigned_get_attr_count(const (.CMS_SignerInfo)* si);
297 	int CMS_unsigned_get_attr_by_NID(const (.CMS_SignerInfo)* si, int nid, int lastpos);
298 	int CMS_unsigned_get_attr_by_OBJ(const (.CMS_SignerInfo)* si, const (libressl_d.openssl.asn1.ASN1_OBJECT)* obj, int lastpos);
299 	libressl_d.openssl.x509.X509_ATTRIBUTE* CMS_unsigned_get_attr(const (.CMS_SignerInfo)* si, int loc);
300 	libressl_d.openssl.x509.X509_ATTRIBUTE* CMS_unsigned_delete_attr(.CMS_SignerInfo* si, int loc);
301 	int CMS_unsigned_add1_attr(.CMS_SignerInfo* si, libressl_d.openssl.x509.X509_ATTRIBUTE* attr);
302 	int CMS_unsigned_add1_attr_by_OBJ(.CMS_SignerInfo* si, const (libressl_d.openssl.asn1.ASN1_OBJECT)* obj, int type, const (void)* bytes, int len);
303 	int CMS_unsigned_add1_attr_by_NID(.CMS_SignerInfo* si, int nid, int type, const (void)* bytes, int len);
304 	int CMS_unsigned_add1_attr_by_txt(.CMS_SignerInfo* si, const (char)* attrname, int type, const (void)* bytes, int len);
305 	void* CMS_unsigned_get0_data_by_OBJ(.CMS_SignerInfo* si, libressl_d.openssl.asn1.ASN1_OBJECT* oid, int lastpos, int type);
306 
307 	static assert(libressl_d.openssl.x509v3.HEADER_X509V3_H);
308 	struct stack_st_GENERAL_NAMES;
309 	int CMS_get1_ReceiptRequest(.CMS_SignerInfo* si, .CMS_ReceiptRequest** prr);
310 	.CMS_ReceiptRequest* CMS_ReceiptRequest_create0(ubyte* id, int idlen, int allorfirst, .stack_st_GENERAL_NAMES* receiptList, .stack_st_GENERAL_NAMES* receiptsTo);
311 	int CMS_add1_ReceiptRequest(.CMS_SignerInfo* si, .CMS_ReceiptRequest* rr);
312 	void CMS_ReceiptRequest_get0_values(.CMS_ReceiptRequest* rr, libressl_d.openssl.ossl_typ.ASN1_STRING** pcid, int* pallorfirst, .stack_st_GENERAL_NAMES** plist, .stack_st_GENERAL_NAMES** prto);
313 
314 	int CMS_RecipientInfo_kari_get0_alg(.CMS_RecipientInfo* ri, libressl_d.openssl.ossl_typ.X509_ALGOR** palg, libressl_d.openssl.ossl_typ.ASN1_OCTET_STRING** pukm);
315 	.stack_st_CMS_RecipientEncryptedKey* CMS_RecipientInfo_kari_get0_reks(.CMS_RecipientInfo* ri);
316 
317 	int CMS_RecipientInfo_kari_get0_orig_id(.CMS_RecipientInfo* ri, libressl_d.openssl.ossl_typ.X509_ALGOR** pubalg, libressl_d.openssl.ossl_typ.ASN1_BIT_STRING** pubkey, libressl_d.openssl.ossl_typ.ASN1_OCTET_STRING** keyid, libressl_d.openssl.ossl_typ.X509_NAME** issuer, libressl_d.openssl.ossl_typ.ASN1_INTEGER** sno);
318 
319 	int CMS_RecipientInfo_kari_orig_id_cmp(.CMS_RecipientInfo* ri, libressl_d.openssl.ossl_typ.X509* cert);
320 
321 	int CMS_RecipientEncryptedKey_get0_id(.CMS_RecipientEncryptedKey* rek, libressl_d.openssl.ossl_typ.ASN1_OCTET_STRING** keyid, libressl_d.openssl.ossl_typ.ASN1_GENERALIZEDTIME** tm, .CMS_OtherKeyAttribute** other, libressl_d.openssl.ossl_typ.X509_NAME** issuer, libressl_d.openssl.ossl_typ.ASN1_INTEGER** sno);
322 	int CMS_RecipientEncryptedKey_cert_cmp(.CMS_RecipientEncryptedKey* rek, libressl_d.openssl.ossl_typ.X509* cert);
323 	int CMS_RecipientInfo_kari_set0_pkey(.CMS_RecipientInfo* ri, libressl_d.openssl.ossl_typ.EVP_PKEY* pk);
324 	libressl_d.openssl.ossl_typ.EVP_CIPHER_CTX* CMS_RecipientInfo_kari_get0_ctx(.CMS_RecipientInfo* ri);
325 	int CMS_RecipientInfo_kari_decrypt(.CMS_ContentInfo* cms, .CMS_RecipientInfo* ri, .CMS_RecipientEncryptedKey* rek);
326 
327 	int CMS_SharedInfo_encode(ubyte** pder, libressl_d.openssl.ossl_typ.X509_ALGOR* kekalg, libressl_d.openssl.ossl_typ.ASN1_OCTET_STRING* ukm, int keylen);
328 
329 	/* Backward compatibility for spelling errors. */
330 	alias CMS_R_UNKNOWN_DIGEST_ALGORITM = .CMS_R_UNKNOWN_DIGEST_ALGORITHM;
331 	alias CMS_R_UNSUPPORTED_RECPIENTINFO_TYPE = .CMS_R_UNSUPPORTED_RECIPIENTINFO_TYPE;
332 
333 	int ERR_load_CMS_strings();
334 
335 	/*
336 	 * CMS function codes.
337 	 */
338 	enum CMS_F_CHECK_CONTENT = 99;
339 	enum CMS_F_CMS_ADD0_CERT = 164;
340 	enum CMS_F_CMS_ADD0_RECIPIENT_KEY = 100;
341 	enum CMS_F_CMS_ADD0_RECIPIENT_PASSWORD = 165;
342 	enum CMS_F_CMS_ADD1_RECEIPTREQUEST = 158;
343 	enum CMS_F_CMS_ADD1_RECIPIENT_CERT = 101;
344 	enum CMS_F_CMS_ADD1_SIGNER = 102;
345 	enum CMS_F_CMS_ADD1_SIGNINGTIME = 103;
346 	enum CMS_F_CMS_COMPRESS = 104;
347 	enum CMS_F_CMS_COMPRESSEDDATA_CREATE = 105;
348 	enum CMS_F_CMS_COMPRESSEDDATA_INIT_BIO = 106;
349 	enum CMS_F_CMS_COPY_CONTENT = 107;
350 	enum CMS_F_CMS_COPY_MESSAGEDIGEST = 108;
351 	enum CMS_F_CMS_DATA = 109;
352 	enum CMS_F_CMS_DATAFINAL = 110;
353 	enum CMS_F_CMS_DATAINIT = 111;
354 	enum CMS_F_CMS_DECRYPT = 112;
355 	enum CMS_F_CMS_DECRYPT_SET1_KEY = 113;
356 	enum CMS_F_CMS_DECRYPT_SET1_PASSWORD = 166;
357 	enum CMS_F_CMS_DECRYPT_SET1_PKEY = 114;
358 	enum CMS_F_CMS_DIGESTALGORITHM_FIND_CTX = 115;
359 	enum CMS_F_CMS_DIGESTALGORITHM_INIT_BIO = 116;
360 	enum CMS_F_CMS_DIGESTEDDATA_DO_FINAL = 117;
361 	enum CMS_F_CMS_DIGEST_VERIFY = 118;
362 	enum CMS_F_CMS_ENCODE_RECEIPT = 161;
363 	enum CMS_F_CMS_ENCRYPT = 119;
364 	enum CMS_F_CMS_ENCRYPTEDCONTENT_INIT = 179;
365 	enum CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO = 120;
366 	enum CMS_F_CMS_ENCRYPTEDDATA_DECRYPT = 121;
367 	enum CMS_F_CMS_ENCRYPTEDDATA_ENCRYPT = 122;
368 	enum CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY = 123;
369 	enum CMS_F_CMS_ENVELOPEDDATA_CREATE = 124;
370 	enum CMS_F_CMS_ENVELOPEDDATA_INIT_BIO = 125;
371 	enum CMS_F_CMS_ENVELOPED_DATA_INIT = 126;
372 	enum CMS_F_CMS_ENV_ASN1_CTRL = 171;
373 	enum CMS_F_CMS_FINAL = 127;
374 	enum CMS_F_CMS_GET0_CERTIFICATE_CHOICES = 128;
375 	enum CMS_F_CMS_GET0_CONTENT = 129;
376 	enum CMS_F_CMS_GET0_ECONTENT_TYPE = 130;
377 	enum CMS_F_CMS_GET0_ENVELOPED = 131;
378 	enum CMS_F_CMS_GET0_REVOCATION_CHOICES = 132;
379 	enum CMS_F_CMS_GET0_SIGNED = 133;
380 	enum CMS_F_CMS_MSGSIGDIGEST_ADD1 = 162;
381 	enum CMS_F_CMS_RECEIPTREQUEST_CREATE0 = 159;
382 	enum CMS_F_CMS_RECEIPT_VERIFY = 160;
383 	enum CMS_F_CMS_RECIPIENTINFO_DECRYPT = 134;
384 	enum CMS_F_CMS_RECIPIENTINFO_ENCRYPT = 169;
385 	enum CMS_F_CMS_RECIPIENTINFO_KARI_ENCRYPT = 178;
386 	enum CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ALG = 175;
387 	enum CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ORIG_ID = 173;
388 	enum CMS_F_CMS_RECIPIENTINFO_KARI_GET0_REKS = 172;
389 	enum CMS_F_CMS_RECIPIENTINFO_KARI_ORIG_ID_CMP = 174;
390 	enum CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT = 135;
391 	enum CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT = 136;
392 	enum CMS_F_CMS_RECIPIENTINFO_KEKRI_GET0_ID = 137;
393 	enum CMS_F_CMS_RECIPIENTINFO_KEKRI_ID_CMP = 138;
394 	enum CMS_F_CMS_RECIPIENTINFO_KTRI_CERT_CMP = 139;
395 	enum CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT = 140;
396 	enum CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT = 141;
397 	enum CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_ALGS = 142;
398 	enum CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_SIGNER_ID = 143;
399 	enum CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT = 167;
400 	enum CMS_F_CMS_RECIPIENTINFO_SET0_KEY = 144;
401 	enum CMS_F_CMS_RECIPIENTINFO_SET0_PASSWORD = 168;
402 	enum CMS_F_CMS_RECIPIENTINFO_SET0_PKEY = 145;
403 	enum CMS_F_CMS_SD_ASN1_CTRL = 170;
404 	enum CMS_F_CMS_SET1_IAS = 176;
405 	enum CMS_F_CMS_SET1_KEYID = 177;
406 	enum CMS_F_CMS_SET1_SIGNERIDENTIFIER = 146;
407 	enum CMS_F_CMS_SET_DETACHED = 147;
408 	enum CMS_F_CMS_SIGN = 148;
409 	enum CMS_F_CMS_SIGNED_DATA_INIT = 149;
410 	enum CMS_F_CMS_SIGNERINFO_CONTENT_SIGN = 150;
411 	enum CMS_F_CMS_SIGNERINFO_SIGN = 151;
412 	enum CMS_F_CMS_SIGNERINFO_VERIFY = 152;
413 	enum CMS_F_CMS_SIGNERINFO_VERIFY_CERT = 153;
414 	enum CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT = 154;
415 	enum CMS_F_CMS_SIGN_RECEIPT = 163;
416 	enum CMS_F_CMS_STREAM = 155;
417 	enum CMS_F_CMS_UNCOMPRESS = 156;
418 	enum CMS_F_CMS_VERIFY = 157;
419 	enum CMS_F_KEK_UNWRAP_KEY = 180;
420 
421 	/*
422 	 * CMS reason codes.
423 	 */
424 	enum CMS_R_ADD_SIGNER_ERROR = 99;
425 	enum CMS_R_CERTIFICATE_ALREADY_PRESENT = 175;
426 	enum CMS_R_CERTIFICATE_HAS_NO_KEYID = 160;
427 	enum CMS_R_CERTIFICATE_VERIFY_ERROR = 100;
428 	enum CMS_R_CIPHER_INITIALISATION_ERROR = 101;
429 	enum CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR = 102;
430 	enum CMS_R_CMS_DATAFINAL_ERROR = 103;
431 	enum CMS_R_CMS_LIB = 104;
432 	enum CMS_R_CONTENTIDENTIFIER_MISMATCH = 170;
433 	enum CMS_R_CONTENT_NOT_FOUND = 105;
434 	enum CMS_R_CONTENT_TYPE_MISMATCH = 171;
435 	enum CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA = 106;
436 	enum CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA = 107;
437 	enum CMS_R_CONTENT_TYPE_NOT_SIGNED_DATA = 108;
438 	enum CMS_R_CONTENT_VERIFY_ERROR = 109;
439 	enum CMS_R_CTRL_ERROR = 110;
440 	enum CMS_R_CTRL_FAILURE = 111;
441 	enum CMS_R_DECRYPT_ERROR = 112;
442 	enum CMS_R_ERROR_GETTING_PUBLIC_KEY = 113;
443 	enum CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE = 114;
444 	enum CMS_R_ERROR_SETTING_KEY = 115;
445 	enum CMS_R_ERROR_SETTING_RECIPIENTINFO = 116;
446 	enum CMS_R_INVALID_ENCRYPTED_KEY_LENGTH = 117;
447 	enum CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER = 176;
448 	enum CMS_R_INVALID_KEY_LENGTH = 118;
449 	enum CMS_R_MD_BIO_INIT_ERROR = 119;
450 	enum CMS_R_MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH = 120;
451 	enum CMS_R_MESSAGEDIGEST_WRONG_LENGTH = 121;
452 	enum CMS_R_MSGSIGDIGEST_ERROR = 172;
453 	enum CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE = 162;
454 	enum CMS_R_MSGSIGDIGEST_WRONG_LENGTH = 163;
455 	enum CMS_R_NEED_ONE_SIGNER = 164;
456 	enum CMS_R_NOT_A_SIGNED_RECEIPT = 165;
457 	enum CMS_R_NOT_ENCRYPTED_DATA = 122;
458 	enum CMS_R_NOT_KEK = 123;
459 	enum CMS_R_NOT_KEY_AGREEMENT = 181;
460 	enum CMS_R_NOT_KEY_TRANSPORT = 124;
461 	enum CMS_R_NOT_PWRI = 177;
462 	enum CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE = 125;
463 	enum CMS_R_NO_CIPHER = 126;
464 	enum CMS_R_NO_CONTENT = 127;
465 	enum CMS_R_NO_CONTENT_TYPE = 173;
466 	enum CMS_R_NO_DEFAULT_DIGEST = 128;
467 	enum CMS_R_NO_DIGEST_SET = 129;
468 	enum CMS_R_NO_KEY = 130;
469 	enum CMS_R_NO_KEY_OR_CERT = 174;
470 	enum CMS_R_NO_MATCHING_DIGEST = 131;
471 	enum CMS_R_NO_MATCHING_RECIPIENT = 132;
472 	enum CMS_R_NO_MATCHING_SIGNATURE = 166;
473 	enum CMS_R_NO_MSGSIGDIGEST = 167;
474 	enum CMS_R_NO_PASSWORD = 178;
475 	enum CMS_R_NO_PRIVATE_KEY = 133;
476 	enum CMS_R_NO_PUBLIC_KEY = 134;
477 	enum CMS_R_NO_RECEIPT_REQUEST = 168;
478 	enum CMS_R_NO_SIGNERS = 135;
479 	enum CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE = 136;
480 	enum CMS_R_RECEIPT_DECODE_ERROR = 169;
481 	enum CMS_R_RECIPIENT_ERROR = 137;
482 	enum CMS_R_SIGNER_CERTIFICATE_NOT_FOUND = 138;
483 	enum CMS_R_SIGNFINAL_ERROR = 139;
484 	enum CMS_R_SMIME_TEXT_ERROR = 140;
485 	enum CMS_R_STORE_INIT_ERROR = 141;
486 	enum CMS_R_TYPE_NOT_COMPRESSED_DATA = 142;
487 	enum CMS_R_TYPE_NOT_DATA = 143;
488 	enum CMS_R_TYPE_NOT_DIGESTED_DATA = 144;
489 	enum CMS_R_TYPE_NOT_ENCRYPTED_DATA = 145;
490 	enum CMS_R_TYPE_NOT_ENVELOPED_DATA = 146;
491 	enum CMS_R_UNABLE_TO_FINALIZE_CONTEXT = 147;
492 	enum CMS_R_UNKNOWN_CIPHER = 148;
493 	enum CMS_R_UNKNOWN_DIGEST_ALGORITHM = 149;
494 	enum CMS_R_UNKNOWN_ID = 150;
495 	enum CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM = 151;
496 	enum CMS_R_UNSUPPORTED_CONTENT_TYPE = 152;
497 	enum CMS_R_UNSUPPORTED_KEK_ALGORITHM = 153;
498 	enum CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM = 179;
499 	enum CMS_R_UNSUPPORTED_RECIPIENTINFO_TYPE = 155;
500 	enum CMS_R_UNSUPPORTED_RECIPIENT_TYPE = 154;
501 	enum CMS_R_UNSUPPORTED_TYPE = 156;
502 	enum CMS_R_UNWRAP_ERROR = 157;
503 	enum CMS_R_UNWRAP_FAILURE = 180;
504 	enum CMS_R_VERIFICATION_FAILURE = 158;
505 	enum CMS_R_WRAP_ERROR = 159;
506 }