summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/pkcs7/pk7_lib.c
diff options
context:
space:
mode:
authorbeck <>1999-09-29 04:37:45 +0000
committerbeck <>1999-09-29 04:37:45 +0000
commitde8f24ea083384bb66b32ec105dc4743c5663cdf (patch)
tree1412176ae62a3cab2cf2b0b92150fcbceaac6092 /src/lib/libcrypto/pkcs7/pk7_lib.c
parentcb929d29896bcb87c2a97417fbd03e50078fc178 (diff)
downloadopenbsd-de8f24ea083384bb66b32ec105dc4743c5663cdf.tar.gz
openbsd-de8f24ea083384bb66b32ec105dc4743c5663cdf.tar.bz2
openbsd-de8f24ea083384bb66b32ec105dc4743c5663cdf.zip
OpenSSL 0.9.4 merge
Diffstat (limited to 'src/lib/libcrypto/pkcs7/pk7_lib.c')
-rw-r--r--src/lib/libcrypto/pkcs7/pk7_lib.c156
1 files changed, 78 insertions, 78 deletions
diff --git a/src/lib/libcrypto/pkcs7/pk7_lib.c b/src/lib/libcrypto/pkcs7/pk7_lib.c
index 7d14ad1173..8b863d0558 100644
--- a/src/lib/libcrypto/pkcs7/pk7_lib.c
+++ b/src/lib/libcrypto/pkcs7/pk7_lib.c
@@ -58,14 +58,10 @@
58 58
59#include <stdio.h> 59#include <stdio.h>
60#include "cryptlib.h" 60#include "cryptlib.h"
61#include "objects.h" 61#include <openssl/objects.h>
62#include "x509.h" 62#include <openssl/x509.h>
63 63
64long PKCS7_ctrl(p7,cmd,larg,parg) 64long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg)
65PKCS7 *p7;
66int cmd;
67long larg;
68char *parg;
69 { 65 {
70 int nid; 66 int nid;
71 long ret; 67 long ret;
@@ -98,14 +94,13 @@ char *parg;
98 94
99 break; 95 break;
100 default: 96 default:
101 abort(); 97 PKCS7err(PKCS7_F_PKCS7_CTRL,PKCS7_R_UNKNOWN_OPERATION);
98 ret=0;
102 } 99 }
103 return(ret); 100 return(ret);
104 } 101 }
105 102
106int PKCS7_content_new(p7,type) 103int PKCS7_content_new(PKCS7 *p7, int type)
107PKCS7 *p7;
108int type;
109 { 104 {
110 PKCS7 *ret=NULL; 105 PKCS7 *ret=NULL;
111 106
@@ -119,9 +114,7 @@ err:
119 return(0); 114 return(0);
120 } 115 }
121 116
122int PKCS7_set_content(p7,p7_data) 117int PKCS7_set_content(PKCS7 *p7, PKCS7 *p7_data)
123PKCS7 *p7;
124PKCS7 *p7_data;
125 { 118 {
126 int i; 119 int i;
127 120
@@ -147,9 +140,7 @@ err:
147 return(0); 140 return(0);
148 } 141 }
149 142
150int PKCS7_set_type(p7,type) 143int PKCS7_set_type(PKCS7 *p7, int type)
151PKCS7 *p7;
152int type;
153 { 144 {
154 ASN1_OBJECT *obj; 145 ASN1_OBJECT *obj;
155 146
@@ -172,12 +163,19 @@ int type;
172 case NID_pkcs7_signedAndEnveloped: 163 case NID_pkcs7_signedAndEnveloped:
173 p7->type=obj; 164 p7->type=obj;
174 if ((p7->d.signed_and_enveloped=PKCS7_SIGN_ENVELOPE_new()) 165 if ((p7->d.signed_and_enveloped=PKCS7_SIGN_ENVELOPE_new())
175 == NULL) 166 == NULL) goto err;
176 goto err; 167 ASN1_INTEGER_set(p7->d.signed_and_enveloped->version,1);
177 ASN1_INTEGER_set(p7->d.sign->version,1); 168/* p7->d.signed_and_enveloped->enc_data->content_type=
169 OBJ_nid2obj(NID_pkcs7_encrypted);*/
170
178 break; 171 break;
179 case NID_pkcs7_digest:
180 case NID_pkcs7_enveloped: 172 case NID_pkcs7_enveloped:
173 p7->type=obj;
174 if ((p7->d.enveloped=PKCS7_ENVELOPE_new())
175 == NULL) goto err;
176 ASN1_INTEGER_set(p7->d.enveloped->version,0);
177 break;
178 case NID_pkcs7_digest:
181 case NID_pkcs7_encrypted: 179 case NID_pkcs7_encrypted:
182 default: 180 default:
183 PKCS7err(PKCS7_F_PKCS7_SET_TYPE,PKCS7_R_UNSUPPORTED_CONTENT_TYPE); 181 PKCS7err(PKCS7_F_PKCS7_SET_TYPE,PKCS7_R_UNSUPPORTED_CONTENT_TYPE);
@@ -188,14 +186,12 @@ err:
188 return(0); 186 return(0);
189 } 187 }
190 188
191int PKCS7_add_signer(p7,psi) 189int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *psi)
192PKCS7 *p7;
193PKCS7_SIGNER_INFO *psi;
194 { 190 {
195 int i,j,nid; 191 int i,j,nid;
196 X509_ALGOR *alg; 192 X509_ALGOR *alg;
197 STACK *signer_sk; 193 STACK_OF(PKCS7_SIGNER_INFO) *signer_sk;
198 STACK *md_sk; 194 STACK_OF(X509_ALGOR) *md_sk;
199 195
200 i=OBJ_obj2nid(p7->type); 196 i=OBJ_obj2nid(p7->type);
201 switch (i) 197 switch (i)
@@ -217,9 +213,9 @@ PKCS7_SIGNER_INFO *psi;
217 213
218 /* If the digest is not currently listed, add it */ 214 /* If the digest is not currently listed, add it */
219 j=0; 215 j=0;
220 for (i=0; i<sk_num(md_sk); i++) 216 for (i=0; i<sk_X509_ALGOR_num(md_sk); i++)
221 { 217 {
222 alg=(X509_ALGOR *)sk_value(md_sk,i); 218 alg=sk_X509_ALGOR_value(md_sk,i);
223 if (OBJ_obj2nid(alg->algorithm) == nid) 219 if (OBJ_obj2nid(alg->algorithm) == nid)
224 { 220 {
225 j=1; 221 j=1;
@@ -230,19 +226,17 @@ PKCS7_SIGNER_INFO *psi;
230 { 226 {
231 alg=X509_ALGOR_new(); 227 alg=X509_ALGOR_new();
232 alg->algorithm=OBJ_nid2obj(nid); 228 alg->algorithm=OBJ_nid2obj(nid);
233 sk_push(md_sk,(char *)alg); 229 sk_X509_ALGOR_push(md_sk,alg);
234 } 230 }
235 231
236 sk_push(signer_sk,(char *)psi); 232 sk_PKCS7_SIGNER_INFO_push(signer_sk,psi);
237 return(1); 233 return(1);
238 } 234 }
239 235
240int PKCS7_add_certificate(p7,x509) 236int PKCS7_add_certificate(PKCS7 *p7, X509 *x509)
241PKCS7 *p7;
242X509 *x509;
243 { 237 {
244 int i; 238 int i;
245 STACK **sk; 239 STACK_OF(X509) **sk;
246 240
247 i=OBJ_obj2nid(p7->type); 241 i=OBJ_obj2nid(p7->type);
248 switch (i) 242 switch (i)
@@ -259,18 +253,16 @@ X509 *x509;
259 } 253 }
260 254
261 if (*sk == NULL) 255 if (*sk == NULL)
262 *sk=sk_new_null(); 256 *sk=sk_X509_new_null();
263 CRYPTO_add(&x509->references,1,CRYPTO_LOCK_X509); 257 CRYPTO_add(&x509->references,1,CRYPTO_LOCK_X509);
264 sk_push(*sk,(char *)x509); 258 sk_X509_push(*sk,x509);
265 return(1); 259 return(1);
266 } 260 }
267 261
268int PKCS7_add_crl(p7,crl) 262int PKCS7_add_crl(PKCS7 *p7, X509_CRL *crl)
269PKCS7 *p7;
270X509_CRL *crl;
271 { 263 {
272 int i; 264 int i;
273 STACK **sk; 265 STACK_OF(X509_CRL) **sk;
274 266
275 i=OBJ_obj2nid(p7->type); 267 i=OBJ_obj2nid(p7->type);
276 switch (i) 268 switch (i)
@@ -287,18 +279,15 @@ X509_CRL *crl;
287 } 279 }
288 280
289 if (*sk == NULL) 281 if (*sk == NULL)
290 *sk=sk_new_null(); 282 *sk=sk_X509_CRL_new_null();
291 283
292 CRYPTO_add(&crl->references,1,CRYPTO_LOCK_X509_CRL); 284 CRYPTO_add(&crl->references,1,CRYPTO_LOCK_X509_CRL);
293 sk_push(*sk,(char *)crl); 285 sk_X509_CRL_push(*sk,crl);
294 return(1); 286 return(1);
295 } 287 }
296 288
297int PKCS7_SIGNER_INFO_set(p7i,x509,pkey,dgst) 289int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey,
298PKCS7_SIGNER_INFO *p7i; 290 EVP_MD *dgst)
299X509 *x509;
300EVP_PKEY *pkey;
301EVP_MD *dgst;
302 { 291 {
303 /* We now need to add another PKCS7_SIGNER_INFO entry */ 292 /* We now need to add another PKCS7_SIGNER_INFO entry */
304 ASN1_INTEGER_set(p7i->version,1); 293 ASN1_INTEGER_set(p7i->version,1);
@@ -316,27 +305,32 @@ EVP_MD *dgst;
316 p7i->pkey=pkey; 305 p7i->pkey=pkey;
317 306
318 /* Set the algorithms */ 307 /* Set the algorithms */
319 p7i->digest_alg->algorithm=OBJ_nid2obj(EVP_MD_type(dgst)); 308 if (pkey->type == EVP_PKEY_DSA)
320 p7i->digest_enc_alg->algorithm=OBJ_nid2obj(EVP_MD_pkey_type(dgst)); 309 p7i->digest_alg->algorithm=OBJ_nid2obj(NID_sha1);
310 else
311 p7i->digest_alg->algorithm=OBJ_nid2obj(EVP_MD_type(dgst));
312
313 if (p7i->digest_alg->parameter != NULL)
314 ASN1_TYPE_free(p7i->digest_alg->parameter);
315 if ((p7i->digest_alg->parameter=ASN1_TYPE_new()) == NULL)
316 goto err;
317 p7i->digest_alg->parameter->type=V_ASN1_NULL;
318
319 p7i->digest_enc_alg->algorithm=OBJ_nid2obj(EVP_PKEY_type(pkey->type));
321 320
322#if 1
323 if (p7i->digest_enc_alg->parameter != NULL) 321 if (p7i->digest_enc_alg->parameter != NULL)
324 ASN1_TYPE_free(p7i->digest_enc_alg->parameter); 322 ASN1_TYPE_free(p7i->digest_enc_alg->parameter);
325 if ((p7i->digest_enc_alg->parameter=ASN1_TYPE_new()) == NULL) 323 if ((p7i->digest_enc_alg->parameter=ASN1_TYPE_new()) == NULL)
326 goto err; 324 goto err;
327 p7i->digest_enc_alg->parameter->type=V_ASN1_NULL; 325 p7i->digest_enc_alg->parameter->type=V_ASN1_NULL;
328#endif
329 326
330 return(1); 327 return(1);
331err: 328err:
332 return(0); 329 return(0);
333 } 330 }
334 331
335PKCS7_SIGNER_INFO *PKCS7_add_signature(p7,x509,pkey,dgst) 332PKCS7_SIGNER_INFO *PKCS7_add_signature(PKCS7 *p7, X509 *x509, EVP_PKEY *pkey,
336PKCS7 *p7; 333 EVP_MD *dgst)
337X509 *x509;
338EVP_PKEY *pkey;
339EVP_MD *dgst;
340 { 334 {
341 PKCS7_SIGNER_INFO *si; 335 PKCS7_SIGNER_INFO *si;
342 336
@@ -348,20 +342,21 @@ err:
348 return(NULL); 342 return(NULL);
349 } 343 }
350 344
351STACK *PKCS7_get_signer_info(p7) 345STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7)
352PKCS7 *p7;
353 { 346 {
354 if (PKCS7_type_is_signed(p7)) 347 if (PKCS7_type_is_signed(p7))
355 { 348 {
356 return(p7->d.sign->signer_info); 349 return(p7->d.sign->signer_info);
357 } 350 }
351 else if (PKCS7_type_is_signedAndEnveloped(p7))
352 {
353 return(p7->d.signed_and_enveloped->signer_info);
354 }
358 else 355 else
359 return(NULL); 356 return(NULL);
360 } 357 }
361 358
362PKCS7_RECIP_INFO *PKCS7_add_recipient(p7,x509) 359PKCS7_RECIP_INFO *PKCS7_add_recipient(PKCS7 *p7, X509 *x509)
363PKCS7 *p7;
364X509 *x509;
365 { 360 {
366 PKCS7_RECIP_INFO *ri; 361 PKCS7_RECIP_INFO *ri;
367 362
@@ -373,12 +368,10 @@ err:
373 return(NULL); 368 return(NULL);
374 } 369 }
375 370
376int PKCS7_add_recipient_info(p7,ri) 371int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri)
377PKCS7 *p7;
378PKCS7_RECIP_INFO *ri;
379 { 372 {
380 int i; 373 int i;
381 STACK *sk; 374 STACK_OF(PKCS7_RECIP_INFO) *sk;
382 375
383 i=OBJ_obj2nid(p7->type); 376 i=OBJ_obj2nid(p7->type);
384 switch (i) 377 switch (i)
@@ -386,18 +379,19 @@ PKCS7_RECIP_INFO *ri;
386 case NID_pkcs7_signedAndEnveloped: 379 case NID_pkcs7_signedAndEnveloped:
387 sk= p7->d.signed_and_enveloped->recipientinfo; 380 sk= p7->d.signed_and_enveloped->recipientinfo;
388 break; 381 break;
382 case NID_pkcs7_enveloped:
383 sk= p7->d.enveloped->recipientinfo;
384 break;
389 default: 385 default:
390 PKCS7err(PKCS7_F_PKCS7_ADD_RECIPIENT_INFO,PKCS7_R_WRONG_CONTENT_TYPE); 386 PKCS7err(PKCS7_F_PKCS7_ADD_RECIPIENT_INFO,PKCS7_R_WRONG_CONTENT_TYPE);
391 return(0); 387 return(0);
392 } 388 }
393 389
394 sk_push(sk,(char *)ri); 390 sk_PKCS7_RECIP_INFO_push(sk,ri);
395 return(1); 391 return(1);
396 } 392 }
397 393
398int PKCS7_RECIP_INFO_set(p7i,x509) 394int PKCS7_RECIP_INFO_set(PKCS7_RECIP_INFO *p7i, X509 *x509)
399PKCS7_RECIP_INFO *p7i;
400X509 *x509;
401 { 395 {
402 ASN1_INTEGER_set(p7i->version,0); 396 ASN1_INTEGER_set(p7i->version,0);
403 X509_NAME_set(&p7i->issuer_and_serial->issuer, 397 X509_NAME_set(&p7i->issuer_and_serial->issuer,
@@ -407,15 +401,18 @@ X509 *x509;
407 p7i->issuer_and_serial->serial= 401 p7i->issuer_and_serial->serial=
408 ASN1_INTEGER_dup(X509_get_serialNumber(x509)); 402 ASN1_INTEGER_dup(X509_get_serialNumber(x509));
409 403
404 X509_ALGOR_free(p7i->key_enc_algor);
405 p7i->key_enc_algor=(X509_ALGOR *)ASN1_dup(i2d_X509_ALGOR,
406 (char *(*)())d2i_X509_ALGOR,
407 (char *)x509->cert_info->key->algor);
408
410 CRYPTO_add(&x509->references,1,CRYPTO_LOCK_X509); 409 CRYPTO_add(&x509->references,1,CRYPTO_LOCK_X509);
411 p7i->cert=x509; 410 p7i->cert=x509;
412 411
413 return(1); 412 return(1);
414 } 413 }
415 414
416X509 *PKCS7_cert_from_signer_info(p7,si) 415X509 *PKCS7_cert_from_signer_info(PKCS7 *p7, PKCS7_SIGNER_INFO *si)
417PKCS7 *p7;
418PKCS7_SIGNER_INFO *si;
419 { 416 {
420 if (PKCS7_type_is_signed(p7)) 417 if (PKCS7_type_is_signed(p7))
421 return(X509_find_by_issuer_and_serial(p7->d.sign->cert, 418 return(X509_find_by_issuer_and_serial(p7->d.sign->cert,
@@ -425,9 +422,7 @@ PKCS7_SIGNER_INFO *si;
425 return(NULL); 422 return(NULL);
426 } 423 }
427 424
428int PKCS7_set_cipher(p7,cipher) 425int PKCS7_set_cipher(PKCS7 *p7, const EVP_CIPHER *cipher)
429PKCS7 *p7;
430EVP_CIPHER *cipher;
431 { 426 {
432 int i; 427 int i;
433 PKCS7_ENC_CONTENT *ec; 428 PKCS7_ENC_CONTENT *ec;
@@ -438,12 +433,17 @@ EVP_CIPHER *cipher;
438 case NID_pkcs7_signedAndEnveloped: 433 case NID_pkcs7_signedAndEnveloped:
439 ec=p7->d.signed_and_enveloped->enc_data; 434 ec=p7->d.signed_and_enveloped->enc_data;
440 break; 435 break;
436 case NID_pkcs7_enveloped:
437 ec=p7->d.enveloped->enc_data;
438 break;
441 default: 439 default:
442 PKCS7err(PKCS7_F_PKCS7_SET_CIPHER,PKCS7_R_WRONG_CONTENT_TYPE); 440 PKCS7err(PKCS7_F_PKCS7_SET_CIPHER,PKCS7_R_WRONG_CONTENT_TYPE);
443 return(0); 441 return(0);
444 } 442 }
445 443
446 ec->algorithm->algorithm=OBJ_nid2obj(EVP_CIPHER_nid(cipher)); 444 /* Setup cipher OID */
447 return(ec->algorithm->algorithm != NULL); 445
446 ec->cipher = cipher;
447 return 1;
448 } 448 }
449 449