| OLD | NEW |
| 1 /* pk7_mime.c */ | 1 /* pk7_mime.c */ |
| 2 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 * project. | 3 * project. |
| 4 */ | 4 */ |
| 5 /* ==================================================================== | 5 /* ==================================================================== |
| 6 * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. | 6 * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. |
| 7 * | 7 * |
| 8 * Redistribution and use in source and binary forms, with or without | 8 * Redistribution and use in source and binary forms, with or without |
| 9 * modification, are permitted provided that the following conditions | 9 * modification, are permitted provided that the following conditions |
| 10 * are met: | 10 * are met: |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 * | 52 * |
| 53 */ | 53 */ |
| 54 | 54 |
| 55 #include <stdio.h> | 55 #include <stdio.h> |
| 56 #include <ctype.h> | 56 #include <ctype.h> |
| 57 #include "cryptlib.h" | 57 #include "cryptlib.h" |
| 58 #include <openssl/rand.h> | 58 #include <openssl/rand.h> |
| 59 #include <openssl/x509.h> | 59 #include <openssl/x509.h> |
| 60 #include <openssl/asn1.h> | 60 #include <openssl/asn1.h> |
| 61 | 61 |
| 62 /* PKCS#7 wrappers round generalised MIME routines */ | 62 /* PKCS#7 wrappers round generalised stream and MIME routines */ |
| 63 | 63 |
| 64 PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont) | 64 int i2d_PKCS7_bio_stream(BIO *out, PKCS7 *p7, BIO *in, int flags) |
| 65 { | 65 { |
| 66 » return (PKCS7 *)SMIME_read_ASN1(bio, bcont, ASN1_ITEM_rptr(PKCS7)); | 66 » return i2d_ASN1_bio_stream(out, (ASN1_VALUE *)p7, in, flags, |
| 67 » » » » » ASN1_ITEM_rptr(PKCS7)); |
| 67 } | 68 } |
| 68 | 69 |
| 69 /* Callback for int_smime_write_ASN1 */ | 70 int PEM_write_bio_PKCS7_stream(BIO *out, PKCS7 *p7, BIO *in, int flags) |
| 70 | |
| 71 static int pk7_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags, | |
| 72 » » » » » const ASN1_ITEM *it) | |
| 73 { | 71 { |
| 74 » PKCS7 *p7 = (PKCS7 *)val; | 72 » return PEM_write_bio_ASN1_stream(out, (ASN1_VALUE *) p7, in, flags, |
| 75 » BIO *tmpbio, *p7bio; | 73 » » » » » » "PKCS7", |
| 76 » int r = 0; | 74 » » » » » » ASN1_ITEM_rptr(PKCS7)); |
| 77 | |
| 78 » if (!(flags & SMIME_DETACHED)) | |
| 79 » » { | |
| 80 » » SMIME_crlf_copy(data, out, flags); | |
| 81 » » return 1; | |
| 82 » » } | |
| 83 | |
| 84 » /* Let PKCS7 code prepend any needed BIOs */ | |
| 85 | |
| 86 » p7bio = PKCS7_dataInit(p7, out); | |
| 87 | |
| 88 » if (!p7bio) | |
| 89 » » return 0; | |
| 90 | |
| 91 » /* Copy data across, passing through filter BIOs for processing */ | |
| 92 » SMIME_crlf_copy(data, p7bio, flags); | |
| 93 | |
| 94 » /* Finalize structure */ | |
| 95 » if (PKCS7_dataFinal(p7, p7bio) <= 0) | |
| 96 » » goto err; | |
| 97 | |
| 98 » r = 1; | |
| 99 | |
| 100 » err: | |
| 101 | |
| 102 » /* Now remove any digests prepended to the BIO */ | |
| 103 | |
| 104 » while (p7bio != out) | |
| 105 » » { | |
| 106 » » tmpbio = BIO_pop(p7bio); | |
| 107 » » BIO_free(p7bio); | |
| 108 » » p7bio = tmpbio; | |
| 109 » » } | |
| 110 | |
| 111 » return 1; | |
| 112 | |
| 113 } | 75 } |
| 114 | 76 |
| 115 int SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags) | 77 int SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags) |
| 116 { | 78 { |
| 117 STACK_OF(X509_ALGOR) *mdalgs; | 79 STACK_OF(X509_ALGOR) *mdalgs; |
| 118 int ctype_nid = OBJ_obj2nid(p7->type); | 80 int ctype_nid = OBJ_obj2nid(p7->type); |
| 119 if (ctype_nid == NID_pkcs7_signed) | 81 if (ctype_nid == NID_pkcs7_signed) |
| 120 mdalgs = p7->d.sign->md_algs; | 82 mdalgs = p7->d.sign->md_algs; |
| 121 else | 83 else |
| 122 mdalgs = NULL; | 84 mdalgs = NULL; |
| 123 | 85 |
| 124 » return int_smime_write_ASN1(bio, (ASN1_VALUE *)p7, data, flags, | 86 » flags ^= SMIME_OLDMIME; |
| 87 |
| 88 |
| 89 » return SMIME_write_ASN1(bio, (ASN1_VALUE *)p7, data, flags, |
| 125 ctype_nid, NID_undef, mdalgs, | 90 ctype_nid, NID_undef, mdalgs, |
| 126 pk7_output_data, | |
| 127 ASN1_ITEM_rptr(PKCS7)); | 91 ASN1_ITEM_rptr(PKCS7)); |
| 128 } | 92 } |
| 93 |
| 94 PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont) |
| 95 { |
| 96 return (PKCS7 *)SMIME_read_ASN1(bio, bcont, ASN1_ITEM_rptr(PKCS7)); |
| 97 } |
| OLD | NEW |