summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/cms/cms_ess.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/cms/cms_ess.c')
-rw-r--r--src/lib/libcrypto/cms/cms_ess.c69
1 files changed, 34 insertions, 35 deletions
diff --git a/src/lib/libcrypto/cms/cms_ess.c b/src/lib/libcrypto/cms/cms_ess.c
index bcc3e58368..abfd170bb4 100644
--- a/src/lib/libcrypto/cms/cms_ess.c
+++ b/src/lib/libcrypto/cms/cms_ess.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: cms_ess.c,v 1.13 2019/08/10 16:42:20 jsing Exp $ */ 1/* $OpenBSD: cms_ess.c,v 1.14 2019/08/10 18:15:52 jsing Exp $ */
2/* 2/*
3 * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 3 * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
4 * project. 4 * project.
@@ -65,16 +65,16 @@ IMPLEMENT_ASN1_FUNCTIONS(CMS_ReceiptRequest)
65 65
66/* ESS services: for now just Signed Receipt related */ 66/* ESS services: for now just Signed Receipt related */
67 67
68int CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr) 68int
69CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr)
69{ 70{
70 ASN1_STRING *str; 71 ASN1_STRING *str;
71 CMS_ReceiptRequest *rr = NULL; 72 CMS_ReceiptRequest *rr = NULL;
73
72 if (prr) 74 if (prr)
73 *prr = NULL; 75 *prr = NULL;
74 str = CMS_signed_get0_data_by_OBJ(si, 76 str = CMS_signed_get0_data_by_OBJ(si,
75 OBJ_nid2obj 77 OBJ_nid2obj(NID_id_smime_aa_receiptRequest), -3, V_ASN1_SEQUENCE);
76 (NID_id_smime_aa_receiptRequest), -3,
77 V_ASN1_SEQUENCE);
78 if (!str) 78 if (!str)
79 return 0; 79 return 0;
80 80
@@ -85,14 +85,13 @@ int CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr)
85 *prr = rr; 85 *prr = rr;
86 else 86 else
87 CMS_ReceiptRequest_free(rr); 87 CMS_ReceiptRequest_free(rr);
88
88 return 1; 89 return 1;
89} 90}
90 91
91CMS_ReceiptRequest *CMS_ReceiptRequest_create0(unsigned char *id, int idlen, 92CMS_ReceiptRequest *
92 int allorfirst, 93CMS_ReceiptRequest_create0(unsigned char *id, int idlen, int allorfirst,
93 STACK_OF(GENERAL_NAMES) 94 STACK_OF(GENERAL_NAMES) *receiptList, STACK_OF(GENERAL_NAMES) *receiptsTo)
94 *receiptList, STACK_OF(GENERAL_NAMES)
95 *receiptsTo)
96{ 95{
97 CMS_ReceiptRequest *rr = NULL; 96 CMS_ReceiptRequest *rr = NULL;
98 97
@@ -127,10 +126,10 @@ CMS_ReceiptRequest *CMS_ReceiptRequest_create0(unsigned char *id, int idlen,
127 err: 126 err:
128 CMS_ReceiptRequest_free(rr); 127 CMS_ReceiptRequest_free(rr);
129 return NULL; 128 return NULL;
130
131} 129}
132 130
133int CMS_add1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest *rr) 131int
132CMS_add1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest *rr)
134{ 133{
135 unsigned char *rrder = NULL; 134 unsigned char *rrder = NULL;
136 int rrderlen, r = 0; 135 int rrderlen, r = 0;
@@ -140,7 +139,7 @@ int CMS_add1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest *rr)
140 goto merr; 139 goto merr;
141 140
142 if (!CMS_signed_add1_attr_by_NID(si, NID_id_smime_aa_receiptRequest, 141 if (!CMS_signed_add1_attr_by_NID(si, NID_id_smime_aa_receiptRequest,
143 V_ASN1_SEQUENCE, rrder, rrderlen)) 142 V_ASN1_SEQUENCE, rrder, rrderlen))
144 goto merr; 143 goto merr;
145 144
146 r = 1; 145 r = 1;
@@ -152,14 +151,12 @@ int CMS_add1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest *rr)
152 OPENSSL_free(rrder); 151 OPENSSL_free(rrder);
153 152
154 return r; 153 return r;
155
156} 154}
157 155
158void CMS_ReceiptRequest_get0_values(CMS_ReceiptRequest *rr, 156void
159 ASN1_STRING **pcid, 157CMS_ReceiptRequest_get0_values(CMS_ReceiptRequest *rr, ASN1_STRING **pcid,
160 int *pallorfirst, 158 int *pallorfirst, STACK_OF(GENERAL_NAMES) **plist,
161 STACK_OF(GENERAL_NAMES) **plist, 159 STACK_OF(GENERAL_NAMES) **prto)
162 STACK_OF(GENERAL_NAMES) **prto)
163{ 160{
164 if (pcid) 161 if (pcid)
165 *pcid = rr->signedContentIdentifier; 162 *pcid = rr->signedContentIdentifier;
@@ -180,40 +177,46 @@ void CMS_ReceiptRequest_get0_values(CMS_ReceiptRequest *rr,
180 177
181/* Digest a SignerInfo structure for msgSigDigest attribute processing */ 178/* Digest a SignerInfo structure for msgSigDigest attribute processing */
182 179
183static int cms_msgSigDigest(CMS_SignerInfo *si, 180static int
184 unsigned char *dig, unsigned int *diglen) 181cms_msgSigDigest(CMS_SignerInfo *si, unsigned char *dig, unsigned int *diglen)
185{ 182{
186 const EVP_MD *md; 183 const EVP_MD *md;
184
187 md = EVP_get_digestbyobj(si->digestAlgorithm->algorithm); 185 md = EVP_get_digestbyobj(si->digestAlgorithm->algorithm);
188 if (md == NULL) 186 if (md == NULL)
189 return 0; 187 return 0;
190 if (!ASN1_item_digest(ASN1_ITEM_rptr(CMS_Attributes_Verify), md, 188 if (!ASN1_item_digest(ASN1_ITEM_rptr(CMS_Attributes_Verify), md,
191 si->signedAttrs, dig, diglen)) 189 si->signedAttrs, dig, diglen))
192 return 0; 190 return 0;
191
193 return 1; 192 return 1;
194} 193}
195 194
196/* Add a msgSigDigest attribute to a SignerInfo */ 195/* Add a msgSigDigest attribute to a SignerInfo */
197 196
198int cms_msgSigDigest_add1(CMS_SignerInfo *dest, CMS_SignerInfo *src) 197int
198cms_msgSigDigest_add1(CMS_SignerInfo *dest, CMS_SignerInfo *src)
199{ 199{
200 unsigned char dig[EVP_MAX_MD_SIZE]; 200 unsigned char dig[EVP_MAX_MD_SIZE];
201 unsigned int diglen; 201 unsigned int diglen;
202
202 if (!cms_msgSigDigest(src, dig, &diglen)) { 203 if (!cms_msgSigDigest(src, dig, &diglen)) {
203 CMSerr(CMS_F_CMS_MSGSIGDIGEST_ADD1, CMS_R_MSGSIGDIGEST_ERROR); 204 CMSerr(CMS_F_CMS_MSGSIGDIGEST_ADD1, CMS_R_MSGSIGDIGEST_ERROR);
204 return 0; 205 return 0;
205 } 206 }
206 if (!CMS_signed_add1_attr_by_NID(dest, NID_id_smime_aa_msgSigDigest, 207 if (!CMS_signed_add1_attr_by_NID(dest, NID_id_smime_aa_msgSigDigest,
207 V_ASN1_OCTET_STRING, dig, diglen)) { 208 V_ASN1_OCTET_STRING, dig, diglen)) {
208 CMSerr(CMS_F_CMS_MSGSIGDIGEST_ADD1, ERR_R_MALLOC_FAILURE); 209 CMSerr(CMS_F_CMS_MSGSIGDIGEST_ADD1, ERR_R_MALLOC_FAILURE);
209 return 0; 210 return 0;
210 } 211 }
212
211 return 1; 213 return 1;
212} 214}
213 215
214/* Verify signed receipt after it has already passed normal CMS verify */ 216/* Verify signed receipt after it has already passed normal CMS verify */
215 217
216int cms_Receipt_verify(CMS_ContentInfo *cms, CMS_ContentInfo *req_cms) 218int
219cms_Receipt_verify(CMS_ContentInfo *cms, CMS_ContentInfo *req_cms)
217{ 220{
218 int r = 0, i; 221 int r = 0, i;
219 CMS_ReceiptRequest *rr = NULL; 222 CMS_ReceiptRequest *rr = NULL;
@@ -274,9 +277,7 @@ int cms_Receipt_verify(CMS_ContentInfo *cms, CMS_ContentInfo *req_cms)
274 /* Get msgSigDigest value and compare */ 277 /* Get msgSigDigest value and compare */
275 278
276 msig = CMS_signed_get0_data_by_OBJ(si, 279 msig = CMS_signed_get0_data_by_OBJ(si,
277 OBJ_nid2obj 280 OBJ_nid2obj(NID_id_smime_aa_msgSigDigest), -3, V_ASN1_OCTET_STRING);
278 (NID_id_smime_aa_msgSigDigest), -3,
279 V_ASN1_OCTET_STRING);
280 281
281 if (!msig) { 282 if (!msig) {
282 CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NO_MSGSIGDIGEST); 283 CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NO_MSGSIGDIGEST);
@@ -302,8 +303,7 @@ int cms_Receipt_verify(CMS_ContentInfo *cms, CMS_ContentInfo *req_cms)
302 /* Compare content types */ 303 /* Compare content types */
303 304
304 octype = CMS_signed_get0_data_by_OBJ(osi, 305 octype = CMS_signed_get0_data_by_OBJ(osi,
305 OBJ_nid2obj(NID_pkcs9_contentType), 306 OBJ_nid2obj(NID_pkcs9_contentType), -3, V_ASN1_OBJECT);
306 -3, V_ASN1_OBJECT);
307 if (!octype) { 307 if (!octype) {
308 CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NO_CONTENT_TYPE); 308 CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NO_CONTENT_TYPE);
309 goto err; 309 goto err;
@@ -324,7 +324,7 @@ int cms_Receipt_verify(CMS_ContentInfo *cms, CMS_ContentInfo *req_cms)
324 } 324 }
325 325
326 if (ASN1_STRING_cmp(rr->signedContentIdentifier, 326 if (ASN1_STRING_cmp(rr->signedContentIdentifier,
327 rct->signedContentIdentifier)) { 327 rct->signedContentIdentifier)) {
328 CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_CONTENTIDENTIFIER_MISMATCH); 328 CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_CONTENTIDENTIFIER_MISMATCH);
329 goto err; 329 goto err;
330 } 330 }
@@ -335,7 +335,6 @@ int cms_Receipt_verify(CMS_ContentInfo *cms, CMS_ContentInfo *req_cms)
335 CMS_ReceiptRequest_free(rr); 335 CMS_ReceiptRequest_free(rr);
336 M_ASN1_free_of(rct, CMS_Receipt); 336 M_ASN1_free_of(rct, CMS_Receipt);
337 return r; 337 return r;
338
339} 338}
340 339
341/* 340/*
@@ -343,7 +342,8 @@ int cms_Receipt_verify(CMS_ContentInfo *cms, CMS_ContentInfo *req_cms)
343 * SignedData ContentInfo. 342 * SignedData ContentInfo.
344 */ 343 */
345 344
346ASN1_OCTET_STRING *cms_encode_Receipt(CMS_SignerInfo *si) 345ASN1_OCTET_STRING *
346cms_encode_Receipt(CMS_SignerInfo *si)
347{ 347{
348 CMS_Receipt rct; 348 CMS_Receipt rct;
349 CMS_ReceiptRequest *rr = NULL; 349 CMS_ReceiptRequest *rr = NULL;
@@ -362,8 +362,7 @@ ASN1_OCTET_STRING *cms_encode_Receipt(CMS_SignerInfo *si)
362 /* Get original content type */ 362 /* Get original content type */
363 363
364 ctype = CMS_signed_get0_data_by_OBJ(si, 364 ctype = CMS_signed_get0_data_by_OBJ(si,
365 OBJ_nid2obj(NID_pkcs9_contentType), 365 OBJ_nid2obj(NID_pkcs9_contentType), -3, V_ASN1_OBJECT);
366 -3, V_ASN1_OBJECT);
367 if (!ctype) { 366 if (!ctype) {
368 CMSerr(CMS_F_CMS_ENCODE_RECEIPT, CMS_R_NO_CONTENT_TYPE); 367 CMSerr(CMS_F_CMS_ENCODE_RECEIPT, CMS_R_NO_CONTENT_TYPE);
369 goto err; 368 goto err;