| 1 | /* | 
| 2 |  * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. | 
| 3 |  * | 
| 4 |  * Licensed under the OpenSSL license (the "License").  You may not use | 
| 5 |  * this file except in compliance with the License.  You can obtain a copy | 
| 6 |  * in the file LICENSE in the source distribution or at | 
| 7 |  * https://www.openssl.org/source/license.html | 
| 8 |  */ | 
| 9 |  | 
| 10 | #ifndef HEADER_PKCS7_H | 
| 11 | # define  | 
| 12 |  | 
| 13 | # include <openssl/asn1.h> | 
| 14 | # include <openssl/bio.h> | 
| 15 | # include <openssl/e_os2.h> | 
| 16 |  | 
| 17 | # include <openssl/symhacks.h> | 
| 18 | # include <openssl/ossl_typ.h> | 
| 19 | # include <openssl/pkcs7err.h> | 
| 20 |  | 
| 21 | #ifdef  __cplusplus | 
| 22 | extern "C"  { | 
| 23 | #endif | 
| 24 |  | 
| 25 | /*- | 
| 26 | Encryption_ID           DES-CBC | 
| 27 | Digest_ID               MD5 | 
| 28 | Digest_Encryption_ID    rsaEncryption | 
| 29 | Key_Encryption_ID       rsaEncryption | 
| 30 | */ | 
| 31 |  | 
| 32 | typedef struct pkcs7_issuer_and_serial_st { | 
| 33 |     X509_NAME *issuer; | 
| 34 |     ASN1_INTEGER *serial; | 
| 35 | } PKCS7_ISSUER_AND_SERIAL; | 
| 36 |  | 
| 37 | typedef struct pkcs7_signer_info_st { | 
| 38 |     ASN1_INTEGER *version;      /* version 1 */ | 
| 39 |     PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; | 
| 40 |     X509_ALGOR *digest_alg; | 
| 41 |     STACK_OF(X509_ATTRIBUTE) *auth_attr; /* [ 0 ] */ | 
| 42 |     X509_ALGOR *digest_enc_alg; | 
| 43 |     ASN1_OCTET_STRING *enc_digest; | 
| 44 |     STACK_OF(X509_ATTRIBUTE) *unauth_attr; /* [ 1 ] */ | 
| 45 |     /* The private key to sign with */ | 
| 46 |     EVP_PKEY *pkey; | 
| 47 | } PKCS7_SIGNER_INFO; | 
| 48 |  | 
| 49 | DEFINE_STACK_OF(PKCS7_SIGNER_INFO) | 
| 50 |  | 
| 51 | typedef struct pkcs7_recip_info_st { | 
| 52 |     ASN1_INTEGER *version;      /* version 0 */ | 
| 53 |     PKCS7_ISSUER_AND_SERIAL *issuer_and_serial; | 
| 54 |     X509_ALGOR *key_enc_algor; | 
| 55 |     ASN1_OCTET_STRING *enc_key; | 
| 56 |     X509 *cert;                 /* get the pub-key from this */ | 
| 57 | } PKCS7_RECIP_INFO; | 
| 58 |  | 
| 59 | DEFINE_STACK_OF(PKCS7_RECIP_INFO) | 
| 60 |  | 
| 61 | typedef struct pkcs7_signed_st { | 
| 62 |     ASN1_INTEGER *version;      /* version 1 */ | 
| 63 |     STACK_OF(X509_ALGOR) *md_algs; /* md used */ | 
| 64 |     STACK_OF(X509) *cert;       /* [ 0 ] */ | 
| 65 |     STACK_OF(X509_CRL) *crl;    /* [ 1 ] */ | 
| 66 |     STACK_OF(PKCS7_SIGNER_INFO) *signer_info; | 
| 67 |     struct pkcs7_st *contents; | 
| 68 | } PKCS7_SIGNED; | 
| 69 | /* | 
| 70 |  * The above structure is very very similar to PKCS7_SIGN_ENVELOPE. How about | 
| 71 |  * merging the two | 
| 72 |  */ | 
| 73 |  | 
| 74 | typedef struct pkcs7_enc_content_st { | 
| 75 |     ASN1_OBJECT *content_type; | 
| 76 |     X509_ALGOR *algorithm; | 
| 77 |     ASN1_OCTET_STRING *enc_data; /* [ 0 ] */ | 
| 78 |     const EVP_CIPHER *cipher; | 
| 79 | } PKCS7_ENC_CONTENT; | 
| 80 |  | 
| 81 | typedef struct pkcs7_enveloped_st { | 
| 82 |     ASN1_INTEGER *version;      /* version 0 */ | 
| 83 |     STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; | 
| 84 |     PKCS7_ENC_CONTENT *enc_data; | 
| 85 | } PKCS7_ENVELOPE; | 
| 86 |  | 
| 87 | typedef struct pkcs7_signedandenveloped_st { | 
| 88 |     ASN1_INTEGER *version;      /* version 1 */ | 
| 89 |     STACK_OF(X509_ALGOR) *md_algs; /* md used */ | 
| 90 |     STACK_OF(X509) *cert;       /* [ 0 ] */ | 
| 91 |     STACK_OF(X509_CRL) *crl;    /* [ 1 ] */ | 
| 92 |     STACK_OF(PKCS7_SIGNER_INFO) *signer_info; | 
| 93 |     PKCS7_ENC_CONTENT *enc_data; | 
| 94 |     STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; | 
| 95 | } PKCS7_SIGN_ENVELOPE; | 
| 96 |  | 
| 97 | typedef struct pkcs7_digest_st { | 
| 98 |     ASN1_INTEGER *version;      /* version 0 */ | 
| 99 |     X509_ALGOR *md;             /* md used */ | 
| 100 |     struct pkcs7_st *contents; | 
| 101 |     ASN1_OCTET_STRING *digest; | 
| 102 | } PKCS7_DIGEST; | 
| 103 |  | 
| 104 | typedef struct pkcs7_encrypted_st { | 
| 105 |     ASN1_INTEGER *version;      /* version 0 */ | 
| 106 |     PKCS7_ENC_CONTENT *enc_data; | 
| 107 | } PKCS7_ENCRYPT; | 
| 108 |  | 
| 109 | typedef struct pkcs7_st { | 
| 110 |     /* | 
| 111 |      * The following is non NULL if it contains ASN1 encoding of this | 
| 112 |      * structure | 
| 113 |      */ | 
| 114 |     unsigned char *asn1; | 
| 115 |     long length; | 
| 116 | # define   0 | 
| 117 | # define PKCS7_S_BODY    1 | 
| 118 | # define PKCS7_S_TAIL    2 | 
| 119 |     int state;                  /* used during processing */ | 
| 120 |     int detached; | 
| 121 |     ASN1_OBJECT *type; | 
| 122 |     /* content as defined by the type */ | 
| 123 |     /* | 
| 124 |      * all encryption/message digests are applied to the 'contents', leaving | 
| 125 |      * out the 'type' field. | 
| 126 |      */ | 
| 127 |     union { | 
| 128 |         char *ptr; | 
| 129 |         /* NID_pkcs7_data */ | 
| 130 |         ASN1_OCTET_STRING *data; | 
| 131 |         /* NID_pkcs7_signed */ | 
| 132 |         PKCS7_SIGNED *sign; | 
| 133 |         /* NID_pkcs7_enveloped */ | 
| 134 |         PKCS7_ENVELOPE *enveloped; | 
| 135 |         /* NID_pkcs7_signedAndEnveloped */ | 
| 136 |         PKCS7_SIGN_ENVELOPE *signed_and_enveloped; | 
| 137 |         /* NID_pkcs7_digest */ | 
| 138 |         PKCS7_DIGEST *digest; | 
| 139 |         /* NID_pkcs7_encrypted */ | 
| 140 |         PKCS7_ENCRYPT *encrypted; | 
| 141 |         /* Anything else */ | 
| 142 |         ASN1_TYPE *other; | 
| 143 |     } d; | 
| 144 | } PKCS7; | 
| 145 |  | 
| 146 | DEFINE_STACK_OF(PKCS7) | 
| 147 |  | 
| 148 | # define PKCS7_OP_SET_DETACHED_SIGNATURE 1 | 
| 149 | # define PKCS7_OP_GET_DETACHED_SIGNATURE 2 | 
| 150 |  | 
| 151 | # define PKCS7_get_signed_attributes(si) ((si)->auth_attr) | 
| 152 | # define PKCS7_get_attributes(si)        ((si)->unauth_attr) | 
| 153 |  | 
| 154 | # define PKCS7_type_is_signed(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_signed) | 
| 155 | # define PKCS7_type_is_encrypted(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_encrypted) | 
| 156 | # define PKCS7_type_is_enveloped(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_enveloped) | 
| 157 | # define PKCS7_type_is_signedAndEnveloped(a) \ | 
| 158 |                 (OBJ_obj2nid((a)->type) == NID_pkcs7_signedAndEnveloped) | 
| 159 | # define PKCS7_type_is_data(a)   (OBJ_obj2nid((a)->type) == NID_pkcs7_data) | 
| 160 | # define PKCS7_type_is_digest(a)   (OBJ_obj2nid((a)->type) == NID_pkcs7_digest) | 
| 161 |  | 
| 162 | # define PKCS7_set_detached(p,v) \ | 
| 163 |                 PKCS7_ctrl(p,PKCS7_OP_SET_DETACHED_SIGNATURE,v,NULL) | 
| 164 | # define PKCS7_get_detached(p) \ | 
| 165 |                 PKCS7_ctrl(p,PKCS7_OP_GET_DETACHED_SIGNATURE,0,NULL) | 
| 166 |  | 
| 167 | # define PKCS7_is_detached(p7) (PKCS7_type_is_signed(p7) && PKCS7_get_detached(p7)) | 
| 168 |  | 
| 169 | /* S/MIME related flags */ | 
| 170 |  | 
| 171 | # define PKCS7_TEXT              0x1 | 
| 172 | # define PKCS7_NOCERTS           0x2 | 
| 173 | # define PKCS7_NOSIGS            0x4 | 
| 174 | # define PKCS7_NOCHAIN           0x8 | 
| 175 | # define PKCS7_NOINTERN          0x10 | 
| 176 | # define PKCS7_NOVERIFY          0x20 | 
| 177 | # define PKCS7_DETACHED          0x40 | 
| 178 | # define PKCS7_BINARY            0x80 | 
| 179 | # define PKCS7_NOATTR            0x100 | 
| 180 | # define PKCS7_NOSMIMECAP        0x200 | 
| 181 | # define PKCS7_NOOLDMIMETYPE     0x400 | 
| 182 | # define PKCS7_CRLFEOL           0x800 | 
| 183 | # define PKCS7_STREAM            0x1000 | 
| 184 | # define PKCS7_NOCRL             0x2000 | 
| 185 | # define PKCS7_PARTIAL           0x4000 | 
| 186 | # define PKCS7_REUSE_DIGEST      0x8000 | 
| 187 | # define PKCS7_NO_DUAL_CONTENT   0x10000 | 
| 188 |  | 
| 189 | /* Flags: for compatibility with older code */ | 
| 190 |  | 
| 191 | # define SMIME_TEXT      PKCS7_TEXT | 
| 192 | # define SMIME_NOCERTS   PKCS7_NOCERTS | 
| 193 | # define SMIME_NOSIGS    PKCS7_NOSIGS | 
| 194 | # define SMIME_NOCHAIN   PKCS7_NOCHAIN | 
| 195 | # define SMIME_NOINTERN  PKCS7_NOINTERN | 
| 196 | # define SMIME_NOVERIFY  PKCS7_NOVERIFY | 
| 197 | # define SMIME_DETACHED  PKCS7_DETACHED | 
| 198 | # define SMIME_BINARY    PKCS7_BINARY | 
| 199 | # define SMIME_NOATTR    PKCS7_NOATTR | 
| 200 |  | 
| 201 | /* CRLF ASCII canonicalisation */ | 
| 202 | # define SMIME_ASCIICRLF         0x80000 | 
| 203 |  | 
| 204 | DECLARE_ASN1_FUNCTIONS(PKCS7_ISSUER_AND_SERIAL) | 
| 205 |  | 
| 206 | int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data, | 
| 207 |                                    const EVP_MD *type, unsigned char *md, | 
| 208 |                                    unsigned int *len); | 
| 209 | # ifndef OPENSSL_NO_STDIO | 
| 210 | PKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7); | 
| 211 | int i2d_PKCS7_fp(FILE *fp, PKCS7 *p7); | 
| 212 | # endif | 
| 213 | PKCS7 *PKCS7_dup(PKCS7 *p7); | 
| 214 | PKCS7 *d2i_PKCS7_bio(BIO *bp, PKCS7 **p7); | 
| 215 | int i2d_PKCS7_bio(BIO *bp, PKCS7 *p7); | 
| 216 | int i2d_PKCS7_bio_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); | 
| 217 | int PEM_write_bio_PKCS7_stream(BIO *out, PKCS7 *p7, BIO *in, int flags); | 
| 218 |  | 
| 219 | DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNER_INFO) | 
| 220 | DECLARE_ASN1_FUNCTIONS(PKCS7_RECIP_INFO) | 
| 221 | DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNED) | 
| 222 | DECLARE_ASN1_FUNCTIONS(PKCS7_ENC_CONTENT) | 
| 223 | DECLARE_ASN1_FUNCTIONS(PKCS7_ENVELOPE) | 
| 224 | DECLARE_ASN1_FUNCTIONS(PKCS7_SIGN_ENVELOPE) | 
| 225 | DECLARE_ASN1_FUNCTIONS(PKCS7_DIGEST) | 
| 226 | DECLARE_ASN1_FUNCTIONS(PKCS7_ENCRYPT) | 
| 227 | DECLARE_ASN1_FUNCTIONS(PKCS7) | 
| 228 |  | 
| 229 | DECLARE_ASN1_ITEM(PKCS7_ATTR_SIGN) | 
| 230 | DECLARE_ASN1_ITEM(PKCS7_ATTR_VERIFY) | 
| 231 |  | 
| 232 | DECLARE_ASN1_NDEF_FUNCTION(PKCS7) | 
| 233 | DECLARE_ASN1_PRINT_FUNCTION(PKCS7) | 
| 234 |  | 
| 235 | long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg); | 
| 236 |  | 
| 237 | int PKCS7_set_type(PKCS7 *p7, int type); | 
| 238 | int PKCS7_set0_type_other(PKCS7 *p7, int type, ASN1_TYPE *other); | 
| 239 | int PKCS7_set_content(PKCS7 *p7, PKCS7 *p7_data); | 
| 240 | int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey, | 
| 241 |                           const EVP_MD *dgst); | 
| 242 | int PKCS7_SIGNER_INFO_sign(PKCS7_SIGNER_INFO *si); | 
| 243 | int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *p7i); | 
| 244 | int PKCS7_add_certificate(PKCS7 *p7, X509 *x509); | 
| 245 | int PKCS7_add_crl(PKCS7 *p7, X509_CRL *x509); | 
| 246 | int PKCS7_content_new(PKCS7 *p7, int nid); | 
| 247 | int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx, | 
| 248 |                      BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si); | 
| 249 | int PKCS7_signatureVerify(BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si, | 
| 250 |                           X509 *x509); | 
| 251 |  | 
| 252 | BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio); | 
| 253 | int PKCS7_dataFinal(PKCS7 *p7, BIO *bio); | 
| 254 | BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert); | 
| 255 |  | 
| 256 | PKCS7_SIGNER_INFO *PKCS7_add_signature(PKCS7 *p7, X509 *x509, | 
| 257 |                                        EVP_PKEY *pkey, const EVP_MD *dgst); | 
| 258 | X509 *PKCS7_cert_from_signer_info(PKCS7 *p7, PKCS7_SIGNER_INFO *si); | 
| 259 | int PKCS7_set_digest(PKCS7 *p7, const EVP_MD *md); | 
| 260 | STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7); | 
| 261 |  | 
| 262 | PKCS7_RECIP_INFO *PKCS7_add_recipient(PKCS7 *p7, X509 *x509); | 
| 263 | void PKCS7_SIGNER_INFO_get0_algs(PKCS7_SIGNER_INFO *si, EVP_PKEY **pk, | 
| 264 |                                  X509_ALGOR **pdig, X509_ALGOR **psig); | 
| 265 | void PKCS7_RECIP_INFO_get0_alg(PKCS7_RECIP_INFO *ri, X509_ALGOR **penc); | 
| 266 | int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri); | 
| 267 | int PKCS7_RECIP_INFO_set(PKCS7_RECIP_INFO *p7i, X509 *x509); | 
| 268 | int PKCS7_set_cipher(PKCS7 *p7, const EVP_CIPHER *cipher); | 
| 269 | int PKCS7_stream(unsigned char ***boundary, PKCS7 *p7); | 
| 270 |  | 
| 271 | PKCS7_ISSUER_AND_SERIAL *PKCS7_get_issuer_and_serial(PKCS7 *p7, int idx); | 
| 272 | ASN1_OCTET_STRING *PKCS7_digest_from_attributes(STACK_OF(X509_ATTRIBUTE) *sk); | 
| 273 | int PKCS7_add_signed_attribute(PKCS7_SIGNER_INFO *p7si, int nid, int type, | 
| 274 |                                void *data); | 
| 275 | int PKCS7_add_attribute(PKCS7_SIGNER_INFO *p7si, int nid, int atrtype, | 
| 276 |                         void *value); | 
| 277 | ASN1_TYPE *PKCS7_get_attribute(PKCS7_SIGNER_INFO *si, int nid); | 
| 278 | ASN1_TYPE *PKCS7_get_signed_attribute(PKCS7_SIGNER_INFO *si, int nid); | 
| 279 | int PKCS7_set_signed_attributes(PKCS7_SIGNER_INFO *p7si, | 
| 280 |                                 STACK_OF(X509_ATTRIBUTE) *sk); | 
| 281 | int PKCS7_set_attributes(PKCS7_SIGNER_INFO *p7si, | 
| 282 |                          STACK_OF(X509_ATTRIBUTE) *sk); | 
| 283 |  | 
| 284 | PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, | 
| 285 |                   BIO *data, int flags); | 
| 286 |  | 
| 287 | PKCS7_SIGNER_INFO *PKCS7_sign_add_signer(PKCS7 *p7, | 
| 288 |                                          X509 *signcert, EVP_PKEY *pkey, | 
| 289 |                                          const EVP_MD *md, int flags); | 
| 290 |  | 
| 291 | int PKCS7_final(PKCS7 *p7, BIO *data, int flags); | 
| 292 | int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store, | 
| 293 |                  BIO *indata, BIO *out, int flags); | 
| 294 | STACK_OF(X509) *PKCS7_get0_signers(PKCS7 *p7, STACK_OF(X509) *certs, | 
| 295 |                                    int flags); | 
| 296 | PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in, const EVP_CIPHER *cipher, | 
| 297 |                      int flags); | 
| 298 | int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, | 
| 299 |                   int flags); | 
| 300 |  | 
| 301 | int PKCS7_add_attrib_smimecap(PKCS7_SIGNER_INFO *si, | 
| 302 |                               STACK_OF(X509_ALGOR) *cap); | 
| 303 | STACK_OF(X509_ALGOR) *PKCS7_get_smimecap(PKCS7_SIGNER_INFO *si); | 
| 304 | int PKCS7_simple_smimecap(STACK_OF(X509_ALGOR) *sk, int nid, int arg); | 
| 305 |  | 
| 306 | int PKCS7_add_attrib_content_type(PKCS7_SIGNER_INFO *si, ASN1_OBJECT *coid); | 
| 307 | int PKCS7_add0_attrib_signing_time(PKCS7_SIGNER_INFO *si, ASN1_TIME *t); | 
| 308 | int PKCS7_add1_attrib_digest(PKCS7_SIGNER_INFO *si, | 
| 309 |                              const unsigned char *md, int mdlen); | 
| 310 |  | 
| 311 | int SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags); | 
| 312 | PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont); | 
| 313 |  | 
| 314 | BIO *BIO_new_PKCS7(BIO *out, PKCS7 *p7); | 
| 315 |  | 
| 316 | # ifdef  __cplusplus | 
| 317 | } | 
| 318 | # endif | 
| 319 | #endif | 
| 320 |  |