diff options
author | beck <> | 1999-09-29 04:37:45 +0000 |
---|---|---|
committer | beck <> | 1999-09-29 04:37:45 +0000 |
commit | de8f24ea083384bb66b32ec105dc4743c5663cdf (patch) | |
tree | 1412176ae62a3cab2cf2b0b92150fcbceaac6092 /src/lib/libcrypto/pkcs7/pk7_lib.c | |
parent | cb929d29896bcb87c2a97417fbd03e50078fc178 (diff) | |
download | openbsd-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.c | 156 |
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 | ||
64 | long PKCS7_ctrl(p7,cmd,larg,parg) | 64 | long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg) |
65 | PKCS7 *p7; | ||
66 | int cmd; | ||
67 | long larg; | ||
68 | char *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 | ||
106 | int PKCS7_content_new(p7,type) | 103 | int PKCS7_content_new(PKCS7 *p7, int type) |
107 | PKCS7 *p7; | ||
108 | int 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 | ||
122 | int PKCS7_set_content(p7,p7_data) | 117 | int PKCS7_set_content(PKCS7 *p7, PKCS7 *p7_data) |
123 | PKCS7 *p7; | ||
124 | PKCS7 *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 | ||
150 | int PKCS7_set_type(p7,type) | 143 | int PKCS7_set_type(PKCS7 *p7, int type) |
151 | PKCS7 *p7; | ||
152 | int 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 | ||
191 | int PKCS7_add_signer(p7,psi) | 189 | int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *psi) |
192 | PKCS7 *p7; | ||
193 | PKCS7_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 | ||
240 | int PKCS7_add_certificate(p7,x509) | 236 | int PKCS7_add_certificate(PKCS7 *p7, X509 *x509) |
241 | PKCS7 *p7; | ||
242 | X509 *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 | ||
268 | int PKCS7_add_crl(p7,crl) | 262 | int PKCS7_add_crl(PKCS7 *p7, X509_CRL *crl) |
269 | PKCS7 *p7; | ||
270 | X509_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 | ||
297 | int PKCS7_SIGNER_INFO_set(p7i,x509,pkey,dgst) | 289 | int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey, |
298 | PKCS7_SIGNER_INFO *p7i; | 290 | EVP_MD *dgst) |
299 | X509 *x509; | ||
300 | EVP_PKEY *pkey; | ||
301 | EVP_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); |
331 | err: | 328 | err: |
332 | return(0); | 329 | return(0); |
333 | } | 330 | } |
334 | 331 | ||
335 | PKCS7_SIGNER_INFO *PKCS7_add_signature(p7,x509,pkey,dgst) | 332 | PKCS7_SIGNER_INFO *PKCS7_add_signature(PKCS7 *p7, X509 *x509, EVP_PKEY *pkey, |
336 | PKCS7 *p7; | 333 | EVP_MD *dgst) |
337 | X509 *x509; | ||
338 | EVP_PKEY *pkey; | ||
339 | EVP_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 | ||
351 | STACK *PKCS7_get_signer_info(p7) | 345 | STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7) |
352 | PKCS7 *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 | ||
362 | PKCS7_RECIP_INFO *PKCS7_add_recipient(p7,x509) | 359 | PKCS7_RECIP_INFO *PKCS7_add_recipient(PKCS7 *p7, X509 *x509) |
363 | PKCS7 *p7; | ||
364 | X509 *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 | ||
376 | int PKCS7_add_recipient_info(p7,ri) | 371 | int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri) |
377 | PKCS7 *p7; | ||
378 | PKCS7_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 | ||
398 | int PKCS7_RECIP_INFO_set(p7i,x509) | 394 | int PKCS7_RECIP_INFO_set(PKCS7_RECIP_INFO *p7i, X509 *x509) |
399 | PKCS7_RECIP_INFO *p7i; | ||
400 | X509 *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 | ||
416 | X509 *PKCS7_cert_from_signer_info(p7,si) | 415 | X509 *PKCS7_cert_from_signer_info(PKCS7 *p7, PKCS7_SIGNER_INFO *si) |
417 | PKCS7 *p7; | ||
418 | PKCS7_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 | ||
428 | int PKCS7_set_cipher(p7,cipher) | 425 | int PKCS7_set_cipher(PKCS7 *p7, const EVP_CIPHER *cipher) |
429 | PKCS7 *p7; | ||
430 | EVP_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 | ||