summaryrefslogtreecommitdiff
path: root/src/lib/libssl/src/crypto/pkcs7/pk7_doit.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/src/crypto/pkcs7/pk7_doit.c')
-rw-r--r--src/lib/libssl/src/crypto/pkcs7/pk7_doit.c58
1 files changed, 26 insertions, 32 deletions
diff --git a/src/lib/libssl/src/crypto/pkcs7/pk7_doit.c b/src/lib/libssl/src/crypto/pkcs7/pk7_doit.c
index 190ca0e9bf..35c7dcd0b3 100644
--- a/src/lib/libssl/src/crypto/pkcs7/pk7_doit.c
+++ b/src/lib/libssl/src/crypto/pkcs7/pk7_doit.c
@@ -91,17 +91,19 @@ static int PKCS7_type_is_other(PKCS7* p7)
91 91
92 } 92 }
93 93
94static int PKCS7_type_is_octet_string(PKCS7* p7) 94static ASN1_OCTET_STRING *PKCS7_get_octet_string(PKCS7 *p7)
95 { 95 {
96 if ( 0==PKCS7_type_is_other(p7) ) 96 if ( PKCS7_type_is_data(p7))
97 return 0; 97 return p7->d.data;
98 98 if ( PKCS7_type_is_other(p7) && p7->d.other
99 return (V_ASN1_OCTET_STRING==p7->d.other->type) ? 1 : 0; 99 && (p7->d.other->type == V_ASN1_OCTET_STRING))
100 return p7->d.other->value.octet_string;
101 return NULL;
100 } 102 }
101 103
102BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio) 104BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio)
103 { 105 {
104 int i,j; 106 int i;
105 BIO *out=NULL,*btmp=NULL; 107 BIO *out=NULL,*btmp=NULL;
106 X509_ALGOR *xa; 108 X509_ALGOR *xa;
107 const EVP_MD *evp_md; 109 const EVP_MD *evp_md;
@@ -159,8 +161,7 @@ BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio)
159 goto err; 161 goto err;
160 } 162 }
161 163
162 j=OBJ_obj2nid(xa->algorithm); 164 evp_md=EVP_get_digestbyobj(xa->algorithm);
163 evp_md=EVP_get_digestbyname(OBJ_nid2sn(j));
164 if (evp_md == NULL) 165 if (evp_md == NULL)
165 { 166 {
166 PKCS7err(PKCS7_F_PKCS7_DATAINIT,PKCS7_R_UNKNOWN_DIGEST_TYPE); 167 PKCS7err(PKCS7_F_PKCS7_DATAINIT,PKCS7_R_UNKNOWN_DIGEST_TYPE);
@@ -250,29 +251,22 @@ BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio)
250 btmp=NULL; 251 btmp=NULL;
251 } 252 }
252 253
253 if (bio == NULL) { 254 if (bio == NULL)
255 {
254 if (PKCS7_is_detached(p7)) 256 if (PKCS7_is_detached(p7))
255 bio=BIO_new(BIO_s_null()); 257 bio=BIO_new(BIO_s_null());
256 else { 258 else
257 if (PKCS7_type_is_signed(p7) ) { 259 {
258 if ( PKCS7_type_is_data(p7->d.sign->contents)) { 260 ASN1_OCTET_STRING *os;
259 ASN1_OCTET_STRING *os; 261 os = PKCS7_get_octet_string(p7->d.sign->contents);
260 os=p7->d.sign->contents->d.data; 262 if (os && os->length > 0)
261 if (os->length > 0) 263 bio = BIO_new_mem_buf(os->data, os->length);
262 bio = BIO_new_mem_buf(os->data, os->length); 264 if(bio == NULL)
263 } 265 {
264 else if ( PKCS7_type_is_octet_string(p7->d.sign->contents) ) {
265 ASN1_OCTET_STRING *os;
266 os=p7->d.sign->contents->d.other->value.octet_string;
267 if (os->length > 0)
268 bio = BIO_new_mem_buf(os->data, os->length);
269 }
270 }
271 if(bio == NULL) {
272 bio=BIO_new(BIO_s_mem()); 266 bio=BIO_new(BIO_s_mem());
273 BIO_set_mem_eof_return(bio,0); 267 BIO_set_mem_eof_return(bio,0);
268 }
274 } 269 }
275 }
276 } 270 }
277 BIO_push(out,bio); 271 BIO_push(out,bio);
278 bio=NULL; 272 bio=NULL;
@@ -311,7 +305,7 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)
311 switch (i) 305 switch (i)
312 { 306 {
313 case NID_pkcs7_signed: 307 case NID_pkcs7_signed:
314 data_body=p7->d.sign->contents->d.data; 308 data_body=PKCS7_get_octet_string(p7->d.sign->contents);
315 md_sk=p7->d.sign->md_algs; 309 md_sk=p7->d.sign->md_algs;
316 break; 310 break;
317 case NID_pkcs7_signedAndEnveloped: 311 case NID_pkcs7_signedAndEnveloped:
@@ -319,7 +313,7 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)
319 md_sk=p7->d.signed_and_enveloped->md_algs; 313 md_sk=p7->d.signed_and_enveloped->md_algs;
320 data_body=p7->d.signed_and_enveloped->enc_data->enc_data; 314 data_body=p7->d.signed_and_enveloped->enc_data->enc_data;
321 enc_alg=p7->d.signed_and_enveloped->enc_data->algorithm; 315 enc_alg=p7->d.signed_and_enveloped->enc_data->algorithm;
322 evp_cipher=EVP_get_cipherbyname(OBJ_nid2sn(OBJ_obj2nid(enc_alg->algorithm))); 316 evp_cipher=EVP_get_cipherbyobj(enc_alg->algorithm);
323 if (evp_cipher == NULL) 317 if (evp_cipher == NULL)
324 { 318 {
325 PKCS7err(PKCS7_F_PKCS7_DATADECODE,PKCS7_R_UNSUPPORTED_CIPHER_TYPE); 319 PKCS7err(PKCS7_F_PKCS7_DATADECODE,PKCS7_R_UNSUPPORTED_CIPHER_TYPE);
@@ -331,7 +325,7 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)
331 rsk=p7->d.enveloped->recipientinfo; 325 rsk=p7->d.enveloped->recipientinfo;
332 enc_alg=p7->d.enveloped->enc_data->algorithm; 326 enc_alg=p7->d.enveloped->enc_data->algorithm;
333 data_body=p7->d.enveloped->enc_data->enc_data; 327 data_body=p7->d.enveloped->enc_data->enc_data;
334 evp_cipher=EVP_get_cipherbyname(OBJ_nid2sn(OBJ_obj2nid(enc_alg->algorithm))); 328 evp_cipher=EVP_get_cipherbyobj(enc_alg->algorithm);
335 if (evp_cipher == NULL) 329 if (evp_cipher == NULL)
336 { 330 {
337 PKCS7err(PKCS7_F_PKCS7_DATADECODE,PKCS7_R_UNSUPPORTED_CIPHER_TYPE); 331 PKCS7err(PKCS7_F_PKCS7_DATADECODE,PKCS7_R_UNSUPPORTED_CIPHER_TYPE);
@@ -357,7 +351,7 @@ BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert)
357 } 351 }
358 352
359 j=OBJ_obj2nid(xa->algorithm); 353 j=OBJ_obj2nid(xa->algorithm);
360 evp_md=EVP_get_digestbyname(OBJ_nid2sn(j)); 354 evp_md=EVP_get_digestbynid(j);
361 if (evp_md == NULL) 355 if (evp_md == NULL)
362 { 356 {
363 PKCS7err(PKCS7_F_PKCS7_DATADECODE,PKCS7_R_UNKNOWN_DIGEST_TYPE); 357 PKCS7err(PKCS7_F_PKCS7_DATADECODE,PKCS7_R_UNKNOWN_DIGEST_TYPE);
@@ -531,9 +525,9 @@ int PKCS7_dataFinal(PKCS7 *p7, BIO *bio)
531 break; 525 break;
532 case NID_pkcs7_signed: 526 case NID_pkcs7_signed:
533 si_sk=p7->d.sign->signer_info; 527 si_sk=p7->d.sign->signer_info;
534 os=p7->d.sign->contents->d.data; 528 os=PKCS7_get_octet_string(p7->d.sign->contents);
535 /* If detached data then the content is excluded */ 529 /* If detached data then the content is excluded */
536 if(p7->detached) { 530 if(PKCS7_type_is_data(p7->d.sign->contents) && p7->detached) {
537 M_ASN1_OCTET_STRING_free(os); 531 M_ASN1_OCTET_STRING_free(os);
538 p7->d.sign->contents->d.data = NULL; 532 p7->d.sign->contents->d.data = NULL;
539 } 533 }