| OLD | NEW |
| (Empty) |
| 1 /* This Source Code Form is subject to the terms of the Mozilla Public | |
| 2 * License, v. 2.0. If a copy of the MPL was not distributed with this | |
| 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | |
| 4 | |
| 5 /* | |
| 6 * Header for pkcs7 types. | |
| 7 * | |
| 8 * $Id: pkcs7t.h,v 1.8 2012/04/25 14:50:06 gerv%gerv.net Exp $ | |
| 9 */ | |
| 10 | |
| 11 #ifndef _PKCS7T_H_ | |
| 12 #define _PKCS7T_H_ | |
| 13 | |
| 14 #include "plarena.h" | |
| 15 | |
| 16 #include "seccomon.h" | |
| 17 #include "secoidt.h" | |
| 18 #include "certt.h" | |
| 19 #include "secmodt.h" | |
| 20 | |
| 21 /* Opaque objects */ | |
| 22 typedef struct SEC_PKCS7DecoderContextStr SEC_PKCS7DecoderContext; | |
| 23 typedef struct SEC_PKCS7EncoderContextStr SEC_PKCS7EncoderContext; | |
| 24 | |
| 25 /* legacy defines that haven't been active for years */ | |
| 26 typedef void *(*SECKEYGetPasswordKey)(void *arg, void *handle); | |
| 27 | |
| 28 | |
| 29 /* Non-opaque objects. NOTE, though: I want them to be treated as | |
| 30 * opaque as much as possible. If I could hide them completely, | |
| 31 * I would. (I tried, but ran into trouble that was taking me too | |
| 32 * much time to get out of.) I still intend to try to do so. | |
| 33 * In fact, the only type that "outsiders" should even *name* is | |
| 34 * SEC_PKCS7ContentInfo, and they should not reference its fields. | |
| 35 */ | |
| 36 /* rjr: PKCS #11 cert handling (pk11cert.c) does use SEC_PKCS7RecipientInfo's. | |
| 37 * This is because when we search the recipient list for the cert and key we | |
| 38 * want, we need to invert the order of the loops we used to have. The old | |
| 39 * loops were: | |
| 40 * | |
| 41 * For each recipient { | |
| 42 * find_cert = PK11_Find_AllCert(recipient->issuerSN); | |
| 43 * [which unrolls to... ] | |
| 44 * For each slot { | |
| 45 * Log into slot; | |
| 46 * search slot for cert; | |
| 47 * } | |
| 48 * } | |
| 49 * | |
| 50 * the new loop searchs all the recipients at once on a slot. this allows | |
| 51 * PKCS #11 to order slots in such a way that logout slots don't get checked | |
| 52 * if we can find the cert on a logged in slot. This eliminates lots of | |
| 53 * spurious password prompts when smart cards are installed... so why this | |
| 54 * comment? If you make SEC_PKCS7RecipientInfo completely opaque, you need | |
| 55 * to provide a non-opaque list of issuerSN's (the only field PKCS#11 needs | |
| 56 * and fix up pk11cert.c first. NOTE: Only S/MIME calls this special PKCS #11 | |
| 57 * function. | |
| 58 */ | |
| 59 typedef struct SEC_PKCS7ContentInfoStr SEC_PKCS7ContentInfo; | |
| 60 typedef struct SEC_PKCS7SignedDataStr SEC_PKCS7SignedData; | |
| 61 typedef struct SEC_PKCS7EncryptedContentInfoStr SEC_PKCS7EncryptedContentInfo; | |
| 62 typedef struct SEC_PKCS7EnvelopedDataStr SEC_PKCS7EnvelopedData; | |
| 63 typedef struct SEC_PKCS7SignedAndEnvelopedDataStr | |
| 64 SEC_PKCS7SignedAndEnvelopedData; | |
| 65 typedef struct SEC_PKCS7SignerInfoStr SEC_PKCS7SignerInfo; | |
| 66 typedef struct SEC_PKCS7RecipientInfoStr SEC_PKCS7RecipientInfo; | |
| 67 typedef struct SEC_PKCS7DigestedDataStr SEC_PKCS7DigestedData; | |
| 68 typedef struct SEC_PKCS7EncryptedDataStr SEC_PKCS7EncryptedData; | |
| 69 /* | |
| 70 * The following is not actually a PKCS7 type, but for now it is only | |
| 71 * used by PKCS7, so we have adopted it. If someone else *ever* needs | |
| 72 * it, its name should be changed and it should be moved out of here. | |
| 73 * Do not dare to use it without doing so! | |
| 74 */ | |
| 75 typedef struct SEC_PKCS7AttributeStr SEC_PKCS7Attribute; | |
| 76 | |
| 77 struct SEC_PKCS7ContentInfoStr { | |
| 78 PLArenaPool *poolp; /* local; not part of encoding */ | |
| 79 PRBool created; /* local; not part of encoding */ | |
| 80 int refCount; /* local; not part of encoding */ | |
| 81 SECOidData *contentTypeTag; /* local; not part of encoding */ | |
| 82 SECKEYGetPasswordKey pwfn; /* local; not part of encoding */ | |
| 83 void *pwfn_arg; /* local; not part of encoding */ | |
| 84 SECItem contentType; | |
| 85 union { | |
| 86 SECItem *data; | |
| 87 SEC_PKCS7DigestedData *digestedData; | |
| 88 SEC_PKCS7EncryptedData *encryptedData; | |
| 89 SEC_PKCS7EnvelopedData *envelopedData; | |
| 90 SEC_PKCS7SignedData *signedData; | |
| 91 SEC_PKCS7SignedAndEnvelopedData *signedAndEnvelopedData; | |
| 92 } content; | |
| 93 }; | |
| 94 | |
| 95 struct SEC_PKCS7SignedDataStr { | |
| 96 SECItem version; | |
| 97 SECAlgorithmID **digestAlgorithms; | |
| 98 SEC_PKCS7ContentInfo contentInfo; | |
| 99 SECItem **rawCerts; | |
| 100 CERTSignedCrl **crls; | |
| 101 SEC_PKCS7SignerInfo **signerInfos; | |
| 102 SECItem **digests; /* local; not part of encoding */ | |
| 103 CERTCertificate **certs; /* local; not part of encoding */ | |
| 104 CERTCertificateList **certLists; /* local; not part of encoding */ | |
| 105 }; | |
| 106 #define SEC_PKCS7_SIGNED_DATA_VERSION 1 /* what we *create* */ | |
| 107 | |
| 108 struct SEC_PKCS7EncryptedContentInfoStr { | |
| 109 SECOidData *contentTypeTag; /* local; not part of encoding */ | |
| 110 SECItem contentType; | |
| 111 SECAlgorithmID contentEncAlg; | |
| 112 SECItem encContent; | |
| 113 SECItem plainContent; /* local; not part of encoding */ | |
| 114 /* bytes not encrypted, but encoded */ | |
| 115 int keysize; /* local; not part of encoding */ | |
| 116 /* size of bulk encryption key | |
| 117 * (only used by creation code) */ | |
| 118 SECOidTag encalg; /* local; not part of encoding */ | |
| 119 /* oid tag of encryption algorithm | |
| 120 * (only used by creation code) */ | |
| 121 }; | |
| 122 | |
| 123 struct SEC_PKCS7EnvelopedDataStr { | |
| 124 SECItem version; | |
| 125 SEC_PKCS7RecipientInfo **recipientInfos; | |
| 126 SEC_PKCS7EncryptedContentInfo encContentInfo; | |
| 127 }; | |
| 128 #define SEC_PKCS7_ENVELOPED_DATA_VERSION 0 /* what we *create* */ | |
| 129 | |
| 130 struct SEC_PKCS7SignedAndEnvelopedDataStr { | |
| 131 SECItem version; | |
| 132 SEC_PKCS7RecipientInfo **recipientInfos; | |
| 133 SECAlgorithmID **digestAlgorithms; | |
| 134 SEC_PKCS7EncryptedContentInfo encContentInfo; | |
| 135 SECItem **rawCerts; | |
| 136 CERTSignedCrl **crls; | |
| 137 SEC_PKCS7SignerInfo **signerInfos; | |
| 138 SECItem **digests; /* local; not part of encoding */ | |
| 139 CERTCertificate **certs; /* local; not part of encoding */ | |
| 140 CERTCertificateList **certLists; /* local; not part of encoding */ | |
| 141 PK11SymKey *sigKey; /* local; not part of encoding */ | |
| 142 }; | |
| 143 #define SEC_PKCS7_SIGNED_AND_ENVELOPED_DATA_VERSION 1 /* what we *create* */ | |
| 144 | |
| 145 struct SEC_PKCS7SignerInfoStr { | |
| 146 SECItem version; | |
| 147 CERTIssuerAndSN *issuerAndSN; | |
| 148 SECAlgorithmID digestAlg; | |
| 149 SEC_PKCS7Attribute **authAttr; | |
| 150 SECAlgorithmID digestEncAlg; | |
| 151 SECItem encDigest; | |
| 152 SEC_PKCS7Attribute **unAuthAttr; | |
| 153 CERTCertificate *cert; /* local; not part of encoding */ | |
| 154 CERTCertificateList *certList; /* local; not part of encoding */ | |
| 155 }; | |
| 156 #define SEC_PKCS7_SIGNER_INFO_VERSION 1 /* what we *create* */ | |
| 157 | |
| 158 struct SEC_PKCS7RecipientInfoStr { | |
| 159 SECItem version; | |
| 160 CERTIssuerAndSN *issuerAndSN; | |
| 161 SECAlgorithmID keyEncAlg; | |
| 162 SECItem encKey; | |
| 163 CERTCertificate *cert; /* local; not part of encoding */ | |
| 164 }; | |
| 165 #define SEC_PKCS7_RECIPIENT_INFO_VERSION 0 /* what we *create* */ | |
| 166 | |
| 167 struct SEC_PKCS7DigestedDataStr { | |
| 168 SECItem version; | |
| 169 SECAlgorithmID digestAlg; | |
| 170 SEC_PKCS7ContentInfo contentInfo; | |
| 171 SECItem digest; | |
| 172 }; | |
| 173 #define SEC_PKCS7_DIGESTED_DATA_VERSION 0 /* what we *create* */ | |
| 174 | |
| 175 struct SEC_PKCS7EncryptedDataStr { | |
| 176 SECItem version; | |
| 177 SEC_PKCS7EncryptedContentInfo encContentInfo; | |
| 178 }; | |
| 179 #define SEC_PKCS7_ENCRYPTED_DATA_VERSION 0 /* what we *create* */ | |
| 180 | |
| 181 /* | |
| 182 * See comment above about this type not really belonging to PKCS7. | |
| 183 */ | |
| 184 struct SEC_PKCS7AttributeStr { | |
| 185 /* The following fields make up an encoded Attribute: */ | |
| 186 SECItem type; | |
| 187 SECItem **values; /* data may or may not be encoded */ | |
| 188 /* The following fields are not part of an encoded Attribute: */ | |
| 189 SECOidData *typeTag; | |
| 190 PRBool encoded; /* when true, values are encoded */ | |
| 191 }; | |
| 192 | |
| 193 /* | |
| 194 * Type of function passed to SEC_PKCS7Decode or SEC_PKCS7DecoderStart. | |
| 195 * If specified, this is where the content bytes (only) will be "sent" | |
| 196 * as they are recovered during the decoding. | |
| 197 * | |
| 198 * XXX Should just combine this with SEC_PKCS7EncoderContentCallback type | |
| 199 * and use a simpler, common name. | |
| 200 */ | |
| 201 typedef void (* SEC_PKCS7DecoderContentCallback)(void *arg, | |
| 202 const char *buf, | |
| 203 unsigned long len); | |
| 204 | |
| 205 /* | |
| 206 * Type of function passed to SEC_PKCS7Encode or SEC_PKCS7EncoderStart. | |
| 207 * This is where the encoded bytes will be "sent". | |
| 208 * | |
| 209 * XXX Should just combine this with SEC_PKCS7DecoderContentCallback type | |
| 210 * and use a simpler, common name. | |
| 211 */ | |
| 212 typedef void (* SEC_PKCS7EncoderOutputCallback)(void *arg, | |
| 213 const char *buf, | |
| 214 unsigned long len); | |
| 215 | |
| 216 | |
| 217 /* | |
| 218 * Type of function passed to SEC_PKCS7Decode or SEC_PKCS7DecoderStart | |
| 219 * to retrieve the decryption key. This function is inteded to be | |
| 220 * used for EncryptedData content info's which do not have a key available | |
| 221 * in a certificate, etc. | |
| 222 */ | |
| 223 typedef PK11SymKey * (* SEC_PKCS7GetDecryptKeyCallback)(void *arg, | |
| 224 SECAlgorithmID *algid); | |
| 225 | |
| 226 /* | |
| 227 * Type of function passed to SEC_PKCS7Decode or SEC_PKCS7DecoderStart. | |
| 228 * This function in intended to be used to verify that decrypting a | |
| 229 * particular crypto algorithm is allowed. Content types which do not | |
| 230 * require decryption will not need the callback. If the callback | |
| 231 * is not specified for content types which require decryption, the | |
| 232 * decryption will be disallowed. | |
| 233 */ | |
| 234 typedef PRBool (* SEC_PKCS7DecryptionAllowedCallback)(SECAlgorithmID *algid, | |
| 235 PK11SymKey *bulkkey); | |
| 236 | |
| 237 #endif /* _PKCS7T_H_ */ | |
| OLD | NEW |