diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libcrypto/cms/cms.h | 188 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_asn1.c | 123 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_att.c | 122 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_cd.c | 47 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_dd.c | 51 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_enc.c | 181 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_env.c | 572 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_err.c | 337 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_ess.c | 243 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_io.c | 78 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_lcl.h | 267 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_lib.c | 445 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_pwri.c | 231 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_sd.c | 710 | ||||
| -rw-r--r-- | src/lib/libcrypto/cms/cms_smime.c | 536 |
15 files changed, 1913 insertions, 2218 deletions
diff --git a/src/lib/libcrypto/cms/cms.h b/src/lib/libcrypto/cms/cms.h index 150607469d..0a782d3163 100644 --- a/src/lib/libcrypto/cms/cms.h +++ b/src/lib/libcrypto/cms/cms.h | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * are met: | 10 | * are met: |
| 11 | * | 11 | * |
| 12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * | 14 | * |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
| @@ -132,110 +132,94 @@ int i2d_CMS_bio(BIO *bp, CMS_ContentInfo *cms); | |||
| 132 | 132 | ||
| 133 | BIO *BIO_new_CMS(BIO *out, CMS_ContentInfo *cms); | 133 | BIO *BIO_new_CMS(BIO *out, CMS_ContentInfo *cms); |
| 134 | int i2d_CMS_bio_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags); | 134 | int i2d_CMS_bio_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags); |
| 135 | int PEM_write_bio_CMS_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags); | 135 | int PEM_write_bio_CMS_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, |
| 136 | int flags); | ||
| 136 | CMS_ContentInfo *SMIME_read_CMS(BIO *bio, BIO **bcont); | 137 | CMS_ContentInfo *SMIME_read_CMS(BIO *bio, BIO **bcont); |
| 137 | int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags); | 138 | int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags); |
| 138 | 139 | ||
| 139 | int CMS_final(CMS_ContentInfo *cms, BIO *data, BIO *dcont, unsigned int flags); | 140 | int CMS_final(CMS_ContentInfo *cms, BIO *data, BIO *dcont, unsigned int flags); |
| 140 | 141 | ||
| 141 | CMS_ContentInfo *CMS_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, | 142 | CMS_ContentInfo *CMS_sign(X509 *signcert, EVP_PKEY *pkey, |
| 142 | BIO *data, unsigned int flags); | 143 | STACK_OF(X509) *certs, BIO *data, unsigned int flags); |
| 143 | 144 | ||
| 144 | CMS_ContentInfo *CMS_sign_receipt(CMS_SignerInfo *si, | 145 | CMS_ContentInfo *CMS_sign_receipt(CMS_SignerInfo *si, X509 *signcert, |
| 145 | X509 *signcert, EVP_PKEY *pkey, | 146 | EVP_PKEY *pkey, STACK_OF(X509) *certs, unsigned int flags); |
| 146 | STACK_OF(X509) *certs, | ||
| 147 | unsigned int flags); | ||
| 148 | 147 | ||
| 149 | int CMS_data(CMS_ContentInfo *cms, BIO *out, unsigned int flags); | 148 | int CMS_data(CMS_ContentInfo *cms, BIO *out, unsigned int flags); |
| 150 | CMS_ContentInfo *CMS_data_create(BIO *in, unsigned int flags); | 149 | CMS_ContentInfo *CMS_data_create(BIO *in, unsigned int flags); |
| 151 | 150 | ||
| 152 | int CMS_digest_verify(CMS_ContentInfo *cms, BIO *dcont, BIO *out, | 151 | int CMS_digest_verify(CMS_ContentInfo *cms, BIO *dcont, BIO *out, |
| 153 | unsigned int flags); | 152 | unsigned int flags); |
| 154 | CMS_ContentInfo *CMS_digest_create(BIO *in, const EVP_MD *md, | 153 | CMS_ContentInfo *CMS_digest_create(BIO *in, const EVP_MD *md, |
| 155 | unsigned int flags); | 154 | unsigned int flags); |
| 156 | 155 | ||
| 157 | int CMS_EncryptedData_decrypt(CMS_ContentInfo *cms, | 156 | int CMS_EncryptedData_decrypt(CMS_ContentInfo *cms, const unsigned char *key, |
| 158 | const unsigned char *key, size_t keylen, | 157 | size_t keylen, BIO *dcont, BIO *out, unsigned int flags); |
| 159 | BIO *dcont, BIO *out, unsigned int flags); | ||
| 160 | 158 | ||
| 161 | CMS_ContentInfo *CMS_EncryptedData_encrypt(BIO *in, const EVP_CIPHER *cipher, | 159 | CMS_ContentInfo *CMS_EncryptedData_encrypt(BIO *in, const EVP_CIPHER *cipher, |
| 162 | const unsigned char *key, size_t keylen, | 160 | const unsigned char *key, size_t keylen, unsigned int flags); |
| 163 | unsigned int flags); | ||
| 164 | 161 | ||
| 165 | int CMS_EncryptedData_set1_key(CMS_ContentInfo *cms, const EVP_CIPHER *ciph, | 162 | int CMS_EncryptedData_set1_key(CMS_ContentInfo *cms, const EVP_CIPHER *ciph, |
| 166 | const unsigned char *key, size_t keylen); | 163 | const unsigned char *key, size_t keylen); |
| 167 | 164 | ||
| 168 | int CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs, | 165 | int CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs, |
| 169 | X509_STORE *store, BIO *dcont, BIO *out, unsigned int flags); | 166 | X509_STORE *store, BIO *dcont, BIO *out, unsigned int flags); |
| 170 | 167 | ||
| 171 | int CMS_verify_receipt(CMS_ContentInfo *rcms, CMS_ContentInfo *ocms, | 168 | int CMS_verify_receipt(CMS_ContentInfo *rcms, CMS_ContentInfo *ocms, |
| 172 | STACK_OF(X509) *certs, | 169 | STACK_OF(X509) *certs, X509_STORE *store, unsigned int flags); |
| 173 | X509_STORE *store, unsigned int flags); | ||
| 174 | 170 | ||
| 175 | STACK_OF(X509) *CMS_get0_signers(CMS_ContentInfo *cms); | 171 | STACK_OF(X509) *CMS_get0_signers(CMS_ContentInfo *cms); |
| 176 | 172 | ||
| 177 | CMS_ContentInfo *CMS_encrypt(STACK_OF(X509) *certs, BIO *in, | 173 | CMS_ContentInfo *CMS_encrypt(STACK_OF(X509) *certs, BIO *in, |
| 178 | const EVP_CIPHER *cipher, unsigned int flags); | 174 | const EVP_CIPHER *cipher, unsigned int flags); |
| 175 | |||
| 176 | int CMS_decrypt(CMS_ContentInfo *cms, EVP_PKEY *pkey, X509 *cert, BIO *dcont, | ||
| 177 | BIO *out, unsigned int flags); | ||
| 179 | 178 | ||
| 180 | int CMS_decrypt(CMS_ContentInfo *cms, EVP_PKEY *pkey, X509 *cert, | ||
| 181 | BIO *dcont, BIO *out, | ||
| 182 | unsigned int flags); | ||
| 183 | |||
| 184 | int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert); | 179 | int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert); |
| 185 | int CMS_decrypt_set1_key(CMS_ContentInfo *cms, | 180 | int CMS_decrypt_set1_key(CMS_ContentInfo *cms, unsigned char *key, |
| 186 | unsigned char *key, size_t keylen, | 181 | size_t keylen, unsigned char *id, size_t idlen); |
| 187 | unsigned char *id, size_t idlen); | 182 | int CMS_decrypt_set1_password(CMS_ContentInfo *cms, unsigned char *pass, |
| 188 | int CMS_decrypt_set1_password(CMS_ContentInfo *cms, | 183 | ssize_t passlen); |
| 189 | unsigned char *pass, ssize_t passlen); | ||
| 190 | 184 | ||
| 191 | STACK_OF(CMS_RecipientInfo) *CMS_get0_RecipientInfos(CMS_ContentInfo *cms); | 185 | STACK_OF(CMS_RecipientInfo) *CMS_get0_RecipientInfos(CMS_ContentInfo *cms); |
| 192 | int CMS_RecipientInfo_type(CMS_RecipientInfo *ri); | 186 | int CMS_RecipientInfo_type(CMS_RecipientInfo *ri); |
| 193 | CMS_ContentInfo *CMS_EnvelopedData_create(const EVP_CIPHER *cipher); | 187 | CMS_ContentInfo *CMS_EnvelopedData_create(const EVP_CIPHER *cipher); |
| 194 | CMS_RecipientInfo *CMS_add1_recipient_cert(CMS_ContentInfo *cms, | 188 | CMS_RecipientInfo *CMS_add1_recipient_cert(CMS_ContentInfo *cms, X509 *recip, |
| 195 | X509 *recip, unsigned int flags); | 189 | unsigned int flags); |
| 196 | int CMS_RecipientInfo_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pkey); | 190 | int CMS_RecipientInfo_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pkey); |
| 197 | int CMS_RecipientInfo_ktri_cert_cmp(CMS_RecipientInfo *ri, X509 *cert); | 191 | int CMS_RecipientInfo_ktri_cert_cmp(CMS_RecipientInfo *ri, X509 *cert); |
| 198 | int CMS_RecipientInfo_ktri_get0_algs(CMS_RecipientInfo *ri, | 192 | int CMS_RecipientInfo_ktri_get0_algs(CMS_RecipientInfo *ri, EVP_PKEY **pk, |
| 199 | EVP_PKEY **pk, X509 **recip, | 193 | X509 **recip, X509_ALGOR **palg); |
| 200 | X509_ALGOR **palg); | ||
| 201 | int CMS_RecipientInfo_ktri_get0_signer_id(CMS_RecipientInfo *ri, | 194 | int CMS_RecipientInfo_ktri_get0_signer_id(CMS_RecipientInfo *ri, |
| 202 | ASN1_OCTET_STRING **keyid, | 195 | ASN1_OCTET_STRING **keyid, X509_NAME **issuer, ASN1_INTEGER **sno); |
| 203 | X509_NAME **issuer, ASN1_INTEGER **sno); | ||
| 204 | 196 | ||
| 205 | CMS_RecipientInfo *CMS_add0_recipient_key(CMS_ContentInfo *cms, int nid, | 197 | CMS_RecipientInfo *CMS_add0_recipient_key(CMS_ContentInfo *cms, int nid, |
| 206 | unsigned char *key, size_t keylen, | 198 | unsigned char *key, size_t keylen, unsigned char *id, size_t idlen, |
| 207 | unsigned char *id, size_t idlen, | 199 | ASN1_GENERALIZEDTIME *date, ASN1_OBJECT *otherTypeId, |
| 208 | ASN1_GENERALIZEDTIME *date, | 200 | ASN1_TYPE *otherType); |
| 209 | ASN1_OBJECT *otherTypeId, | 201 | |
| 210 | ASN1_TYPE *otherType); | 202 | int CMS_RecipientInfo_kekri_get0_id(CMS_RecipientInfo *ri, X509_ALGOR **palg, |
| 211 | 203 | ASN1_OCTET_STRING **pid, ASN1_GENERALIZEDTIME **pdate, | |
| 212 | int CMS_RecipientInfo_kekri_get0_id(CMS_RecipientInfo *ri, | 204 | ASN1_OBJECT **potherid, ASN1_TYPE **pothertype); |
| 213 | X509_ALGOR **palg, | 205 | |
| 214 | ASN1_OCTET_STRING **pid, | 206 | int CMS_RecipientInfo_set0_key(CMS_RecipientInfo *ri, unsigned char *key, |
| 215 | ASN1_GENERALIZEDTIME **pdate, | 207 | size_t keylen); |
| 216 | ASN1_OBJECT **potherid, | 208 | |
| 217 | ASN1_TYPE **pothertype); | 209 | int CMS_RecipientInfo_kekri_id_cmp(CMS_RecipientInfo *ri, |
| 218 | 210 | const unsigned char *id, size_t idlen); | |
| 219 | int CMS_RecipientInfo_set0_key(CMS_RecipientInfo *ri, | 211 | |
| 220 | unsigned char *key, size_t keylen); | 212 | int CMS_RecipientInfo_set0_password(CMS_RecipientInfo *ri, unsigned char *pass, |
| 221 | 213 | ssize_t passlen); | |
| 222 | int CMS_RecipientInfo_kekri_id_cmp(CMS_RecipientInfo *ri, | 214 | |
| 223 | const unsigned char *id, size_t idlen); | 215 | CMS_RecipientInfo *CMS_add0_recipient_password(CMS_ContentInfo *cms, int iter, |
| 224 | 216 | int wrap_nid, int pbe_nid, unsigned char *pass, ssize_t passlen, | |
| 225 | int CMS_RecipientInfo_set0_password(CMS_RecipientInfo *ri, | 217 | const EVP_CIPHER *kekciph); |
| 226 | unsigned char *pass, | ||
| 227 | ssize_t passlen); | ||
| 228 | |||
| 229 | CMS_RecipientInfo *CMS_add0_recipient_password(CMS_ContentInfo *cms, | ||
| 230 | int iter, int wrap_nid, int pbe_nid, | ||
| 231 | unsigned char *pass, | ||
| 232 | ssize_t passlen, | ||
| 233 | const EVP_CIPHER *kekciph); | ||
| 234 | 218 | ||
| 235 | int CMS_RecipientInfo_decrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri); | 219 | int CMS_RecipientInfo_decrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri); |
| 236 | 220 | ||
| 237 | int CMS_uncompress(CMS_ContentInfo *cms, BIO *dcont, BIO *out, | 221 | int CMS_uncompress(CMS_ContentInfo *cms, BIO *dcont, BIO *out, |
| 238 | unsigned int flags); | 222 | unsigned int flags); |
| 239 | CMS_ContentInfo *CMS_compress(BIO *in, int comp_nid, unsigned int flags); | 223 | CMS_ContentInfo *CMS_compress(BIO *in, int comp_nid, unsigned int flags); |
| 240 | 224 | ||
| 241 | int CMS_set1_eContentType(CMS_ContentInfo *cms, const ASN1_OBJECT *oid); | 225 | int CMS_set1_eContentType(CMS_ContentInfo *cms, const ASN1_OBJECT *oid); |
| @@ -252,82 +236,70 @@ int CMS_add1_crl(CMS_ContentInfo *cms, X509_CRL *crl); | |||
| 252 | STACK_OF(X509_CRL) *CMS_get1_crls(CMS_ContentInfo *cms); | 236 | STACK_OF(X509_CRL) *CMS_get1_crls(CMS_ContentInfo *cms); |
| 253 | 237 | ||
| 254 | int CMS_SignedData_init(CMS_ContentInfo *cms); | 238 | int CMS_SignedData_init(CMS_ContentInfo *cms); |
| 255 | CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms, | 239 | CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms, X509 *signer, |
| 256 | X509 *signer, EVP_PKEY *pk, const EVP_MD *md, | 240 | EVP_PKEY *pk, const EVP_MD *md, unsigned int flags); |
| 257 | unsigned int flags); | ||
| 258 | STACK_OF(CMS_SignerInfo) *CMS_get0_SignerInfos(CMS_ContentInfo *cms); | 241 | STACK_OF(CMS_SignerInfo) *CMS_get0_SignerInfos(CMS_ContentInfo *cms); |
| 259 | 242 | ||
| 260 | void CMS_SignerInfo_set1_signer_cert(CMS_SignerInfo *si, X509 *signer); | 243 | void CMS_SignerInfo_set1_signer_cert(CMS_SignerInfo *si, X509 *signer); |
| 261 | int CMS_SignerInfo_get0_signer_id(CMS_SignerInfo *si, | 244 | int CMS_SignerInfo_get0_signer_id(CMS_SignerInfo *si, |
| 262 | ASN1_OCTET_STRING **keyid, | 245 | ASN1_OCTET_STRING **keyid, X509_NAME **issuer, ASN1_INTEGER **sno); |
| 263 | X509_NAME **issuer, ASN1_INTEGER **sno); | ||
| 264 | int CMS_SignerInfo_cert_cmp(CMS_SignerInfo *si, X509 *cert); | 246 | int CMS_SignerInfo_cert_cmp(CMS_SignerInfo *si, X509 *cert); |
| 265 | int CMS_set1_signers_certs(CMS_ContentInfo *cms, STACK_OF(X509) *certs, | 247 | int CMS_set1_signers_certs(CMS_ContentInfo *cms, STACK_OF(X509) *certs, |
| 266 | unsigned int flags); | 248 | unsigned int flags); |
| 267 | void CMS_SignerInfo_get0_algs(CMS_SignerInfo *si, EVP_PKEY **pk, X509 **signer, | 249 | void CMS_SignerInfo_get0_algs(CMS_SignerInfo *si, EVP_PKEY **pk, X509 **signer, |
| 268 | X509_ALGOR **pdig, X509_ALGOR **psig); | 250 | X509_ALGOR **pdig, X509_ALGOR **psig); |
| 269 | int CMS_SignerInfo_sign(CMS_SignerInfo *si); | 251 | int CMS_SignerInfo_sign(CMS_SignerInfo *si); |
| 270 | int CMS_SignerInfo_verify(CMS_SignerInfo *si); | 252 | int CMS_SignerInfo_verify(CMS_SignerInfo *si); |
| 271 | int CMS_SignerInfo_verify_content(CMS_SignerInfo *si, BIO *chain); | 253 | int CMS_SignerInfo_verify_content(CMS_SignerInfo *si, BIO *chain); |
| 272 | 254 | ||
| 273 | int CMS_add_smimecap(CMS_SignerInfo *si, STACK_OF(X509_ALGOR) *algs); | 255 | int CMS_add_smimecap(CMS_SignerInfo *si, STACK_OF(X509_ALGOR) *algs); |
| 274 | int CMS_add_simple_smimecap(STACK_OF(X509_ALGOR) **algs, | 256 | int CMS_add_simple_smimecap(STACK_OF(X509_ALGOR) **algs, int algnid, |
| 275 | int algnid, int keysize); | 257 | int keysize); |
| 276 | int CMS_add_standard_smimecap(STACK_OF(X509_ALGOR) **smcap); | 258 | int CMS_add_standard_smimecap(STACK_OF(X509_ALGOR) **smcap); |
| 277 | 259 | ||
| 278 | int CMS_signed_get_attr_count(const CMS_SignerInfo *si); | 260 | int CMS_signed_get_attr_count(const CMS_SignerInfo *si); |
| 279 | int CMS_signed_get_attr_by_NID(const CMS_SignerInfo *si, int nid, | 261 | int CMS_signed_get_attr_by_NID(const CMS_SignerInfo *si, int nid, int lastpos); |
| 280 | int lastpos); | ||
| 281 | int CMS_signed_get_attr_by_OBJ(const CMS_SignerInfo *si, ASN1_OBJECT *obj, | 262 | int CMS_signed_get_attr_by_OBJ(const CMS_SignerInfo *si, ASN1_OBJECT *obj, |
| 282 | int lastpos); | 263 | int lastpos); |
| 283 | X509_ATTRIBUTE *CMS_signed_get_attr(const CMS_SignerInfo *si, int loc); | 264 | X509_ATTRIBUTE *CMS_signed_get_attr(const CMS_SignerInfo *si, int loc); |
| 284 | X509_ATTRIBUTE *CMS_signed_delete_attr(CMS_SignerInfo *si, int loc); | 265 | X509_ATTRIBUTE *CMS_signed_delete_attr(CMS_SignerInfo *si, int loc); |
| 285 | int CMS_signed_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); | 266 | int CMS_signed_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); |
| 286 | int CMS_signed_add1_attr_by_OBJ(CMS_SignerInfo *si, | 267 | int CMS_signed_add1_attr_by_OBJ(CMS_SignerInfo *si, const ASN1_OBJECT *obj, |
| 287 | const ASN1_OBJECT *obj, int type, | 268 | int type, const void *bytes, int len); |
| 288 | const void *bytes, int len); | 269 | int CMS_signed_add1_attr_by_NID(CMS_SignerInfo *si, int nid, int type, |
| 289 | int CMS_signed_add1_attr_by_NID(CMS_SignerInfo *si, | 270 | const void *bytes, int len); |
| 290 | int nid, int type, | 271 | int CMS_signed_add1_attr_by_txt(CMS_SignerInfo *si, const char *attrname, |
| 291 | const void *bytes, int len); | 272 | int type, const void *bytes, int len); |
| 292 | int CMS_signed_add1_attr_by_txt(CMS_SignerInfo *si, | ||
| 293 | const char *attrname, int type, | ||
| 294 | const void *bytes, int len); | ||
| 295 | void *CMS_signed_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, | 273 | void *CMS_signed_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, |
| 296 | int lastpos, int type); | 274 | int lastpos, int type); |
| 297 | 275 | ||
| 298 | int CMS_unsigned_get_attr_count(const CMS_SignerInfo *si); | 276 | int CMS_unsigned_get_attr_count(const CMS_SignerInfo *si); |
| 299 | int CMS_unsigned_get_attr_by_NID(const CMS_SignerInfo *si, int nid, | 277 | int CMS_unsigned_get_attr_by_NID(const CMS_SignerInfo *si, int nid, |
| 300 | int lastpos); | 278 | int lastpos); |
| 301 | int CMS_unsigned_get_attr_by_OBJ(const CMS_SignerInfo *si, ASN1_OBJECT *obj, | 279 | int CMS_unsigned_get_attr_by_OBJ(const CMS_SignerInfo *si, ASN1_OBJECT *obj, |
| 302 | int lastpos); | 280 | int lastpos); |
| 303 | X509_ATTRIBUTE *CMS_unsigned_get_attr(const CMS_SignerInfo *si, int loc); | 281 | X509_ATTRIBUTE *CMS_unsigned_get_attr(const CMS_SignerInfo *si, int loc); |
| 304 | X509_ATTRIBUTE *CMS_unsigned_delete_attr(CMS_SignerInfo *si, int loc); | 282 | X509_ATTRIBUTE *CMS_unsigned_delete_attr(CMS_SignerInfo *si, int loc); |
| 305 | int CMS_unsigned_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); | 283 | int CMS_unsigned_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr); |
| 306 | int CMS_unsigned_add1_attr_by_OBJ(CMS_SignerInfo *si, | 284 | int CMS_unsigned_add1_attr_by_OBJ(CMS_SignerInfo *si, const ASN1_OBJECT *obj, |
| 307 | const ASN1_OBJECT *obj, int type, | 285 | int type, const void *bytes, int len); |
| 308 | const void *bytes, int len); | 286 | int CMS_unsigned_add1_attr_by_NID(CMS_SignerInfo *si, int nid, int type, |
| 309 | int CMS_unsigned_add1_attr_by_NID(CMS_SignerInfo *si, | 287 | const void *bytes, int len); |
| 310 | int nid, int type, | 288 | int CMS_unsigned_add1_attr_by_txt(CMS_SignerInfo *si, const char *attrname, |
| 311 | const void *bytes, int len); | 289 | int type, const void *bytes, int len); |
| 312 | int CMS_unsigned_add1_attr_by_txt(CMS_SignerInfo *si, | ||
| 313 | const char *attrname, int type, | ||
| 314 | const void *bytes, int len); | ||
| 315 | void *CMS_unsigned_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, | 290 | void *CMS_unsigned_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, |
| 316 | int lastpos, int type); | 291 | int lastpos, int type); |
| 317 | 292 | ||
| 318 | #ifdef HEADER_X509V3_H | 293 | #ifdef HEADER_X509V3_H |
| 319 | 294 | ||
| 320 | int CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr); | 295 | int CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr); |
| 321 | CMS_ReceiptRequest *CMS_ReceiptRequest_create0(unsigned char *id, int idlen, | 296 | CMS_ReceiptRequest *CMS_ReceiptRequest_create0(unsigned char *id, int idlen, |
| 322 | int allorfirst, | 297 | int allorfirst, STACK_OF(GENERAL_NAMES) *receiptList, |
| 323 | STACK_OF(GENERAL_NAMES) *receiptList, | 298 | STACK_OF(GENERAL_NAMES) *receiptsTo); |
| 324 | STACK_OF(GENERAL_NAMES) *receiptsTo); | ||
| 325 | int CMS_add1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest *rr); | 299 | int CMS_add1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest *rr); |
| 326 | void CMS_ReceiptRequest_get0_values(CMS_ReceiptRequest *rr, | 300 | void CMS_ReceiptRequest_get0_values(CMS_ReceiptRequest *rr, ASN1_STRING **pcid, |
| 327 | ASN1_STRING **pcid, | 301 | int *pallorfirst, STACK_OF(GENERAL_NAMES) **plist, |
| 328 | int *pallorfirst, | 302 | STACK_OF(GENERAL_NAMES) **prto); |
| 329 | STACK_OF(GENERAL_NAMES) **plist, | ||
| 330 | STACK_OF(GENERAL_NAMES) **prto); | ||
| 331 | 303 | ||
| 332 | #endif | 304 | #endif |
| 333 | 305 | ||
diff --git a/src/lib/libcrypto/cms/cms_asn1.c b/src/lib/libcrypto/cms/cms_asn1.c index bd7466cc1d..a2b0217a93 100644 --- a/src/lib/libcrypto/cms/cms_asn1.c +++ b/src/lib/libcrypto/cms/cms_asn1.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * are met: | 10 | * are met: |
| 11 | * | 11 | * |
| 12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * | 14 | * |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
| @@ -57,7 +57,6 @@ | |||
| 57 | #include "cms.h" | 57 | #include "cms.h" |
| 58 | #include "cms_lcl.h" | 58 | #include "cms_lcl.h" |
| 59 | 59 | ||
| 60 | |||
| 61 | ASN1_SEQUENCE(CMS_IssuerAndSerialNumber) = { | 60 | ASN1_SEQUENCE(CMS_IssuerAndSerialNumber) = { |
| 62 | ASN1_SIMPLE(CMS_IssuerAndSerialNumber, issuer, X509_NAME), | 61 | ASN1_SIMPLE(CMS_IssuerAndSerialNumber, issuer, X509_NAME), |
| 63 | ASN1_SIMPLE(CMS_IssuerAndSerialNumber, serialNumber, ASN1_INTEGER) | 62 | ASN1_SIMPLE(CMS_IssuerAndSerialNumber, serialNumber, ASN1_INTEGER) |
| @@ -87,19 +86,18 @@ ASN1_NDEF_SEQUENCE(CMS_EncapsulatedContentInfo) = { | |||
| 87 | } ASN1_NDEF_SEQUENCE_END(CMS_EncapsulatedContentInfo) | 86 | } ASN1_NDEF_SEQUENCE_END(CMS_EncapsulatedContentInfo) |
| 88 | 87 | ||
| 89 | /* Minor tweak to operation: free up signer key, cert */ | 88 | /* Minor tweak to operation: free up signer key, cert */ |
| 90 | static int cms_si_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, | 89 | static int |
| 91 | void *exarg) | 90 | cms_si_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, void *exarg) |
| 92 | { | 91 | { |
| 93 | if(operation == ASN1_OP_FREE_POST) | 92 | if (operation == ASN1_OP_FREE_POST) { |
| 94 | { | ||
| 95 | CMS_SignerInfo *si = (CMS_SignerInfo *)*pval; | 93 | CMS_SignerInfo *si = (CMS_SignerInfo *)*pval; |
| 96 | if (si->pkey) | 94 | if (si->pkey) |
| 97 | EVP_PKEY_free(si->pkey); | 95 | EVP_PKEY_free(si->pkey); |
| 98 | if (si->signer) | 96 | if (si->signer) |
| 99 | X509_free(si->signer); | 97 | X509_free(si->signer); |
| 100 | } | ||
| 101 | return 1; | ||
| 102 | } | 98 | } |
| 99 | return 1; | ||
| 100 | } | ||
| 103 | 101 | ||
| 104 | ASN1_SEQUENCE_cb(CMS_SignerInfo, cms_si_cb) = { | 102 | ASN1_SEQUENCE_cb(CMS_SignerInfo, cms_si_cb) = { |
| 105 | ASN1_SIMPLE(CMS_SignerInfo, version, LONG), | 103 | ASN1_SIMPLE(CMS_SignerInfo, version, LONG), |
| @@ -160,8 +158,8 @@ ASN1_SEQUENCE(CMS_RecipientKeyIdentifier) = { | |||
| 160 | } ASN1_SEQUENCE_END(CMS_RecipientKeyIdentifier) | 158 | } ASN1_SEQUENCE_END(CMS_RecipientKeyIdentifier) |
| 161 | 159 | ||
| 162 | ASN1_CHOICE(CMS_KeyAgreeRecipientIdentifier) = { | 160 | ASN1_CHOICE(CMS_KeyAgreeRecipientIdentifier) = { |
| 163 | ASN1_SIMPLE(CMS_KeyAgreeRecipientIdentifier, d.issuerAndSerialNumber, CMS_IssuerAndSerialNumber), | 161 | ASN1_SIMPLE(CMS_KeyAgreeRecipientIdentifier, d.issuerAndSerialNumber, CMS_IssuerAndSerialNumber), |
| 164 | ASN1_IMP(CMS_KeyAgreeRecipientIdentifier, d.rKeyId, CMS_RecipientKeyIdentifier, 0) | 162 | ASN1_IMP(CMS_KeyAgreeRecipientIdentifier, d.rKeyId, CMS_RecipientKeyIdentifier, 0) |
| 165 | } ASN1_CHOICE_END(CMS_KeyAgreeRecipientIdentifier) | 163 | } ASN1_CHOICE_END(CMS_KeyAgreeRecipientIdentifier) |
| 166 | 164 | ||
| 167 | ASN1_SEQUENCE(CMS_RecipientEncryptedKey) = { | 165 | ASN1_SEQUENCE(CMS_RecipientEncryptedKey) = { |
| @@ -170,14 +168,14 @@ ASN1_SEQUENCE(CMS_RecipientEncryptedKey) = { | |||
| 170 | } ASN1_SEQUENCE_END(CMS_RecipientEncryptedKey) | 168 | } ASN1_SEQUENCE_END(CMS_RecipientEncryptedKey) |
| 171 | 169 | ||
| 172 | ASN1_SEQUENCE(CMS_OriginatorPublicKey) = { | 170 | ASN1_SEQUENCE(CMS_OriginatorPublicKey) = { |
| 173 | ASN1_SIMPLE(CMS_OriginatorPublicKey, algorithm, X509_ALGOR), | 171 | ASN1_SIMPLE(CMS_OriginatorPublicKey, algorithm, X509_ALGOR), |
| 174 | ASN1_SIMPLE(CMS_OriginatorPublicKey, publicKey, ASN1_BIT_STRING) | 172 | ASN1_SIMPLE(CMS_OriginatorPublicKey, publicKey, ASN1_BIT_STRING) |
| 175 | } ASN1_SEQUENCE_END(CMS_OriginatorPublicKey) | 173 | } ASN1_SEQUENCE_END(CMS_OriginatorPublicKey) |
| 176 | 174 | ||
| 177 | ASN1_CHOICE(CMS_OriginatorIdentifierOrKey) = { | 175 | ASN1_CHOICE(CMS_OriginatorIdentifierOrKey) = { |
| 178 | ASN1_SIMPLE(CMS_OriginatorIdentifierOrKey, d.issuerAndSerialNumber, CMS_IssuerAndSerialNumber), | 176 | ASN1_SIMPLE(CMS_OriginatorIdentifierOrKey, d.issuerAndSerialNumber, CMS_IssuerAndSerialNumber), |
| 179 | ASN1_IMP(CMS_OriginatorIdentifierOrKey, d.subjectKeyIdentifier, ASN1_OCTET_STRING, 0), | 177 | ASN1_IMP(CMS_OriginatorIdentifierOrKey, d.subjectKeyIdentifier, ASN1_OCTET_STRING, 0), |
| 180 | ASN1_IMP(CMS_OriginatorIdentifierOrKey, d.originatorKey, CMS_OriginatorPublicKey, 1) | 178 | ASN1_IMP(CMS_OriginatorIdentifierOrKey, d.originatorKey, CMS_OriginatorPublicKey, 1) |
| 181 | } ASN1_CHOICE_END(CMS_OriginatorIdentifierOrKey) | 179 | } ASN1_CHOICE_END(CMS_OriginatorIdentifierOrKey) |
| 182 | 180 | ||
| 183 | ASN1_SEQUENCE(CMS_KeyAgreeRecipientInfo) = { | 181 | ASN1_SEQUENCE(CMS_KeyAgreeRecipientInfo) = { |
| @@ -209,46 +207,38 @@ ASN1_SEQUENCE(CMS_PasswordRecipientInfo) = { | |||
| 209 | } ASN1_SEQUENCE_END(CMS_PasswordRecipientInfo) | 207 | } ASN1_SEQUENCE_END(CMS_PasswordRecipientInfo) |
| 210 | 208 | ||
| 211 | ASN1_SEQUENCE(CMS_OtherRecipientInfo) = { | 209 | ASN1_SEQUENCE(CMS_OtherRecipientInfo) = { |
| 212 | ASN1_SIMPLE(CMS_OtherRecipientInfo, oriType, ASN1_OBJECT), | 210 | ASN1_SIMPLE(CMS_OtherRecipientInfo, oriType, ASN1_OBJECT), |
| 213 | ASN1_OPT(CMS_OtherRecipientInfo, oriValue, ASN1_ANY) | 211 | ASN1_OPT(CMS_OtherRecipientInfo, oriValue, ASN1_ANY) |
| 214 | } ASN1_SEQUENCE_END(CMS_OtherRecipientInfo) | 212 | } ASN1_SEQUENCE_END(CMS_OtherRecipientInfo) |
| 215 | 213 | ||
| 216 | /* Free up RecipientInfo additional data */ | 214 | /* Free up RecipientInfo additional data */ |
| 217 | static int cms_ri_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, | 215 | static int |
| 218 | void *exarg) | 216 | cms_ri_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, void *exarg) |
| 219 | { | 217 | { |
| 220 | if(operation == ASN1_OP_FREE_PRE) | 218 | if (operation == ASN1_OP_FREE_PRE) { |
| 221 | { | ||
| 222 | CMS_RecipientInfo *ri = (CMS_RecipientInfo *)*pval; | 219 | CMS_RecipientInfo *ri = (CMS_RecipientInfo *)*pval; |
| 223 | if (ri->type == CMS_RECIPINFO_TRANS) | 220 | if (ri->type == CMS_RECIPINFO_TRANS) { |
| 224 | { | ||
| 225 | CMS_KeyTransRecipientInfo *ktri = ri->d.ktri; | 221 | CMS_KeyTransRecipientInfo *ktri = ri->d.ktri; |
| 226 | if (ktri->pkey) | 222 | if (ktri->pkey) |
| 227 | EVP_PKEY_free(ktri->pkey); | 223 | EVP_PKEY_free(ktri->pkey); |
| 228 | if (ktri->recip) | 224 | if (ktri->recip) |
| 229 | X509_free(ktri->recip); | 225 | X509_free(ktri->recip); |
| 230 | } | 226 | } else if (ri->type == CMS_RECIPINFO_KEK) { |
| 231 | else if (ri->type == CMS_RECIPINFO_KEK) | ||
| 232 | { | ||
| 233 | CMS_KEKRecipientInfo *kekri = ri->d.kekri; | 227 | CMS_KEKRecipientInfo *kekri = ri->d.kekri; |
| 234 | if (kekri->key) | 228 | if (kekri->key) { |
| 235 | { | ||
| 236 | OPENSSL_cleanse(kekri->key, kekri->keylen); | 229 | OPENSSL_cleanse(kekri->key, kekri->keylen); |
| 237 | free(kekri->key); | 230 | free(kekri->key); |
| 238 | } | ||
| 239 | } | 231 | } |
| 240 | else if (ri->type == CMS_RECIPINFO_PASS) | 232 | } else if (ri->type == CMS_RECIPINFO_PASS) { |
| 241 | { | ||
| 242 | CMS_PasswordRecipientInfo *pwri = ri->d.pwri; | 233 | CMS_PasswordRecipientInfo *pwri = ri->d.pwri; |
| 243 | if (pwri->pass) | 234 | if (pwri->pass) { |
| 244 | { | ||
| 245 | OPENSSL_cleanse(pwri->pass, pwri->passlen); | 235 | OPENSSL_cleanse(pwri->pass, pwri->passlen); |
| 246 | free(pwri->pass); | 236 | free(pwri->pass); |
| 247 | } | ||
| 248 | } | 237 | } |
| 249 | } | 238 | } |
| 250 | return 1; | ||
| 251 | } | 239 | } |
| 240 | return 1; | ||
| 241 | } | ||
| 252 | 242 | ||
| 253 | ASN1_CHOICE_cb(CMS_RecipientInfo, cms_ri_cb) = { | 243 | ASN1_CHOICE_cb(CMS_RecipientInfo, cms_ri_cb) = { |
| 254 | ASN1_SIMPLE(CMS_RecipientInfo, d.ktri, CMS_KeyTransRecipientInfo), | 244 | ASN1_SIMPLE(CMS_RecipientInfo, d.ktri, CMS_KeyTransRecipientInfo), |
| @@ -295,7 +285,7 @@ ASN1_NDEF_SEQUENCE(CMS_CompressedData) = { | |||
| 295 | ASN1_SIMPLE(CMS_CompressedData, version, LONG), | 285 | ASN1_SIMPLE(CMS_CompressedData, version, LONG), |
| 296 | ASN1_SIMPLE(CMS_CompressedData, compressionAlgorithm, X509_ALGOR), | 286 | ASN1_SIMPLE(CMS_CompressedData, compressionAlgorithm, X509_ALGOR), |
| 297 | ASN1_SIMPLE(CMS_CompressedData, encapContentInfo, CMS_EncapsulatedContentInfo), | 287 | ASN1_SIMPLE(CMS_CompressedData, encapContentInfo, CMS_EncapsulatedContentInfo), |
| 298 | } ASN1_NDEF_SEQUENCE_END(CMS_CompressedData) | 288 | } ASN1_NDEF_SEQUENCE_END(CMS_CompressedData) |
| 299 | 289 | ||
| 300 | /* This is the ANY DEFINED BY table for the top level ContentInfo structure */ | 290 | /* This is the ANY DEFINED BY table for the top level ContentInfo structure */ |
| 301 | 291 | ||
| @@ -312,36 +302,34 @@ ASN1_ADB(CMS_ContentInfo) = { | |||
| 312 | } ASN1_ADB_END(CMS_ContentInfo, 0, contentType, 0, &cms_default_tt, NULL); | 302 | } ASN1_ADB_END(CMS_ContentInfo, 0, contentType, 0, &cms_default_tt, NULL); |
| 313 | 303 | ||
| 314 | /* CMS streaming support */ | 304 | /* CMS streaming support */ |
| 315 | static int cms_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, | 305 | static int |
| 316 | void *exarg) | 306 | cms_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, void *exarg) |
| 317 | { | 307 | { |
| 318 | ASN1_STREAM_ARG *sarg = exarg; | 308 | ASN1_STREAM_ARG *sarg = exarg; |
| 319 | CMS_ContentInfo *cms = NULL; | 309 | CMS_ContentInfo *cms = NULL; |
| 310 | |||
| 320 | if (pval) | 311 | if (pval) |
| 321 | cms = (CMS_ContentInfo *)*pval; | 312 | cms = (CMS_ContentInfo *)*pval; |
| 322 | else | 313 | else |
| 323 | return 1; | 314 | return 1; |
| 324 | switch(operation) | ||
| 325 | { | ||
| 326 | 315 | ||
| 327 | case ASN1_OP_STREAM_PRE: | 316 | switch (operation) { |
| 317 | case ASN1_OP_STREAM_PRE: | ||
| 328 | if (CMS_stream(&sarg->boundary, cms) <= 0) | 318 | if (CMS_stream(&sarg->boundary, cms) <= 0) |
| 329 | return 0; | 319 | return 0; |
| 330 | case ASN1_OP_DETACHED_PRE: | 320 | case ASN1_OP_DETACHED_PRE: |
| 331 | sarg->ndef_bio = CMS_dataInit(cms, sarg->out); | 321 | sarg->ndef_bio = CMS_dataInit(cms, sarg->out); |
| 332 | if (!sarg->ndef_bio) | 322 | if (!sarg->ndef_bio) |
| 333 | return 0; | 323 | return 0; |
| 334 | break; | 324 | break; |
| 335 | 325 | case ASN1_OP_STREAM_POST: | |
| 336 | case ASN1_OP_STREAM_POST: | 326 | case ASN1_OP_DETACHED_POST: |
| 337 | case ASN1_OP_DETACHED_POST: | ||
| 338 | if (CMS_dataFinal(cms, sarg->ndef_bio) <= 0) | 327 | if (CMS_dataFinal(cms, sarg->ndef_bio) <= 0) |
| 339 | return 0; | 328 | return 0; |
| 340 | break; | 329 | break; |
| 341 | |||
| 342 | } | ||
| 343 | return 1; | ||
| 344 | } | 330 | } |
| 331 | return 1; | ||
| 332 | } | ||
| 345 | 333 | ||
| 346 | ASN1_NDEF_SEQUENCE_cb(CMS_ContentInfo, cms_cb) = { | 334 | ASN1_NDEF_SEQUENCE_cb(CMS_ContentInfo, cms_cb) = { |
| 347 | ASN1_SIMPLE(CMS_ContentInfo, contentType, ASN1_OBJECT), | 335 | ASN1_SIMPLE(CMS_ContentInfo, contentType, ASN1_OBJECT), |
| @@ -354,36 +342,33 @@ ASN1_NDEF_SEQUENCE_cb(CMS_ContentInfo, cms_cb) = { | |||
| 354 | * encoding. | 342 | * encoding. |
| 355 | */ | 343 | */ |
| 356 | 344 | ||
| 357 | ASN1_ITEM_TEMPLATE(CMS_Attributes_Sign) = | 345 | ASN1_ITEM_TEMPLATE(CMS_Attributes_Sign) = |
| 358 | ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SET_ORDER, 0, CMS_ATTRIBUTES, X509_ATTRIBUTE) | 346 | ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SET_ORDER, 0, CMS_ATTRIBUTES, X509_ATTRIBUTE) |
| 359 | ASN1_ITEM_TEMPLATE_END(CMS_Attributes_Sign) | 347 | ASN1_ITEM_TEMPLATE_END(CMS_Attributes_Sign) |
| 360 | 348 | ||
| 361 | /* When verifying attributes we need to use the received order. So | 349 | /* When verifying attributes we need to use the received order. So |
| 362 | * we use SEQUENCE OF and tag it to SET OF | 350 | * we use SEQUENCE OF and tag it to SET OF |
| 363 | */ | 351 | */ |
| 364 | 352 | ||
| 365 | ASN1_ITEM_TEMPLATE(CMS_Attributes_Verify) = | 353 | ASN1_ITEM_TEMPLATE(CMS_Attributes_Verify) = |
| 366 | ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_IMPTAG | ASN1_TFLG_UNIVERSAL, | 354 | ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_IMPTAG | ASN1_TFLG_UNIVERSAL, |
| 367 | V_ASN1_SET, CMS_ATTRIBUTES, X509_ATTRIBUTE) | 355 | V_ASN1_SET, CMS_ATTRIBUTES, X509_ATTRIBUTE) |
| 368 | ASN1_ITEM_TEMPLATE_END(CMS_Attributes_Verify) | 356 | ASN1_ITEM_TEMPLATE_END(CMS_Attributes_Verify) |
| 369 | 357 | ||
| 370 | |||
| 371 | |||
| 372 | ASN1_CHOICE(CMS_ReceiptsFrom) = { | 358 | ASN1_CHOICE(CMS_ReceiptsFrom) = { |
| 373 | ASN1_IMP(CMS_ReceiptsFrom, d.allOrFirstTier, LONG, 0), | 359 | ASN1_IMP(CMS_ReceiptsFrom, d.allOrFirstTier, LONG, 0), |
| 374 | ASN1_IMP_SEQUENCE_OF(CMS_ReceiptsFrom, d.receiptList, GENERAL_NAMES, 1) | 360 | ASN1_IMP_SEQUENCE_OF(CMS_ReceiptsFrom, d.receiptList, GENERAL_NAMES, 1) |
| 375 | } ASN1_CHOICE_END(CMS_ReceiptsFrom) | 361 | } ASN1_CHOICE_END(CMS_ReceiptsFrom) |
| 376 | 362 | ||
| 377 | ASN1_SEQUENCE(CMS_ReceiptRequest) = { | 363 | ASN1_SEQUENCE(CMS_ReceiptRequest) = { |
| 378 | ASN1_SIMPLE(CMS_ReceiptRequest, signedContentIdentifier, ASN1_OCTET_STRING), | 364 | ASN1_SIMPLE(CMS_ReceiptRequest, signedContentIdentifier, ASN1_OCTET_STRING), |
| 379 | ASN1_SIMPLE(CMS_ReceiptRequest, receiptsFrom, CMS_ReceiptsFrom), | 365 | ASN1_SIMPLE(CMS_ReceiptRequest, receiptsFrom, CMS_ReceiptsFrom), |
| 380 | ASN1_SEQUENCE_OF(CMS_ReceiptRequest, receiptsTo, GENERAL_NAMES) | 366 | ASN1_SEQUENCE_OF(CMS_ReceiptRequest, receiptsTo, GENERAL_NAMES) |
| 381 | } ASN1_SEQUENCE_END(CMS_ReceiptRequest) | 367 | } ASN1_SEQUENCE_END(CMS_ReceiptRequest) |
| 382 | 368 | ||
| 383 | ASN1_SEQUENCE(CMS_Receipt) = { | 369 | ASN1_SEQUENCE(CMS_Receipt) = { |
| 384 | ASN1_SIMPLE(CMS_Receipt, version, LONG), | 370 | ASN1_SIMPLE(CMS_Receipt, version, LONG), |
| 385 | ASN1_SIMPLE(CMS_Receipt, contentType, ASN1_OBJECT), | 371 | ASN1_SIMPLE(CMS_Receipt, contentType, ASN1_OBJECT), |
| 386 | ASN1_SIMPLE(CMS_Receipt, signedContentIdentifier, ASN1_OCTET_STRING), | 372 | ASN1_SIMPLE(CMS_Receipt, signedContentIdentifier, ASN1_OCTET_STRING), |
| 387 | ASN1_SIMPLE(CMS_Receipt, originatorSignatureValue, ASN1_OCTET_STRING) | 373 | ASN1_SIMPLE(CMS_Receipt, originatorSignatureValue, ASN1_OCTET_STRING) |
| 388 | } ASN1_SEQUENCE_END(CMS_Receipt) | 374 | } ASN1_SEQUENCE_END(CMS_Receipt) |
| 389 | |||
diff --git a/src/lib/libcrypto/cms/cms_att.c b/src/lib/libcrypto/cms/cms_att.c index 5b71722ebc..c6bc784fb8 100644 --- a/src/lib/libcrypto/cms/cms_att.c +++ b/src/lib/libcrypto/cms/cms_att.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * are met: | 10 | * are met: |
| 11 | * | 11 | * |
| 12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * | 14 | * |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
| @@ -60,134 +60,150 @@ | |||
| 60 | 60 | ||
| 61 | /* CMS SignedData Attribute utilities */ | 61 | /* CMS SignedData Attribute utilities */ |
| 62 | 62 | ||
| 63 | int CMS_signed_get_attr_count(const CMS_SignerInfo *si) | 63 | int |
| 64 | CMS_signed_get_attr_count(const CMS_SignerInfo *si) | ||
| 64 | { | 65 | { |
| 65 | return X509at_get_attr_count(si->signedAttrs); | 66 | return X509at_get_attr_count(si->signedAttrs); |
| 66 | } | 67 | } |
| 67 | 68 | ||
| 68 | int CMS_signed_get_attr_by_NID(const CMS_SignerInfo *si, int nid, | 69 | int |
| 69 | int lastpos) | 70 | CMS_signed_get_attr_by_NID(const CMS_SignerInfo *si, int nid, int lastpos) |
| 70 | { | 71 | { |
| 71 | return X509at_get_attr_by_NID(si->signedAttrs, nid, lastpos); | 72 | return X509at_get_attr_by_NID(si->signedAttrs, nid, lastpos); |
| 72 | } | 73 | } |
| 73 | 74 | ||
| 74 | int CMS_signed_get_attr_by_OBJ(const CMS_SignerInfo *si, ASN1_OBJECT *obj, | 75 | int |
| 75 | int lastpos) | 76 | CMS_signed_get_attr_by_OBJ(const CMS_SignerInfo *si, ASN1_OBJECT *obj, |
| 77 | int lastpos) | ||
| 76 | { | 78 | { |
| 77 | return X509at_get_attr_by_OBJ(si->signedAttrs, obj, lastpos); | 79 | return X509at_get_attr_by_OBJ(si->signedAttrs, obj, lastpos); |
| 78 | } | 80 | } |
| 79 | 81 | ||
| 80 | X509_ATTRIBUTE *CMS_signed_get_attr(const CMS_SignerInfo *si, int loc) | 82 | X509_ATTRIBUTE * |
| 83 | CMS_signed_get_attr(const CMS_SignerInfo *si, int loc) | ||
| 81 | { | 84 | { |
| 82 | return X509at_get_attr(si->signedAttrs, loc); | 85 | return X509at_get_attr(si->signedAttrs, loc); |
| 83 | } | 86 | } |
| 84 | 87 | ||
| 85 | X509_ATTRIBUTE *CMS_signed_delete_attr(CMS_SignerInfo *si, int loc) | 88 | X509_ATTRIBUTE * |
| 89 | CMS_signed_delete_attr(CMS_SignerInfo *si, int loc) | ||
| 86 | { | 90 | { |
| 87 | return X509at_delete_attr(si->signedAttrs, loc); | 91 | return X509at_delete_attr(si->signedAttrs, loc); |
| 88 | } | 92 | } |
| 89 | 93 | ||
| 90 | int CMS_signed_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr) | 94 | int |
| 95 | CMS_signed_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr) | ||
| 91 | { | 96 | { |
| 92 | if(X509at_add1_attr(&si->signedAttrs, attr)) return 1; | 97 | if (X509at_add1_attr(&si->signedAttrs, attr)) |
| 98 | return 1; | ||
| 93 | return 0; | 99 | return 0; |
| 94 | } | 100 | } |
| 95 | 101 | ||
| 96 | int CMS_signed_add1_attr_by_OBJ(CMS_SignerInfo *si, | 102 | int |
| 97 | const ASN1_OBJECT *obj, int type, | 103 | CMS_signed_add1_attr_by_OBJ(CMS_SignerInfo *si, const ASN1_OBJECT *obj, |
| 98 | const void *bytes, int len) | 104 | int type, const void *bytes, int len) |
| 99 | { | 105 | { |
| 100 | if(X509at_add1_attr_by_OBJ(&si->signedAttrs, obj, | 106 | if (X509at_add1_attr_by_OBJ(&si->signedAttrs, obj, type, bytes, len)) |
| 101 | type, bytes, len)) return 1; | 107 | return 1; |
| 102 | return 0; | 108 | return 0; |
| 103 | } | 109 | } |
| 104 | 110 | ||
| 105 | int CMS_signed_add1_attr_by_NID(CMS_SignerInfo *si, | 111 | int |
| 106 | int nid, int type, | 112 | CMS_signed_add1_attr_by_NID(CMS_SignerInfo *si, int nid, int type, |
| 107 | const void *bytes, int len) | 113 | const void *bytes, int len) |
| 108 | { | 114 | { |
| 109 | if(X509at_add1_attr_by_NID(&si->signedAttrs, nid, | 115 | if (X509at_add1_attr_by_NID(&si->signedAttrs, nid, type, bytes, len)) |
| 110 | type, bytes, len)) return 1; | 116 | return 1; |
| 111 | return 0; | 117 | return 0; |
| 112 | } | 118 | } |
| 113 | 119 | ||
| 114 | int CMS_signed_add1_attr_by_txt(CMS_SignerInfo *si, | 120 | int |
| 115 | const char *attrname, int type, | 121 | CMS_signed_add1_attr_by_txt(CMS_SignerInfo *si, const char *attrname, int type, |
| 116 | const void *bytes, int len) | 122 | const void *bytes, int len) |
| 117 | { | 123 | { |
| 118 | if(X509at_add1_attr_by_txt(&si->signedAttrs, attrname, | 124 | if (X509at_add1_attr_by_txt(&si->signedAttrs, attrname, type, |
| 119 | type, bytes, len)) return 1; | 125 | bytes, len)) |
| 126 | return 1; | ||
| 120 | return 0; | 127 | return 0; |
| 121 | } | 128 | } |
| 122 | 129 | ||
| 123 | void *CMS_signed_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, | 130 | void * |
| 124 | int lastpos, int type) | 131 | CMS_signed_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, int lastpos, |
| 132 | int type) | ||
| 125 | { | 133 | { |
| 126 | return X509at_get0_data_by_OBJ(si->signedAttrs, oid, lastpos, type); | 134 | return X509at_get0_data_by_OBJ(si->signedAttrs, oid, lastpos, type); |
| 127 | } | 135 | } |
| 128 | 136 | ||
| 129 | int CMS_unsigned_get_attr_count(const CMS_SignerInfo *si) | 137 | int |
| 138 | CMS_unsigned_get_attr_count(const CMS_SignerInfo *si) | ||
| 130 | { | 139 | { |
| 131 | return X509at_get_attr_count(si->unsignedAttrs); | 140 | return X509at_get_attr_count(si->unsignedAttrs); |
| 132 | } | 141 | } |
| 133 | 142 | ||
| 134 | int CMS_unsigned_get_attr_by_NID(const CMS_SignerInfo *si, int nid, | 143 | int |
| 135 | int lastpos) | 144 | CMS_unsigned_get_attr_by_NID(const CMS_SignerInfo *si, int nid, int lastpos) |
| 136 | { | 145 | { |
| 137 | return X509at_get_attr_by_NID(si->unsignedAttrs, nid, lastpos); | 146 | return X509at_get_attr_by_NID(si->unsignedAttrs, nid, lastpos); |
| 138 | } | 147 | } |
| 139 | 148 | ||
| 140 | int CMS_unsigned_get_attr_by_OBJ(const CMS_SignerInfo *si, ASN1_OBJECT *obj, | 149 | int |
| 141 | int lastpos) | 150 | CMS_unsigned_get_attr_by_OBJ(const CMS_SignerInfo *si, ASN1_OBJECT *obj, |
| 151 | int lastpos) | ||
| 142 | { | 152 | { |
| 143 | return X509at_get_attr_by_OBJ(si->unsignedAttrs, obj, lastpos); | 153 | return X509at_get_attr_by_OBJ(si->unsignedAttrs, obj, lastpos); |
| 144 | } | 154 | } |
| 145 | 155 | ||
| 146 | X509_ATTRIBUTE *CMS_unsigned_get_attr(const CMS_SignerInfo *si, int loc) | 156 | X509_ATTRIBUTE * |
| 157 | CMS_unsigned_get_attr(const CMS_SignerInfo *si, int loc) | ||
| 147 | { | 158 | { |
| 148 | return X509at_get_attr(si->unsignedAttrs, loc); | 159 | return X509at_get_attr(si->unsignedAttrs, loc); |
| 149 | } | 160 | } |
| 150 | 161 | ||
| 151 | X509_ATTRIBUTE *CMS_unsigned_delete_attr(CMS_SignerInfo *si, int loc) | 162 | X509_ATTRIBUTE * |
| 163 | CMS_unsigned_delete_attr(CMS_SignerInfo *si, int loc) | ||
| 152 | { | 164 | { |
| 153 | return X509at_delete_attr(si->unsignedAttrs, loc); | 165 | return X509at_delete_attr(si->unsignedAttrs, loc); |
| 154 | } | 166 | } |
| 155 | 167 | ||
| 156 | int CMS_unsigned_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr) | 168 | int |
| 169 | CMS_unsigned_add1_attr(CMS_SignerInfo *si, X509_ATTRIBUTE *attr) | ||
| 157 | { | 170 | { |
| 158 | if(X509at_add1_attr(&si->unsignedAttrs, attr)) return 1; | 171 | if (X509at_add1_attr(&si->unsignedAttrs, attr)) |
| 172 | return 1; | ||
| 159 | return 0; | 173 | return 0; |
| 160 | } | 174 | } |
| 161 | 175 | ||
| 162 | int CMS_unsigned_add1_attr_by_OBJ(CMS_SignerInfo *si, | 176 | int |
| 163 | const ASN1_OBJECT *obj, int type, | 177 | CMS_unsigned_add1_attr_by_OBJ(CMS_SignerInfo *si, const ASN1_OBJECT *obj, |
| 164 | const void *bytes, int len) | 178 | int type, const void *bytes, int len) |
| 165 | { | 179 | { |
| 166 | if(X509at_add1_attr_by_OBJ(&si->unsignedAttrs, obj, | 180 | if (X509at_add1_attr_by_OBJ(&si->unsignedAttrs, obj, type, bytes, len)) |
| 167 | type, bytes, len)) return 1; | 181 | return 1; |
| 168 | return 0; | 182 | return 0; |
| 169 | } | 183 | } |
| 170 | 184 | ||
| 171 | int CMS_unsigned_add1_attr_by_NID(CMS_SignerInfo *si, | 185 | int |
| 172 | int nid, int type, | 186 | CMS_unsigned_add1_attr_by_NID(CMS_SignerInfo *si, int nid, int type, |
| 173 | const void *bytes, int len) | 187 | const void *bytes, int len) |
| 174 | { | 188 | { |
| 175 | if(X509at_add1_attr_by_NID(&si->unsignedAttrs, nid, | 189 | if (X509at_add1_attr_by_NID(&si->unsignedAttrs, nid, type, bytes, len)) |
| 176 | type, bytes, len)) return 1; | 190 | return 1; |
| 177 | return 0; | 191 | return 0; |
| 178 | } | 192 | } |
| 179 | 193 | ||
| 180 | int CMS_unsigned_add1_attr_by_txt(CMS_SignerInfo *si, | 194 | int |
| 181 | const char *attrname, int type, | 195 | CMS_unsigned_add1_attr_by_txt(CMS_SignerInfo *si, const char *attrname, |
| 182 | const void *bytes, int len) | 196 | int type, const void *bytes, int len) |
| 183 | { | 197 | { |
| 184 | if(X509at_add1_attr_by_txt(&si->unsignedAttrs, attrname, | 198 | if (X509at_add1_attr_by_txt(&si->unsignedAttrs, attrname, type, |
| 185 | type, bytes, len)) return 1; | 199 | bytes, len)) |
| 200 | return 1; | ||
| 186 | return 0; | 201 | return 0; |
| 187 | } | 202 | } |
| 188 | 203 | ||
| 189 | void *CMS_unsigned_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, | 204 | void * |
| 190 | int lastpos, int type) | 205 | CMS_unsigned_get0_data_by_OBJ(CMS_SignerInfo *si, ASN1_OBJECT *oid, |
| 206 | int lastpos, int type) | ||
| 191 | { | 207 | { |
| 192 | return X509at_get0_data_by_OBJ(si->unsignedAttrs, oid, lastpos, type); | 208 | return X509at_get0_data_by_OBJ(si->unsignedAttrs, oid, lastpos, type); |
| 193 | } | 209 | } |
diff --git a/src/lib/libcrypto/cms/cms_cd.c b/src/lib/libcrypto/cms/cms_cd.c index 2021688101..ec48471df2 100644 --- a/src/lib/libcrypto/cms/cms_cd.c +++ b/src/lib/libcrypto/cms/cms_cd.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * are met: | 10 | * are met: |
| 11 | * | 11 | * |
| 12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * | 14 | * |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
| @@ -69,19 +69,20 @@ DECLARE_ASN1_ITEM(CMS_CompressedData) | |||
| 69 | 69 | ||
| 70 | /* CMS CompressedData Utilities */ | 70 | /* CMS CompressedData Utilities */ |
| 71 | 71 | ||
| 72 | CMS_ContentInfo *cms_CompressedData_create(int comp_nid) | 72 | CMS_ContentInfo * |
| 73 | { | 73 | cms_CompressedData_create(int comp_nid) |
| 74 | { | ||
| 74 | CMS_ContentInfo *cms; | 75 | CMS_ContentInfo *cms; |
| 75 | CMS_CompressedData *cd; | 76 | CMS_CompressedData *cd; |
| 77 | |||
| 76 | /* Will need something cleverer if there is ever more than one | 78 | /* Will need something cleverer if there is ever more than one |
| 77 | * compression algorithm or parameters have some meaning... | 79 | * compression algorithm or parameters have some meaning... |
| 78 | */ | 80 | */ |
| 79 | if (comp_nid != NID_zlib_compression) | 81 | if (comp_nid != NID_zlib_compression) { |
| 80 | { | ||
| 81 | CMSerr(CMS_F_CMS_COMPRESSEDDATA_CREATE, | 82 | CMSerr(CMS_F_CMS_COMPRESSEDDATA_CREATE, |
| 82 | CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM); | 83 | CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM); |
| 83 | return NULL; | 84 | return NULL; |
| 84 | } | 85 | } |
| 85 | cms = CMS_ContentInfo_new(); | 86 | cms = CMS_ContentInfo_new(); |
| 86 | if (!cms) | 87 | if (!cms) |
| 87 | return NULL; | 88 | return NULL; |
| @@ -97,40 +98,38 @@ CMS_ContentInfo *cms_CompressedData_create(int comp_nid) | |||
| 97 | cd->version = 0; | 98 | cd->version = 0; |
| 98 | 99 | ||
| 99 | X509_ALGOR_set0(cd->compressionAlgorithm, | 100 | X509_ALGOR_set0(cd->compressionAlgorithm, |
| 100 | OBJ_nid2obj(NID_zlib_compression), | 101 | OBJ_nid2obj(NID_zlib_compression), |
| 101 | V_ASN1_UNDEF, NULL); | 102 | V_ASN1_UNDEF, NULL); |
| 102 | 103 | ||
| 103 | cd->encapContentInfo->eContentType = OBJ_nid2obj(NID_pkcs7_data); | 104 | cd->encapContentInfo->eContentType = OBJ_nid2obj(NID_pkcs7_data); |
| 104 | 105 | ||
| 105 | return cms; | 106 | return cms; |
| 106 | 107 | ||
| 107 | err: | 108 | err: |
| 108 | |||
| 109 | if (cms) | 109 | if (cms) |
| 110 | CMS_ContentInfo_free(cms); | 110 | CMS_ContentInfo_free(cms); |
| 111 | |||
| 112 | return NULL; | 111 | return NULL; |
| 113 | } | 112 | } |
| 114 | 113 | ||
| 115 | BIO *cms_CompressedData_init_bio(CMS_ContentInfo *cms) | 114 | BIO * |
| 116 | { | 115 | cms_CompressedData_init_bio(CMS_ContentInfo *cms) |
| 116 | { | ||
| 117 | CMS_CompressedData *cd; | 117 | CMS_CompressedData *cd; |
| 118 | ASN1_OBJECT *compoid; | 118 | ASN1_OBJECT *compoid; |
| 119 | if (OBJ_obj2nid(cms->contentType) != NID_id_smime_ct_compressedData) | 119 | |
| 120 | { | 120 | if (OBJ_obj2nid(cms->contentType) != NID_id_smime_ct_compressedData) { |
| 121 | CMSerr(CMS_F_CMS_COMPRESSEDDATA_INIT_BIO, | 121 | CMSerr(CMS_F_CMS_COMPRESSEDDATA_INIT_BIO, |
| 122 | CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA); | 122 | CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA); |
| 123 | return NULL; | 123 | return NULL; |
| 124 | } | 124 | } |
| 125 | cd = cms->d.compressedData; | 125 | cd = cms->d.compressedData; |
| 126 | X509_ALGOR_get0(&compoid, NULL, NULL, cd->compressionAlgorithm); | 126 | X509_ALGOR_get0(&compoid, NULL, NULL, cd->compressionAlgorithm); |
| 127 | if (OBJ_obj2nid(compoid) != NID_zlib_compression) | 127 | if (OBJ_obj2nid(compoid) != NID_zlib_compression) { |
| 128 | { | ||
| 129 | CMSerr(CMS_F_CMS_COMPRESSEDDATA_INIT_BIO, | 128 | CMSerr(CMS_F_CMS_COMPRESSEDDATA_INIT_BIO, |
| 130 | CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM); | 129 | CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM); |
| 131 | return NULL; | 130 | return NULL; |
| 132 | } | ||
| 133 | return BIO_new(BIO_f_zlib()); | ||
| 134 | } | 131 | } |
| 132 | return BIO_new(BIO_f_zlib()); | ||
| 133 | } | ||
| 135 | 134 | ||
| 136 | #endif | 135 | #endif |
diff --git a/src/lib/libcrypto/cms/cms_dd.c b/src/lib/libcrypto/cms/cms_dd.c index 8919c15be1..f115d2274b 100644 --- a/src/lib/libcrypto/cms/cms_dd.c +++ b/src/lib/libcrypto/cms/cms_dd.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * are met: | 10 | * are met: |
| 11 | * | 11 | * |
| 12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * | 14 | * |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
| @@ -63,10 +63,12 @@ DECLARE_ASN1_ITEM(CMS_DigestedData) | |||
| 63 | 63 | ||
| 64 | /* CMS DigestedData Utilities */ | 64 | /* CMS DigestedData Utilities */ |
| 65 | 65 | ||
| 66 | CMS_ContentInfo *cms_DigestedData_create(const EVP_MD *md) | 66 | CMS_ContentInfo * |
| 67 | { | 67 | cms_DigestedData_create(const EVP_MD *md) |
| 68 | { | ||
| 68 | CMS_ContentInfo *cms; | 69 | CMS_ContentInfo *cms; |
| 69 | CMS_DigestedData *dd; | 70 | CMS_DigestedData *dd; |
| 71 | |||
| 70 | cms = CMS_ContentInfo_new(); | 72 | cms = CMS_ContentInfo_new(); |
| 71 | if (!cms) | 73 | if (!cms) |
| 72 | return NULL; | 74 | return NULL; |
| @@ -86,28 +88,30 @@ CMS_ContentInfo *cms_DigestedData_create(const EVP_MD *md) | |||
| 86 | 88 | ||
| 87 | return cms; | 89 | return cms; |
| 88 | 90 | ||
| 89 | err: | 91 | err: |
| 90 | |||
| 91 | if (cms) | 92 | if (cms) |
| 92 | CMS_ContentInfo_free(cms); | 93 | CMS_ContentInfo_free(cms); |
| 93 | |||
| 94 | return NULL; | 94 | return NULL; |
| 95 | } | 95 | } |
| 96 | 96 | ||
| 97 | BIO *cms_DigestedData_init_bio(CMS_ContentInfo *cms) | 97 | BIO * |
| 98 | { | 98 | cms_DigestedData_init_bio(CMS_ContentInfo *cms) |
| 99 | { | ||
| 99 | CMS_DigestedData *dd; | 100 | CMS_DigestedData *dd; |
| 101 | |||
| 100 | dd = cms->d.digestedData; | 102 | dd = cms->d.digestedData; |
| 101 | return cms_DigestAlgorithm_init_bio(dd->digestAlgorithm); | 103 | return cms_DigestAlgorithm_init_bio(dd->digestAlgorithm); |
| 102 | } | 104 | } |
| 103 | 105 | ||
| 104 | int cms_DigestedData_do_final(CMS_ContentInfo *cms, BIO *chain, int verify) | 106 | int |
| 105 | { | 107 | cms_DigestedData_do_final(CMS_ContentInfo *cms, BIO *chain, int verify) |
| 108 | { | ||
| 106 | EVP_MD_CTX mctx; | 109 | EVP_MD_CTX mctx; |
| 107 | unsigned char md[EVP_MAX_MD_SIZE]; | 110 | unsigned char md[EVP_MAX_MD_SIZE]; |
| 108 | unsigned int mdlen; | 111 | unsigned int mdlen; |
| 109 | int r = 0; | 112 | int r = 0; |
| 110 | CMS_DigestedData *dd; | 113 | CMS_DigestedData *dd; |
| 114 | |||
| 111 | EVP_MD_CTX_init(&mctx); | 115 | EVP_MD_CTX_init(&mctx); |
| 112 | 116 | ||
| 113 | dd = cms->d.digestedData; | 117 | dd = cms->d.digestedData; |
| @@ -118,31 +122,26 @@ int cms_DigestedData_do_final(CMS_ContentInfo *cms, BIO *chain, int verify) | |||
| 118 | if (EVP_DigestFinal_ex(&mctx, md, &mdlen) <= 0) | 122 | if (EVP_DigestFinal_ex(&mctx, md, &mdlen) <= 0) |
| 119 | goto err; | 123 | goto err; |
| 120 | 124 | ||
| 121 | if (verify) | 125 | if (verify) { |
| 122 | { | 126 | if (mdlen != (unsigned int)dd->digest->length) { |
| 123 | if (mdlen != (unsigned int)dd->digest->length) | ||
| 124 | { | ||
| 125 | CMSerr(CMS_F_CMS_DIGESTEDDATA_DO_FINAL, | 127 | CMSerr(CMS_F_CMS_DIGESTEDDATA_DO_FINAL, |
| 126 | CMS_R_MESSAGEDIGEST_WRONG_LENGTH); | 128 | CMS_R_MESSAGEDIGEST_WRONG_LENGTH); |
| 127 | goto err; | 129 | goto err; |
| 128 | } | 130 | } |
| 129 | 131 | ||
| 130 | if (memcmp(md, dd->digest->data, mdlen)) | 132 | if (memcmp(md, dd->digest->data, mdlen)) |
| 131 | CMSerr(CMS_F_CMS_DIGESTEDDATA_DO_FINAL, | 133 | CMSerr(CMS_F_CMS_DIGESTEDDATA_DO_FINAL, |
| 132 | CMS_R_VERIFICATION_FAILURE); | 134 | CMS_R_VERIFICATION_FAILURE); |
| 133 | else | 135 | else |
| 134 | r = 1; | 136 | r = 1; |
| 135 | } | 137 | } else { |
| 136 | else | ||
| 137 | { | ||
| 138 | if (!ASN1_STRING_set(dd->digest, md, mdlen)) | 138 | if (!ASN1_STRING_set(dd->digest, md, mdlen)) |
| 139 | goto err; | 139 | goto err; |
| 140 | r = 1; | 140 | r = 1; |
| 141 | } | 141 | } |
| 142 | 142 | ||
| 143 | err: | 143 | err: |
| 144 | EVP_MD_CTX_cleanup(&mctx); | 144 | EVP_MD_CTX_cleanup(&mctx); |
| 145 | 145 | ||
| 146 | return r; | 146 | return r; |
| 147 | 147 | } | |
| 148 | } | ||
diff --git a/src/lib/libcrypto/cms/cms_enc.c b/src/lib/libcrypto/cms/cms_enc.c index 612fce6dde..75e08cdb1d 100644 --- a/src/lib/libcrypto/cms/cms_enc.c +++ b/src/lib/libcrypto/cms/cms_enc.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * are met: | 10 | * are met: |
| 11 | * | 11 | * |
| 12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * | 14 | * |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
| @@ -66,8 +66,9 @@ DECLARE_ASN1_ITEM(CMS_EncryptedData) | |||
| 66 | 66 | ||
| 67 | /* Return BIO based on EncryptedContentInfo and key */ | 67 | /* Return BIO based on EncryptedContentInfo and key */ |
| 68 | 68 | ||
| 69 | BIO *cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec) | 69 | BIO * |
| 70 | { | 70 | cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec) |
| 71 | { | ||
| 71 | BIO *b; | 72 | BIO *b; |
| 72 | EVP_CIPHER_CTX *ctx; | 73 | EVP_CIPHER_CTX *ctx; |
| 73 | const EVP_CIPHER *ciph; | 74 | const EVP_CIPHER *ciph; |
| @@ -75,87 +76,72 @@ BIO *cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec) | |||
| 75 | unsigned char iv[EVP_MAX_IV_LENGTH], *piv = NULL; | 76 | unsigned char iv[EVP_MAX_IV_LENGTH], *piv = NULL; |
| 76 | unsigned char *tkey = NULL; | 77 | unsigned char *tkey = NULL; |
| 77 | size_t tkeylen = 0; | 78 | size_t tkeylen = 0; |
| 78 | |||
| 79 | int ok = 0; | 79 | int ok = 0; |
| 80 | |||
| 81 | int enc, keep_key = 0; | 80 | int enc, keep_key = 0; |
| 82 | 81 | ||
| 83 | enc = ec->cipher ? 1 : 0; | 82 | enc = ec->cipher ? 1 : 0; |
| 84 | 83 | ||
| 85 | b = BIO_new(BIO_f_cipher()); | 84 | b = BIO_new(BIO_f_cipher()); |
| 86 | if (!b) | 85 | if (!b) { |
| 87 | { | ||
| 88 | CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, | 86 | CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, |
| 89 | ERR_R_MALLOC_FAILURE); | 87 | ERR_R_MALLOC_FAILURE); |
| 90 | return NULL; | 88 | return NULL; |
| 91 | } | 89 | } |
| 92 | 90 | ||
| 93 | BIO_get_cipher_ctx(b, &ctx); | 91 | BIO_get_cipher_ctx(b, &ctx); |
| 94 | 92 | ||
| 95 | if (enc) | 93 | if (enc) { |
| 96 | { | ||
| 97 | ciph = ec->cipher; | 94 | ciph = ec->cipher; |
| 98 | /* If not keeping key set cipher to NULL so subsequent calls | 95 | /* If not keeping key set cipher to NULL so subsequent calls |
| 99 | * decrypt. | 96 | * decrypt. |
| 100 | */ | 97 | */ |
| 101 | if (ec->key) | 98 | if (ec->key) |
| 102 | ec->cipher = NULL; | 99 | ec->cipher = NULL; |
| 103 | } | 100 | } else { |
| 104 | else | ||
| 105 | { | ||
| 106 | ciph = EVP_get_cipherbyobj(calg->algorithm); | 101 | ciph = EVP_get_cipherbyobj(calg->algorithm); |
| 107 | 102 | ||
| 108 | if (!ciph) | 103 | if (!ciph) { |
| 109 | { | ||
| 110 | CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, | 104 | CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, |
| 111 | CMS_R_UNKNOWN_CIPHER); | 105 | CMS_R_UNKNOWN_CIPHER); |
| 112 | goto err; | 106 | goto err; |
| 113 | } | ||
| 114 | } | 107 | } |
| 108 | } | ||
| 115 | 109 | ||
| 116 | if (EVP_CipherInit_ex(ctx, ciph, NULL, NULL, NULL, enc) <= 0) | 110 | if (EVP_CipherInit_ex(ctx, ciph, NULL, NULL, NULL, enc) <= 0) { |
| 117 | { | ||
| 118 | CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, | 111 | CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, |
| 119 | CMS_R_CIPHER_INITIALISATION_ERROR); | 112 | CMS_R_CIPHER_INITIALISATION_ERROR); |
| 120 | goto err; | 113 | goto err; |
| 121 | } | 114 | } |
| 122 | 115 | ||
| 123 | if (enc) | 116 | if (enc) { |
| 124 | { | ||
| 125 | int ivlen; | 117 | int ivlen; |
| 126 | calg->algorithm = OBJ_nid2obj(EVP_CIPHER_CTX_type(ctx)); | 118 | calg->algorithm = OBJ_nid2obj(EVP_CIPHER_CTX_type(ctx)); |
| 127 | /* Generate a random IV if we need one */ | 119 | /* Generate a random IV if we need one */ |
| 128 | ivlen = EVP_CIPHER_CTX_iv_length(ctx); | 120 | ivlen = EVP_CIPHER_CTX_iv_length(ctx); |
| 129 | if (ivlen > 0) | 121 | if (ivlen > 0) { |
| 130 | { | ||
| 131 | if (RAND_pseudo_bytes(iv, ivlen) <= 0) | 122 | if (RAND_pseudo_bytes(iv, ivlen) <= 0) |
| 132 | goto err; | 123 | goto err; |
| 133 | piv = iv; | 124 | piv = iv; |
| 134 | } | ||
| 135 | } | 125 | } |
| 136 | else if (EVP_CIPHER_asn1_to_param(ctx, calg->parameter) <= 0) | 126 | } else if (EVP_CIPHER_asn1_to_param(ctx, calg->parameter) <= 0) { |
| 137 | { | ||
| 138 | CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, | 127 | CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, |
| 139 | CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR); | 128 | CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR); |
| 140 | goto err; | 129 | goto err; |
| 141 | } | 130 | } |
| 142 | tkeylen = EVP_CIPHER_CTX_key_length(ctx); | 131 | tkeylen = EVP_CIPHER_CTX_key_length(ctx); |
| 143 | /* Generate random session key */ | 132 | /* Generate random session key */ |
| 144 | if (!enc || !ec->key) | 133 | if (!enc || !ec->key) { |
| 145 | { | ||
| 146 | tkey = malloc(tkeylen); | 134 | tkey = malloc(tkeylen); |
| 147 | if (!tkey) | 135 | if (!tkey) { |
| 148 | { | ||
| 149 | CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, | 136 | CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, |
| 150 | ERR_R_MALLOC_FAILURE); | 137 | ERR_R_MALLOC_FAILURE); |
| 151 | goto err; | 138 | goto err; |
| 152 | } | 139 | } |
| 153 | if (EVP_CIPHER_CTX_rand_key(ctx, tkey) <= 0) | 140 | if (EVP_CIPHER_CTX_rand_key(ctx, tkey) <= 0) |
| 154 | goto err; | 141 | goto err; |
| 155 | } | 142 | } |
| 156 | 143 | ||
| 157 | if (!ec->key) | 144 | if (!ec->key) { |
| 158 | { | ||
| 159 | ec->key = tkey; | 145 | ec->key = tkey; |
| 160 | ec->keylen = tkeylen; | 146 | ec->keylen = tkeylen; |
| 161 | tkey = NULL; | 147 | tkey = NULL; |
| @@ -163,25 +149,20 @@ BIO *cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec) | |||
| 163 | keep_key = 1; | 149 | keep_key = 1; |
| 164 | else | 150 | else |
| 165 | ERR_clear_error(); | 151 | ERR_clear_error(); |
| 166 | |||
| 167 | } | ||
| 168 | 152 | ||
| 169 | if (ec->keylen != tkeylen) | 153 | } |
| 170 | { | 154 | |
| 155 | if (ec->keylen != tkeylen) { | ||
| 171 | /* If necessary set key length */ | 156 | /* If necessary set key length */ |
| 172 | if (EVP_CIPHER_CTX_set_key_length(ctx, ec->keylen) <= 0) | 157 | if (EVP_CIPHER_CTX_set_key_length(ctx, ec->keylen) <= 0) { |
| 173 | { | ||
| 174 | /* Only reveal failure if debugging so we don't | 158 | /* Only reveal failure if debugging so we don't |
| 175 | * leak information which may be useful in MMA. | 159 | * leak information which may be useful in MMA. |
| 176 | */ | 160 | */ |
| 177 | if (enc || ec->debug) | 161 | if (enc || ec->debug) { |
| 178 | { | ||
| 179 | CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, | 162 | CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, |
| 180 | CMS_R_INVALID_KEY_LENGTH); | 163 | CMS_R_INVALID_KEY_LENGTH); |
| 181 | goto err; | 164 | goto err; |
| 182 | } | 165 | } else { |
| 183 | else | ||
| 184 | { | ||
| 185 | /* Use random key */ | 166 | /* Use random key */ |
| 186 | OPENSSL_cleanse(ec->key, ec->keylen); | 167 | OPENSSL_cleanse(ec->key, ec->keylen); |
| 187 | free(ec->key); | 168 | free(ec->key); |
| @@ -189,106 +170,98 @@ BIO *cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec) | |||
| 189 | ec->keylen = tkeylen; | 170 | ec->keylen = tkeylen; |
| 190 | tkey = NULL; | 171 | tkey = NULL; |
| 191 | ERR_clear_error(); | 172 | ERR_clear_error(); |
| 192 | } | ||
| 193 | } | 173 | } |
| 194 | } | 174 | } |
| 175 | } | ||
| 195 | 176 | ||
| 196 | if (EVP_CipherInit_ex(ctx, NULL, NULL, ec->key, piv, enc) <= 0) | 177 | if (EVP_CipherInit_ex(ctx, NULL, NULL, ec->key, piv, enc) <= 0) { |
| 197 | { | ||
| 198 | CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, | 178 | CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, |
| 199 | CMS_R_CIPHER_INITIALISATION_ERROR); | 179 | CMS_R_CIPHER_INITIALISATION_ERROR); |
| 200 | goto err; | 180 | goto err; |
| 201 | } | 181 | } |
| 202 | 182 | ||
| 203 | if (piv) | 183 | if (piv) { |
| 204 | { | ||
| 205 | calg->parameter = ASN1_TYPE_new(); | 184 | calg->parameter = ASN1_TYPE_new(); |
| 206 | if (!calg->parameter) | 185 | if (!calg->parameter) { |
| 207 | { | ||
| 208 | CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, | 186 | CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, |
| 209 | ERR_R_MALLOC_FAILURE); | 187 | ERR_R_MALLOC_FAILURE); |
| 210 | goto err; | 188 | goto err; |
| 211 | } | 189 | } |
| 212 | if (EVP_CIPHER_param_to_asn1(ctx, calg->parameter) <= 0) | 190 | if (EVP_CIPHER_param_to_asn1(ctx, calg->parameter) <= 0) { |
| 213 | { | ||
| 214 | CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, | 191 | CMSerr(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO, |
| 215 | CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR); | 192 | CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR); |
| 216 | goto err; | 193 | goto err; |
| 217 | } | ||
| 218 | } | 194 | } |
| 195 | } | ||
| 219 | ok = 1; | 196 | ok = 1; |
| 220 | 197 | ||
| 221 | err: | 198 | err: |
| 222 | if (ec->key && !keep_key) | 199 | if (ec->key && !keep_key) { |
| 223 | { | ||
| 224 | OPENSSL_cleanse(ec->key, ec->keylen); | 200 | OPENSSL_cleanse(ec->key, ec->keylen); |
| 225 | free(ec->key); | 201 | free(ec->key); |
| 226 | ec->key = NULL; | 202 | ec->key = NULL; |
| 227 | } | 203 | } |
| 228 | if (tkey) | 204 | if (tkey) { |
| 229 | { | ||
| 230 | OPENSSL_cleanse(tkey, tkeylen); | 205 | OPENSSL_cleanse(tkey, tkeylen); |
| 231 | free(tkey); | 206 | free(tkey); |
| 232 | } | 207 | } |
| 233 | if (ok) | 208 | if (ok) |
| 234 | return b; | 209 | return b; |
| 235 | BIO_free(b); | 210 | BIO_free(b); |
| 236 | return NULL; | 211 | return NULL; |
| 237 | } | 212 | } |
| 238 | 213 | ||
| 239 | int cms_EncryptedContent_init(CMS_EncryptedContentInfo *ec, | 214 | int |
| 240 | const EVP_CIPHER *cipher, | 215 | cms_EncryptedContent_init(CMS_EncryptedContentInfo *ec, |
| 241 | const unsigned char *key, size_t keylen) | 216 | const EVP_CIPHER *cipher, const unsigned char *key, size_t keylen) |
| 242 | { | 217 | { |
| 243 | ec->cipher = cipher; | 218 | ec->cipher = cipher; |
| 244 | if (key) | 219 | if (key) { |
| 245 | { | ||
| 246 | ec->key = malloc(keylen); | 220 | ec->key = malloc(keylen); |
| 247 | if (!ec->key) | 221 | if (!ec->key) |
| 248 | return 0; | 222 | return 0; |
| 249 | memcpy(ec->key, key, keylen); | 223 | memcpy(ec->key, key, keylen); |
| 250 | } | 224 | } |
| 251 | ec->keylen = keylen; | 225 | ec->keylen = keylen; |
| 252 | if (cipher) | 226 | if (cipher) |
| 253 | ec->contentType = OBJ_nid2obj(NID_pkcs7_data); | 227 | ec->contentType = OBJ_nid2obj(NID_pkcs7_data); |
| 254 | return 1; | 228 | return 1; |
| 255 | } | 229 | } |
| 256 | 230 | ||
| 257 | int CMS_EncryptedData_set1_key(CMS_ContentInfo *cms, const EVP_CIPHER *ciph, | 231 | int |
| 258 | const unsigned char *key, size_t keylen) | 232 | CMS_EncryptedData_set1_key(CMS_ContentInfo *cms, const EVP_CIPHER *ciph, |
| 259 | { | 233 | const unsigned char *key, size_t keylen) |
| 234 | { | ||
| 260 | CMS_EncryptedContentInfo *ec; | 235 | CMS_EncryptedContentInfo *ec; |
| 261 | if (!key || !keylen) | 236 | |
| 262 | { | 237 | if (!key || !keylen) { |
| 263 | CMSerr(CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY, CMS_R_NO_KEY); | 238 | CMSerr(CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY, CMS_R_NO_KEY); |
| 264 | return 0; | 239 | return 0; |
| 265 | } | 240 | } |
| 266 | if (ciph) | 241 | if (ciph) { |
| 267 | { | ||
| 268 | cms->d.encryptedData = M_ASN1_new_of(CMS_EncryptedData); | 242 | cms->d.encryptedData = M_ASN1_new_of(CMS_EncryptedData); |
| 269 | if (!cms->d.encryptedData) | 243 | if (!cms->d.encryptedData) { |
| 270 | { | ||
| 271 | CMSerr(CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY, | 244 | CMSerr(CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY, |
| 272 | ERR_R_MALLOC_FAILURE); | 245 | ERR_R_MALLOC_FAILURE); |
| 273 | return 0; | 246 | return 0; |
| 274 | } | 247 | } |
| 275 | cms->contentType = OBJ_nid2obj(NID_pkcs7_encrypted); | 248 | cms->contentType = OBJ_nid2obj(NID_pkcs7_encrypted); |
| 276 | cms->d.encryptedData->version = 0; | 249 | cms->d.encryptedData->version = 0; |
| 277 | } | 250 | } else if (OBJ_obj2nid(cms->contentType) != NID_pkcs7_encrypted) { |
| 278 | else if (OBJ_obj2nid(cms->contentType) != NID_pkcs7_encrypted) | ||
| 279 | { | ||
| 280 | CMSerr(CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY, | 251 | CMSerr(CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY, |
| 281 | CMS_R_NOT_ENCRYPTED_DATA); | 252 | CMS_R_NOT_ENCRYPTED_DATA); |
| 282 | return 0; | 253 | return 0; |
| 283 | } | 254 | } |
| 284 | ec = cms->d.encryptedData->encryptedContentInfo; | 255 | ec = cms->d.encryptedData->encryptedContentInfo; |
| 285 | return cms_EncryptedContent_init(ec, ciph, key, keylen); | 256 | return cms_EncryptedContent_init(ec, ciph, key, keylen); |
| 286 | } | 257 | } |
| 287 | 258 | ||
| 288 | BIO *cms_EncryptedData_init_bio(CMS_ContentInfo *cms) | 259 | BIO * |
| 289 | { | 260 | cms_EncryptedData_init_bio(CMS_ContentInfo *cms) |
| 261 | { | ||
| 290 | CMS_EncryptedData *enc = cms->d.encryptedData; | 262 | CMS_EncryptedData *enc = cms->d.encryptedData; |
| 263 | |||
| 291 | if (enc->encryptedContentInfo->cipher && enc->unprotectedAttrs) | 264 | if (enc->encryptedContentInfo->cipher && enc->unprotectedAttrs) |
| 292 | enc->version = 2; | 265 | enc->version = 2; |
| 293 | return cms_EncryptedContent_init_bio(enc->encryptedContentInfo); | 266 | return cms_EncryptedContent_init_bio(enc->encryptedContentInfo); |
| 294 | } | 267 | } |
diff --git a/src/lib/libcrypto/cms/cms_env.c b/src/lib/libcrypto/cms/cms_env.c index 5e6e7033b2..a274e26226 100644 --- a/src/lib/libcrypto/cms/cms_env.c +++ b/src/lib/libcrypto/cms/cms_env.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * are met: | 10 | * are met: |
| 11 | * | 11 | * |
| 12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * | 14 | * |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
| @@ -71,56 +71,59 @@ DECLARE_ASN1_ITEM(CMS_OtherKeyAttribute) | |||
| 71 | 71 | ||
| 72 | DECLARE_STACK_OF(CMS_RecipientInfo) | 72 | DECLARE_STACK_OF(CMS_RecipientInfo) |
| 73 | 73 | ||
| 74 | CMS_EnvelopedData *cms_get0_enveloped(CMS_ContentInfo *cms) | 74 | CMS_EnvelopedData * |
| 75 | { | 75 | cms_get0_enveloped(CMS_ContentInfo *cms) |
| 76 | if (OBJ_obj2nid(cms->contentType) != NID_pkcs7_enveloped) | 76 | { |
| 77 | { | 77 | if (OBJ_obj2nid(cms->contentType) != NID_pkcs7_enveloped) { |
| 78 | CMSerr(CMS_F_CMS_GET0_ENVELOPED, | 78 | CMSerr(CMS_F_CMS_GET0_ENVELOPED, |
| 79 | CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA); | 79 | CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA); |
| 80 | return NULL; | 80 | return NULL; |
| 81 | } | ||
| 82 | return cms->d.envelopedData; | ||
| 83 | } | 81 | } |
| 82 | return cms->d.envelopedData; | ||
| 83 | } | ||
| 84 | 84 | ||
| 85 | static CMS_EnvelopedData *cms_enveloped_data_init(CMS_ContentInfo *cms) | 85 | static CMS_EnvelopedData * |
| 86 | { | 86 | cms_enveloped_data_init(CMS_ContentInfo *cms) |
| 87 | if (cms->d.other == NULL) | 87 | { |
| 88 | { | 88 | if (cms->d.other == NULL) { |
| 89 | cms->d.envelopedData = M_ASN1_new_of(CMS_EnvelopedData); | 89 | cms->d.envelopedData = M_ASN1_new_of(CMS_EnvelopedData); |
| 90 | if (!cms->d.envelopedData) | 90 | if (!cms->d.envelopedData) { |
| 91 | { | ||
| 92 | CMSerr(CMS_F_CMS_ENVELOPED_DATA_INIT, | 91 | CMSerr(CMS_F_CMS_ENVELOPED_DATA_INIT, |
| 93 | ERR_R_MALLOC_FAILURE); | 92 | ERR_R_MALLOC_FAILURE); |
| 94 | return NULL; | 93 | return NULL; |
| 95 | } | 94 | } |
| 96 | cms->d.envelopedData->version = 0; | 95 | cms->d.envelopedData->version = 0; |
| 97 | cms->d.envelopedData->encryptedContentInfo->contentType = | 96 | cms->d.envelopedData->encryptedContentInfo->contentType = |
| 98 | OBJ_nid2obj(NID_pkcs7_data); | 97 | OBJ_nid2obj(NID_pkcs7_data); |
| 99 | ASN1_OBJECT_free(cms->contentType); | 98 | ASN1_OBJECT_free(cms->contentType); |
| 100 | cms->contentType = OBJ_nid2obj(NID_pkcs7_enveloped); | 99 | cms->contentType = OBJ_nid2obj(NID_pkcs7_enveloped); |
| 101 | return cms->d.envelopedData; | 100 | return cms->d.envelopedData; |
| 102 | } | ||
| 103 | return cms_get0_enveloped(cms); | ||
| 104 | } | 101 | } |
| 102 | return cms_get0_enveloped(cms); | ||
| 103 | } | ||
| 105 | 104 | ||
| 106 | STACK_OF(CMS_RecipientInfo) *CMS_get0_RecipientInfos(CMS_ContentInfo *cms) | 105 | STACK_OF(CMS_RecipientInfo) *CMS_get0_RecipientInfos(CMS_ContentInfo *cms) |
| 107 | { | 106 | { |
| 108 | CMS_EnvelopedData *env; | 107 | CMS_EnvelopedData *env; |
| 108 | |||
| 109 | env = cms_get0_enveloped(cms); | 109 | env = cms_get0_enveloped(cms); |
| 110 | if (!env) | 110 | if (!env) |
| 111 | return NULL; | 111 | return NULL; |
| 112 | return env->recipientInfos; | 112 | return env->recipientInfos; |
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | int CMS_RecipientInfo_type(CMS_RecipientInfo *ri) | 115 | int |
| 116 | { | 116 | CMS_RecipientInfo_type(CMS_RecipientInfo *ri) |
| 117 | { | ||
| 117 | return ri->type; | 118 | return ri->type; |
| 118 | } | 119 | } |
| 119 | 120 | ||
| 120 | CMS_ContentInfo *CMS_EnvelopedData_create(const EVP_CIPHER *cipher) | 121 | CMS_ContentInfo * |
| 121 | { | 122 | CMS_EnvelopedData_create(const EVP_CIPHER *cipher) |
| 123 | { | ||
| 122 | CMS_ContentInfo *cms; | 124 | CMS_ContentInfo *cms; |
| 123 | CMS_EnvelopedData *env; | 125 | CMS_EnvelopedData *env; |
| 126 | |||
| 124 | cms = CMS_ContentInfo_new(); | 127 | cms = CMS_ContentInfo_new(); |
| 125 | if (!cms) | 128 | if (!cms) |
| 126 | goto merr; | 129 | goto merr; |
| @@ -128,15 +131,16 @@ CMS_ContentInfo *CMS_EnvelopedData_create(const EVP_CIPHER *cipher) | |||
| 128 | if (!env) | 131 | if (!env) |
| 129 | goto merr; | 132 | goto merr; |
| 130 | if (!cms_EncryptedContent_init(env->encryptedContentInfo, | 133 | if (!cms_EncryptedContent_init(env->encryptedContentInfo, |
| 131 | cipher, NULL, 0)) | 134 | cipher, NULL, 0)) |
| 132 | goto merr; | 135 | goto merr; |
| 133 | return cms; | 136 | return cms; |
| 134 | merr: | 137 | |
| 138 | merr: | ||
| 135 | if (cms) | 139 | if (cms) |
| 136 | CMS_ContentInfo_free(cms); | 140 | CMS_ContentInfo_free(cms); |
| 137 | CMSerr(CMS_F_CMS_ENVELOPEDDATA_CREATE, ERR_R_MALLOC_FAILURE); | 141 | CMSerr(CMS_F_CMS_ENVELOPEDDATA_CREATE, ERR_R_MALLOC_FAILURE); |
| 138 | return NULL; | 142 | return NULL; |
| 139 | } | 143 | } |
| 140 | 144 | ||
| 141 | /* Key Transport Recipient Info (KTRI) routines */ | 145 | /* Key Transport Recipient Info (KTRI) routines */ |
| 142 | 146 | ||
| @@ -144,14 +148,15 @@ CMS_ContentInfo *CMS_EnvelopedData_create(const EVP_CIPHER *cipher) | |||
| 144 | * If we ever handle key agreement will need updating. | 148 | * If we ever handle key agreement will need updating. |
| 145 | */ | 149 | */ |
| 146 | 150 | ||
| 147 | CMS_RecipientInfo *CMS_add1_recipient_cert(CMS_ContentInfo *cms, | 151 | CMS_RecipientInfo * |
| 148 | X509 *recip, unsigned int flags) | 152 | CMS_add1_recipient_cert(CMS_ContentInfo *cms, X509 *recip, unsigned int flags) |
| 149 | { | 153 | { |
| 150 | CMS_RecipientInfo *ri = NULL; | 154 | CMS_RecipientInfo *ri = NULL; |
| 151 | CMS_KeyTransRecipientInfo *ktri; | 155 | CMS_KeyTransRecipientInfo *ktri; |
| 152 | CMS_EnvelopedData *env; | 156 | CMS_EnvelopedData *env; |
| 153 | EVP_PKEY *pk = NULL; | 157 | EVP_PKEY *pk = NULL; |
| 154 | int i, type; | 158 | int i, type; |
| 159 | |||
| 155 | env = cms_get0_enveloped(cms); | 160 | env = cms_get0_enveloped(cms); |
| 156 | if (!env) | 161 | if (!env) |
| 157 | goto err; | 162 | goto err; |
| @@ -172,26 +177,22 @@ CMS_RecipientInfo *CMS_add1_recipient_cert(CMS_ContentInfo *cms, | |||
| 172 | 177 | ||
| 173 | X509_check_purpose(recip, -1, -1); | 178 | X509_check_purpose(recip, -1, -1); |
| 174 | pk = X509_get_pubkey(recip); | 179 | pk = X509_get_pubkey(recip); |
| 175 | if (!pk) | 180 | if (!pk) { |
| 176 | { | ||
| 177 | CMSerr(CMS_F_CMS_ADD1_RECIPIENT_CERT, | 181 | CMSerr(CMS_F_CMS_ADD1_RECIPIENT_CERT, |
| 178 | CMS_R_ERROR_GETTING_PUBLIC_KEY); | 182 | CMS_R_ERROR_GETTING_PUBLIC_KEY); |
| 179 | goto err; | 183 | goto err; |
| 180 | } | 184 | } |
| 181 | CRYPTO_add(&recip->references, 1, CRYPTO_LOCK_X509); | 185 | CRYPTO_add(&recip->references, 1, CRYPTO_LOCK_X509); |
| 182 | ktri->pkey = pk; | 186 | ktri->pkey = pk; |
| 183 | ktri->recip = recip; | 187 | ktri->recip = recip; |
| 184 | 188 | ||
| 185 | if (flags & CMS_USE_KEYID) | 189 | if (flags & CMS_USE_KEYID) { |
| 186 | { | ||
| 187 | ktri->version = 2; | 190 | ktri->version = 2; |
| 188 | type = CMS_RECIPINFO_KEYIDENTIFIER; | 191 | type = CMS_RECIPINFO_KEYIDENTIFIER; |
| 189 | } | 192 | } else { |
| 190 | else | ||
| 191 | { | ||
| 192 | ktri->version = 0; | 193 | ktri->version = 0; |
| 193 | type = CMS_RECIPINFO_ISSUER_SERIAL; | 194 | type = CMS_RECIPINFO_ISSUER_SERIAL; |
| 194 | } | 195 | } |
| 195 | 196 | ||
| 196 | /* Not a typo: RecipientIdentifier and SignerIdentifier are the | 197 | /* Not a typo: RecipientIdentifier and SignerIdentifier are the |
| 197 | * same structure. | 198 | * same structure. |
| @@ -200,49 +201,45 @@ CMS_RecipientInfo *CMS_add1_recipient_cert(CMS_ContentInfo *cms, | |||
| 200 | if (!cms_set1_SignerIdentifier(ktri->rid, recip, type)) | 201 | if (!cms_set1_SignerIdentifier(ktri->rid, recip, type)) |
| 201 | goto err; | 202 | goto err; |
| 202 | 203 | ||
| 203 | if (pk->ameth && pk->ameth->pkey_ctrl) | 204 | if (pk->ameth && pk->ameth->pkey_ctrl) { |
| 204 | { | ||
| 205 | i = pk->ameth->pkey_ctrl(pk, ASN1_PKEY_CTRL_CMS_ENVELOPE, | 205 | i = pk->ameth->pkey_ctrl(pk, ASN1_PKEY_CTRL_CMS_ENVELOPE, |
| 206 | 0, ri); | 206 | 0, ri); |
| 207 | if (i == -2) | 207 | if (i == -2) { |
| 208 | { | ||
| 209 | CMSerr(CMS_F_CMS_ADD1_RECIPIENT_CERT, | 208 | CMSerr(CMS_F_CMS_ADD1_RECIPIENT_CERT, |
| 210 | CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE); | 209 | CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE); |
| 211 | goto err; | 210 | goto err; |
| 212 | } | 211 | } |
| 213 | if (i <= 0) | 212 | if (i <= 0) { |
| 214 | { | ||
| 215 | CMSerr(CMS_F_CMS_ADD1_RECIPIENT_CERT, | 213 | CMSerr(CMS_F_CMS_ADD1_RECIPIENT_CERT, |
| 216 | CMS_R_CTRL_FAILURE); | 214 | CMS_R_CTRL_FAILURE); |
| 217 | goto err; | 215 | goto err; |
| 218 | } | ||
| 219 | } | 216 | } |
| 217 | } | ||
| 220 | 218 | ||
| 221 | if (!sk_CMS_RecipientInfo_push(env->recipientInfos, ri)) | 219 | if (!sk_CMS_RecipientInfo_push(env->recipientInfos, ri)) |
| 222 | goto merr; | 220 | goto merr; |
| 223 | 221 | ||
| 224 | return ri; | 222 | return ri; |
| 225 | 223 | ||
| 226 | merr: | 224 | merr: |
| 227 | CMSerr(CMS_F_CMS_ADD1_RECIPIENT_CERT, ERR_R_MALLOC_FAILURE); | 225 | CMSerr(CMS_F_CMS_ADD1_RECIPIENT_CERT, ERR_R_MALLOC_FAILURE); |
| 228 | err: | 226 | err: |
| 229 | if (ri) | 227 | if (ri) |
| 230 | M_ASN1_free_of(ri, CMS_RecipientInfo); | 228 | M_ASN1_free_of(ri, CMS_RecipientInfo); |
| 231 | return NULL; | 229 | return NULL; |
| 230 | } | ||
| 232 | 231 | ||
| 233 | } | 232 | int |
| 234 | 233 | CMS_RecipientInfo_ktri_get0_algs(CMS_RecipientInfo *ri, EVP_PKEY **pk, | |
| 235 | int CMS_RecipientInfo_ktri_get0_algs(CMS_RecipientInfo *ri, | 234 | X509 **recip, X509_ALGOR **palg) |
| 236 | EVP_PKEY **pk, X509 **recip, | 235 | { |
| 237 | X509_ALGOR **palg) | ||
| 238 | { | ||
| 239 | CMS_KeyTransRecipientInfo *ktri; | 236 | CMS_KeyTransRecipientInfo *ktri; |
| 240 | if (ri->type != CMS_RECIPINFO_TRANS) | 237 | |
| 241 | { | 238 | if (ri->type != CMS_RECIPINFO_TRANS) { |
| 242 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_ALGS, | 239 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_ALGS, |
| 243 | CMS_R_NOT_KEY_TRANSPORT); | 240 | CMS_R_NOT_KEY_TRANSPORT); |
| 244 | return 0; | 241 | return 0; |
| 245 | } | 242 | } |
| 246 | 243 | ||
| 247 | ktri = ri->d.ktri; | 244 | ktri = ri->d.ktri; |
| 248 | 245 | ||
| @@ -253,53 +250,53 @@ int CMS_RecipientInfo_ktri_get0_algs(CMS_RecipientInfo *ri, | |||
| 253 | if (palg) | 250 | if (palg) |
| 254 | *palg = ktri->keyEncryptionAlgorithm; | 251 | *palg = ktri->keyEncryptionAlgorithm; |
| 255 | return 1; | 252 | return 1; |
| 256 | } | 253 | } |
| 257 | 254 | ||
| 258 | int CMS_RecipientInfo_ktri_get0_signer_id(CMS_RecipientInfo *ri, | 255 | int |
| 259 | ASN1_OCTET_STRING **keyid, | 256 | CMS_RecipientInfo_ktri_get0_signer_id(CMS_RecipientInfo *ri, |
| 260 | X509_NAME **issuer, ASN1_INTEGER **sno) | 257 | ASN1_OCTET_STRING **keyid, X509_NAME **issuer, ASN1_INTEGER **sno) |
| 261 | { | 258 | { |
| 262 | CMS_KeyTransRecipientInfo *ktri; | 259 | CMS_KeyTransRecipientInfo *ktri; |
| 263 | if (ri->type != CMS_RECIPINFO_TRANS) | 260 | |
| 264 | { | 261 | if (ri->type != CMS_RECIPINFO_TRANS) { |
| 265 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_SIGNER_ID, | 262 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_SIGNER_ID, |
| 266 | CMS_R_NOT_KEY_TRANSPORT); | 263 | CMS_R_NOT_KEY_TRANSPORT); |
| 267 | return 0; | 264 | return 0; |
| 268 | } | 265 | } |
| 269 | ktri = ri->d.ktri; | 266 | ktri = ri->d.ktri; |
| 270 | 267 | ||
| 271 | return cms_SignerIdentifier_get0_signer_id(ktri->rid, | 268 | return cms_SignerIdentifier_get0_signer_id(ktri->rid, keyid, |
| 272 | keyid, issuer, sno); | 269 | issuer, sno); |
| 273 | } | 270 | } |
| 274 | 271 | ||
| 275 | int CMS_RecipientInfo_ktri_cert_cmp(CMS_RecipientInfo *ri, X509 *cert) | 272 | int |
| 276 | { | 273 | CMS_RecipientInfo_ktri_cert_cmp(CMS_RecipientInfo *ri, X509 *cert) |
| 277 | if (ri->type != CMS_RECIPINFO_TRANS) | 274 | { |
| 278 | { | 275 | if (ri->type != CMS_RECIPINFO_TRANS) { |
| 279 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_CERT_CMP, | 276 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_CERT_CMP, |
| 280 | CMS_R_NOT_KEY_TRANSPORT); | 277 | CMS_R_NOT_KEY_TRANSPORT); |
| 281 | return -2; | 278 | return -2; |
| 282 | } | ||
| 283 | return cms_SignerIdentifier_cert_cmp(ri->d.ktri->rid, cert); | ||
| 284 | } | 279 | } |
| 280 | return cms_SignerIdentifier_cert_cmp(ri->d.ktri->rid, cert); | ||
| 281 | } | ||
| 285 | 282 | ||
| 286 | int CMS_RecipientInfo_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pkey) | 283 | int |
| 287 | { | 284 | CMS_RecipientInfo_set0_pkey(CMS_RecipientInfo *ri, EVP_PKEY *pkey) |
| 288 | if (ri->type != CMS_RECIPINFO_TRANS) | 285 | { |
| 289 | { | 286 | if (ri->type != CMS_RECIPINFO_TRANS) { |
| 290 | CMSerr(CMS_F_CMS_RECIPIENTINFO_SET0_PKEY, | 287 | CMSerr(CMS_F_CMS_RECIPIENTINFO_SET0_PKEY, |
| 291 | CMS_R_NOT_KEY_TRANSPORT); | 288 | CMS_R_NOT_KEY_TRANSPORT); |
| 292 | return 0; | 289 | return 0; |
| 293 | } | 290 | } |
| 294 | ri->d.ktri->pkey = pkey; | 291 | ri->d.ktri->pkey = pkey; |
| 295 | return 1; | 292 | return 1; |
| 296 | } | 293 | } |
| 297 | 294 | ||
| 298 | /* Encrypt content key in key transport recipient info */ | 295 | /* Encrypt content key in key transport recipient info */ |
| 299 | 296 | ||
| 300 | static int cms_RecipientInfo_ktri_encrypt(CMS_ContentInfo *cms, | 297 | static int |
| 301 | CMS_RecipientInfo *ri) | 298 | cms_RecipientInfo_ktri_encrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri) |
| 302 | { | 299 | { |
| 303 | CMS_KeyTransRecipientInfo *ktri; | 300 | CMS_KeyTransRecipientInfo *ktri; |
| 304 | CMS_EncryptedContentInfo *ec; | 301 | CMS_EncryptedContentInfo *ec; |
| 305 | EVP_PKEY_CTX *pctx = NULL; | 302 | EVP_PKEY_CTX *pctx = NULL; |
| @@ -308,12 +305,11 @@ static int cms_RecipientInfo_ktri_encrypt(CMS_ContentInfo *cms, | |||
| 308 | 305 | ||
| 309 | int ret = 0; | 306 | int ret = 0; |
| 310 | 307 | ||
| 311 | if (ri->type != CMS_RECIPINFO_TRANS) | 308 | if (ri->type != CMS_RECIPINFO_TRANS) { |
| 312 | { | ||
| 313 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT, | 309 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT, |
| 314 | CMS_R_NOT_KEY_TRANSPORT); | 310 | CMS_R_NOT_KEY_TRANSPORT); |
| 315 | return 0; | 311 | return 0; |
| 316 | } | 312 | } |
| 317 | ktri = ri->d.ktri; | 313 | ktri = ri->d.ktri; |
| 318 | ec = cms->d.envelopedData->encryptedContentInfo; | 314 | ec = cms->d.envelopedData->encryptedContentInfo; |
| 319 | 315 | ||
| @@ -325,23 +321,21 @@ static int cms_RecipientInfo_ktri_encrypt(CMS_ContentInfo *cms, | |||
| 325 | goto err; | 321 | goto err; |
| 326 | 322 | ||
| 327 | if (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_ENCRYPT, | 323 | if (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_ENCRYPT, |
| 328 | EVP_PKEY_CTRL_CMS_ENCRYPT, 0, ri) <= 0) | 324 | EVP_PKEY_CTRL_CMS_ENCRYPT, 0, ri) <= 0) { |
| 329 | { | ||
| 330 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT, CMS_R_CTRL_ERROR); | 325 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT, CMS_R_CTRL_ERROR); |
| 331 | goto err; | 326 | goto err; |
| 332 | } | 327 | } |
| 333 | 328 | ||
| 334 | if (EVP_PKEY_encrypt(pctx, NULL, &eklen, ec->key, ec->keylen) <= 0) | 329 | if (EVP_PKEY_encrypt(pctx, NULL, &eklen, ec->key, ec->keylen) <= 0) |
| 335 | goto err; | 330 | goto err; |
| 336 | 331 | ||
| 337 | ek = malloc(eklen); | 332 | ek = malloc(eklen); |
| 338 | 333 | ||
| 339 | if (ek == NULL) | 334 | if (ek == NULL) { |
| 340 | { | ||
| 341 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT, | 335 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT, |
| 342 | ERR_R_MALLOC_FAILURE); | 336 | ERR_R_MALLOC_FAILURE); |
| 343 | goto err; | 337 | goto err; |
| 344 | } | 338 | } |
| 345 | 339 | ||
| 346 | if (EVP_PKEY_encrypt(pctx, ek, &eklen, ec->key, ec->keylen) <= 0) | 340 | if (EVP_PKEY_encrypt(pctx, ek, &eklen, ec->key, ec->keylen) <= 0) |
| 347 | goto err; | 341 | goto err; |
| @@ -351,33 +345,32 @@ static int cms_RecipientInfo_ktri_encrypt(CMS_ContentInfo *cms, | |||
| 351 | 345 | ||
| 352 | ret = 1; | 346 | ret = 1; |
| 353 | 347 | ||
| 354 | err: | 348 | err: |
| 355 | if (pctx) | 349 | if (pctx) |
| 356 | EVP_PKEY_CTX_free(pctx); | 350 | EVP_PKEY_CTX_free(pctx); |
| 357 | free(ek); | 351 | free(ek); |
| 358 | return ret; | 352 | return ret; |
| 359 | 353 | } | |
| 360 | } | ||
| 361 | 354 | ||
| 362 | /* Decrypt content key from KTRI */ | 355 | /* Decrypt content key from KTRI */ |
| 363 | 356 | ||
| 364 | static int cms_RecipientInfo_ktri_decrypt(CMS_ContentInfo *cms, | 357 | static int |
| 365 | CMS_RecipientInfo *ri) | 358 | cms_RecipientInfo_ktri_decrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri) |
| 366 | { | 359 | { |
| 367 | CMS_KeyTransRecipientInfo *ktri = ri->d.ktri; | 360 | CMS_KeyTransRecipientInfo *ktri = ri->d.ktri; |
| 368 | EVP_PKEY_CTX *pctx = NULL; | 361 | EVP_PKEY_CTX *pctx = NULL; |
| 369 | unsigned char *ek = NULL; | 362 | unsigned char *ek = NULL; |
| 370 | size_t eklen; | 363 | size_t eklen; |
| 371 | int ret = 0; | 364 | int ret = 0; |
| 372 | CMS_EncryptedContentInfo *ec; | 365 | CMS_EncryptedContentInfo *ec; |
| 366 | |||
| 373 | ec = cms->d.envelopedData->encryptedContentInfo; | 367 | ec = cms->d.envelopedData->encryptedContentInfo; |
| 374 | 368 | ||
| 375 | if (ktri->pkey == NULL) | 369 | if (ktri->pkey == NULL) { |
| 376 | { | ||
| 377 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT, | 370 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT, |
| 378 | CMS_R_NO_PRIVATE_KEY); | 371 | CMS_R_NO_PRIVATE_KEY); |
| 379 | return 0; | 372 | return 0; |
| 380 | } | 373 | } |
| 381 | 374 | ||
| 382 | pctx = EVP_PKEY_CTX_new(ktri->pkey, NULL); | 375 | pctx = EVP_PKEY_CTX_new(ktri->pkey, NULL); |
| 383 | if (!pctx) | 376 | if (!pctx) |
| @@ -387,152 +380,134 @@ static int cms_RecipientInfo_ktri_decrypt(CMS_ContentInfo *cms, | |||
| 387 | goto err; | 380 | goto err; |
| 388 | 381 | ||
| 389 | if (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DECRYPT, | 382 | if (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_DECRYPT, |
| 390 | EVP_PKEY_CTRL_CMS_DECRYPT, 0, ri) <= 0) | 383 | EVP_PKEY_CTRL_CMS_DECRYPT, 0, ri) <= 0) { |
| 391 | { | ||
| 392 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT, CMS_R_CTRL_ERROR); | 384 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT, CMS_R_CTRL_ERROR); |
| 393 | goto err; | 385 | goto err; |
| 394 | } | 386 | } |
| 395 | 387 | ||
| 396 | if (EVP_PKEY_decrypt(pctx, NULL, &eklen, | 388 | if (EVP_PKEY_decrypt(pctx, NULL, &eklen, |
| 397 | ktri->encryptedKey->data, | 389 | ktri->encryptedKey->data, |
| 398 | ktri->encryptedKey->length) <= 0) | 390 | ktri->encryptedKey->length) <= 0) |
| 399 | goto err; | 391 | goto err; |
| 400 | 392 | ||
| 401 | ek = malloc(eklen); | 393 | ek = malloc(eklen); |
| 402 | 394 | ||
| 403 | if (ek == NULL) | 395 | if (ek == NULL) { |
| 404 | { | ||
| 405 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT, | 396 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT, |
| 406 | ERR_R_MALLOC_FAILURE); | 397 | ERR_R_MALLOC_FAILURE); |
| 407 | goto err; | 398 | goto err; |
| 408 | } | 399 | } |
| 409 | 400 | ||
| 410 | if (EVP_PKEY_decrypt(pctx, ek, &eklen, | 401 | if (EVP_PKEY_decrypt(pctx, ek, &eklen, |
| 411 | ktri->encryptedKey->data, | 402 | ktri->encryptedKey->data, |
| 412 | ktri->encryptedKey->length) <= 0) | 403 | ktri->encryptedKey->length) <= 0) { |
| 413 | { | ||
| 414 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT, CMS_R_CMS_LIB); | 404 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT, CMS_R_CMS_LIB); |
| 415 | goto err; | 405 | goto err; |
| 416 | } | 406 | } |
| 417 | 407 | ||
| 418 | ret = 1; | 408 | ret = 1; |
| 419 | 409 | ||
| 420 | if (ec->key) | 410 | if (ec->key) { |
| 421 | { | ||
| 422 | OPENSSL_cleanse(ec->key, ec->keylen); | 411 | OPENSSL_cleanse(ec->key, ec->keylen); |
| 423 | free(ec->key); | 412 | free(ec->key); |
| 424 | } | 413 | } |
| 425 | 414 | ||
| 426 | ec->key = ek; | 415 | ec->key = ek; |
| 427 | ec->keylen = eklen; | 416 | ec->keylen = eklen; |
| 428 | 417 | ||
| 429 | err: | 418 | err: |
| 430 | if (pctx) | 419 | if (pctx) |
| 431 | EVP_PKEY_CTX_free(pctx); | 420 | EVP_PKEY_CTX_free(pctx); |
| 432 | if (!ret && ek) | 421 | if (!ret && ek) |
| 433 | free(ek); | 422 | free(ek); |
| 434 | 423 | ||
| 435 | return ret; | 424 | return ret; |
| 436 | } | 425 | } |
| 437 | 426 | ||
| 438 | /* Key Encrypted Key (KEK) RecipientInfo routines */ | 427 | /* Key Encrypted Key (KEK) RecipientInfo routines */ |
| 439 | 428 | ||
| 440 | int CMS_RecipientInfo_kekri_id_cmp(CMS_RecipientInfo *ri, | 429 | int |
| 441 | const unsigned char *id, size_t idlen) | 430 | CMS_RecipientInfo_kekri_id_cmp(CMS_RecipientInfo *ri, const unsigned char *id, |
| 442 | { | 431 | size_t idlen) |
| 432 | { | ||
| 443 | ASN1_OCTET_STRING tmp_os; | 433 | ASN1_OCTET_STRING tmp_os; |
| 444 | CMS_KEKRecipientInfo *kekri; | 434 | CMS_KEKRecipientInfo *kekri; |
| 445 | if (ri->type != CMS_RECIPINFO_KEK) | 435 | |
| 446 | { | 436 | if (ri->type != CMS_RECIPINFO_KEK) { |
| 447 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_ID_CMP, CMS_R_NOT_KEK); | 437 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_ID_CMP, CMS_R_NOT_KEK); |
| 448 | return -2; | 438 | return -2; |
| 449 | } | 439 | } |
| 450 | kekri = ri->d.kekri; | 440 | kekri = ri->d.kekri; |
| 451 | tmp_os.type = V_ASN1_OCTET_STRING; | 441 | tmp_os.type = V_ASN1_OCTET_STRING; |
| 452 | tmp_os.flags = 0; | 442 | tmp_os.flags = 0; |
| 453 | tmp_os.data = (unsigned char *)id; | 443 | tmp_os.data = (unsigned char *)id; |
| 454 | tmp_os.length = (int)idlen; | 444 | tmp_os.length = (int)idlen; |
| 455 | return ASN1_OCTET_STRING_cmp(&tmp_os, kekri->kekid->keyIdentifier); | 445 | return ASN1_OCTET_STRING_cmp(&tmp_os, kekri->kekid->keyIdentifier); |
| 456 | } | 446 | } |
| 457 | 447 | ||
| 458 | /* For now hard code AES key wrap info */ | 448 | /* For now hard code AES key wrap info */ |
| 459 | 449 | ||
| 460 | static size_t aes_wrap_keylen(int nid) | 450 | static size_t |
| 461 | { | 451 | aes_wrap_keylen(int nid) |
| 462 | switch (nid) | 452 | { |
| 463 | { | 453 | switch (nid) { |
| 464 | case NID_id_aes128_wrap: | 454 | case NID_id_aes128_wrap: |
| 465 | return 16; | 455 | return 16; |
| 466 | 456 | case NID_id_aes192_wrap: | |
| 467 | case NID_id_aes192_wrap: | 457 | return 24; |
| 468 | return 24; | 458 | case NID_id_aes256_wrap: |
| 469 | 459 | return 32; | |
| 470 | case NID_id_aes256_wrap: | 460 | default: |
| 471 | return 32; | ||
| 472 | |||
| 473 | default: | ||
| 474 | return 0; | 461 | return 0; |
| 475 | } | ||
| 476 | } | 462 | } |
| 463 | } | ||
| 477 | 464 | ||
| 478 | CMS_RecipientInfo *CMS_add0_recipient_key(CMS_ContentInfo *cms, int nid, | 465 | CMS_RecipientInfo * |
| 479 | unsigned char *key, size_t keylen, | 466 | CMS_add0_recipient_key(CMS_ContentInfo *cms, int nid, unsigned char *key, |
| 480 | unsigned char *id, size_t idlen, | 467 | size_t keylen, unsigned char *id, size_t idlen, ASN1_GENERALIZEDTIME *date, |
| 481 | ASN1_GENERALIZEDTIME *date, | 468 | ASN1_OBJECT *otherTypeId, ASN1_TYPE *otherType) |
| 482 | ASN1_OBJECT *otherTypeId, | 469 | { |
| 483 | ASN1_TYPE *otherType) | ||
| 484 | { | ||
| 485 | CMS_RecipientInfo *ri = NULL; | 470 | CMS_RecipientInfo *ri = NULL; |
| 486 | CMS_EnvelopedData *env; | 471 | CMS_EnvelopedData *env; |
| 487 | CMS_KEKRecipientInfo *kekri; | 472 | CMS_KEKRecipientInfo *kekri; |
| 473 | |||
| 488 | env = cms_get0_enveloped(cms); | 474 | env = cms_get0_enveloped(cms); |
| 489 | if (!env) | 475 | if (!env) |
| 490 | goto err; | 476 | goto err; |
| 491 | 477 | ||
| 492 | if (nid == NID_undef) | 478 | if (nid == NID_undef) { |
| 493 | { | 479 | switch (keylen) { |
| 494 | switch (keylen) | 480 | case 16: |
| 495 | { | ||
| 496 | case 16: | ||
| 497 | nid = NID_id_aes128_wrap; | 481 | nid = NID_id_aes128_wrap; |
| 498 | break; | 482 | break; |
| 499 | 483 | case 24: | |
| 500 | case 24: | ||
| 501 | nid = NID_id_aes192_wrap; | 484 | nid = NID_id_aes192_wrap; |
| 502 | break; | 485 | break; |
| 503 | 486 | case 32: | |
| 504 | case 32: | ||
| 505 | nid = NID_id_aes256_wrap; | 487 | nid = NID_id_aes256_wrap; |
| 506 | break; | 488 | break; |
| 507 | 489 | default: | |
| 508 | default: | ||
| 509 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_KEY, | 490 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_KEY, |
| 510 | CMS_R_INVALID_KEY_LENGTH); | 491 | CMS_R_INVALID_KEY_LENGTH); |
| 511 | goto err; | 492 | goto err; |
| 512 | } | ||
| 513 | |||
| 514 | } | 493 | } |
| 515 | else | 494 | } else { |
| 516 | { | ||
| 517 | |||
| 518 | size_t exp_keylen = aes_wrap_keylen(nid); | 495 | size_t exp_keylen = aes_wrap_keylen(nid); |
| 519 | 496 | ||
| 520 | if (!exp_keylen) | 497 | if (!exp_keylen) { |
| 521 | { | ||
| 522 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_KEY, | 498 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_KEY, |
| 523 | CMS_R_UNSUPPORTED_KEK_ALGORITHM); | 499 | CMS_R_UNSUPPORTED_KEK_ALGORITHM); |
| 524 | goto err; | 500 | goto err; |
| 525 | } | 501 | } |
| 526 | 502 | ||
| 527 | if (keylen != exp_keylen) | 503 | if (keylen != exp_keylen) { |
| 528 | { | ||
| 529 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_KEY, | 504 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_KEY, |
| 530 | CMS_R_INVALID_KEY_LENGTH); | 505 | CMS_R_INVALID_KEY_LENGTH); |
| 531 | goto err; | 506 | goto err; |
| 532 | } | ||
| 533 | |||
| 534 | } | 507 | } |
| 535 | 508 | ||
| 509 | } | ||
| 510 | |||
| 536 | /* Initialize recipient info */ | 511 | /* Initialize recipient info */ |
| 537 | ri = M_ASN1_new_of(CMS_RecipientInfo); | 512 | ri = M_ASN1_new_of(CMS_RecipientInfo); |
| 538 | if (!ri) | 513 | if (!ri) |
| @@ -545,17 +520,15 @@ CMS_RecipientInfo *CMS_add0_recipient_key(CMS_ContentInfo *cms, int nid, | |||
| 545 | 520 | ||
| 546 | kekri = ri->d.kekri; | 521 | kekri = ri->d.kekri; |
| 547 | 522 | ||
| 548 | if (otherTypeId) | 523 | if (otherTypeId) { |
| 549 | { | ||
| 550 | kekri->kekid->other = M_ASN1_new_of(CMS_OtherKeyAttribute); | 524 | kekri->kekid->other = M_ASN1_new_of(CMS_OtherKeyAttribute); |
| 551 | if (kekri->kekid->other == NULL) | 525 | if (kekri->kekid->other == NULL) |
| 552 | goto merr; | 526 | goto merr; |
| 553 | } | 527 | } |
| 554 | 528 | ||
| 555 | if (!sk_CMS_RecipientInfo_push(env->recipientInfos, ri)) | 529 | if (!sk_CMS_RecipientInfo_push(env->recipientInfos, ri)) |
| 556 | goto merr; | 530 | goto merr; |
| 557 | 531 | ||
| 558 | |||
| 559 | /* After this point no calls can fail */ | 532 | /* After this point no calls can fail */ |
| 560 | 533 | ||
| 561 | kekri->version = 4; | 534 | kekri->version = 4; |
| @@ -567,85 +540,79 @@ CMS_RecipientInfo *CMS_add0_recipient_key(CMS_ContentInfo *cms, int nid, | |||
| 567 | 540 | ||
| 568 | kekri->kekid->date = date; | 541 | kekri->kekid->date = date; |
| 569 | 542 | ||
| 570 | if (kekri->kekid->other) | 543 | if (kekri->kekid->other) { |
| 571 | { | ||
| 572 | kekri->kekid->other->keyAttrId = otherTypeId; | 544 | kekri->kekid->other->keyAttrId = otherTypeId; |
| 573 | kekri->kekid->other->keyAttr = otherType; | 545 | kekri->kekid->other->keyAttr = otherType; |
| 574 | } | 546 | } |
| 575 | 547 | ||
| 576 | X509_ALGOR_set0(kekri->keyEncryptionAlgorithm, | 548 | X509_ALGOR_set0(kekri->keyEncryptionAlgorithm, |
| 577 | OBJ_nid2obj(nid), V_ASN1_UNDEF, NULL); | 549 | OBJ_nid2obj(nid), V_ASN1_UNDEF, NULL); |
| 578 | 550 | ||
| 579 | return ri; | 551 | return ri; |
| 580 | 552 | ||
| 581 | merr: | 553 | merr: |
| 582 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_KEY, ERR_R_MALLOC_FAILURE); | 554 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_KEY, ERR_R_MALLOC_FAILURE); |
| 583 | err: | 555 | err: |
| 584 | if (ri) | 556 | if (ri) |
| 585 | M_ASN1_free_of(ri, CMS_RecipientInfo); | 557 | M_ASN1_free_of(ri, CMS_RecipientInfo); |
| 586 | return NULL; | 558 | return NULL; |
| 559 | } | ||
| 587 | 560 | ||
| 588 | } | 561 | int |
| 589 | 562 | CMS_RecipientInfo_kekri_get0_id(CMS_RecipientInfo *ri, X509_ALGOR **palg, | |
| 590 | int CMS_RecipientInfo_kekri_get0_id(CMS_RecipientInfo *ri, | 563 | ASN1_OCTET_STRING **pid, ASN1_GENERALIZEDTIME **pdate, |
| 591 | X509_ALGOR **palg, | 564 | ASN1_OBJECT **potherid, ASN1_TYPE **pothertype) |
| 592 | ASN1_OCTET_STRING **pid, | 565 | { |
| 593 | ASN1_GENERALIZEDTIME **pdate, | ||
| 594 | ASN1_OBJECT **potherid, | ||
| 595 | ASN1_TYPE **pothertype) | ||
| 596 | { | ||
| 597 | CMS_KEKIdentifier *rkid; | 566 | CMS_KEKIdentifier *rkid; |
| 598 | if (ri->type != CMS_RECIPINFO_KEK) | 567 | |
| 599 | { | 568 | if (ri->type != CMS_RECIPINFO_KEK) { |
| 600 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_GET0_ID, CMS_R_NOT_KEK); | 569 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_GET0_ID, CMS_R_NOT_KEK); |
| 601 | return 0; | 570 | return 0; |
| 602 | } | 571 | } |
| 603 | rkid = ri->d.kekri->kekid; | 572 | rkid = ri->d.kekri->kekid; |
| 604 | if (palg) | 573 | if (palg) |
| 605 | *palg = ri->d.kekri->keyEncryptionAlgorithm; | 574 | *palg = ri->d.kekri->keyEncryptionAlgorithm; |
| 606 | if (pid) | 575 | if (pid) |
| 607 | *pid = rkid->keyIdentifier; | 576 | *pid = rkid->keyIdentifier; |
| 608 | if (pdate) | 577 | if (pdate) |
| 609 | *pdate = rkid->date; | 578 | *pdate = rkid->date; |
| 610 | if (potherid) | 579 | if (potherid) { |
| 611 | { | ||
| 612 | if (rkid->other) | 580 | if (rkid->other) |
| 613 | *potherid = rkid->other->keyAttrId; | 581 | *potherid = rkid->other->keyAttrId; |
| 614 | else | 582 | else |
| 615 | *potherid = NULL; | 583 | *potherid = NULL; |
| 616 | } | 584 | } |
| 617 | if (pothertype) | 585 | if (pothertype) { |
| 618 | { | ||
| 619 | if (rkid->other) | 586 | if (rkid->other) |
| 620 | *pothertype = rkid->other->keyAttr; | 587 | *pothertype = rkid->other->keyAttr; |
| 621 | else | 588 | else |
| 622 | *pothertype = NULL; | 589 | *pothertype = NULL; |
| 623 | } | ||
| 624 | return 1; | ||
| 625 | } | 590 | } |
| 591 | return 1; | ||
| 592 | } | ||
| 626 | 593 | ||
| 627 | int CMS_RecipientInfo_set0_key(CMS_RecipientInfo *ri, | 594 | int |
| 628 | unsigned char *key, size_t keylen) | 595 | CMS_RecipientInfo_set0_key(CMS_RecipientInfo *ri, unsigned char *key, |
| 629 | { | 596 | size_t keylen) |
| 597 | { | ||
| 630 | CMS_KEKRecipientInfo *kekri; | 598 | CMS_KEKRecipientInfo *kekri; |
| 631 | if (ri->type != CMS_RECIPINFO_KEK) | 599 | |
| 632 | { | 600 | if (ri->type != CMS_RECIPINFO_KEK) { |
| 633 | CMSerr(CMS_F_CMS_RECIPIENTINFO_SET0_KEY, CMS_R_NOT_KEK); | 601 | CMSerr(CMS_F_CMS_RECIPIENTINFO_SET0_KEY, CMS_R_NOT_KEK); |
| 634 | return 0; | 602 | return 0; |
| 635 | } | 603 | } |
| 636 | 604 | ||
| 637 | kekri = ri->d.kekri; | 605 | kekri = ri->d.kekri; |
| 638 | kekri->key = key; | 606 | kekri->key = key; |
| 639 | kekri->keylen = keylen; | 607 | kekri->keylen = keylen; |
| 640 | return 1; | 608 | return 1; |
| 641 | } | 609 | } |
| 642 | |||
| 643 | 610 | ||
| 644 | /* Encrypt content key in KEK recipient info */ | 611 | /* Encrypt content key in KEK recipient info */ |
| 645 | 612 | ||
| 646 | static int cms_RecipientInfo_kekri_encrypt(CMS_ContentInfo *cms, | 613 | static int |
| 647 | CMS_RecipientInfo *ri) | 614 | cms_RecipientInfo_kekri_encrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri) |
| 648 | { | 615 | { |
| 649 | CMS_EncryptedContentInfo *ec; | 616 | CMS_EncryptedContentInfo *ec; |
| 650 | CMS_KEKRecipientInfo *kekri; | 617 | CMS_KEKRecipientInfo *kekri; |
| 651 | AES_KEY actx; | 618 | AES_KEY actx; |
| @@ -657,55 +624,49 @@ static int cms_RecipientInfo_kekri_encrypt(CMS_ContentInfo *cms, | |||
| 657 | 624 | ||
| 658 | kekri = ri->d.kekri; | 625 | kekri = ri->d.kekri; |
| 659 | 626 | ||
| 660 | if (!kekri->key) | 627 | if (!kekri->key) { |
| 661 | { | ||
| 662 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT, CMS_R_NO_KEY); | 628 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT, CMS_R_NO_KEY); |
| 663 | return 0; | 629 | return 0; |
| 664 | } | 630 | } |
| 665 | 631 | ||
| 666 | if (AES_set_encrypt_key(kekri->key, kekri->keylen << 3, &actx)) | 632 | if (AES_set_encrypt_key(kekri->key, kekri->keylen << 3, &actx)) { |
| 667 | { | ||
| 668 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT, | 633 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT, |
| 669 | CMS_R_ERROR_SETTING_KEY); | 634 | CMS_R_ERROR_SETTING_KEY); |
| 670 | goto err; | 635 | goto err; |
| 671 | } | 636 | } |
| 672 | 637 | ||
| 673 | wkey = malloc(ec->keylen + 8); | 638 | wkey = malloc(ec->keylen + 8); |
| 674 | 639 | ||
| 675 | if (!wkey) | 640 | if (!wkey) { |
| 676 | { | ||
| 677 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT, | 641 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT, |
| 678 | ERR_R_MALLOC_FAILURE); | 642 | ERR_R_MALLOC_FAILURE); |
| 679 | goto err; | 643 | goto err; |
| 680 | } | 644 | } |
| 681 | 645 | ||
| 682 | wkeylen = AES_wrap_key(&actx, NULL, wkey, ec->key, ec->keylen); | 646 | wkeylen = AES_wrap_key(&actx, NULL, wkey, ec->key, ec->keylen); |
| 683 | 647 | ||
| 684 | if (wkeylen <= 0) | 648 | if (wkeylen <= 0) { |
| 685 | { | ||
| 686 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT, CMS_R_WRAP_ERROR); | 649 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT, CMS_R_WRAP_ERROR); |
| 687 | goto err; | 650 | goto err; |
| 688 | } | 651 | } |
| 689 | 652 | ||
| 690 | ASN1_STRING_set0(kekri->encryptedKey, wkey, wkeylen); | 653 | ASN1_STRING_set0(kekri->encryptedKey, wkey, wkeylen); |
| 691 | 654 | ||
| 692 | r = 1; | 655 | r = 1; |
| 693 | 656 | ||
| 694 | err: | 657 | err: |
| 695 | |||
| 696 | if (!r && wkey) | 658 | if (!r && wkey) |
| 697 | free(wkey); | 659 | free(wkey); |
| 698 | OPENSSL_cleanse(&actx, sizeof(actx)); | 660 | OPENSSL_cleanse(&actx, sizeof(actx)); |
| 699 | 661 | ||
| 700 | return r; | 662 | return r; |
| 701 | 663 | } | |
| 702 | } | ||
| 703 | 664 | ||
| 704 | /* Decrypt content key in KEK recipient info */ | 665 | /* Decrypt content key in KEK recipient info */ |
| 705 | 666 | ||
| 706 | static int cms_RecipientInfo_kekri_decrypt(CMS_ContentInfo *cms, | 667 | static int |
| 707 | CMS_RecipientInfo *ri) | 668 | cms_RecipientInfo_kekri_decrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri) |
| 708 | { | 669 | { |
| 709 | CMS_EncryptedContentInfo *ec; | 670 | CMS_EncryptedContentInfo *ec; |
| 710 | CMS_KEKRecipientInfo *kekri; | 671 | CMS_KEKRecipientInfo *kekri; |
| 711 | AES_KEY actx; | 672 | AES_KEY actx; |
| @@ -717,93 +678,83 @@ static int cms_RecipientInfo_kekri_decrypt(CMS_ContentInfo *cms, | |||
| 717 | 678 | ||
| 718 | kekri = ri->d.kekri; | 679 | kekri = ri->d.kekri; |
| 719 | 680 | ||
| 720 | if (!kekri->key) | 681 | if (!kekri->key) { |
| 721 | { | ||
| 722 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT, CMS_R_NO_KEY); | 682 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT, CMS_R_NO_KEY); |
| 723 | return 0; | 683 | return 0; |
| 724 | } | 684 | } |
| 725 | 685 | ||
| 726 | wrap_nid = OBJ_obj2nid(kekri->keyEncryptionAlgorithm->algorithm); | 686 | wrap_nid = OBJ_obj2nid(kekri->keyEncryptionAlgorithm->algorithm); |
| 727 | if (aes_wrap_keylen(wrap_nid) != kekri->keylen) | 687 | if (aes_wrap_keylen(wrap_nid) != kekri->keylen) { |
| 728 | { | ||
| 729 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT, | 688 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT, |
| 730 | CMS_R_INVALID_KEY_LENGTH); | 689 | CMS_R_INVALID_KEY_LENGTH); |
| 731 | return 0; | 690 | return 0; |
| 732 | } | 691 | } |
| 733 | 692 | ||
| 734 | /* If encrypted key length is invalid don't bother */ | 693 | /* If encrypted key length is invalid don't bother */ |
| 735 | 694 | ||
| 736 | if (kekri->encryptedKey->length < 16) | 695 | if (kekri->encryptedKey->length < 16) { |
| 737 | { | ||
| 738 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT, | 696 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT, |
| 739 | CMS_R_INVALID_ENCRYPTED_KEY_LENGTH); | 697 | CMS_R_INVALID_ENCRYPTED_KEY_LENGTH); |
| 740 | goto err; | 698 | goto err; |
| 741 | } | 699 | } |
| 742 | 700 | ||
| 743 | if (AES_set_decrypt_key(kekri->key, kekri->keylen << 3, &actx)) | 701 | if (AES_set_decrypt_key(kekri->key, kekri->keylen << 3, &actx)) { |
| 744 | { | ||
| 745 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT, | 702 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT, |
| 746 | CMS_R_ERROR_SETTING_KEY); | 703 | CMS_R_ERROR_SETTING_KEY); |
| 747 | goto err; | 704 | goto err; |
| 748 | } | 705 | } |
| 749 | 706 | ||
| 750 | ukey = malloc(kekri->encryptedKey->length - 8); | 707 | ukey = malloc(kekri->encryptedKey->length - 8); |
| 751 | 708 | ||
| 752 | if (!ukey) | 709 | if (!ukey) { |
| 753 | { | ||
| 754 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT, | 710 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT, |
| 755 | ERR_R_MALLOC_FAILURE); | 711 | ERR_R_MALLOC_FAILURE); |
| 756 | goto err; | 712 | goto err; |
| 757 | } | 713 | } |
| 758 | 714 | ||
| 759 | ukeylen = AES_unwrap_key(&actx, NULL, ukey, | 715 | ukeylen = AES_unwrap_key(&actx, NULL, ukey, |
| 760 | kekri->encryptedKey->data, | 716 | kekri->encryptedKey->data, |
| 761 | kekri->encryptedKey->length); | 717 | kekri->encryptedKey->length); |
| 762 | 718 | ||
| 763 | if (ukeylen <= 0) | 719 | if (ukeylen <= 0) { |
| 764 | { | ||
| 765 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT, | 720 | CMSerr(CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT, |
| 766 | CMS_R_UNWRAP_ERROR); | 721 | CMS_R_UNWRAP_ERROR); |
| 767 | goto err; | 722 | goto err; |
| 768 | } | 723 | } |
| 769 | 724 | ||
| 770 | ec->key = ukey; | 725 | ec->key = ukey; |
| 771 | ec->keylen = ukeylen; | 726 | ec->keylen = ukeylen; |
| 772 | 727 | ||
| 773 | r = 1; | 728 | r = 1; |
| 774 | 729 | ||
| 775 | err: | 730 | err: |
| 776 | |||
| 777 | if (!r && ukey) | 731 | if (!r && ukey) |
| 778 | free(ukey); | 732 | free(ukey); |
| 779 | OPENSSL_cleanse(&actx, sizeof(actx)); | 733 | OPENSSL_cleanse(&actx, sizeof(actx)); |
| 780 | 734 | ||
| 781 | return r; | 735 | return r; |
| 736 | } | ||
| 782 | 737 | ||
| 783 | } | 738 | int |
| 784 | 739 | CMS_RecipientInfo_decrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri) | |
| 785 | int CMS_RecipientInfo_decrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri) | 740 | { |
| 786 | { | 741 | switch (ri->type) { |
| 787 | switch(ri->type) | 742 | case CMS_RECIPINFO_TRANS: |
| 788 | { | ||
| 789 | case CMS_RECIPINFO_TRANS: | ||
| 790 | return cms_RecipientInfo_ktri_decrypt(cms, ri); | 743 | return cms_RecipientInfo_ktri_decrypt(cms, ri); |
| 791 | 744 | case CMS_RECIPINFO_KEK: | |
| 792 | case CMS_RECIPINFO_KEK: | ||
| 793 | return cms_RecipientInfo_kekri_decrypt(cms, ri); | 745 | return cms_RecipientInfo_kekri_decrypt(cms, ri); |
| 794 | 746 | case CMS_RECIPINFO_PASS: | |
| 795 | case CMS_RECIPINFO_PASS: | ||
| 796 | return cms_RecipientInfo_pwri_crypt(cms, ri, 0); | 747 | return cms_RecipientInfo_pwri_crypt(cms, ri, 0); |
| 797 | 748 | default: | |
| 798 | default: | ||
| 799 | CMSerr(CMS_F_CMS_RECIPIENTINFO_DECRYPT, | 749 | CMSerr(CMS_F_CMS_RECIPIENTINFO_DECRYPT, |
| 800 | CMS_R_UNSUPPORTED_RECPIENTINFO_TYPE); | 750 | CMS_R_UNSUPPORTED_RECPIENTINFO_TYPE); |
| 801 | return 0; | 751 | return 0; |
| 802 | } | ||
| 803 | } | 752 | } |
| 753 | } | ||
| 804 | 754 | ||
| 805 | BIO *cms_EnvelopedData_init_bio(CMS_ContentInfo *cms) | 755 | BIO * |
| 806 | { | 756 | cms_EnvelopedData_init_bio(CMS_ContentInfo *cms) |
| 757 | { | ||
| 807 | CMS_EncryptedContentInfo *ec; | 758 | CMS_EncryptedContentInfo *ec; |
| 808 | STACK_OF(CMS_RecipientInfo) *rinfos; | 759 | STACK_OF(CMS_RecipientInfo) *rinfos; |
| 809 | CMS_RecipientInfo *ri; | 760 | CMS_RecipientInfo *ri; |
| @@ -824,52 +775,47 @@ BIO *cms_EnvelopedData_init_bio(CMS_ContentInfo *cms) | |||
| 824 | 775 | ||
| 825 | rinfos = cms->d.envelopedData->recipientInfos; | 776 | rinfos = cms->d.envelopedData->recipientInfos; |
| 826 | 777 | ||
| 827 | for (i = 0; i < sk_CMS_RecipientInfo_num(rinfos); i++) | 778 | for (i = 0; i < sk_CMS_RecipientInfo_num(rinfos); i++) { |
| 828 | { | ||
| 829 | ri = sk_CMS_RecipientInfo_value(rinfos, i); | 779 | ri = sk_CMS_RecipientInfo_value(rinfos, i); |
| 830 | 780 | ||
| 831 | switch (ri->type) | 781 | switch (ri->type) { |
| 832 | { | 782 | case CMS_RECIPINFO_TRANS: |
| 833 | case CMS_RECIPINFO_TRANS: | ||
| 834 | r = cms_RecipientInfo_ktri_encrypt(cms, ri); | 783 | r = cms_RecipientInfo_ktri_encrypt(cms, ri); |
| 835 | break; | 784 | break; |
| 836 | 785 | ||
| 837 | case CMS_RECIPINFO_KEK: | 786 | case CMS_RECIPINFO_KEK: |
| 838 | r = cms_RecipientInfo_kekri_encrypt(cms, ri); | 787 | r = cms_RecipientInfo_kekri_encrypt(cms, ri); |
| 839 | break; | 788 | break; |
| 840 | 789 | ||
| 841 | case CMS_RECIPINFO_PASS: | 790 | case CMS_RECIPINFO_PASS: |
| 842 | r = cms_RecipientInfo_pwri_crypt(cms, ri, 1); | 791 | r = cms_RecipientInfo_pwri_crypt(cms, ri, 1); |
| 843 | break; | 792 | break; |
| 844 | 793 | ||
| 845 | default: | 794 | default: |
| 846 | CMSerr(CMS_F_CMS_ENVELOPEDDATA_INIT_BIO, | 795 | CMSerr(CMS_F_CMS_ENVELOPEDDATA_INIT_BIO, |
| 847 | CMS_R_UNSUPPORTED_RECIPIENT_TYPE); | 796 | CMS_R_UNSUPPORTED_RECIPIENT_TYPE); |
| 848 | goto err; | 797 | goto err; |
| 849 | } | 798 | } |
| 850 | 799 | ||
| 851 | if (r <= 0) | 800 | if (r <= 0) { |
| 852 | { | ||
| 853 | CMSerr(CMS_F_CMS_ENVELOPEDDATA_INIT_BIO, | 801 | CMSerr(CMS_F_CMS_ENVELOPEDDATA_INIT_BIO, |
| 854 | CMS_R_ERROR_SETTING_RECIPIENTINFO); | 802 | CMS_R_ERROR_SETTING_RECIPIENTINFO); |
| 855 | goto err; | 803 | goto err; |
| 856 | } | ||
| 857 | } | 804 | } |
| 805 | } | ||
| 858 | 806 | ||
| 859 | ok = 1; | 807 | ok = 1; |
| 860 | 808 | ||
| 861 | err: | 809 | err: |
| 862 | ec->cipher = NULL; | 810 | ec->cipher = NULL; |
| 863 | if (ec->key) | 811 | if (ec->key) { |
| 864 | { | ||
| 865 | OPENSSL_cleanse(ec->key, ec->keylen); | 812 | OPENSSL_cleanse(ec->key, ec->keylen); |
| 866 | free(ec->key); | 813 | free(ec->key); |
| 867 | ec->key = NULL; | 814 | ec->key = NULL; |
| 868 | ec->keylen = 0; | 815 | ec->keylen = 0; |
| 869 | } | 816 | } |
| 870 | if (ok) | 817 | if (ok) |
| 871 | return ret; | 818 | return ret; |
| 872 | BIO_free(ret); | 819 | BIO_free(ret); |
| 873 | return NULL; | 820 | return NULL; |
| 874 | 821 | } | |
| 875 | } | ||
diff --git a/src/lib/libcrypto/cms/cms_err.c b/src/lib/libcrypto/cms/cms_err.c index 8330ead7ed..313354691a 100644 --- a/src/lib/libcrypto/cms/cms_err.c +++ b/src/lib/libcrypto/cms/cms_err.c | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | * are met: | 7 | * are met: |
| 8 | * | 8 | * |
| 9 | * 1. Redistributions of source code must retain the above copyright | 9 | * 1. Redistributions of source code must retain the above copyright |
| 10 | * notice, this list of conditions and the following disclaimer. | 10 | * notice, this list of conditions and the following disclaimer. |
| 11 | * | 11 | * |
| 12 | * 2. Redistributions in binary form must reproduce the above copyright | 12 | * 2. Redistributions in binary form must reproduce the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer in | 13 | * notice, this list of conditions and the following disclaimer in |
| @@ -68,178 +68,175 @@ | |||
| 68 | #define ERR_FUNC(func) ERR_PACK(ERR_LIB_CMS,func,0) | 68 | #define ERR_FUNC(func) ERR_PACK(ERR_LIB_CMS,func,0) |
| 69 | #define ERR_REASON(reason) ERR_PACK(ERR_LIB_CMS,0,reason) | 69 | #define ERR_REASON(reason) ERR_PACK(ERR_LIB_CMS,0,reason) |
| 70 | 70 | ||
| 71 | static ERR_STRING_DATA CMS_str_functs[]= | 71 | static ERR_STRING_DATA CMS_str_functs[]= { |
| 72 | { | 72 | {ERR_FUNC(CMS_F_CHECK_CONTENT), "CHECK_CONTENT"}, |
| 73 | {ERR_FUNC(CMS_F_CHECK_CONTENT), "CHECK_CONTENT"}, | 73 | {ERR_FUNC(CMS_F_CMS_ADD0_CERT), "CMS_add0_cert"}, |
| 74 | {ERR_FUNC(CMS_F_CMS_ADD0_CERT), "CMS_add0_cert"}, | 74 | {ERR_FUNC(CMS_F_CMS_ADD0_RECIPIENT_KEY), "CMS_add0_recipient_key"}, |
| 75 | {ERR_FUNC(CMS_F_CMS_ADD0_RECIPIENT_KEY), "CMS_add0_recipient_key"}, | 75 | {ERR_FUNC(CMS_F_CMS_ADD0_RECIPIENT_PASSWORD), "CMS_add0_recipient_password"}, |
| 76 | {ERR_FUNC(CMS_F_CMS_ADD0_RECIPIENT_PASSWORD), "CMS_add0_recipient_password"}, | 76 | {ERR_FUNC(CMS_F_CMS_ADD1_RECEIPTREQUEST), "CMS_add1_ReceiptRequest"}, |
| 77 | {ERR_FUNC(CMS_F_CMS_ADD1_RECEIPTREQUEST), "CMS_add1_ReceiptRequest"}, | 77 | {ERR_FUNC(CMS_F_CMS_ADD1_RECIPIENT_CERT), "CMS_add1_recipient_cert"}, |
| 78 | {ERR_FUNC(CMS_F_CMS_ADD1_RECIPIENT_CERT), "CMS_add1_recipient_cert"}, | 78 | {ERR_FUNC(CMS_F_CMS_ADD1_SIGNER), "CMS_add1_signer"}, |
| 79 | {ERR_FUNC(CMS_F_CMS_ADD1_SIGNER), "CMS_add1_signer"}, | 79 | {ERR_FUNC(CMS_F_CMS_ADD1_SIGNINGTIME), "CMS_ADD1_SIGNINGTIME"}, |
| 80 | {ERR_FUNC(CMS_F_CMS_ADD1_SIGNINGTIME), "CMS_ADD1_SIGNINGTIME"}, | 80 | {ERR_FUNC(CMS_F_CMS_COMPRESS), "CMS_compress"}, |
| 81 | {ERR_FUNC(CMS_F_CMS_COMPRESS), "CMS_compress"}, | 81 | {ERR_FUNC(CMS_F_CMS_COMPRESSEDDATA_CREATE), "cms_CompressedData_create"}, |
| 82 | {ERR_FUNC(CMS_F_CMS_COMPRESSEDDATA_CREATE), "cms_CompressedData_create"}, | 82 | {ERR_FUNC(CMS_F_CMS_COMPRESSEDDATA_INIT_BIO), "cms_CompressedData_init_bio"}, |
| 83 | {ERR_FUNC(CMS_F_CMS_COMPRESSEDDATA_INIT_BIO), "cms_CompressedData_init_bio"}, | 83 | {ERR_FUNC(CMS_F_CMS_COPY_CONTENT), "CMS_COPY_CONTENT"}, |
| 84 | {ERR_FUNC(CMS_F_CMS_COPY_CONTENT), "CMS_COPY_CONTENT"}, | 84 | {ERR_FUNC(CMS_F_CMS_COPY_MESSAGEDIGEST), "CMS_COPY_MESSAGEDIGEST"}, |
| 85 | {ERR_FUNC(CMS_F_CMS_COPY_MESSAGEDIGEST), "CMS_COPY_MESSAGEDIGEST"}, | 85 | {ERR_FUNC(CMS_F_CMS_DATA), "CMS_data"}, |
| 86 | {ERR_FUNC(CMS_F_CMS_DATA), "CMS_data"}, | 86 | {ERR_FUNC(CMS_F_CMS_DATAFINAL), "CMS_dataFinal"}, |
| 87 | {ERR_FUNC(CMS_F_CMS_DATAFINAL), "CMS_dataFinal"}, | 87 | {ERR_FUNC(CMS_F_CMS_DATAINIT), "CMS_dataInit"}, |
| 88 | {ERR_FUNC(CMS_F_CMS_DATAINIT), "CMS_dataInit"}, | 88 | {ERR_FUNC(CMS_F_CMS_DECRYPT), "CMS_decrypt"}, |
| 89 | {ERR_FUNC(CMS_F_CMS_DECRYPT), "CMS_decrypt"}, | 89 | {ERR_FUNC(CMS_F_CMS_DECRYPT_SET1_KEY), "CMS_decrypt_set1_key"}, |
| 90 | {ERR_FUNC(CMS_F_CMS_DECRYPT_SET1_KEY), "CMS_decrypt_set1_key"}, | 90 | {ERR_FUNC(CMS_F_CMS_DECRYPT_SET1_PASSWORD), "CMS_decrypt_set1_password"}, |
| 91 | {ERR_FUNC(CMS_F_CMS_DECRYPT_SET1_PASSWORD), "CMS_decrypt_set1_password"}, | 91 | {ERR_FUNC(CMS_F_CMS_DECRYPT_SET1_PKEY), "CMS_decrypt_set1_pkey"}, |
| 92 | {ERR_FUNC(CMS_F_CMS_DECRYPT_SET1_PKEY), "CMS_decrypt_set1_pkey"}, | 92 | {ERR_FUNC(CMS_F_CMS_DIGESTALGORITHM_FIND_CTX), "cms_DigestAlgorithm_find_ctx"}, |
| 93 | {ERR_FUNC(CMS_F_CMS_DIGESTALGORITHM_FIND_CTX), "cms_DigestAlgorithm_find_ctx"}, | 93 | {ERR_FUNC(CMS_F_CMS_DIGESTALGORITHM_INIT_BIO), "cms_DigestAlgorithm_init_bio"}, |
| 94 | {ERR_FUNC(CMS_F_CMS_DIGESTALGORITHM_INIT_BIO), "cms_DigestAlgorithm_init_bio"}, | 94 | {ERR_FUNC(CMS_F_CMS_DIGESTEDDATA_DO_FINAL), "cms_DigestedData_do_final"}, |
| 95 | {ERR_FUNC(CMS_F_CMS_DIGESTEDDATA_DO_FINAL), "cms_DigestedData_do_final"}, | 95 | {ERR_FUNC(CMS_F_CMS_DIGEST_VERIFY), "CMS_digest_verify"}, |
| 96 | {ERR_FUNC(CMS_F_CMS_DIGEST_VERIFY), "CMS_digest_verify"}, | 96 | {ERR_FUNC(CMS_F_CMS_ENCODE_RECEIPT), "cms_encode_Receipt"}, |
| 97 | {ERR_FUNC(CMS_F_CMS_ENCODE_RECEIPT), "cms_encode_Receipt"}, | 97 | {ERR_FUNC(CMS_F_CMS_ENCRYPT), "CMS_encrypt"}, |
| 98 | {ERR_FUNC(CMS_F_CMS_ENCRYPT), "CMS_encrypt"}, | 98 | {ERR_FUNC(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO), "cms_EncryptedContent_init_bio"}, |
| 99 | {ERR_FUNC(CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO), "cms_EncryptedContent_init_bio"}, | 99 | {ERR_FUNC(CMS_F_CMS_ENCRYPTEDDATA_DECRYPT), "CMS_EncryptedData_decrypt"}, |
| 100 | {ERR_FUNC(CMS_F_CMS_ENCRYPTEDDATA_DECRYPT), "CMS_EncryptedData_decrypt"}, | 100 | {ERR_FUNC(CMS_F_CMS_ENCRYPTEDDATA_ENCRYPT), "CMS_EncryptedData_encrypt"}, |
| 101 | {ERR_FUNC(CMS_F_CMS_ENCRYPTEDDATA_ENCRYPT), "CMS_EncryptedData_encrypt"}, | 101 | {ERR_FUNC(CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY), "CMS_EncryptedData_set1_key"}, |
| 102 | {ERR_FUNC(CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY), "CMS_EncryptedData_set1_key"}, | 102 | {ERR_FUNC(CMS_F_CMS_ENVELOPEDDATA_CREATE), "CMS_EnvelopedData_create"}, |
| 103 | {ERR_FUNC(CMS_F_CMS_ENVELOPEDDATA_CREATE), "CMS_EnvelopedData_create"}, | 103 | {ERR_FUNC(CMS_F_CMS_ENVELOPEDDATA_INIT_BIO), "cms_EnvelopedData_init_bio"}, |
| 104 | {ERR_FUNC(CMS_F_CMS_ENVELOPEDDATA_INIT_BIO), "cms_EnvelopedData_init_bio"}, | 104 | {ERR_FUNC(CMS_F_CMS_ENVELOPED_DATA_INIT), "CMS_ENVELOPED_DATA_INIT"}, |
| 105 | {ERR_FUNC(CMS_F_CMS_ENVELOPED_DATA_INIT), "CMS_ENVELOPED_DATA_INIT"}, | 105 | {ERR_FUNC(CMS_F_CMS_FINAL), "CMS_final"}, |
| 106 | {ERR_FUNC(CMS_F_CMS_FINAL), "CMS_final"}, | 106 | {ERR_FUNC(CMS_F_CMS_GET0_CERTIFICATE_CHOICES), "CMS_GET0_CERTIFICATE_CHOICES"}, |
| 107 | {ERR_FUNC(CMS_F_CMS_GET0_CERTIFICATE_CHOICES), "CMS_GET0_CERTIFICATE_CHOICES"}, | 107 | {ERR_FUNC(CMS_F_CMS_GET0_CONTENT), "CMS_get0_content"}, |
| 108 | {ERR_FUNC(CMS_F_CMS_GET0_CONTENT), "CMS_get0_content"}, | 108 | {ERR_FUNC(CMS_F_CMS_GET0_ECONTENT_TYPE), "CMS_GET0_ECONTENT_TYPE"}, |
| 109 | {ERR_FUNC(CMS_F_CMS_GET0_ECONTENT_TYPE), "CMS_GET0_ECONTENT_TYPE"}, | 109 | {ERR_FUNC(CMS_F_CMS_GET0_ENVELOPED), "cms_get0_enveloped"}, |
| 110 | {ERR_FUNC(CMS_F_CMS_GET0_ENVELOPED), "cms_get0_enveloped"}, | 110 | {ERR_FUNC(CMS_F_CMS_GET0_REVOCATION_CHOICES), "CMS_GET0_REVOCATION_CHOICES"}, |
| 111 | {ERR_FUNC(CMS_F_CMS_GET0_REVOCATION_CHOICES), "CMS_GET0_REVOCATION_CHOICES"}, | 111 | {ERR_FUNC(CMS_F_CMS_GET0_SIGNED), "CMS_GET0_SIGNED"}, |
| 112 | {ERR_FUNC(CMS_F_CMS_GET0_SIGNED), "CMS_GET0_SIGNED"}, | 112 | {ERR_FUNC(CMS_F_CMS_MSGSIGDIGEST_ADD1), "cms_msgSigDigest_add1"}, |
| 113 | {ERR_FUNC(CMS_F_CMS_MSGSIGDIGEST_ADD1), "cms_msgSigDigest_add1"}, | 113 | {ERR_FUNC(CMS_F_CMS_RECEIPTREQUEST_CREATE0), "CMS_ReceiptRequest_create0"}, |
| 114 | {ERR_FUNC(CMS_F_CMS_RECEIPTREQUEST_CREATE0), "CMS_ReceiptRequest_create0"}, | 114 | {ERR_FUNC(CMS_F_CMS_RECEIPT_VERIFY), "cms_Receipt_verify"}, |
| 115 | {ERR_FUNC(CMS_F_CMS_RECEIPT_VERIFY), "cms_Receipt_verify"}, | 115 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_DECRYPT), "CMS_RecipientInfo_decrypt"}, |
| 116 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_DECRYPT), "CMS_RecipientInfo_decrypt"}, | 116 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT), "CMS_RECIPIENTINFO_KEKRI_DECRYPT"}, |
| 117 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT), "CMS_RECIPIENTINFO_KEKRI_DECRYPT"}, | 117 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT), "CMS_RECIPIENTINFO_KEKRI_ENCRYPT"}, |
| 118 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT), "CMS_RECIPIENTINFO_KEKRI_ENCRYPT"}, | 118 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KEKRI_GET0_ID), "CMS_RecipientInfo_kekri_get0_id"}, |
| 119 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KEKRI_GET0_ID), "CMS_RecipientInfo_kekri_get0_id"}, | 119 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KEKRI_ID_CMP), "CMS_RecipientInfo_kekri_id_cmp"}, |
| 120 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KEKRI_ID_CMP), "CMS_RecipientInfo_kekri_id_cmp"}, | 120 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KTRI_CERT_CMP), "CMS_RecipientInfo_ktri_cert_cmp"}, |
| 121 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KTRI_CERT_CMP), "CMS_RecipientInfo_ktri_cert_cmp"}, | 121 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT), "CMS_RECIPIENTINFO_KTRI_DECRYPT"}, |
| 122 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT), "CMS_RECIPIENTINFO_KTRI_DECRYPT"}, | 122 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT), "CMS_RECIPIENTINFO_KTRI_ENCRYPT"}, |
| 123 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT), "CMS_RECIPIENTINFO_KTRI_ENCRYPT"}, | 123 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_ALGS), "CMS_RecipientInfo_ktri_get0_algs"}, |
| 124 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_ALGS), "CMS_RecipientInfo_ktri_get0_algs"}, | 124 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_SIGNER_ID), "CMS_RecipientInfo_ktri_get0_signer_id"}, |
| 125 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_SIGNER_ID), "CMS_RecipientInfo_ktri_get0_signer_id"}, | 125 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT), "cms_RecipientInfo_pwri_crypt"}, |
| 126 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT), "cms_RecipientInfo_pwri_crypt"}, | 126 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_SET0_KEY), "CMS_RecipientInfo_set0_key"}, |
| 127 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_SET0_KEY), "CMS_RecipientInfo_set0_key"}, | 127 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_SET0_PASSWORD), "CMS_RecipientInfo_set0_password"}, |
| 128 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_SET0_PASSWORD), "CMS_RecipientInfo_set0_password"}, | 128 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_SET0_PKEY), "CMS_RecipientInfo_set0_pkey"}, |
| 129 | {ERR_FUNC(CMS_F_CMS_RECIPIENTINFO_SET0_PKEY), "CMS_RecipientInfo_set0_pkey"}, | 129 | {ERR_FUNC(CMS_F_CMS_SET1_SIGNERIDENTIFIER), "cms_set1_SignerIdentifier"}, |
| 130 | {ERR_FUNC(CMS_F_CMS_SET1_SIGNERIDENTIFIER), "cms_set1_SignerIdentifier"}, | 130 | {ERR_FUNC(CMS_F_CMS_SET_DETACHED), "CMS_set_detached"}, |
| 131 | {ERR_FUNC(CMS_F_CMS_SET_DETACHED), "CMS_set_detached"}, | 131 | {ERR_FUNC(CMS_F_CMS_SIGN), "CMS_sign"}, |
| 132 | {ERR_FUNC(CMS_F_CMS_SIGN), "CMS_sign"}, | 132 | {ERR_FUNC(CMS_F_CMS_SIGNED_DATA_INIT), "CMS_SIGNED_DATA_INIT"}, |
| 133 | {ERR_FUNC(CMS_F_CMS_SIGNED_DATA_INIT), "CMS_SIGNED_DATA_INIT"}, | 133 | {ERR_FUNC(CMS_F_CMS_SIGNERINFO_CONTENT_SIGN), "CMS_SIGNERINFO_CONTENT_SIGN"}, |
| 134 | {ERR_FUNC(CMS_F_CMS_SIGNERINFO_CONTENT_SIGN), "CMS_SIGNERINFO_CONTENT_SIGN"}, | 134 | {ERR_FUNC(CMS_F_CMS_SIGNERINFO_SIGN), "CMS_SignerInfo_sign"}, |
| 135 | {ERR_FUNC(CMS_F_CMS_SIGNERINFO_SIGN), "CMS_SignerInfo_sign"}, | 135 | {ERR_FUNC(CMS_F_CMS_SIGNERINFO_VERIFY), "CMS_SignerInfo_verify"}, |
| 136 | {ERR_FUNC(CMS_F_CMS_SIGNERINFO_VERIFY), "CMS_SignerInfo_verify"}, | 136 | {ERR_FUNC(CMS_F_CMS_SIGNERINFO_VERIFY_CERT), "CMS_SIGNERINFO_VERIFY_CERT"}, |
| 137 | {ERR_FUNC(CMS_F_CMS_SIGNERINFO_VERIFY_CERT), "CMS_SIGNERINFO_VERIFY_CERT"}, | 137 | {ERR_FUNC(CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT), "CMS_SignerInfo_verify_content"}, |
| 138 | {ERR_FUNC(CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT), "CMS_SignerInfo_verify_content"}, | 138 | {ERR_FUNC(CMS_F_CMS_SIGN_RECEIPT), "CMS_sign_receipt"}, |
| 139 | {ERR_FUNC(CMS_F_CMS_SIGN_RECEIPT), "CMS_sign_receipt"}, | 139 | {ERR_FUNC(CMS_F_CMS_STREAM), "CMS_stream"}, |
| 140 | {ERR_FUNC(CMS_F_CMS_STREAM), "CMS_stream"}, | 140 | {ERR_FUNC(CMS_F_CMS_UNCOMPRESS), "CMS_uncompress"}, |
| 141 | {ERR_FUNC(CMS_F_CMS_UNCOMPRESS), "CMS_uncompress"}, | 141 | {ERR_FUNC(CMS_F_CMS_VERIFY), "CMS_verify"}, |
| 142 | {ERR_FUNC(CMS_F_CMS_VERIFY), "CMS_verify"}, | 142 | {0, NULL} |
| 143 | {0,NULL} | 143 | }; |
| 144 | }; | ||
| 145 | 144 | ||
| 146 | static ERR_STRING_DATA CMS_str_reasons[]= | 145 | static ERR_STRING_DATA CMS_str_reasons[]= { |
| 147 | { | 146 | {ERR_REASON(CMS_R_ADD_SIGNER_ERROR) , "add signer error"}, |
| 148 | {ERR_REASON(CMS_R_ADD_SIGNER_ERROR) ,"add signer error"}, | 147 | {ERR_REASON(CMS_R_CERTIFICATE_ALREADY_PRESENT), "certificate already present"}, |
| 149 | {ERR_REASON(CMS_R_CERTIFICATE_ALREADY_PRESENT),"certificate already present"}, | 148 | {ERR_REASON(CMS_R_CERTIFICATE_HAS_NO_KEYID), "certificate has no keyid"}, |
| 150 | {ERR_REASON(CMS_R_CERTIFICATE_HAS_NO_KEYID),"certificate has no keyid"}, | 149 | {ERR_REASON(CMS_R_CERTIFICATE_VERIFY_ERROR), "certificate verify error"}, |
| 151 | {ERR_REASON(CMS_R_CERTIFICATE_VERIFY_ERROR),"certificate verify error"}, | 150 | {ERR_REASON(CMS_R_CIPHER_INITIALISATION_ERROR), "cipher initialisation error"}, |
| 152 | {ERR_REASON(CMS_R_CIPHER_INITIALISATION_ERROR),"cipher initialisation error"}, | 151 | {ERR_REASON(CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR), "cipher parameter initialisation error"}, |
| 153 | {ERR_REASON(CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR),"cipher parameter initialisation error"}, | 152 | {ERR_REASON(CMS_R_CMS_DATAFINAL_ERROR) , "cms datafinal error"}, |
| 154 | {ERR_REASON(CMS_R_CMS_DATAFINAL_ERROR) ,"cms datafinal error"}, | 153 | {ERR_REASON(CMS_R_CMS_LIB) , "cms lib"}, |
| 155 | {ERR_REASON(CMS_R_CMS_LIB) ,"cms lib"}, | 154 | {ERR_REASON(CMS_R_CONTENTIDENTIFIER_MISMATCH), "contentidentifier mismatch"}, |
| 156 | {ERR_REASON(CMS_R_CONTENTIDENTIFIER_MISMATCH),"contentidentifier mismatch"}, | 155 | {ERR_REASON(CMS_R_CONTENT_NOT_FOUND) , "content not found"}, |
| 157 | {ERR_REASON(CMS_R_CONTENT_NOT_FOUND) ,"content not found"}, | 156 | {ERR_REASON(CMS_R_CONTENT_TYPE_MISMATCH) , "content type mismatch"}, |
| 158 | {ERR_REASON(CMS_R_CONTENT_TYPE_MISMATCH) ,"content type mismatch"}, | 157 | {ERR_REASON(CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA), "content type not compressed data"}, |
| 159 | {ERR_REASON(CMS_R_CONTENT_TYPE_NOT_COMPRESSED_DATA),"content type not compressed data"}, | 158 | {ERR_REASON(CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA), "content type not enveloped data"}, |
| 160 | {ERR_REASON(CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA),"content type not enveloped data"}, | 159 | {ERR_REASON(CMS_R_CONTENT_TYPE_NOT_SIGNED_DATA), "content type not signed data"}, |
| 161 | {ERR_REASON(CMS_R_CONTENT_TYPE_NOT_SIGNED_DATA),"content type not signed data"}, | 160 | {ERR_REASON(CMS_R_CONTENT_VERIFY_ERROR) , "content verify error"}, |
| 162 | {ERR_REASON(CMS_R_CONTENT_VERIFY_ERROR) ,"content verify error"}, | 161 | {ERR_REASON(CMS_R_CTRL_ERROR) , "ctrl error"}, |
| 163 | {ERR_REASON(CMS_R_CTRL_ERROR) ,"ctrl error"}, | 162 | {ERR_REASON(CMS_R_CTRL_FAILURE) , "ctrl failure"}, |
| 164 | {ERR_REASON(CMS_R_CTRL_FAILURE) ,"ctrl failure"}, | 163 | {ERR_REASON(CMS_R_DECRYPT_ERROR) , "decrypt error"}, |
| 165 | {ERR_REASON(CMS_R_DECRYPT_ERROR) ,"decrypt error"}, | 164 | {ERR_REASON(CMS_R_DIGEST_ERROR) , "digest error"}, |
| 166 | {ERR_REASON(CMS_R_DIGEST_ERROR) ,"digest error"}, | 165 | {ERR_REASON(CMS_R_ERROR_GETTING_PUBLIC_KEY), "error getting public key"}, |
| 167 | {ERR_REASON(CMS_R_ERROR_GETTING_PUBLIC_KEY),"error getting public key"}, | 166 | {ERR_REASON(CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE), "error reading messagedigest attribute"}, |
| 168 | {ERR_REASON(CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE),"error reading messagedigest attribute"}, | 167 | {ERR_REASON(CMS_R_ERROR_SETTING_KEY) , "error setting key"}, |
| 169 | {ERR_REASON(CMS_R_ERROR_SETTING_KEY) ,"error setting key"}, | 168 | {ERR_REASON(CMS_R_ERROR_SETTING_RECIPIENTINFO), "error setting recipientinfo"}, |
| 170 | {ERR_REASON(CMS_R_ERROR_SETTING_RECIPIENTINFO),"error setting recipientinfo"}, | 169 | {ERR_REASON(CMS_R_INVALID_ENCRYPTED_KEY_LENGTH), "invalid encrypted key length"}, |
| 171 | {ERR_REASON(CMS_R_INVALID_ENCRYPTED_KEY_LENGTH),"invalid encrypted key length"}, | 170 | {ERR_REASON(CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER), "invalid key encryption parameter"}, |
| 172 | {ERR_REASON(CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER),"invalid key encryption parameter"}, | 171 | {ERR_REASON(CMS_R_INVALID_KEY_LENGTH) , "invalid key length"}, |
| 173 | {ERR_REASON(CMS_R_INVALID_KEY_LENGTH) ,"invalid key length"}, | 172 | {ERR_REASON(CMS_R_MD_BIO_INIT_ERROR) , "md bio init error"}, |
| 174 | {ERR_REASON(CMS_R_MD_BIO_INIT_ERROR) ,"md bio init error"}, | 173 | {ERR_REASON(CMS_R_MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH), "messagedigest attribute wrong length"}, |
| 175 | {ERR_REASON(CMS_R_MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH),"messagedigest attribute wrong length"}, | 174 | {ERR_REASON(CMS_R_MESSAGEDIGEST_WRONG_LENGTH), "messagedigest wrong length"}, |
| 176 | {ERR_REASON(CMS_R_MESSAGEDIGEST_WRONG_LENGTH),"messagedigest wrong length"}, | 175 | {ERR_REASON(CMS_R_MSGSIGDIGEST_ERROR) , "msgsigdigest error"}, |
| 177 | {ERR_REASON(CMS_R_MSGSIGDIGEST_ERROR) ,"msgsigdigest error"}, | 176 | {ERR_REASON(CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE), "msgsigdigest verification failure"}, |
| 178 | {ERR_REASON(CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE),"msgsigdigest verification failure"}, | 177 | {ERR_REASON(CMS_R_MSGSIGDIGEST_WRONG_LENGTH), "msgsigdigest wrong length"}, |
| 179 | {ERR_REASON(CMS_R_MSGSIGDIGEST_WRONG_LENGTH),"msgsigdigest wrong length"}, | 178 | {ERR_REASON(CMS_R_NEED_ONE_SIGNER) , "need one signer"}, |
| 180 | {ERR_REASON(CMS_R_NEED_ONE_SIGNER) ,"need one signer"}, | 179 | {ERR_REASON(CMS_R_NOT_A_SIGNED_RECEIPT) , "not a signed receipt"}, |
| 181 | {ERR_REASON(CMS_R_NOT_A_SIGNED_RECEIPT) ,"not a signed receipt"}, | 180 | {ERR_REASON(CMS_R_NOT_ENCRYPTED_DATA) , "not encrypted data"}, |
| 182 | {ERR_REASON(CMS_R_NOT_ENCRYPTED_DATA) ,"not encrypted data"}, | 181 | {ERR_REASON(CMS_R_NOT_KEK) , "not kek"}, |
| 183 | {ERR_REASON(CMS_R_NOT_KEK) ,"not kek"}, | 182 | {ERR_REASON(CMS_R_NOT_KEY_TRANSPORT) , "not key transport"}, |
| 184 | {ERR_REASON(CMS_R_NOT_KEY_TRANSPORT) ,"not key transport"}, | 183 | {ERR_REASON(CMS_R_NOT_PWRI) , "not pwri"}, |
| 185 | {ERR_REASON(CMS_R_NOT_PWRI) ,"not pwri"}, | 184 | {ERR_REASON(CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE), "not supported for this key type"}, |
| 186 | {ERR_REASON(CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE),"not supported for this key type"}, | 185 | {ERR_REASON(CMS_R_NO_CIPHER) , "no cipher"}, |
| 187 | {ERR_REASON(CMS_R_NO_CIPHER) ,"no cipher"}, | 186 | {ERR_REASON(CMS_R_NO_CONTENT) , "no content"}, |
| 188 | {ERR_REASON(CMS_R_NO_CONTENT) ,"no content"}, | 187 | {ERR_REASON(CMS_R_NO_CONTENT_TYPE) , "no content type"}, |
| 189 | {ERR_REASON(CMS_R_NO_CONTENT_TYPE) ,"no content type"}, | 188 | {ERR_REASON(CMS_R_NO_DEFAULT_DIGEST) , "no default digest"}, |
| 190 | {ERR_REASON(CMS_R_NO_DEFAULT_DIGEST) ,"no default digest"}, | 189 | {ERR_REASON(CMS_R_NO_DIGEST_SET) , "no digest set"}, |
| 191 | {ERR_REASON(CMS_R_NO_DIGEST_SET) ,"no digest set"}, | 190 | {ERR_REASON(CMS_R_NO_KEY) , "no key"}, |
| 192 | {ERR_REASON(CMS_R_NO_KEY) ,"no key"}, | 191 | {ERR_REASON(CMS_R_NO_KEY_OR_CERT) , "no key or cert"}, |
| 193 | {ERR_REASON(CMS_R_NO_KEY_OR_CERT) ,"no key or cert"}, | 192 | {ERR_REASON(CMS_R_NO_MATCHING_DIGEST) , "no matching digest"}, |
| 194 | {ERR_REASON(CMS_R_NO_MATCHING_DIGEST) ,"no matching digest"}, | 193 | {ERR_REASON(CMS_R_NO_MATCHING_RECIPIENT) , "no matching recipient"}, |
| 195 | {ERR_REASON(CMS_R_NO_MATCHING_RECIPIENT) ,"no matching recipient"}, | 194 | {ERR_REASON(CMS_R_NO_MATCHING_SIGNATURE) , "no matching signature"}, |
| 196 | {ERR_REASON(CMS_R_NO_MATCHING_SIGNATURE) ,"no matching signature"}, | 195 | {ERR_REASON(CMS_R_NO_MSGSIGDIGEST) , "no msgsigdigest"}, |
| 197 | {ERR_REASON(CMS_R_NO_MSGSIGDIGEST) ,"no msgsigdigest"}, | 196 | {ERR_REASON(CMS_R_NO_PASSWORD) , "no password"}, |
| 198 | {ERR_REASON(CMS_R_NO_PASSWORD) ,"no password"}, | 197 | {ERR_REASON(CMS_R_NO_PRIVATE_KEY) , "no private key"}, |
| 199 | {ERR_REASON(CMS_R_NO_PRIVATE_KEY) ,"no private key"}, | 198 | {ERR_REASON(CMS_R_NO_PUBLIC_KEY) , "no public key"}, |
| 200 | {ERR_REASON(CMS_R_NO_PUBLIC_KEY) ,"no public key"}, | 199 | {ERR_REASON(CMS_R_NO_RECEIPT_REQUEST) , "no receipt request"}, |
| 201 | {ERR_REASON(CMS_R_NO_RECEIPT_REQUEST) ,"no receipt request"}, | 200 | {ERR_REASON(CMS_R_NO_SIGNERS) , "no signers"}, |
| 202 | {ERR_REASON(CMS_R_NO_SIGNERS) ,"no signers"}, | 201 | {ERR_REASON(CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE), "private key does not match certificate"}, |
| 203 | {ERR_REASON(CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE),"private key does not match certificate"}, | 202 | {ERR_REASON(CMS_R_RECEIPT_DECODE_ERROR) , "receipt decode error"}, |
| 204 | {ERR_REASON(CMS_R_RECEIPT_DECODE_ERROR) ,"receipt decode error"}, | 203 | {ERR_REASON(CMS_R_RECIPIENT_ERROR) , "recipient error"}, |
| 205 | {ERR_REASON(CMS_R_RECIPIENT_ERROR) ,"recipient error"}, | 204 | {ERR_REASON(CMS_R_SIGNER_CERTIFICATE_NOT_FOUND), "signer certificate not found"}, |
| 206 | {ERR_REASON(CMS_R_SIGNER_CERTIFICATE_NOT_FOUND),"signer certificate not found"}, | 205 | {ERR_REASON(CMS_R_SIGNFINAL_ERROR) , "signfinal error"}, |
| 207 | {ERR_REASON(CMS_R_SIGNFINAL_ERROR) ,"signfinal error"}, | 206 | {ERR_REASON(CMS_R_SMIME_TEXT_ERROR) , "smime text error"}, |
| 208 | {ERR_REASON(CMS_R_SMIME_TEXT_ERROR) ,"smime text error"}, | 207 | {ERR_REASON(CMS_R_STORE_INIT_ERROR) , "store init error"}, |
| 209 | {ERR_REASON(CMS_R_STORE_INIT_ERROR) ,"store init error"}, | 208 | {ERR_REASON(CMS_R_TYPE_NOT_COMPRESSED_DATA), "type not compressed data"}, |
| 210 | {ERR_REASON(CMS_R_TYPE_NOT_COMPRESSED_DATA),"type not compressed data"}, | 209 | {ERR_REASON(CMS_R_TYPE_NOT_DATA) , "type not data"}, |
| 211 | {ERR_REASON(CMS_R_TYPE_NOT_DATA) ,"type not data"}, | 210 | {ERR_REASON(CMS_R_TYPE_NOT_DIGESTED_DATA), "type not digested data"}, |
| 212 | {ERR_REASON(CMS_R_TYPE_NOT_DIGESTED_DATA),"type not digested data"}, | 211 | {ERR_REASON(CMS_R_TYPE_NOT_ENCRYPTED_DATA), "type not encrypted data"}, |
| 213 | {ERR_REASON(CMS_R_TYPE_NOT_ENCRYPTED_DATA),"type not encrypted data"}, | 212 | {ERR_REASON(CMS_R_TYPE_NOT_ENVELOPED_DATA), "type not enveloped data"}, |
| 214 | {ERR_REASON(CMS_R_TYPE_NOT_ENVELOPED_DATA),"type not enveloped data"}, | 213 | {ERR_REASON(CMS_R_UNABLE_TO_FINALIZE_CONTEXT), "unable to finalize context"}, |
| 215 | {ERR_REASON(CMS_R_UNABLE_TO_FINALIZE_CONTEXT),"unable to finalize context"}, | 214 | {ERR_REASON(CMS_R_UNKNOWN_CIPHER) , "unknown cipher"}, |
| 216 | {ERR_REASON(CMS_R_UNKNOWN_CIPHER) ,"unknown cipher"}, | 215 | {ERR_REASON(CMS_R_UNKNOWN_DIGEST_ALGORIHM), "unknown digest algorihm"}, |
| 217 | {ERR_REASON(CMS_R_UNKNOWN_DIGEST_ALGORIHM),"unknown digest algorihm"}, | 216 | {ERR_REASON(CMS_R_UNKNOWN_ID) , "unknown id"}, |
| 218 | {ERR_REASON(CMS_R_UNKNOWN_ID) ,"unknown id"}, | 217 | {ERR_REASON(CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM), "unsupported compression algorithm"}, |
| 219 | {ERR_REASON(CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM),"unsupported compression algorithm"}, | 218 | {ERR_REASON(CMS_R_UNSUPPORTED_CONTENT_TYPE), "unsupported content type"}, |
| 220 | {ERR_REASON(CMS_R_UNSUPPORTED_CONTENT_TYPE),"unsupported content type"}, | 219 | {ERR_REASON(CMS_R_UNSUPPORTED_KEK_ALGORITHM), "unsupported kek algorithm"}, |
| 221 | {ERR_REASON(CMS_R_UNSUPPORTED_KEK_ALGORITHM),"unsupported kek algorithm"}, | 220 | {ERR_REASON(CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM), "unsupported key encryption algorithm"}, |
| 222 | {ERR_REASON(CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM),"unsupported key encryption algorithm"}, | 221 | {ERR_REASON(CMS_R_UNSUPPORTED_RECIPIENT_TYPE), "unsupported recipient type"}, |
| 223 | {ERR_REASON(CMS_R_UNSUPPORTED_RECIPIENT_TYPE),"unsupported recipient type"}, | 222 | {ERR_REASON(CMS_R_UNSUPPORTED_RECPIENTINFO_TYPE), "unsupported recpientinfo type"}, |
| 224 | {ERR_REASON(CMS_R_UNSUPPORTED_RECPIENTINFO_TYPE),"unsupported recpientinfo type"}, | 223 | {ERR_REASON(CMS_R_UNSUPPORTED_TYPE) , "unsupported type"}, |
| 225 | {ERR_REASON(CMS_R_UNSUPPORTED_TYPE) ,"unsupported type"}, | 224 | {ERR_REASON(CMS_R_UNWRAP_ERROR) , "unwrap error"}, |
| 226 | {ERR_REASON(CMS_R_UNWRAP_ERROR) ,"unwrap error"}, | 225 | {ERR_REASON(CMS_R_UNWRAP_FAILURE) , "unwrap failure"}, |
| 227 | {ERR_REASON(CMS_R_UNWRAP_FAILURE) ,"unwrap failure"}, | 226 | {ERR_REASON(CMS_R_VERIFICATION_FAILURE) , "verification failure"}, |
| 228 | {ERR_REASON(CMS_R_VERIFICATION_FAILURE) ,"verification failure"}, | 227 | {ERR_REASON(CMS_R_WRAP_ERROR) , "wrap error"}, |
| 229 | {ERR_REASON(CMS_R_WRAP_ERROR) ,"wrap error"}, | 228 | {0, NULL} |
| 230 | {0,NULL} | 229 | }; |
| 231 | }; | ||
| 232 | 230 | ||
| 233 | #endif | 231 | #endif |
| 234 | 232 | ||
| 235 | void ERR_load_CMS_strings(void) | 233 | void |
| 236 | { | 234 | ERR_load_CMS_strings(void) |
| 235 | { | ||
| 237 | #ifndef OPENSSL_NO_ERR | 236 | #ifndef OPENSSL_NO_ERR |
| 238 | 237 | if (ERR_func_error_string(CMS_str_functs[0].error) == NULL) { | |
| 239 | if (ERR_func_error_string(CMS_str_functs[0].error) == NULL) | 238 | ERR_load_strings(0, CMS_str_functs); |
| 240 | { | 239 | ERR_load_strings(0, CMS_str_reasons); |
| 241 | ERR_load_strings(0,CMS_str_functs); | ||
| 242 | ERR_load_strings(0,CMS_str_reasons); | ||
| 243 | } | ||
| 244 | #endif | ||
| 245 | } | 240 | } |
| 241 | #endif | ||
| 242 | } | ||
diff --git a/src/lib/libcrypto/cms/cms_ess.c b/src/lib/libcrypto/cms/cms_ess.c index 8dbd56ef2b..6868edaaed 100644 --- a/src/lib/libcrypto/cms/cms_ess.c +++ b/src/lib/libcrypto/cms/cms_ess.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * are met: | 10 | * are met: |
| 11 | * | 11 | * |
| 12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * | 14 | * |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
| @@ -67,15 +67,17 @@ IMPLEMENT_ASN1_FUNCTIONS(CMS_ReceiptRequest) | |||
| 67 | 67 | ||
| 68 | /* ESS services: for now just Signed Receipt related */ | 68 | /* ESS services: for now just Signed Receipt related */ |
| 69 | 69 | ||
| 70 | int CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr) | 70 | int |
| 71 | { | 71 | CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr) |
| 72 | { | ||
| 72 | ASN1_STRING *str; | 73 | ASN1_STRING *str; |
| 73 | CMS_ReceiptRequest *rr = NULL; | 74 | CMS_ReceiptRequest *rr = NULL; |
| 75 | |||
| 74 | if (prr) | 76 | if (prr) |
| 75 | *prr = NULL; | 77 | *prr = NULL; |
| 76 | str = CMS_signed_get0_data_by_OBJ(si, | 78 | str = CMS_signed_get0_data_by_OBJ(si, |
| 77 | OBJ_nid2obj(NID_id_smime_aa_receiptRequest), | 79 | OBJ_nid2obj(NID_id_smime_aa_receiptRequest), |
| 78 | -3, V_ASN1_SEQUENCE); | 80 | -3, V_ASN1_SEQUENCE); |
| 79 | if (!str) | 81 | if (!str) |
| 80 | return 0; | 82 | return 0; |
| 81 | 83 | ||
| @@ -87,13 +89,12 @@ int CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr) | |||
| 87 | else | 89 | else |
| 88 | CMS_ReceiptRequest_free(rr); | 90 | CMS_ReceiptRequest_free(rr); |
| 89 | return 1; | 91 | return 1; |
| 90 | } | 92 | } |
| 91 | 93 | ||
| 92 | CMS_ReceiptRequest *CMS_ReceiptRequest_create0(unsigned char *id, int idlen, | 94 | CMS_ReceiptRequest * |
| 93 | int allorfirst, | 95 | CMS_ReceiptRequest_create0(unsigned char *id, int idlen, int allorfirst, |
| 94 | STACK_OF(GENERAL_NAMES) *receiptList, | 96 | STACK_OF(GENERAL_NAMES) *receiptList, STACK_OF(GENERAL_NAMES) *receiptsTo) |
| 95 | STACK_OF(GENERAL_NAMES) *receiptsTo) | 97 | { |
| 96 | { | ||
| 97 | CMS_ReceiptRequest *rr = NULL; | 98 | CMS_ReceiptRequest *rr = NULL; |
| 98 | 99 | ||
| 99 | rr = CMS_ReceiptRequest_new(); | 100 | rr = CMS_ReceiptRequest_new(); |
| @@ -101,44 +102,38 @@ CMS_ReceiptRequest *CMS_ReceiptRequest_create0(unsigned char *id, int idlen, | |||
| 101 | goto merr; | 102 | goto merr; |
| 102 | if (id) | 103 | if (id) |
| 103 | ASN1_STRING_set0(rr->signedContentIdentifier, id, idlen); | 104 | ASN1_STRING_set0(rr->signedContentIdentifier, id, idlen); |
| 104 | else | 105 | else { |
| 105 | { | ||
| 106 | if (!ASN1_STRING_set(rr->signedContentIdentifier, NULL, 32)) | 106 | if (!ASN1_STRING_set(rr->signedContentIdentifier, NULL, 32)) |
| 107 | goto merr; | 107 | goto merr; |
| 108 | if (RAND_pseudo_bytes(rr->signedContentIdentifier->data, 32) | 108 | if (RAND_pseudo_bytes(rr->signedContentIdentifier->data, 32) |
| 109 | <= 0) | 109 | <= 0) |
| 110 | goto err; | 110 | goto err; |
| 111 | } | 111 | } |
| 112 | 112 | ||
| 113 | sk_GENERAL_NAMES_pop_free(rr->receiptsTo, GENERAL_NAMES_free); | 113 | sk_GENERAL_NAMES_pop_free(rr->receiptsTo, GENERAL_NAMES_free); |
| 114 | rr->receiptsTo = receiptsTo; | 114 | rr->receiptsTo = receiptsTo; |
| 115 | 115 | ||
| 116 | if (receiptList) | 116 | if (receiptList) { |
| 117 | { | ||
| 118 | rr->receiptsFrom->type = 1; | 117 | rr->receiptsFrom->type = 1; |
| 119 | rr->receiptsFrom->d.receiptList = receiptList; | 118 | rr->receiptsFrom->d.receiptList = receiptList; |
| 120 | } | 119 | } else { |
| 121 | else | ||
| 122 | { | ||
| 123 | rr->receiptsFrom->type = 0; | 120 | rr->receiptsFrom->type = 0; |
| 124 | rr->receiptsFrom->d.allOrFirstTier = allorfirst; | 121 | rr->receiptsFrom->d.allOrFirstTier = allorfirst; |
| 125 | } | 122 | } |
| 126 | 123 | ||
| 127 | return rr; | 124 | return rr; |
| 128 | 125 | ||
| 129 | merr: | 126 | merr: |
| 130 | CMSerr(CMS_F_CMS_RECEIPTREQUEST_CREATE0, ERR_R_MALLOC_FAILURE); | 127 | CMSerr(CMS_F_CMS_RECEIPTREQUEST_CREATE0, ERR_R_MALLOC_FAILURE); |
| 131 | 128 | err: | |
| 132 | err: | ||
| 133 | if (rr) | 129 | if (rr) |
| 134 | CMS_ReceiptRequest_free(rr); | 130 | CMS_ReceiptRequest_free(rr); |
| 135 | |||
| 136 | return NULL; | 131 | return NULL; |
| 137 | 132 | } | |
| 138 | } | ||
| 139 | 133 | ||
| 140 | int CMS_add1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest *rr) | 134 | int |
| 141 | { | 135 | CMS_add1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest *rr) |
| 136 | { | ||
| 142 | unsigned char *rrder = NULL; | 137 | unsigned char *rrder = NULL; |
| 143 | int rrderlen, r = 0; | 138 | int rrderlen, r = 0; |
| 144 | 139 | ||
| @@ -147,86 +142,81 @@ int CMS_add1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest *rr) | |||
| 147 | goto merr; | 142 | goto merr; |
| 148 | 143 | ||
| 149 | if (!CMS_signed_add1_attr_by_NID(si, NID_id_smime_aa_receiptRequest, | 144 | if (!CMS_signed_add1_attr_by_NID(si, NID_id_smime_aa_receiptRequest, |
| 150 | V_ASN1_SEQUENCE, rrder, rrderlen)) | 145 | V_ASN1_SEQUENCE, rrder, rrderlen)) |
| 151 | goto merr; | 146 | goto merr; |
| 152 | 147 | ||
| 153 | r = 1; | 148 | r = 1; |
| 154 | 149 | ||
| 155 | merr: | 150 | merr: |
| 156 | if (!r) | 151 | if (!r) |
| 157 | CMSerr(CMS_F_CMS_ADD1_RECEIPTREQUEST, ERR_R_MALLOC_FAILURE); | 152 | CMSerr(CMS_F_CMS_ADD1_RECEIPTREQUEST, ERR_R_MALLOC_FAILURE); |
| 158 | |||
| 159 | free(rrder); | 153 | free(rrder); |
| 160 | |||
| 161 | return r; | 154 | return r; |
| 162 | 155 | } | |
| 163 | } | ||
| 164 | 156 | ||
| 165 | void CMS_ReceiptRequest_get0_values(CMS_ReceiptRequest *rr, | 157 | void |
| 166 | ASN1_STRING **pcid, | 158 | CMS_ReceiptRequest_get0_values(CMS_ReceiptRequest *rr, ASN1_STRING **pcid, |
| 167 | int *pallorfirst, | 159 | int *pallorfirst, STACK_OF(GENERAL_NAMES) **plist, |
| 168 | STACK_OF(GENERAL_NAMES) **plist, | 160 | STACK_OF(GENERAL_NAMES) **prto) |
| 169 | STACK_OF(GENERAL_NAMES) **prto) | 161 | { |
| 170 | { | ||
| 171 | if (pcid) | 162 | if (pcid) |
| 172 | *pcid = rr->signedContentIdentifier; | 163 | *pcid = rr->signedContentIdentifier; |
| 173 | if (rr->receiptsFrom->type == 0) | 164 | if (rr->receiptsFrom->type == 0) { |
| 174 | { | ||
| 175 | if (pallorfirst) | 165 | if (pallorfirst) |
| 176 | *pallorfirst = (int)rr->receiptsFrom->d.allOrFirstTier; | 166 | *pallorfirst = (int)rr->receiptsFrom->d.allOrFirstTier; |
| 177 | if (plist) | 167 | if (plist) |
| 178 | *plist = NULL; | 168 | *plist = NULL; |
| 179 | } | 169 | } else { |
| 180 | else | ||
| 181 | { | ||
| 182 | if (pallorfirst) | 170 | if (pallorfirst) |
| 183 | *pallorfirst = -1; | 171 | *pallorfirst = -1; |
| 184 | if (plist) | 172 | if (plist) |
| 185 | *plist = rr->receiptsFrom->d.receiptList; | 173 | *plist = rr->receiptsFrom->d.receiptList; |
| 186 | } | 174 | } |
| 187 | if (prto) | 175 | if (prto) |
| 188 | *prto = rr->receiptsTo; | 176 | *prto = rr->receiptsTo; |
| 189 | } | 177 | } |
| 190 | 178 | ||
| 191 | /* Digest a SignerInfo structure for msgSigDigest attribute processing */ | 179 | /* Digest a SignerInfo structure for msgSigDigest attribute processing */ |
| 192 | 180 | ||
| 193 | static int cms_msgSigDigest(CMS_SignerInfo *si, | 181 | static int |
| 194 | unsigned char *dig, unsigned int *diglen) | 182 | cms_msgSigDigest(CMS_SignerInfo *si, unsigned char *dig, unsigned int *diglen) |
| 195 | { | 183 | { |
| 196 | const EVP_MD *md; | 184 | const EVP_MD *md; |
| 185 | |||
| 197 | md = EVP_get_digestbyobj(si->digestAlgorithm->algorithm); | 186 | md = EVP_get_digestbyobj(si->digestAlgorithm->algorithm); |
| 198 | if (md == NULL) | 187 | if (md == NULL) |
| 199 | return 0; | 188 | return 0; |
| 200 | if (!ASN1_item_digest(ASN1_ITEM_rptr(CMS_Attributes_Verify), md, | 189 | if (!ASN1_item_digest(ASN1_ITEM_rptr(CMS_Attributes_Verify), md, |
| 201 | si->signedAttrs, dig, diglen)) | 190 | si->signedAttrs, dig, diglen)) |
| 202 | return 0; | 191 | return 0; |
| 203 | return 1; | 192 | return 1; |
| 204 | } | 193 | } |
| 205 | 194 | ||
| 206 | /* Add a msgSigDigest attribute to a SignerInfo */ | 195 | /* Add a msgSigDigest attribute to a SignerInfo */ |
| 207 | 196 | ||
| 208 | int cms_msgSigDigest_add1(CMS_SignerInfo *dest, CMS_SignerInfo *src) | 197 | int |
| 209 | { | 198 | cms_msgSigDigest_add1(CMS_SignerInfo *dest, CMS_SignerInfo *src) |
| 199 | { | ||
| 210 | unsigned char dig[EVP_MAX_MD_SIZE]; | 200 | unsigned char dig[EVP_MAX_MD_SIZE]; |
| 211 | unsigned int diglen; | 201 | unsigned int diglen; |
| 212 | if (!cms_msgSigDigest(src, dig, &diglen)) | 202 | |
| 213 | { | 203 | if (!cms_msgSigDigest(src, dig, &diglen)) { |
| 214 | CMSerr(CMS_F_CMS_MSGSIGDIGEST_ADD1, CMS_R_MSGSIGDIGEST_ERROR); | 204 | CMSerr(CMS_F_CMS_MSGSIGDIGEST_ADD1, CMS_R_MSGSIGDIGEST_ERROR); |
| 215 | return 0; | 205 | return 0; |
| 216 | } | 206 | } |
| 217 | if (!CMS_signed_add1_attr_by_NID(dest, NID_id_smime_aa_msgSigDigest, | 207 | if (!CMS_signed_add1_attr_by_NID(dest, NID_id_smime_aa_msgSigDigest, |
| 218 | V_ASN1_OCTET_STRING, dig, diglen)) | 208 | V_ASN1_OCTET_STRING, dig, diglen)) { |
| 219 | { | ||
| 220 | CMSerr(CMS_F_CMS_MSGSIGDIGEST_ADD1, ERR_R_MALLOC_FAILURE); | 209 | CMSerr(CMS_F_CMS_MSGSIGDIGEST_ADD1, ERR_R_MALLOC_FAILURE); |
| 221 | return 0; | 210 | return 0; |
| 222 | } | ||
| 223 | return 1; | ||
| 224 | } | 211 | } |
| 212 | return 1; | ||
| 213 | } | ||
| 225 | 214 | ||
| 226 | /* Verify signed receipt after it has already passed normal CMS verify */ | 215 | /* Verify signed receipt after it has already passed normal CMS verify */ |
| 227 | 216 | ||
| 228 | int cms_Receipt_verify(CMS_ContentInfo *cms, CMS_ContentInfo *req_cms) | 217 | int |
| 229 | { | 218 | cms_Receipt_verify(CMS_ContentInfo *cms, CMS_ContentInfo *req_cms) |
| 219 | { | ||
| 230 | int r = 0, i; | 220 | int r = 0, i; |
| 231 | CMS_ReceiptRequest *rr = NULL; | 221 | CMS_ReceiptRequest *rr = NULL; |
| 232 | CMS_Receipt *rct = NULL; | 222 | CMS_Receipt *rct = NULL; |
| @@ -243,138 +233,122 @@ int cms_Receipt_verify(CMS_ContentInfo *cms, CMS_ContentInfo *req_cms) | |||
| 243 | if (!osis || !sis) | 233 | if (!osis || !sis) |
| 244 | goto err; | 234 | goto err; |
| 245 | 235 | ||
| 246 | if (sk_CMS_SignerInfo_num(sis) != 1) | 236 | if (sk_CMS_SignerInfo_num(sis) != 1) { |
| 247 | { | ||
| 248 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NEED_ONE_SIGNER); | 237 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NEED_ONE_SIGNER); |
| 249 | goto err; | 238 | goto err; |
| 250 | } | 239 | } |
| 251 | 240 | ||
| 252 | /* Check receipt content type */ | 241 | /* Check receipt content type */ |
| 253 | if (OBJ_obj2nid(CMS_get0_eContentType(cms)) != NID_id_smime_ct_receipt) | 242 | if (OBJ_obj2nid(CMS_get0_eContentType(cms)) != NID_id_smime_ct_receipt) { |
| 254 | { | ||
| 255 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NOT_A_SIGNED_RECEIPT); | 243 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NOT_A_SIGNED_RECEIPT); |
| 256 | goto err; | 244 | goto err; |
| 257 | } | 245 | } |
| 258 | 246 | ||
| 259 | /* Extract and decode receipt content */ | 247 | /* Extract and decode receipt content */ |
| 260 | pcont = CMS_get0_content(cms); | 248 | pcont = CMS_get0_content(cms); |
| 261 | if (!pcont || !*pcont) | 249 | if (!pcont || !*pcont) { |
| 262 | { | ||
| 263 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NO_CONTENT); | 250 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NO_CONTENT); |
| 264 | goto err; | 251 | goto err; |
| 265 | } | 252 | } |
| 266 | 253 | ||
| 267 | rct = ASN1_item_unpack(*pcont, ASN1_ITEM_rptr(CMS_Receipt)); | 254 | rct = ASN1_item_unpack(*pcont, ASN1_ITEM_rptr(CMS_Receipt)); |
| 268 | 255 | ||
| 269 | if (!rct) | 256 | if (!rct) { |
| 270 | { | ||
| 271 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_RECEIPT_DECODE_ERROR); | 257 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_RECEIPT_DECODE_ERROR); |
| 272 | goto err; | 258 | goto err; |
| 273 | } | 259 | } |
| 274 | 260 | ||
| 275 | /* Locate original request */ | 261 | /* Locate original request */ |
| 276 | 262 | ||
| 277 | for (i = 0; i < sk_CMS_SignerInfo_num(osis); i++) | 263 | for (i = 0; i < sk_CMS_SignerInfo_num(osis); i++) { |
| 278 | { | ||
| 279 | osi = sk_CMS_SignerInfo_value(osis, i); | 264 | osi = sk_CMS_SignerInfo_value(osis, i); |
| 280 | if (!ASN1_STRING_cmp(osi->signature, | 265 | if (!ASN1_STRING_cmp(osi->signature, |
| 281 | rct->originatorSignatureValue)) | 266 | rct->originatorSignatureValue)) |
| 282 | break; | 267 | break; |
| 283 | } | 268 | } |
| 284 | 269 | ||
| 285 | if (i == sk_CMS_SignerInfo_num(osis)) | 270 | if (i == sk_CMS_SignerInfo_num(osis)) { |
| 286 | { | ||
| 287 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NO_MATCHING_SIGNATURE); | 271 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NO_MATCHING_SIGNATURE); |
| 288 | goto err; | 272 | goto err; |
| 289 | } | 273 | } |
| 290 | 274 | ||
| 291 | si = sk_CMS_SignerInfo_value(sis, 0); | 275 | si = sk_CMS_SignerInfo_value(sis, 0); |
| 292 | 276 | ||
| 293 | /* Get msgSigDigest value and compare */ | 277 | /* Get msgSigDigest value and compare */ |
| 294 | 278 | ||
| 295 | msig = CMS_signed_get0_data_by_OBJ(si, | 279 | msig = CMS_signed_get0_data_by_OBJ(si, |
| 296 | OBJ_nid2obj(NID_id_smime_aa_msgSigDigest), | 280 | OBJ_nid2obj(NID_id_smime_aa_msgSigDigest), -3, V_ASN1_OCTET_STRING); |
| 297 | -3, V_ASN1_OCTET_STRING); | ||
| 298 | 281 | ||
| 299 | if (!msig) | 282 | if (!msig) { |
| 300 | { | ||
| 301 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NO_MSGSIGDIGEST); | 283 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NO_MSGSIGDIGEST); |
| 302 | goto err; | 284 | goto err; |
| 303 | } | 285 | } |
| 304 | 286 | ||
| 305 | if (!cms_msgSigDigest(osi, dig, &diglen)) | 287 | if (!cms_msgSigDigest(osi, dig, &diglen)) { |
| 306 | { | ||
| 307 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_MSGSIGDIGEST_ERROR); | 288 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_MSGSIGDIGEST_ERROR); |
| 308 | goto err; | 289 | goto err; |
| 309 | } | 290 | } |
| 310 | 291 | ||
| 311 | if (diglen != (unsigned int)msig->length) | 292 | if (diglen != (unsigned int)msig->length) { |
| 312 | { | 293 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, |
| 313 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, | 294 | CMS_R_MSGSIGDIGEST_WRONG_LENGTH); |
| 314 | CMS_R_MSGSIGDIGEST_WRONG_LENGTH); | 295 | goto err; |
| 315 | goto err; | 296 | } |
| 316 | } | ||
| 317 | 297 | ||
| 318 | if (memcmp(dig, msig->data, diglen)) | 298 | if (memcmp(dig, msig->data, diglen)) { |
| 319 | { | 299 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, |
| 320 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, | 300 | CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE); |
| 321 | CMS_R_MSGSIGDIGEST_VERIFICATION_FAILURE); | 301 | goto err; |
| 322 | goto err; | 302 | } |
| 323 | } | ||
| 324 | 303 | ||
| 325 | /* Compare content types */ | 304 | /* Compare content types */ |
| 326 | 305 | ||
| 327 | octype = CMS_signed_get0_data_by_OBJ(osi, | 306 | octype = CMS_signed_get0_data_by_OBJ(osi, |
| 328 | OBJ_nid2obj(NID_pkcs9_contentType), | 307 | OBJ_nid2obj(NID_pkcs9_contentType), -3, V_ASN1_OBJECT); |
| 329 | -3, V_ASN1_OBJECT); | 308 | if (!octype) { |
| 330 | if (!octype) | ||
| 331 | { | ||
| 332 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NO_CONTENT_TYPE); | 309 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NO_CONTENT_TYPE); |
| 333 | goto err; | 310 | goto err; |
| 334 | } | 311 | } |
| 335 | 312 | ||
| 336 | /* Compare details in receipt request */ | 313 | /* Compare details in receipt request */ |
| 337 | 314 | ||
| 338 | if (OBJ_cmp(octype, rct->contentType)) | 315 | if (OBJ_cmp(octype, rct->contentType)) { |
| 339 | { | ||
| 340 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_CONTENT_TYPE_MISMATCH); | 316 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_CONTENT_TYPE_MISMATCH); |
| 341 | goto err; | 317 | goto err; |
| 342 | } | 318 | } |
| 343 | 319 | ||
| 344 | /* Get original receipt request details */ | 320 | /* Get original receipt request details */ |
| 345 | 321 | ||
| 346 | if (CMS_get1_ReceiptRequest(osi, &rr) <= 0) | 322 | if (CMS_get1_ReceiptRequest(osi, &rr) <= 0) { |
| 347 | { | ||
| 348 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NO_RECEIPT_REQUEST); | 323 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, CMS_R_NO_RECEIPT_REQUEST); |
| 349 | goto err; | 324 | goto err; |
| 350 | } | 325 | } |
| 351 | 326 | ||
| 352 | if (ASN1_STRING_cmp(rr->signedContentIdentifier, | 327 | if (ASN1_STRING_cmp(rr->signedContentIdentifier, |
| 353 | rct->signedContentIdentifier)) | 328 | rct->signedContentIdentifier)) { |
| 354 | { | ||
| 355 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, | 329 | CMSerr(CMS_F_CMS_RECEIPT_VERIFY, |
| 356 | CMS_R_CONTENTIDENTIFIER_MISMATCH); | 330 | CMS_R_CONTENTIDENTIFIER_MISMATCH); |
| 357 | goto err; | 331 | goto err; |
| 358 | } | 332 | } |
| 359 | 333 | ||
| 360 | r = 1; | 334 | r = 1; |
| 361 | 335 | ||
| 362 | err: | 336 | err: |
| 363 | if (rr) | 337 | if (rr) |
| 364 | CMS_ReceiptRequest_free(rr); | 338 | CMS_ReceiptRequest_free(rr); |
| 365 | if (rct) | 339 | if (rct) |
| 366 | M_ASN1_free_of(rct, CMS_Receipt); | 340 | M_ASN1_free_of(rct, CMS_Receipt); |
| 367 | 341 | ||
| 368 | return r; | 342 | return r; |
| 369 | 343 | } | |
| 370 | } | ||
| 371 | 344 | ||
| 372 | /* Encode a Receipt into an OCTET STRING read for including into content of | 345 | /* Encode a Receipt into an OCTET STRING read for including into content of |
| 373 | * a SignedData ContentInfo. | 346 | * a SignedData ContentInfo. |
| 374 | */ | 347 | */ |
| 375 | 348 | ||
| 376 | ASN1_OCTET_STRING *cms_encode_Receipt(CMS_SignerInfo *si) | 349 | ASN1_OCTET_STRING * |
| 377 | { | 350 | cms_encode_Receipt(CMS_SignerInfo *si) |
| 351 | { | ||
| 378 | CMS_Receipt rct; | 352 | CMS_Receipt rct; |
| 379 | CMS_ReceiptRequest *rr = NULL; | 353 | CMS_ReceiptRequest *rr = NULL; |
| 380 | ASN1_OBJECT *ctype; | 354 | ASN1_OBJECT *ctype; |
| @@ -384,22 +358,19 @@ ASN1_OCTET_STRING *cms_encode_Receipt(CMS_SignerInfo *si) | |||
| 384 | 358 | ||
| 385 | /* Get original receipt request details */ | 359 | /* Get original receipt request details */ |
| 386 | 360 | ||
| 387 | if (CMS_get1_ReceiptRequest(si, &rr) <= 0) | 361 | if (CMS_get1_ReceiptRequest(si, &rr) <= 0) { |
| 388 | { | ||
| 389 | CMSerr(CMS_F_CMS_ENCODE_RECEIPT, CMS_R_NO_RECEIPT_REQUEST); | 362 | CMSerr(CMS_F_CMS_ENCODE_RECEIPT, CMS_R_NO_RECEIPT_REQUEST); |
| 390 | goto err; | 363 | goto err; |
| 391 | } | 364 | } |
| 392 | 365 | ||
| 393 | /* Get original content type */ | 366 | /* Get original content type */ |
| 394 | 367 | ||
| 395 | ctype = CMS_signed_get0_data_by_OBJ(si, | 368 | ctype = CMS_signed_get0_data_by_OBJ(si, |
| 396 | OBJ_nid2obj(NID_pkcs9_contentType), | 369 | OBJ_nid2obj(NID_pkcs9_contentType), -3, V_ASN1_OBJECT); |
| 397 | -3, V_ASN1_OBJECT); | 370 | if (!ctype) { |
| 398 | if (!ctype) | ||
| 399 | { | ||
| 400 | CMSerr(CMS_F_CMS_ENCODE_RECEIPT, CMS_R_NO_CONTENT_TYPE); | 371 | CMSerr(CMS_F_CMS_ENCODE_RECEIPT, CMS_R_NO_CONTENT_TYPE); |
| 401 | goto err; | 372 | goto err; |
| 402 | } | 373 | } |
| 403 | 374 | ||
| 404 | rct.version = 1; | 375 | rct.version = 1; |
| 405 | rct.contentType = ctype; | 376 | rct.contentType = ctype; |
| @@ -408,12 +379,8 @@ ASN1_OCTET_STRING *cms_encode_Receipt(CMS_SignerInfo *si) | |||
| 408 | 379 | ||
| 409 | os = ASN1_item_pack(&rct, ASN1_ITEM_rptr(CMS_Receipt), NULL); | 380 | os = ASN1_item_pack(&rct, ASN1_ITEM_rptr(CMS_Receipt), NULL); |
| 410 | 381 | ||
| 411 | err: | 382 | err: |
| 412 | if (rr) | 383 | if (rr) |
| 413 | CMS_ReceiptRequest_free(rr); | 384 | CMS_ReceiptRequest_free(rr); |
| 414 | |||
| 415 | return os; | 385 | return os; |
| 416 | 386 | } | |
| 417 | } | ||
| 418 | |||
| 419 | |||
diff --git a/src/lib/libcrypto/cms/cms_io.c b/src/lib/libcrypto/cms/cms_io.c index 1cb0264cc5..f8c1d45152 100644 --- a/src/lib/libcrypto/cms/cms_io.c +++ b/src/lib/libcrypto/cms/cms_io.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * are met: | 10 | * are met: |
| 11 | * | 11 | * |
| 12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * | 14 | * |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
| @@ -58,76 +58,82 @@ | |||
| 58 | #include "cms.h" | 58 | #include "cms.h" |
| 59 | #include "cms_lcl.h" | 59 | #include "cms_lcl.h" |
| 60 | 60 | ||
| 61 | int CMS_stream(unsigned char ***boundary, CMS_ContentInfo *cms) | 61 | int |
| 62 | { | 62 | CMS_stream(unsigned char ***boundary, CMS_ContentInfo *cms) |
| 63 | { | ||
| 63 | ASN1_OCTET_STRING **pos; | 64 | ASN1_OCTET_STRING **pos; |
| 65 | |||
| 64 | pos = CMS_get0_content(cms); | 66 | pos = CMS_get0_content(cms); |
| 65 | if (!pos) | 67 | if (!pos) |
| 66 | return 0; | 68 | return 0; |
| 67 | if (!*pos) | 69 | if (!*pos) |
| 68 | *pos = ASN1_OCTET_STRING_new(); | 70 | *pos = ASN1_OCTET_STRING_new(); |
| 69 | if (*pos) | 71 | if (*pos) { |
| 70 | { | ||
| 71 | (*pos)->flags |= ASN1_STRING_FLAG_NDEF; | 72 | (*pos)->flags |= ASN1_STRING_FLAG_NDEF; |
| 72 | (*pos)->flags &= ~ASN1_STRING_FLAG_CONT; | 73 | (*pos)->flags &= ~ASN1_STRING_FLAG_CONT; |
| 73 | *boundary = &(*pos)->data; | 74 | *boundary = &(*pos)->data; |
| 74 | return 1; | 75 | return 1; |
| 75 | } | 76 | } |
| 76 | CMSerr(CMS_F_CMS_STREAM, ERR_R_MALLOC_FAILURE); | 77 | CMSerr(CMS_F_CMS_STREAM, ERR_R_MALLOC_FAILURE); |
| 77 | return 0; | 78 | return 0; |
| 78 | } | 79 | } |
| 79 | 80 | ||
| 80 | CMS_ContentInfo *d2i_CMS_bio(BIO *bp, CMS_ContentInfo **cms) | 81 | CMS_ContentInfo * |
| 81 | { | 82 | d2i_CMS_bio(BIO *bp, CMS_ContentInfo **cms) |
| 83 | { | ||
| 82 | return ASN1_item_d2i_bio(ASN1_ITEM_rptr(CMS_ContentInfo), bp, cms); | 84 | return ASN1_item_d2i_bio(ASN1_ITEM_rptr(CMS_ContentInfo), bp, cms); |
| 83 | } | 85 | } |
| 84 | 86 | ||
| 85 | int i2d_CMS_bio(BIO *bp, CMS_ContentInfo *cms) | 87 | int |
| 86 | { | 88 | i2d_CMS_bio(BIO *bp, CMS_ContentInfo *cms) |
| 89 | { | ||
| 87 | return ASN1_item_i2d_bio(ASN1_ITEM_rptr(CMS_ContentInfo), bp, cms); | 90 | return ASN1_item_i2d_bio(ASN1_ITEM_rptr(CMS_ContentInfo), bp, cms); |
| 88 | } | 91 | } |
| 89 | 92 | ||
| 90 | IMPLEMENT_PEM_rw_const(CMS, CMS_ContentInfo, PEM_STRING_CMS, CMS_ContentInfo) | 93 | IMPLEMENT_PEM_rw_const(CMS, CMS_ContentInfo, PEM_STRING_CMS, CMS_ContentInfo) |
| 91 | 94 | ||
| 92 | BIO *BIO_new_CMS(BIO *out, CMS_ContentInfo *cms) | 95 | BIO * |
| 93 | { | 96 | BIO_new_CMS(BIO *out, CMS_ContentInfo *cms) |
| 97 | { | ||
| 94 | return BIO_new_NDEF(out, (ASN1_VALUE *)cms, | 98 | return BIO_new_NDEF(out, (ASN1_VALUE *)cms, |
| 95 | ASN1_ITEM_rptr(CMS_ContentInfo)); | 99 | ASN1_ITEM_rptr(CMS_ContentInfo)); |
| 96 | } | 100 | } |
| 97 | 101 | ||
| 98 | /* CMS wrappers round generalised stream and MIME routines */ | 102 | /* CMS wrappers round generalised stream and MIME routines */ |
| 99 | 103 | ||
| 100 | int i2d_CMS_bio_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags) | 104 | int |
| 101 | { | 105 | i2d_CMS_bio_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags) |
| 106 | { | ||
| 102 | return i2d_ASN1_bio_stream(out, (ASN1_VALUE *)cms, in, flags, | 107 | return i2d_ASN1_bio_stream(out, (ASN1_VALUE *)cms, in, flags, |
| 103 | ASN1_ITEM_rptr(CMS_ContentInfo)); | 108 | ASN1_ITEM_rptr(CMS_ContentInfo)); |
| 104 | } | 109 | } |
| 105 | 110 | ||
| 106 | int PEM_write_bio_CMS_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags) | 111 | int |
| 107 | { | 112 | PEM_write_bio_CMS_stream(BIO *out, CMS_ContentInfo *cms, BIO *in, int flags) |
| 113 | { | ||
| 108 | return PEM_write_bio_ASN1_stream(out, (ASN1_VALUE *) cms, in, flags, | 114 | return PEM_write_bio_ASN1_stream(out, (ASN1_VALUE *) cms, in, flags, |
| 109 | "CMS", | 115 | "CMS", ASN1_ITEM_rptr(CMS_ContentInfo)); |
| 110 | ASN1_ITEM_rptr(CMS_ContentInfo)); | 116 | } |
| 111 | } | ||
| 112 | 117 | ||
| 113 | int SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags) | 118 | int |
| 114 | { | 119 | SMIME_write_CMS(BIO *bio, CMS_ContentInfo *cms, BIO *data, int flags) |
| 120 | { | ||
| 115 | STACK_OF(X509_ALGOR) *mdalgs; | 121 | STACK_OF(X509_ALGOR) *mdalgs; |
| 116 | int ctype_nid = OBJ_obj2nid(cms->contentType); | 122 | int ctype_nid = OBJ_obj2nid(cms->contentType); |
| 117 | int econt_nid = OBJ_obj2nid(CMS_get0_eContentType(cms)); | 123 | int econt_nid = OBJ_obj2nid(CMS_get0_eContentType(cms)); |
| 124 | |||
| 118 | if (ctype_nid == NID_pkcs7_signed) | 125 | if (ctype_nid == NID_pkcs7_signed) |
| 119 | mdalgs = cms->d.signedData->digestAlgorithms; | 126 | mdalgs = cms->d.signedData->digestAlgorithms; |
| 120 | else | 127 | else |
| 121 | mdalgs = NULL; | 128 | mdalgs = NULL; |
| 122 | 129 | ||
| 123 | return SMIME_write_ASN1(bio, (ASN1_VALUE *)cms, data, flags, | 130 | return SMIME_write_ASN1(bio, (ASN1_VALUE *)cms, data, flags, |
| 124 | ctype_nid, econt_nid, mdalgs, | 131 | ctype_nid, econt_nid, mdalgs, ASN1_ITEM_rptr(CMS_ContentInfo)); |
| 125 | ASN1_ITEM_rptr(CMS_ContentInfo)); | 132 | } |
| 126 | } | ||
| 127 | 133 | ||
| 128 | CMS_ContentInfo *SMIME_read_CMS(BIO *bio, BIO **bcont) | 134 | CMS_ContentInfo * |
| 129 | { | 135 | SMIME_read_CMS(BIO *bio, BIO **bcont) |
| 136 | { | ||
| 130 | return (CMS_ContentInfo *)SMIME_read_ASN1(bio, bcont, | 137 | return (CMS_ContentInfo *)SMIME_read_ASN1(bio, bcont, |
| 131 | ASN1_ITEM_rptr(CMS_ContentInfo)); | 138 | ASN1_ITEM_rptr(CMS_ContentInfo)); |
| 132 | } | 139 | } |
| 133 | |||
diff --git a/src/lib/libcrypto/cms/cms_lcl.h b/src/lib/libcrypto/cms/cms_lcl.h index a9f9730157..3c905342f4 100644 --- a/src/lib/libcrypto/cms/cms_lcl.h +++ b/src/lib/libcrypto/cms/cms_lcl.h | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * are met: | 10 | * are met: |
| 11 | * | 11 | * |
| 12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * | 14 | * |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
| @@ -93,10 +93,9 @@ typedef struct CMS_PasswordRecipientInfo_st CMS_PasswordRecipientInfo; | |||
| 93 | typedef struct CMS_OtherRecipientInfo_st CMS_OtherRecipientInfo; | 93 | typedef struct CMS_OtherRecipientInfo_st CMS_OtherRecipientInfo; |
| 94 | typedef struct CMS_ReceiptsFrom_st CMS_ReceiptsFrom; | 94 | typedef struct CMS_ReceiptsFrom_st CMS_ReceiptsFrom; |
| 95 | 95 | ||
| 96 | struct CMS_ContentInfo_st | 96 | struct CMS_ContentInfo_st { |
| 97 | { | ||
| 98 | ASN1_OBJECT *contentType; | 97 | ASN1_OBJECT *contentType; |
| 99 | union { | 98 | union { |
| 100 | ASN1_OCTET_STRING *data; | 99 | ASN1_OCTET_STRING *data; |
| 101 | CMS_SignedData *signedData; | 100 | CMS_SignedData *signedData; |
| 102 | CMS_EnvelopedData *envelopedData; | 101 | CMS_EnvelopedData *envelopedData; |
| @@ -107,29 +106,26 @@ struct CMS_ContentInfo_st | |||
| 107 | ASN1_TYPE *other; | 106 | ASN1_TYPE *other; |
| 108 | /* Other types ... */ | 107 | /* Other types ... */ |
| 109 | void *otherData; | 108 | void *otherData; |
| 110 | } d; | 109 | } d; |
| 111 | }; | 110 | }; |
| 112 | 111 | ||
| 113 | struct CMS_SignedData_st | 112 | struct CMS_SignedData_st { |
| 114 | { | ||
| 115 | long version; | 113 | long version; |
| 116 | STACK_OF(X509_ALGOR) *digestAlgorithms; | 114 | STACK_OF(X509_ALGOR) *digestAlgorithms; |
| 117 | CMS_EncapsulatedContentInfo *encapContentInfo; | 115 | CMS_EncapsulatedContentInfo *encapContentInfo; |
| 118 | STACK_OF(CMS_CertificateChoices) *certificates; | 116 | STACK_OF(CMS_CertificateChoices) *certificates; |
| 119 | STACK_OF(CMS_RevocationInfoChoice) *crls; | 117 | STACK_OF(CMS_RevocationInfoChoice) *crls; |
| 120 | STACK_OF(CMS_SignerInfo) *signerInfos; | 118 | STACK_OF(CMS_SignerInfo) *signerInfos; |
| 121 | }; | 119 | }; |
| 122 | 120 | ||
| 123 | struct CMS_EncapsulatedContentInfo_st | 121 | struct CMS_EncapsulatedContentInfo_st { |
| 124 | { | ||
| 125 | ASN1_OBJECT *eContentType; | 122 | ASN1_OBJECT *eContentType; |
| 126 | ASN1_OCTET_STRING *eContent; | 123 | ASN1_OCTET_STRING *eContent; |
| 127 | /* Set to 1 if incomplete structure only part set up */ | 124 | /* Set to 1 if incomplete structure only part set up */ |
| 128 | int partial; | 125 | int partial; |
| 129 | }; | 126 | }; |
| 130 | 127 | ||
| 131 | struct CMS_SignerInfo_st | 128 | struct CMS_SignerInfo_st { |
| 132 | { | ||
| 133 | long version; | 129 | long version; |
| 134 | CMS_SignerIdentifier *sid; | 130 | CMS_SignerIdentifier *sid; |
| 135 | X509_ALGOR *digestAlgorithm; | 131 | X509_ALGOR *digestAlgorithm; |
| @@ -140,34 +136,30 @@ struct CMS_SignerInfo_st | |||
| 140 | /* Signing certificate and key */ | 136 | /* Signing certificate and key */ |
| 141 | X509 *signer; | 137 | X509 *signer; |
| 142 | EVP_PKEY *pkey; | 138 | EVP_PKEY *pkey; |
| 143 | }; | 139 | }; |
| 144 | 140 | ||
| 145 | struct CMS_SignerIdentifier_st | 141 | struct CMS_SignerIdentifier_st { |
| 146 | { | ||
| 147 | int type; | 142 | int type; |
| 148 | union { | 143 | union { |
| 149 | CMS_IssuerAndSerialNumber *issuerAndSerialNumber; | 144 | CMS_IssuerAndSerialNumber *issuerAndSerialNumber; |
| 150 | ASN1_OCTET_STRING *subjectKeyIdentifier; | 145 | ASN1_OCTET_STRING *subjectKeyIdentifier; |
| 151 | } d; | 146 | } d; |
| 152 | }; | 147 | }; |
| 153 | 148 | ||
| 154 | struct CMS_EnvelopedData_st | 149 | struct CMS_EnvelopedData_st { |
| 155 | { | ||
| 156 | long version; | 150 | long version; |
| 157 | CMS_OriginatorInfo *originatorInfo; | 151 | CMS_OriginatorInfo *originatorInfo; |
| 158 | STACK_OF(CMS_RecipientInfo) *recipientInfos; | 152 | STACK_OF(CMS_RecipientInfo) *recipientInfos; |
| 159 | CMS_EncryptedContentInfo *encryptedContentInfo; | 153 | CMS_EncryptedContentInfo *encryptedContentInfo; |
| 160 | STACK_OF(X509_ATTRIBUTE) *unprotectedAttrs; | 154 | STACK_OF(X509_ATTRIBUTE) *unprotectedAttrs; |
| 161 | }; | 155 | }; |
| 162 | 156 | ||
| 163 | struct CMS_OriginatorInfo_st | 157 | struct CMS_OriginatorInfo_st { |
| 164 | { | ||
| 165 | STACK_OF(CMS_CertificateChoices) *certificates; | 158 | STACK_OF(CMS_CertificateChoices) *certificates; |
| 166 | STACK_OF(CMS_RevocationInfoChoice) *crls; | 159 | STACK_OF(CMS_RevocationInfoChoice) *crls; |
| 167 | }; | 160 | }; |
| 168 | 161 | ||
| 169 | struct CMS_EncryptedContentInfo_st | 162 | struct CMS_EncryptedContentInfo_st { |
| 170 | { | ||
| 171 | ASN1_OBJECT *contentType; | 163 | ASN1_OBJECT *contentType; |
| 172 | X509_ALGOR *contentEncryptionAlgorithm; | 164 | X509_ALGOR *contentEncryptionAlgorithm; |
| 173 | ASN1_OCTET_STRING *encryptedContent; | 165 | ASN1_OCTET_STRING *encryptedContent; |
| @@ -177,24 +169,22 @@ struct CMS_EncryptedContentInfo_st | |||
| 177 | size_t keylen; | 169 | size_t keylen; |
| 178 | /* Set to 1 if we are debugging decrypt and don't fake keys for MMA */ | 170 | /* Set to 1 if we are debugging decrypt and don't fake keys for MMA */ |
| 179 | int debug; | 171 | int debug; |
| 180 | }; | 172 | }; |
| 181 | 173 | ||
| 182 | struct CMS_RecipientInfo_st | 174 | struct CMS_RecipientInfo_st { |
| 183 | { | 175 | int type; |
| 184 | int type; | 176 | union { |
| 185 | union { | 177 | CMS_KeyTransRecipientInfo *ktri; |
| 186 | CMS_KeyTransRecipientInfo *ktri; | 178 | CMS_KeyAgreeRecipientInfo *kari; |
| 187 | CMS_KeyAgreeRecipientInfo *kari; | 179 | CMS_KEKRecipientInfo *kekri; |
| 188 | CMS_KEKRecipientInfo *kekri; | ||
| 189 | CMS_PasswordRecipientInfo *pwri; | 180 | CMS_PasswordRecipientInfo *pwri; |
| 190 | CMS_OtherRecipientInfo *ori; | 181 | CMS_OtherRecipientInfo *ori; |
| 191 | } d; | 182 | } d; |
| 192 | }; | 183 | }; |
| 193 | 184 | ||
| 194 | typedef CMS_SignerIdentifier CMS_RecipientIdentifier; | 185 | typedef CMS_SignerIdentifier CMS_RecipientIdentifier; |
| 195 | 186 | ||
| 196 | struct CMS_KeyTransRecipientInfo_st | 187 | struct CMS_KeyTransRecipientInfo_st { |
| 197 | { | ||
| 198 | long version; | 188 | long version; |
| 199 | CMS_RecipientIdentifier *rid; | 189 | CMS_RecipientIdentifier *rid; |
| 200 | X509_ALGOR *keyEncryptionAlgorithm; | 190 | X509_ALGOR *keyEncryptionAlgorithm; |
| @@ -202,107 +192,94 @@ struct CMS_KeyTransRecipientInfo_st | |||
| 202 | /* Recipient Key and cert */ | 192 | /* Recipient Key and cert */ |
| 203 | X509 *recip; | 193 | X509 *recip; |
| 204 | EVP_PKEY *pkey; | 194 | EVP_PKEY *pkey; |
| 205 | }; | 195 | }; |
| 206 | 196 | ||
| 207 | struct CMS_KeyAgreeRecipientInfo_st | 197 | struct CMS_KeyAgreeRecipientInfo_st { |
| 208 | { | ||
| 209 | long version; | 198 | long version; |
| 210 | CMS_OriginatorIdentifierOrKey *originator; | 199 | CMS_OriginatorIdentifierOrKey *originator; |
| 211 | ASN1_OCTET_STRING *ukm; | 200 | ASN1_OCTET_STRING *ukm; |
| 212 | X509_ALGOR *keyEncryptionAlgorithm; | 201 | X509_ALGOR *keyEncryptionAlgorithm; |
| 213 | STACK_OF(CMS_RecipientEncryptedKey) *recipientEncryptedKeys; | 202 | STACK_OF(CMS_RecipientEncryptedKey) *recipientEncryptedKeys; |
| 214 | }; | 203 | }; |
| 215 | 204 | ||
| 216 | struct CMS_OriginatorIdentifierOrKey_st | 205 | struct CMS_OriginatorIdentifierOrKey_st { |
| 217 | { | ||
| 218 | int type; | 206 | int type; |
| 219 | union { | 207 | union { |
| 220 | CMS_IssuerAndSerialNumber *issuerAndSerialNumber; | 208 | CMS_IssuerAndSerialNumber *issuerAndSerialNumber; |
| 221 | ASN1_OCTET_STRING *subjectKeyIdentifier; | 209 | ASN1_OCTET_STRING *subjectKeyIdentifier; |
| 222 | CMS_OriginatorPublicKey *originatorKey; | 210 | CMS_OriginatorPublicKey *originatorKey; |
| 223 | } d; | 211 | } d; |
| 224 | }; | 212 | }; |
| 225 | 213 | ||
| 226 | struct CMS_OriginatorPublicKey_st | 214 | struct CMS_OriginatorPublicKey_st { |
| 227 | { | ||
| 228 | X509_ALGOR *algorithm; | 215 | X509_ALGOR *algorithm; |
| 229 | ASN1_BIT_STRING *publicKey; | 216 | ASN1_BIT_STRING *publicKey; |
| 230 | }; | 217 | }; |
| 231 | 218 | ||
| 232 | struct CMS_RecipientEncryptedKey_st | 219 | struct CMS_RecipientEncryptedKey_st { |
| 233 | { | 220 | CMS_KeyAgreeRecipientIdentifier *rid; |
| 234 | CMS_KeyAgreeRecipientIdentifier *rid; | 221 | ASN1_OCTET_STRING *encryptedKey; |
| 235 | ASN1_OCTET_STRING *encryptedKey; | 222 | }; |
| 236 | }; | ||
| 237 | 223 | ||
| 238 | struct CMS_KeyAgreeRecipientIdentifier_st | 224 | struct CMS_KeyAgreeRecipientIdentifier_st { |
| 239 | { | ||
| 240 | int type; | 225 | int type; |
| 241 | union { | 226 | union { |
| 242 | CMS_IssuerAndSerialNumber *issuerAndSerialNumber; | 227 | CMS_IssuerAndSerialNumber *issuerAndSerialNumber; |
| 243 | CMS_RecipientKeyIdentifier *rKeyId; | 228 | CMS_RecipientKeyIdentifier *rKeyId; |
| 244 | } d; | 229 | } d; |
| 245 | }; | 230 | }; |
| 246 | 231 | ||
| 247 | struct CMS_RecipientKeyIdentifier_st | 232 | struct CMS_RecipientKeyIdentifier_st { |
| 248 | { | 233 | ASN1_OCTET_STRING *subjectKeyIdentifier; |
| 249 | ASN1_OCTET_STRING *subjectKeyIdentifier; | 234 | ASN1_GENERALIZEDTIME *date; |
| 250 | ASN1_GENERALIZEDTIME *date; | 235 | CMS_OtherKeyAttribute *other; |
| 251 | CMS_OtherKeyAttribute *other; | 236 | }; |
| 252 | }; | ||
| 253 | 237 | ||
| 254 | struct CMS_KEKRecipientInfo_st | 238 | struct CMS_KEKRecipientInfo_st { |
| 255 | { | 239 | long version; |
| 256 | long version; | 240 | CMS_KEKIdentifier *kekid; |
| 257 | CMS_KEKIdentifier *kekid; | 241 | X509_ALGOR *keyEncryptionAlgorithm; |
| 258 | X509_ALGOR *keyEncryptionAlgorithm; | 242 | ASN1_OCTET_STRING *encryptedKey; |
| 259 | ASN1_OCTET_STRING *encryptedKey; | ||
| 260 | /* Extra info: symmetric key to use */ | 243 | /* Extra info: symmetric key to use */ |
| 261 | unsigned char *key; | 244 | unsigned char *key; |
| 262 | size_t keylen; | 245 | size_t keylen; |
| 263 | }; | 246 | }; |
| 264 | 247 | ||
| 265 | struct CMS_KEKIdentifier_st | 248 | struct CMS_KEKIdentifier_st { |
| 266 | { | 249 | ASN1_OCTET_STRING *keyIdentifier; |
| 267 | ASN1_OCTET_STRING *keyIdentifier; | 250 | ASN1_GENERALIZEDTIME *date; |
| 268 | ASN1_GENERALIZEDTIME *date; | 251 | CMS_OtherKeyAttribute *other; |
| 269 | CMS_OtherKeyAttribute *other; | 252 | }; |
| 270 | }; | ||
| 271 | 253 | ||
| 272 | struct CMS_PasswordRecipientInfo_st | 254 | struct CMS_PasswordRecipientInfo_st { |
| 273 | { | 255 | long version; |
| 274 | long version; | 256 | X509_ALGOR *keyDerivationAlgorithm; |
| 275 | X509_ALGOR *keyDerivationAlgorithm; | 257 | X509_ALGOR *keyEncryptionAlgorithm; |
| 276 | X509_ALGOR *keyEncryptionAlgorithm; | 258 | ASN1_OCTET_STRING *encryptedKey; |
| 277 | ASN1_OCTET_STRING *encryptedKey; | ||
| 278 | /* Extra info: password to use */ | 259 | /* Extra info: password to use */ |
| 279 | unsigned char *pass; | 260 | unsigned char *pass; |
| 280 | size_t passlen; | 261 | size_t passlen; |
| 281 | }; | 262 | }; |
| 282 | 263 | ||
| 283 | struct CMS_OtherRecipientInfo_st | 264 | struct CMS_OtherRecipientInfo_st { |
| 284 | { | 265 | ASN1_OBJECT *oriType; |
| 285 | ASN1_OBJECT *oriType; | 266 | ASN1_TYPE *oriValue; |
| 286 | ASN1_TYPE *oriValue; | 267 | }; |
| 287 | }; | ||
| 288 | 268 | ||
| 289 | struct CMS_DigestedData_st | 269 | struct CMS_DigestedData_st { |
| 290 | { | ||
| 291 | long version; | 270 | long version; |
| 292 | X509_ALGOR *digestAlgorithm; | 271 | X509_ALGOR *digestAlgorithm; |
| 293 | CMS_EncapsulatedContentInfo *encapContentInfo; | 272 | CMS_EncapsulatedContentInfo *encapContentInfo; |
| 294 | ASN1_OCTET_STRING *digest; | 273 | ASN1_OCTET_STRING *digest; |
| 295 | }; | 274 | }; |
| 296 | 275 | ||
| 297 | struct CMS_EncryptedData_st | 276 | struct CMS_EncryptedData_st { |
| 298 | { | ||
| 299 | long version; | 277 | long version; |
| 300 | CMS_EncryptedContentInfo *encryptedContentInfo; | 278 | CMS_EncryptedContentInfo *encryptedContentInfo; |
| 301 | STACK_OF(X509_ATTRIBUTE) *unprotectedAttrs; | 279 | STACK_OF(X509_ATTRIBUTE) *unprotectedAttrs; |
| 302 | }; | 280 | }; |
| 303 | 281 | ||
| 304 | struct CMS_AuthenticatedData_st | 282 | struct CMS_AuthenticatedData_st { |
| 305 | { | ||
| 306 | long version; | 283 | long version; |
| 307 | CMS_OriginatorInfo *originatorInfo; | 284 | CMS_OriginatorInfo *originatorInfo; |
| 308 | STACK_OF(CMS_RecipientInfo) *recipientInfos; | 285 | STACK_OF(CMS_RecipientInfo) *recipientInfos; |
| @@ -312,45 +289,41 @@ struct CMS_AuthenticatedData_st | |||
| 312 | STACK_OF(X509_ATTRIBUTE) *authAttrs; | 289 | STACK_OF(X509_ATTRIBUTE) *authAttrs; |
| 313 | ASN1_OCTET_STRING *mac; | 290 | ASN1_OCTET_STRING *mac; |
| 314 | STACK_OF(X509_ATTRIBUTE) *unauthAttrs; | 291 | STACK_OF(X509_ATTRIBUTE) *unauthAttrs; |
| 315 | }; | 292 | }; |
| 316 | 293 | ||
| 317 | struct CMS_CompressedData_st | 294 | struct CMS_CompressedData_st { |
| 318 | { | ||
| 319 | long version; | 295 | long version; |
| 320 | X509_ALGOR *compressionAlgorithm; | 296 | X509_ALGOR *compressionAlgorithm; |
| 321 | STACK_OF(CMS_RecipientInfo) *recipientInfos; | 297 | STACK_OF(CMS_RecipientInfo) *recipientInfos; |
| 322 | CMS_EncapsulatedContentInfo *encapContentInfo; | 298 | CMS_EncapsulatedContentInfo *encapContentInfo; |
| 323 | }; | 299 | }; |
| 324 | 300 | ||
| 325 | struct CMS_RevocationInfoChoice_st | 301 | struct CMS_RevocationInfoChoice_st { |
| 326 | { | ||
| 327 | int type; | 302 | int type; |
| 328 | union { | 303 | union { |
| 329 | X509_CRL *crl; | 304 | X509_CRL *crl; |
| 330 | CMS_OtherRevocationInfoFormat *other; | 305 | CMS_OtherRevocationInfoFormat *other; |
| 331 | } d; | 306 | } d; |
| 332 | }; | 307 | }; |
| 333 | 308 | ||
| 334 | #define CMS_REVCHOICE_CRL 0 | 309 | #define CMS_REVCHOICE_CRL 0 |
| 335 | #define CMS_REVCHOICE_OTHER 1 | 310 | #define CMS_REVCHOICE_OTHER 1 |
| 336 | 311 | ||
| 337 | struct CMS_OtherRevocationInfoFormat_st | 312 | struct CMS_OtherRevocationInfoFormat_st { |
| 338 | { | ||
| 339 | ASN1_OBJECT *otherRevInfoFormat; | 313 | ASN1_OBJECT *otherRevInfoFormat; |
| 340 | ASN1_TYPE *otherRevInfo; | 314 | ASN1_TYPE *otherRevInfo; |
| 341 | }; | 315 | }; |
| 342 | 316 | ||
| 343 | struct CMS_CertificateChoices | 317 | struct CMS_CertificateChoices { |
| 344 | { | ||
| 345 | int type; | 318 | int type; |
| 346 | union { | 319 | union { |
| 347 | X509 *certificate; | 320 | X509 *certificate; |
| 348 | ASN1_STRING *extendedCertificate; /* Obsolete */ | 321 | ASN1_STRING *extendedCertificate; /* Obsolete */ |
| 349 | ASN1_STRING *v1AttrCert; /* Left encoded for now */ | 322 | ASN1_STRING *v1AttrCert; /* Left encoded for now */ |
| 350 | ASN1_STRING *v2AttrCert; /* Left encoded for now */ | 323 | ASN1_STRING *v2AttrCert; /* Left encoded for now */ |
| 351 | CMS_OtherCertificateFormat *other; | 324 | CMS_OtherCertificateFormat *other; |
| 352 | } d; | 325 | } d; |
| 353 | }; | 326 | }; |
| 354 | 327 | ||
| 355 | #define CMS_CERTCHOICE_CERT 0 | 328 | #define CMS_CERTCHOICE_CERT 0 |
| 356 | #define CMS_CERTCHOICE_EXCERT 1 | 329 | #define CMS_CERTCHOICE_EXCERT 1 |
| @@ -358,58 +331,52 @@ struct CMS_CertificateChoices | |||
| 358 | #define CMS_CERTCHOICE_V2ACERT 3 | 331 | #define CMS_CERTCHOICE_V2ACERT 3 |
| 359 | #define CMS_CERTCHOICE_OTHER 4 | 332 | #define CMS_CERTCHOICE_OTHER 4 |
| 360 | 333 | ||
| 361 | struct CMS_OtherCertificateFormat_st | 334 | struct CMS_OtherCertificateFormat_st { |
| 362 | { | ||
| 363 | ASN1_OBJECT *otherCertFormat; | 335 | ASN1_OBJECT *otherCertFormat; |
| 364 | ASN1_TYPE *otherCert; | 336 | ASN1_TYPE *otherCert; |
| 365 | }; | 337 | }; |
| 366 | 338 | ||
| 367 | /* This is also defined in pkcs7.h but we duplicate it | 339 | /* This is also defined in pkcs7.h but we duplicate it |
| 368 | * to allow the CMS code to be independent of PKCS#7 | 340 | * to allow the CMS code to be independent of PKCS#7 |
| 369 | */ | 341 | */ |
| 370 | 342 | ||
| 371 | struct CMS_IssuerAndSerialNumber_st | 343 | struct CMS_IssuerAndSerialNumber_st { |
| 372 | { | ||
| 373 | X509_NAME *issuer; | 344 | X509_NAME *issuer; |
| 374 | ASN1_INTEGER *serialNumber; | 345 | ASN1_INTEGER *serialNumber; |
| 375 | }; | 346 | }; |
| 376 | 347 | ||
| 377 | struct CMS_OtherKeyAttribute_st | 348 | struct CMS_OtherKeyAttribute_st { |
| 378 | { | ||
| 379 | ASN1_OBJECT *keyAttrId; | 349 | ASN1_OBJECT *keyAttrId; |
| 380 | ASN1_TYPE *keyAttr; | 350 | ASN1_TYPE *keyAttr; |
| 381 | }; | 351 | }; |
| 382 | 352 | ||
| 383 | /* ESS structures */ | 353 | /* ESS structures */ |
| 384 | 354 | ||
| 385 | #ifdef HEADER_X509V3_H | 355 | #ifdef HEADER_X509V3_H |
| 386 | 356 | ||
| 387 | struct CMS_ReceiptRequest_st | 357 | struct CMS_ReceiptRequest_st { |
| 388 | { | ||
| 389 | ASN1_OCTET_STRING *signedContentIdentifier; | 358 | ASN1_OCTET_STRING *signedContentIdentifier; |
| 390 | CMS_ReceiptsFrom *receiptsFrom; | 359 | CMS_ReceiptsFrom *receiptsFrom; |
| 391 | STACK_OF(GENERAL_NAMES) *receiptsTo; | 360 | STACK_OF(GENERAL_NAMES) *receiptsTo; |
| 392 | }; | 361 | }; |
| 393 | 362 | ||
| 394 | 363 | ||
| 395 | struct CMS_ReceiptsFrom_st | 364 | struct CMS_ReceiptsFrom_st { |
| 396 | { | ||
| 397 | int type; | 365 | int type; |
| 398 | union | 366 | union |
| 399 | { | 367 | { |
| 400 | long allOrFirstTier; | 368 | long allOrFirstTier; |
| 401 | STACK_OF(GENERAL_NAMES) *receiptList; | 369 | STACK_OF(GENERAL_NAMES) *receiptList; |
| 402 | } d; | 370 | } d; |
| 403 | }; | 371 | }; |
| 404 | #endif | 372 | #endif |
| 405 | 373 | ||
| 406 | struct CMS_Receipt_st | 374 | struct CMS_Receipt_st { |
| 407 | { | ||
| 408 | long version; | 375 | long version; |
| 409 | ASN1_OBJECT *contentType; | 376 | ASN1_OBJECT *contentType; |
| 410 | ASN1_OCTET_STRING *signedContentIdentifier; | 377 | ASN1_OCTET_STRING *signedContentIdentifier; |
| 411 | ASN1_OCTET_STRING *originatorSignatureValue; | 378 | ASN1_OCTET_STRING *originatorSignatureValue; |
| 412 | }; | 379 | }; |
| 413 | 380 | ||
| 414 | DECLARE_ASN1_FUNCTIONS(CMS_ContentInfo) | 381 | DECLARE_ASN1_FUNCTIONS(CMS_ContentInfo) |
| 415 | DECLARE_ASN1_ITEM(CMS_SignerInfo) | 382 | DECLARE_ASN1_ITEM(CMS_SignerInfo) |
| @@ -438,8 +405,7 @@ BIO *cms_SignedData_init_bio(CMS_ContentInfo *cms); | |||
| 438 | int cms_SignedData_final(CMS_ContentInfo *cms, BIO *chain); | 405 | int cms_SignedData_final(CMS_ContentInfo *cms, BIO *chain); |
| 439 | int cms_set1_SignerIdentifier(CMS_SignerIdentifier *sid, X509 *cert, int type); | 406 | int cms_set1_SignerIdentifier(CMS_SignerIdentifier *sid, X509 *cert, int type); |
| 440 | int cms_SignerIdentifier_get0_signer_id(CMS_SignerIdentifier *sid, | 407 | int cms_SignerIdentifier_get0_signer_id(CMS_SignerIdentifier *sid, |
| 441 | ASN1_OCTET_STRING **keyid, | 408 | ASN1_OCTET_STRING **keyid, X509_NAME **issuer, ASN1_INTEGER **sno); |
| 442 | X509_NAME **issuer, ASN1_INTEGER **sno); | ||
| 443 | int cms_SignerIdentifier_cert_cmp(CMS_SignerIdentifier *sid, X509 *cert); | 409 | int cms_SignerIdentifier_cert_cmp(CMS_SignerIdentifier *sid, X509 *cert); |
| 444 | 410 | ||
| 445 | CMS_ContentInfo *cms_CompressedData_create(int comp_nid); | 411 | CMS_ContentInfo *cms_CompressedData_create(int comp_nid); |
| @@ -448,13 +414,12 @@ BIO *cms_CompressedData_init_bio(CMS_ContentInfo *cms); | |||
| 448 | void cms_DigestAlgorithm_set(X509_ALGOR *alg, const EVP_MD *md); | 414 | void cms_DigestAlgorithm_set(X509_ALGOR *alg, const EVP_MD *md); |
| 449 | BIO *cms_DigestAlgorithm_init_bio(X509_ALGOR *digestAlgorithm); | 415 | BIO *cms_DigestAlgorithm_init_bio(X509_ALGOR *digestAlgorithm); |
| 450 | int cms_DigestAlgorithm_find_ctx(EVP_MD_CTX *mctx, BIO *chain, | 416 | int cms_DigestAlgorithm_find_ctx(EVP_MD_CTX *mctx, BIO *chain, |
| 451 | X509_ALGOR *mdalg); | 417 | X509_ALGOR *mdalg); |
| 452 | 418 | ||
| 453 | BIO *cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec); | 419 | BIO *cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec); |
| 454 | BIO *cms_EncryptedData_init_bio(CMS_ContentInfo *cms); | 420 | BIO *cms_EncryptedData_init_bio(CMS_ContentInfo *cms); |
| 455 | int cms_EncryptedContent_init(CMS_EncryptedContentInfo *ec, | 421 | int cms_EncryptedContent_init(CMS_EncryptedContentInfo *ec, |
| 456 | const EVP_CIPHER *cipher, | 422 | const EVP_CIPHER *cipher, const unsigned char *key, size_t keylen); |
| 457 | const unsigned char *key, size_t keylen); | ||
| 458 | 423 | ||
| 459 | int cms_Receipt_verify(CMS_ContentInfo *cms, CMS_ContentInfo *req_cms); | 424 | int cms_Receipt_verify(CMS_ContentInfo *cms, CMS_ContentInfo *req_cms); |
| 460 | int cms_msgSigDigest_add1(CMS_SignerInfo *dest, CMS_SignerInfo *src); | 425 | int cms_msgSigDigest_add1(CMS_SignerInfo *dest, CMS_SignerInfo *src); |
| @@ -465,8 +430,8 @@ CMS_EnvelopedData *cms_get0_enveloped(CMS_ContentInfo *cms); | |||
| 465 | 430 | ||
| 466 | /* PWRI routines */ | 431 | /* PWRI routines */ |
| 467 | int cms_RecipientInfo_pwri_crypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri, | 432 | int cms_RecipientInfo_pwri_crypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri, |
| 468 | int en_de); | 433 | int en_de); |
| 469 | 434 | ||
| 470 | #ifdef __cplusplus | 435 | #ifdef __cplusplus |
| 471 | } | 436 | } |
| 472 | #endif | 437 | #endif |
diff --git a/src/lib/libcrypto/cms/cms_lib.c b/src/lib/libcrypto/cms/cms_lib.c index ba08279a04..66bd73c86c 100644 --- a/src/lib/libcrypto/cms/cms_lib.c +++ b/src/lib/libcrypto/cms/cms_lib.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * are met: | 10 | * are met: |
| 11 | * | 11 | * |
| 12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * | 14 | * |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
| @@ -68,27 +68,31 @@ DECLARE_ASN1_ITEM(CMS_RevocationInfoChoice) | |||
| 68 | DECLARE_STACK_OF(CMS_CertificateChoices) | 68 | DECLARE_STACK_OF(CMS_CertificateChoices) |
| 69 | DECLARE_STACK_OF(CMS_RevocationInfoChoice) | 69 | DECLARE_STACK_OF(CMS_RevocationInfoChoice) |
| 70 | 70 | ||
| 71 | const ASN1_OBJECT *CMS_get0_type(CMS_ContentInfo *cms) | 71 | const ASN1_OBJECT * |
| 72 | { | 72 | CMS_get0_type(CMS_ContentInfo *cms) |
| 73 | { | ||
| 73 | return cms->contentType; | 74 | return cms->contentType; |
| 74 | } | 75 | } |
| 75 | 76 | ||
| 76 | CMS_ContentInfo *cms_Data_create(void) | 77 | CMS_ContentInfo * |
| 77 | { | 78 | cms_Data_create(void) |
| 79 | { | ||
| 78 | CMS_ContentInfo *cms; | 80 | CMS_ContentInfo *cms; |
| 81 | |||
| 79 | cms = CMS_ContentInfo_new(); | 82 | cms = CMS_ContentInfo_new(); |
| 80 | if (cms) | 83 | if (cms) { |
| 81 | { | ||
| 82 | cms->contentType = OBJ_nid2obj(NID_pkcs7_data); | 84 | cms->contentType = OBJ_nid2obj(NID_pkcs7_data); |
| 83 | /* Never detached */ | 85 | /* Never detached */ |
| 84 | CMS_set_detached(cms, 0); | 86 | CMS_set_detached(cms, 0); |
| 85 | } | ||
| 86 | return cms; | ||
| 87 | } | 87 | } |
| 88 | return cms; | ||
| 89 | } | ||
| 88 | 90 | ||
| 89 | BIO *cms_content_bio(CMS_ContentInfo *cms) | 91 | BIO * |
| 90 | { | 92 | cms_content_bio(CMS_ContentInfo *cms) |
| 93 | { | ||
| 91 | ASN1_OCTET_STRING **pos = CMS_get0_content(cms); | 94 | ASN1_OCTET_STRING **pos = CMS_get0_content(cms); |
| 95 | |||
| 92 | if (!pos) | 96 | if (!pos) |
| 93 | return NULL; | 97 | return NULL; |
| 94 | /* If content detached data goes nowhere: create NULL BIO */ | 98 | /* If content detached data goes nowhere: create NULL BIO */ |
| @@ -100,51 +104,45 @@ BIO *cms_content_bio(CMS_ContentInfo *cms) | |||
| 100 | return BIO_new(BIO_s_mem()); | 104 | return BIO_new(BIO_s_mem()); |
| 101 | /* Else content was read in: return read only BIO for it */ | 105 | /* Else content was read in: return read only BIO for it */ |
| 102 | return BIO_new_mem_buf((*pos)->data, (*pos)->length); | 106 | return BIO_new_mem_buf((*pos)->data, (*pos)->length); |
| 103 | } | 107 | } |
| 104 | 108 | ||
| 105 | BIO *CMS_dataInit(CMS_ContentInfo *cms, BIO *icont) | 109 | BIO * |
| 106 | { | 110 | CMS_dataInit(CMS_ContentInfo *cms, BIO *icont) |
| 111 | { | ||
| 107 | BIO *cmsbio, *cont; | 112 | BIO *cmsbio, *cont; |
| 113 | |||
| 108 | if (icont) | 114 | if (icont) |
| 109 | cont = icont; | 115 | cont = icont; |
| 110 | else | 116 | else |
| 111 | cont = cms_content_bio(cms); | 117 | cont = cms_content_bio(cms); |
| 112 | if (!cont) | 118 | if (!cont) { |
| 113 | { | ||
| 114 | CMSerr(CMS_F_CMS_DATAINIT, CMS_R_NO_CONTENT); | 119 | CMSerr(CMS_F_CMS_DATAINIT, CMS_R_NO_CONTENT); |
| 115 | return NULL; | 120 | return NULL; |
| 116 | } | 121 | } |
| 117 | switch (OBJ_obj2nid(cms->contentType)) | 122 | switch (OBJ_obj2nid(cms->contentType)) { |
| 118 | { | 123 | case NID_pkcs7_data: |
| 119 | |||
| 120 | case NID_pkcs7_data: | ||
| 121 | return cont; | 124 | return cont; |
| 122 | 125 | case NID_pkcs7_signed: | |
| 123 | case NID_pkcs7_signed: | ||
| 124 | cmsbio = cms_SignedData_init_bio(cms); | 126 | cmsbio = cms_SignedData_init_bio(cms); |
| 125 | break; | 127 | break; |
| 126 | 128 | case NID_pkcs7_digest: | |
| 127 | case NID_pkcs7_digest: | ||
| 128 | cmsbio = cms_DigestedData_init_bio(cms); | 129 | cmsbio = cms_DigestedData_init_bio(cms); |
| 129 | break; | 130 | break; |
| 130 | #ifdef ZLIB | 131 | #ifdef ZLIB |
| 131 | case NID_id_smime_ct_compressedData: | 132 | case NID_id_smime_ct_compressedData: |
| 132 | cmsbio = cms_CompressedData_init_bio(cms); | 133 | cmsbio = cms_CompressedData_init_bio(cms); |
| 133 | break; | 134 | break; |
| 134 | #endif | 135 | #endif |
| 135 | 136 | case NID_pkcs7_encrypted: | |
| 136 | case NID_pkcs7_encrypted: | ||
| 137 | cmsbio = cms_EncryptedData_init_bio(cms); | 137 | cmsbio = cms_EncryptedData_init_bio(cms); |
| 138 | break; | 138 | break; |
| 139 | 139 | case NID_pkcs7_enveloped: | |
| 140 | case NID_pkcs7_enveloped: | ||
| 141 | cmsbio = cms_EnvelopedData_init_bio(cms); | 140 | cmsbio = cms_EnvelopedData_init_bio(cms); |
| 142 | break; | 141 | break; |
| 143 | 142 | default: | |
| 144 | default: | ||
| 145 | CMSerr(CMS_F_CMS_DATAINIT, CMS_R_UNSUPPORTED_TYPE); | 143 | CMSerr(CMS_F_CMS_DATAINIT, CMS_R_UNSUPPORTED_TYPE); |
| 146 | return NULL; | 144 | return NULL; |
| 147 | } | 145 | } |
| 148 | 146 | ||
| 149 | if (cmsbio) | 147 | if (cmsbio) |
| 150 | return BIO_push(cmsbio, cont); | 148 | return BIO_push(cmsbio, cont); |
| @@ -152,142 +150,121 @@ BIO *CMS_dataInit(CMS_ContentInfo *cms, BIO *icont) | |||
| 152 | if (!icont) | 150 | if (!icont) |
| 153 | BIO_free(cont); | 151 | BIO_free(cont); |
| 154 | return NULL; | 152 | return NULL; |
| 153 | } | ||
| 155 | 154 | ||
| 156 | } | 155 | int |
| 157 | 156 | CMS_dataFinal(CMS_ContentInfo *cms, BIO *cmsbio) | |
| 158 | int CMS_dataFinal(CMS_ContentInfo *cms, BIO *cmsbio) | 157 | { |
| 159 | { | ||
| 160 | ASN1_OCTET_STRING **pos = CMS_get0_content(cms); | 158 | ASN1_OCTET_STRING **pos = CMS_get0_content(cms); |
| 159 | |||
| 161 | if (!pos) | 160 | if (!pos) |
| 162 | return 0; | 161 | return 0; |
| 163 | /* If ebmedded content find memory BIO and set content */ | 162 | /* If ebmedded content find memory BIO and set content */ |
| 164 | if (*pos && ((*pos)->flags & ASN1_STRING_FLAG_CONT)) | 163 | if (*pos && ((*pos)->flags & ASN1_STRING_FLAG_CONT)) { |
| 165 | { | ||
| 166 | BIO *mbio; | 164 | BIO *mbio; |
| 167 | unsigned char *cont; | 165 | unsigned char *cont; |
| 168 | long contlen; | 166 | long contlen; |
| 169 | mbio = BIO_find_type(cmsbio, BIO_TYPE_MEM); | 167 | mbio = BIO_find_type(cmsbio, BIO_TYPE_MEM); |
| 170 | if (!mbio) | 168 | if (!mbio) { |
| 171 | { | ||
| 172 | CMSerr(CMS_F_CMS_DATAFINAL, CMS_R_CONTENT_NOT_FOUND); | 169 | CMSerr(CMS_F_CMS_DATAFINAL, CMS_R_CONTENT_NOT_FOUND); |
| 173 | return 0; | 170 | return 0; |
| 174 | } | 171 | } |
| 175 | contlen = BIO_get_mem_data(mbio, &cont); | 172 | contlen = BIO_get_mem_data(mbio, &cont); |
| 176 | /* Set bio as read only so its content can't be clobbered */ | 173 | /* Set bio as read only so its content can't be clobbered */ |
| 177 | BIO_set_flags(mbio, BIO_FLAGS_MEM_RDONLY); | 174 | BIO_set_flags(mbio, BIO_FLAGS_MEM_RDONLY); |
| 178 | BIO_set_mem_eof_return(mbio, 0); | 175 | BIO_set_mem_eof_return(mbio, 0); |
| 179 | ASN1_STRING_set0(*pos, cont, contlen); | 176 | ASN1_STRING_set0(*pos, cont, contlen); |
| 180 | (*pos)->flags &= ~ASN1_STRING_FLAG_CONT; | 177 | (*pos)->flags &= ~ASN1_STRING_FLAG_CONT; |
| 181 | } | 178 | } |
| 182 | |||
| 183 | switch (OBJ_obj2nid(cms->contentType)) | ||
| 184 | { | ||
| 185 | 179 | ||
| 186 | case NID_pkcs7_data: | 180 | switch (OBJ_obj2nid(cms->contentType)) { |
| 187 | case NID_pkcs7_enveloped: | 181 | case NID_pkcs7_data: |
| 188 | case NID_pkcs7_encrypted: | 182 | case NID_pkcs7_enveloped: |
| 189 | case NID_id_smime_ct_compressedData: | 183 | case NID_pkcs7_encrypted: |
| 184 | case NID_id_smime_ct_compressedData: | ||
| 190 | /* Nothing to do */ | 185 | /* Nothing to do */ |
| 191 | return 1; | 186 | return 1; |
| 192 | 187 | case NID_pkcs7_signed: | |
| 193 | case NID_pkcs7_signed: | ||
| 194 | return cms_SignedData_final(cms, cmsbio); | 188 | return cms_SignedData_final(cms, cmsbio); |
| 195 | 189 | case NID_pkcs7_digest: | |
| 196 | case NID_pkcs7_digest: | ||
| 197 | return cms_DigestedData_do_final(cms, cmsbio, 0); | 190 | return cms_DigestedData_do_final(cms, cmsbio, 0); |
| 198 | 191 | default: | |
| 199 | default: | ||
| 200 | CMSerr(CMS_F_CMS_DATAFINAL, CMS_R_UNSUPPORTED_TYPE); | 192 | CMSerr(CMS_F_CMS_DATAFINAL, CMS_R_UNSUPPORTED_TYPE); |
| 201 | return 0; | 193 | return 0; |
| 202 | } | ||
| 203 | } | 194 | } |
| 195 | } | ||
| 204 | 196 | ||
| 205 | /* Return an OCTET STRING pointer to content. This allows it to | 197 | /* Return an OCTET STRING pointer to content. This allows it to |
| 206 | * be accessed or set later. | 198 | * be accessed or set later. |
| 207 | */ | 199 | */ |
| 208 | 200 | ||
| 209 | ASN1_OCTET_STRING **CMS_get0_content(CMS_ContentInfo *cms) | 201 | ASN1_OCTET_STRING **CMS_get0_content(CMS_ContentInfo *cms) |
| 210 | { | 202 | { |
| 211 | switch (OBJ_obj2nid(cms->contentType)) | 203 | switch (OBJ_obj2nid(cms->contentType)) { |
| 212 | { | 204 | case NID_pkcs7_data: |
| 213 | |||
| 214 | case NID_pkcs7_data: | ||
| 215 | return &cms->d.data; | 205 | return &cms->d.data; |
| 216 | 206 | case NID_pkcs7_signed: | |
| 217 | case NID_pkcs7_signed: | ||
| 218 | return &cms->d.signedData->encapContentInfo->eContent; | 207 | return &cms->d.signedData->encapContentInfo->eContent; |
| 219 | 208 | case NID_pkcs7_enveloped: | |
| 220 | case NID_pkcs7_enveloped: | ||
| 221 | return &cms->d.envelopedData->encryptedContentInfo->encryptedContent; | 209 | return &cms->d.envelopedData->encryptedContentInfo->encryptedContent; |
| 222 | 210 | case NID_pkcs7_digest: | |
| 223 | case NID_pkcs7_digest: | ||
| 224 | return &cms->d.digestedData->encapContentInfo->eContent; | 211 | return &cms->d.digestedData->encapContentInfo->eContent; |
| 225 | 212 | case NID_pkcs7_encrypted: | |
| 226 | case NID_pkcs7_encrypted: | ||
| 227 | return &cms->d.encryptedData->encryptedContentInfo->encryptedContent; | 213 | return &cms->d.encryptedData->encryptedContentInfo->encryptedContent; |
| 228 | 214 | case NID_id_smime_ct_authData: | |
| 229 | case NID_id_smime_ct_authData: | ||
| 230 | return &cms->d.authenticatedData->encapContentInfo->eContent; | 215 | return &cms->d.authenticatedData->encapContentInfo->eContent; |
| 231 | 216 | case NID_id_smime_ct_compressedData: | |
| 232 | case NID_id_smime_ct_compressedData: | ||
| 233 | return &cms->d.compressedData->encapContentInfo->eContent; | 217 | return &cms->d.compressedData->encapContentInfo->eContent; |
| 234 | 218 | default: | |
| 235 | default: | ||
| 236 | if (cms->d.other->type == V_ASN1_OCTET_STRING) | 219 | if (cms->d.other->type == V_ASN1_OCTET_STRING) |
| 237 | return &cms->d.other->value.octet_string; | 220 | return &cms->d.other->value.octet_string; |
| 238 | CMSerr(CMS_F_CMS_GET0_CONTENT, CMS_R_UNSUPPORTED_CONTENT_TYPE); | 221 | CMSerr(CMS_F_CMS_GET0_CONTENT, CMS_R_UNSUPPORTED_CONTENT_TYPE); |
| 239 | return NULL; | 222 | return NULL; |
| 240 | |||
| 241 | } | ||
| 242 | } | 223 | } |
| 224 | } | ||
| 243 | 225 | ||
| 244 | /* Return an ASN1_OBJECT pointer to content type. This allows it to | 226 | /* Return an ASN1_OBJECT pointer to content type. This allows it to |
| 245 | * be accessed or set later. | 227 | * be accessed or set later. |
| 246 | */ | 228 | */ |
| 247 | 229 | ||
| 248 | static ASN1_OBJECT **cms_get0_econtent_type(CMS_ContentInfo *cms) | 230 | static ASN1_OBJECT **cms_get0_econtent_type(CMS_ContentInfo *cms) |
| 249 | { | 231 | { |
| 250 | switch (OBJ_obj2nid(cms->contentType)) | 232 | switch (OBJ_obj2nid(cms->contentType)) { |
| 251 | { | 233 | case NID_pkcs7_signed: |
| 252 | |||
| 253 | case NID_pkcs7_signed: | ||
| 254 | return &cms->d.signedData->encapContentInfo->eContentType; | 234 | return &cms->d.signedData->encapContentInfo->eContentType; |
| 255 | 235 | case NID_pkcs7_enveloped: | |
| 256 | case NID_pkcs7_enveloped: | ||
| 257 | return &cms->d.envelopedData->encryptedContentInfo->contentType; | 236 | return &cms->d.envelopedData->encryptedContentInfo->contentType; |
| 258 | 237 | case NID_pkcs7_digest: | |
| 259 | case NID_pkcs7_digest: | ||
| 260 | return &cms->d.digestedData->encapContentInfo->eContentType; | 238 | return &cms->d.digestedData->encapContentInfo->eContentType; |
| 261 | 239 | case NID_pkcs7_encrypted: | |
| 262 | case NID_pkcs7_encrypted: | ||
| 263 | return &cms->d.encryptedData->encryptedContentInfo->contentType; | 240 | return &cms->d.encryptedData->encryptedContentInfo->contentType; |
| 264 | 241 | case NID_id_smime_ct_authData: | |
| 265 | case NID_id_smime_ct_authData: | ||
| 266 | return &cms->d.authenticatedData->encapContentInfo->eContentType; | 242 | return &cms->d.authenticatedData->encapContentInfo->eContentType; |
| 267 | 243 | case NID_id_smime_ct_compressedData: | |
| 268 | case NID_id_smime_ct_compressedData: | ||
| 269 | return &cms->d.compressedData->encapContentInfo->eContentType; | 244 | return &cms->d.compressedData->encapContentInfo->eContentType; |
| 270 | 245 | default: | |
| 271 | default: | ||
| 272 | CMSerr(CMS_F_CMS_GET0_ECONTENT_TYPE, | 246 | CMSerr(CMS_F_CMS_GET0_ECONTENT_TYPE, |
| 273 | CMS_R_UNSUPPORTED_CONTENT_TYPE); | 247 | CMS_R_UNSUPPORTED_CONTENT_TYPE); |
| 274 | return NULL; | 248 | return NULL; |
| 275 | |||
| 276 | } | ||
| 277 | } | 249 | } |
| 250 | } | ||
| 278 | 251 | ||
| 279 | const ASN1_OBJECT *CMS_get0_eContentType(CMS_ContentInfo *cms) | 252 | const ASN1_OBJECT * |
| 280 | { | 253 | CMS_get0_eContentType(CMS_ContentInfo *cms) |
| 254 | { | ||
| 281 | ASN1_OBJECT **petype; | 255 | ASN1_OBJECT **petype; |
| 256 | |||
| 282 | petype = cms_get0_econtent_type(cms); | 257 | petype = cms_get0_econtent_type(cms); |
| 283 | if (petype) | 258 | if (petype) |
| 284 | return *petype; | 259 | return *petype; |
| 285 | return NULL; | 260 | return NULL; |
| 286 | } | 261 | } |
| 287 | 262 | ||
| 288 | int CMS_set1_eContentType(CMS_ContentInfo *cms, const ASN1_OBJECT *oid) | 263 | int |
| 289 | { | 264 | CMS_set1_eContentType(CMS_ContentInfo *cms, const ASN1_OBJECT *oid) |
| 265 | { | ||
| 290 | ASN1_OBJECT **petype, *etype; | 266 | ASN1_OBJECT **petype, *etype; |
| 267 | |||
| 291 | petype = cms_get0_econtent_type(cms); | 268 | petype = cms_get0_econtent_type(cms); |
| 292 | if (!petype) | 269 | if (!petype) |
| 293 | return 0; | 270 | return 0; |
| @@ -299,52 +276,54 @@ int CMS_set1_eContentType(CMS_ContentInfo *cms, const ASN1_OBJECT *oid) | |||
| 299 | ASN1_OBJECT_free(*petype); | 276 | ASN1_OBJECT_free(*petype); |
| 300 | *petype = etype; | 277 | *petype = etype; |
| 301 | return 1; | 278 | return 1; |
| 302 | } | 279 | } |
| 303 | 280 | ||
| 304 | int CMS_is_detached(CMS_ContentInfo *cms) | 281 | int |
| 305 | { | 282 | CMS_is_detached(CMS_ContentInfo *cms) |
| 283 | { | ||
| 306 | ASN1_OCTET_STRING **pos; | 284 | ASN1_OCTET_STRING **pos; |
| 285 | |||
| 307 | pos = CMS_get0_content(cms); | 286 | pos = CMS_get0_content(cms); |
| 308 | if (!pos) | 287 | if (!pos) |
| 309 | return -1; | 288 | return -1; |
| 310 | if (*pos) | 289 | if (*pos) |
| 311 | return 0; | 290 | return 0; |
| 312 | return 1; | 291 | return 1; |
| 313 | } | 292 | } |
| 314 | 293 | ||
| 315 | int CMS_set_detached(CMS_ContentInfo *cms, int detached) | 294 | int |
| 316 | { | 295 | CMS_set_detached(CMS_ContentInfo *cms, int detached) |
| 296 | { | ||
| 317 | ASN1_OCTET_STRING **pos; | 297 | ASN1_OCTET_STRING **pos; |
| 298 | |||
| 318 | pos = CMS_get0_content(cms); | 299 | pos = CMS_get0_content(cms); |
| 319 | if (!pos) | 300 | if (!pos) |
| 320 | return 0; | 301 | return 0; |
| 321 | if (detached) | 302 | if (detached) { |
| 322 | { | 303 | if (*pos) { |
| 323 | if (*pos) | ||
| 324 | { | ||
| 325 | ASN1_OCTET_STRING_free(*pos); | 304 | ASN1_OCTET_STRING_free(*pos); |
| 326 | *pos = NULL; | 305 | *pos = NULL; |
| 327 | } | ||
| 328 | return 1; | ||
| 329 | } | 306 | } |
| 307 | return 1; | ||
| 308 | } | ||
| 330 | if (!*pos) | 309 | if (!*pos) |
| 331 | *pos = ASN1_OCTET_STRING_new(); | 310 | *pos = ASN1_OCTET_STRING_new(); |
| 332 | if (*pos) | 311 | if (*pos) { |
| 333 | { | ||
| 334 | /* NB: special flag to show content is created and not | 312 | /* NB: special flag to show content is created and not |
| 335 | * read in. | 313 | * read in. |
| 336 | */ | 314 | */ |
| 337 | (*pos)->flags |= ASN1_STRING_FLAG_CONT; | 315 | (*pos)->flags |= ASN1_STRING_FLAG_CONT; |
| 338 | return 1; | 316 | return 1; |
| 339 | } | 317 | } |
| 340 | CMSerr(CMS_F_CMS_SET_DETACHED, ERR_R_MALLOC_FAILURE); | 318 | CMSerr(CMS_F_CMS_SET_DETACHED, ERR_R_MALLOC_FAILURE); |
| 341 | return 0; | 319 | return 0; |
| 342 | } | 320 | } |
| 343 | 321 | ||
| 344 | /* Set up an X509_ALGOR DigestAlgorithmIdentifier from an EVP_MD */ | 322 | /* Set up an X509_ALGOR DigestAlgorithmIdentifier from an EVP_MD */ |
| 345 | 323 | ||
| 346 | void cms_DigestAlgorithm_set(X509_ALGOR *alg, const EVP_MD *md) | 324 | void |
| 347 | { | 325 | cms_DigestAlgorithm_set(X509_ALGOR *alg, const EVP_MD *md) |
| 326 | { | ||
| 348 | int param_type; | 327 | int param_type; |
| 349 | 328 | ||
| 350 | if (md->flags & EVP_MD_FLAG_DIGALGID_ABSENT) | 329 | if (md->flags & EVP_MD_FLAG_DIGALGID_ABSENT) |
| @@ -354,91 +333,90 @@ void cms_DigestAlgorithm_set(X509_ALGOR *alg, const EVP_MD *md) | |||
| 354 | 333 | ||
| 355 | X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_type(md)), param_type, NULL); | 334 | X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_type(md)), param_type, NULL); |
| 356 | 335 | ||
| 357 | } | 336 | } |
| 358 | 337 | ||
| 359 | /* Create a digest BIO from an X509_ALGOR structure */ | 338 | /* Create a digest BIO from an X509_ALGOR structure */ |
| 360 | 339 | ||
| 361 | BIO *cms_DigestAlgorithm_init_bio(X509_ALGOR *digestAlgorithm) | 340 | BIO * |
| 362 | { | 341 | cms_DigestAlgorithm_init_bio(X509_ALGOR *digestAlgorithm) |
| 342 | { | ||
| 363 | BIO *mdbio = NULL; | 343 | BIO *mdbio = NULL; |
| 364 | ASN1_OBJECT *digestoid; | 344 | ASN1_OBJECT *digestoid; |
| 365 | const EVP_MD *digest; | 345 | const EVP_MD *digest; |
| 346 | |||
| 366 | X509_ALGOR_get0(&digestoid, NULL, NULL, digestAlgorithm); | 347 | X509_ALGOR_get0(&digestoid, NULL, NULL, digestAlgorithm); |
| 367 | digest = EVP_get_digestbyobj(digestoid); | 348 | digest = EVP_get_digestbyobj(digestoid); |
| 368 | if (!digest) | 349 | if (!digest) { |
| 369 | { | ||
| 370 | CMSerr(CMS_F_CMS_DIGESTALGORITHM_INIT_BIO, | 350 | CMSerr(CMS_F_CMS_DIGESTALGORITHM_INIT_BIO, |
| 371 | CMS_R_UNKNOWN_DIGEST_ALGORIHM); | 351 | CMS_R_UNKNOWN_DIGEST_ALGORIHM); |
| 372 | goto err; | 352 | goto err; |
| 373 | } | 353 | } |
| 374 | mdbio = BIO_new(BIO_f_md()); | 354 | mdbio = BIO_new(BIO_f_md()); |
| 375 | if (!mdbio || !BIO_set_md(mdbio, digest)) | 355 | if (!mdbio || !BIO_set_md(mdbio, digest)) { |
| 376 | { | ||
| 377 | CMSerr(CMS_F_CMS_DIGESTALGORITHM_INIT_BIO, | 356 | CMSerr(CMS_F_CMS_DIGESTALGORITHM_INIT_BIO, |
| 378 | CMS_R_MD_BIO_INIT_ERROR); | 357 | CMS_R_MD_BIO_INIT_ERROR); |
| 379 | goto err; | 358 | goto err; |
| 380 | } | 359 | } |
| 381 | return mdbio; | 360 | return mdbio; |
| 382 | err: | 361 | |
| 362 | err: | ||
| 383 | if (mdbio) | 363 | if (mdbio) |
| 384 | BIO_free(mdbio); | 364 | BIO_free(mdbio); |
| 385 | return NULL; | 365 | return NULL; |
| 386 | } | 366 | } |
| 387 | 367 | ||
| 388 | /* Locate a message digest content from a BIO chain based on SignerInfo */ | 368 | /* Locate a message digest content from a BIO chain based on SignerInfo */ |
| 389 | 369 | ||
| 390 | int cms_DigestAlgorithm_find_ctx(EVP_MD_CTX *mctx, BIO *chain, | 370 | int |
| 391 | X509_ALGOR *mdalg) | 371 | cms_DigestAlgorithm_find_ctx(EVP_MD_CTX *mctx, BIO *chain, X509_ALGOR *mdalg) |
| 392 | { | 372 | { |
| 393 | int nid; | 373 | int nid; |
| 394 | ASN1_OBJECT *mdoid; | 374 | ASN1_OBJECT *mdoid; |
| 375 | |||
| 395 | X509_ALGOR_get0(&mdoid, NULL, NULL, mdalg); | 376 | X509_ALGOR_get0(&mdoid, NULL, NULL, mdalg); |
| 396 | nid = OBJ_obj2nid(mdoid); | 377 | nid = OBJ_obj2nid(mdoid); |
| 378 | |||
| 397 | /* Look for digest type to match signature */ | 379 | /* Look for digest type to match signature */ |
| 398 | for (;;) | 380 | for (;;) { |
| 399 | { | ||
| 400 | EVP_MD_CTX *mtmp; | 381 | EVP_MD_CTX *mtmp; |
| 401 | chain = BIO_find_type(chain, BIO_TYPE_MD); | 382 | chain = BIO_find_type(chain, BIO_TYPE_MD); |
| 402 | if (chain == NULL) | 383 | if (chain == NULL) { |
| 403 | { | ||
| 404 | CMSerr(CMS_F_CMS_DIGESTALGORITHM_FIND_CTX, | 384 | CMSerr(CMS_F_CMS_DIGESTALGORITHM_FIND_CTX, |
| 405 | CMS_R_NO_MATCHING_DIGEST); | 385 | CMS_R_NO_MATCHING_DIGEST); |
| 406 | return 0; | 386 | return 0; |
| 407 | } | 387 | } |
| 408 | BIO_get_md_ctx(chain, &mtmp); | 388 | BIO_get_md_ctx(chain, &mtmp); |
| 409 | if (EVP_MD_CTX_type(mtmp) == nid | 389 | if (EVP_MD_CTX_type(mtmp) == nid |
| 410 | /* Workaround for broken implementations that use signature | 390 | /* Workaround for broken implementations that use signature |
| 411 | * algorithm OID instead of digest. | 391 | * algorithm OID instead of digest. |
| 412 | */ | 392 | */ || |
| 413 | || EVP_MD_pkey_type(EVP_MD_CTX_md(mtmp)) == nid) | 393 | EVP_MD_pkey_type(EVP_MD_CTX_md(mtmp)) == nid) |
| 414 | return EVP_MD_CTX_copy_ex(mctx, mtmp); | 394 | return EVP_MD_CTX_copy_ex(mctx, mtmp); |
| 415 | chain = BIO_next(chain); | 395 | chain = BIO_next(chain); |
| 416 | } | ||
| 417 | } | 396 | } |
| 397 | } | ||
| 418 | 398 | ||
| 419 | static STACK_OF(CMS_CertificateChoices) **cms_get0_certificate_choices(CMS_ContentInfo *cms) | 399 | static STACK_OF(CMS_CertificateChoices) ** |
| 420 | { | 400 | cms_get0_certificate_choices(CMS_ContentInfo *cms) |
| 421 | switch (OBJ_obj2nid(cms->contentType)) | 401 | { |
| 422 | { | 402 | switch (OBJ_obj2nid(cms->contentType)) { |
| 423 | 403 | case NID_pkcs7_signed: | |
| 424 | case NID_pkcs7_signed: | ||
| 425 | return &cms->d.signedData->certificates; | 404 | return &cms->d.signedData->certificates; |
| 426 | 405 | case NID_pkcs7_enveloped: | |
| 427 | case NID_pkcs7_enveloped: | ||
| 428 | return &cms->d.envelopedData->originatorInfo->certificates; | 406 | return &cms->d.envelopedData->originatorInfo->certificates; |
| 429 | 407 | default: | |
| 430 | default: | ||
| 431 | CMSerr(CMS_F_CMS_GET0_CERTIFICATE_CHOICES, | 408 | CMSerr(CMS_F_CMS_GET0_CERTIFICATE_CHOICES, |
| 432 | CMS_R_UNSUPPORTED_CONTENT_TYPE); | 409 | CMS_R_UNSUPPORTED_CONTENT_TYPE); |
| 433 | return NULL; | 410 | return NULL; |
| 434 | |||
| 435 | } | ||
| 436 | } | 411 | } |
| 412 | } | ||
| 437 | 413 | ||
| 438 | CMS_CertificateChoices *CMS_add0_CertificateChoices(CMS_ContentInfo *cms) | 414 | CMS_CertificateChoices * |
| 439 | { | 415 | CMS_add0_CertificateChoices(CMS_ContentInfo *cms) |
| 416 | { | ||
| 440 | STACK_OF(CMS_CertificateChoices) **pcerts; | 417 | STACK_OF(CMS_CertificateChoices) **pcerts; |
| 441 | CMS_CertificateChoices *cch; | 418 | CMS_CertificateChoices *cch; |
| 419 | |||
| 442 | pcerts = cms_get0_certificate_choices(cms); | 420 | pcerts = cms_get0_certificate_choices(cms); |
| 443 | if (!pcerts) | 421 | if (!pcerts) |
| 444 | return NULL; | 422 | return NULL; |
| @@ -449,75 +427,73 @@ CMS_CertificateChoices *CMS_add0_CertificateChoices(CMS_ContentInfo *cms) | |||
| 449 | cch = M_ASN1_new_of(CMS_CertificateChoices); | 427 | cch = M_ASN1_new_of(CMS_CertificateChoices); |
| 450 | if (!cch) | 428 | if (!cch) |
| 451 | return NULL; | 429 | return NULL; |
| 452 | if (!sk_CMS_CertificateChoices_push(*pcerts, cch)) | 430 | if (!sk_CMS_CertificateChoices_push(*pcerts, cch)) { |
| 453 | { | ||
| 454 | M_ASN1_free_of(cch, CMS_CertificateChoices); | 431 | M_ASN1_free_of(cch, CMS_CertificateChoices); |
| 455 | return NULL; | 432 | return NULL; |
| 456 | } | ||
| 457 | return cch; | ||
| 458 | } | 433 | } |
| 434 | return cch; | ||
| 435 | } | ||
| 459 | 436 | ||
| 460 | int CMS_add0_cert(CMS_ContentInfo *cms, X509 *cert) | 437 | int |
| 461 | { | 438 | CMS_add0_cert(CMS_ContentInfo *cms, X509 *cert) |
| 439 | { | ||
| 462 | CMS_CertificateChoices *cch; | 440 | CMS_CertificateChoices *cch; |
| 463 | STACK_OF(CMS_CertificateChoices) **pcerts; | 441 | STACK_OF(CMS_CertificateChoices) **pcerts; |
| 464 | int i; | 442 | int i; |
| 443 | |||
| 465 | pcerts = cms_get0_certificate_choices(cms); | 444 | pcerts = cms_get0_certificate_choices(cms); |
| 466 | if (!pcerts) | 445 | if (!pcerts) |
| 467 | return 0; | 446 | return 0; |
| 468 | for (i = 0; i < sk_CMS_CertificateChoices_num(*pcerts); i++) | 447 | for (i = 0; i < sk_CMS_CertificateChoices_num(*pcerts); i++) { |
| 469 | { | ||
| 470 | cch = sk_CMS_CertificateChoices_value(*pcerts, i); | 448 | cch = sk_CMS_CertificateChoices_value(*pcerts, i); |
| 471 | if (cch->type == CMS_CERTCHOICE_CERT) | 449 | if (cch->type == CMS_CERTCHOICE_CERT) { |
| 472 | { | 450 | if (!X509_cmp(cch->d.certificate, cert)) { |
| 473 | if (!X509_cmp(cch->d.certificate, cert)) | 451 | CMSerr(CMS_F_CMS_ADD0_CERT, |
| 474 | { | 452 | CMS_R_CERTIFICATE_ALREADY_PRESENT); |
| 475 | CMSerr(CMS_F_CMS_ADD0_CERT, | ||
| 476 | CMS_R_CERTIFICATE_ALREADY_PRESENT); | ||
| 477 | return 0; | 453 | return 0; |
| 478 | } | ||
| 479 | } | 454 | } |
| 480 | } | 455 | } |
| 456 | } | ||
| 481 | cch = CMS_add0_CertificateChoices(cms); | 457 | cch = CMS_add0_CertificateChoices(cms); |
| 482 | if (!cch) | 458 | if (!cch) |
| 483 | return 0; | 459 | return 0; |
| 484 | cch->type = CMS_CERTCHOICE_CERT; | 460 | cch->type = CMS_CERTCHOICE_CERT; |
| 485 | cch->d.certificate = cert; | 461 | cch->d.certificate = cert; |
| 486 | return 1; | 462 | return 1; |
| 487 | } | 463 | } |
| 488 | 464 | ||
| 489 | int CMS_add1_cert(CMS_ContentInfo *cms, X509 *cert) | 465 | int |
| 490 | { | 466 | CMS_add1_cert(CMS_ContentInfo *cms, X509 *cert) |
| 467 | { | ||
| 491 | int r; | 468 | int r; |
| 469 | |||
| 492 | r = CMS_add0_cert(cms, cert); | 470 | r = CMS_add0_cert(cms, cert); |
| 493 | if (r > 0) | 471 | if (r > 0) |
| 494 | CRYPTO_add(&cert->references, 1, CRYPTO_LOCK_X509); | 472 | CRYPTO_add(&cert->references, 1, CRYPTO_LOCK_X509); |
| 495 | return r; | 473 | return r; |
| 496 | } | 474 | } |
| 497 | 475 | ||
| 498 | static STACK_OF(CMS_RevocationInfoChoice) **cms_get0_revocation_choices(CMS_ContentInfo *cms) | 476 | static STACK_OF(CMS_RevocationInfoChoice) ** |
| 499 | { | 477 | cms_get0_revocation_choices(CMS_ContentInfo *cms) |
| 500 | switch (OBJ_obj2nid(cms->contentType)) | 478 | { |
| 501 | { | 479 | switch (OBJ_obj2nid(cms->contentType)) { |
| 502 | 480 | case NID_pkcs7_signed: | |
| 503 | case NID_pkcs7_signed: | ||
| 504 | return &cms->d.signedData->crls; | 481 | return &cms->d.signedData->crls; |
| 505 | 482 | case NID_pkcs7_enveloped: | |
| 506 | case NID_pkcs7_enveloped: | ||
| 507 | return &cms->d.envelopedData->originatorInfo->crls; | 483 | return &cms->d.envelopedData->originatorInfo->crls; |
| 508 | 484 | default: | |
| 509 | default: | ||
| 510 | CMSerr(CMS_F_CMS_GET0_REVOCATION_CHOICES, | 485 | CMSerr(CMS_F_CMS_GET0_REVOCATION_CHOICES, |
| 511 | CMS_R_UNSUPPORTED_CONTENT_TYPE); | 486 | CMS_R_UNSUPPORTED_CONTENT_TYPE); |
| 512 | return NULL; | 487 | return NULL; |
| 513 | |||
| 514 | } | ||
| 515 | } | 488 | } |
| 489 | } | ||
| 516 | 490 | ||
| 517 | CMS_RevocationInfoChoice *CMS_add0_RevocationInfoChoice(CMS_ContentInfo *cms) | 491 | CMS_RevocationInfoChoice * |
| 518 | { | 492 | CMS_add0_RevocationInfoChoice(CMS_ContentInfo *cms) |
| 493 | { | ||
| 519 | STACK_OF(CMS_RevocationInfoChoice) **pcrls; | 494 | STACK_OF(CMS_RevocationInfoChoice) **pcrls; |
| 520 | CMS_RevocationInfoChoice *rch; | 495 | CMS_RevocationInfoChoice *rch; |
| 496 | |||
| 521 | pcrls = cms_get0_revocation_choices(cms); | 497 | pcrls = cms_get0_revocation_choices(cms); |
| 522 | if (!pcrls) | 498 | if (!pcrls) |
| 523 | return NULL; | 499 | return NULL; |
| @@ -528,95 +504,92 @@ CMS_RevocationInfoChoice *CMS_add0_RevocationInfoChoice(CMS_ContentInfo *cms) | |||
| 528 | rch = M_ASN1_new_of(CMS_RevocationInfoChoice); | 504 | rch = M_ASN1_new_of(CMS_RevocationInfoChoice); |
| 529 | if (!rch) | 505 | if (!rch) |
| 530 | return NULL; | 506 | return NULL; |
| 531 | if (!sk_CMS_RevocationInfoChoice_push(*pcrls, rch)) | 507 | if (!sk_CMS_RevocationInfoChoice_push(*pcrls, rch)) { |
| 532 | { | ||
| 533 | M_ASN1_free_of(rch, CMS_RevocationInfoChoice); | 508 | M_ASN1_free_of(rch, CMS_RevocationInfoChoice); |
| 534 | return NULL; | 509 | return NULL; |
| 535 | } | ||
| 536 | return rch; | ||
| 537 | } | 510 | } |
| 511 | return rch; | ||
| 512 | } | ||
| 538 | 513 | ||
| 539 | int CMS_add0_crl(CMS_ContentInfo *cms, X509_CRL *crl) | 514 | int |
| 540 | { | 515 | CMS_add0_crl(CMS_ContentInfo *cms, X509_CRL *crl) |
| 516 | { | ||
| 541 | CMS_RevocationInfoChoice *rch; | 517 | CMS_RevocationInfoChoice *rch; |
| 518 | |||
| 542 | rch = CMS_add0_RevocationInfoChoice(cms); | 519 | rch = CMS_add0_RevocationInfoChoice(cms); |
| 543 | if (!rch) | 520 | if (!rch) |
| 544 | return 0; | 521 | return 0; |
| 545 | rch->type = CMS_REVCHOICE_CRL; | 522 | rch->type = CMS_REVCHOICE_CRL; |
| 546 | rch->d.crl = crl; | 523 | rch->d.crl = crl; |
| 547 | return 1; | 524 | return 1; |
| 548 | } | 525 | } |
| 549 | 526 | ||
| 550 | int CMS_add1_crl(CMS_ContentInfo *cms, X509_CRL *crl) | 527 | int |
| 551 | { | 528 | CMS_add1_crl(CMS_ContentInfo *cms, X509_CRL *crl) |
| 529 | { | ||
| 552 | int r; | 530 | int r; |
| 531 | |||
| 553 | r = CMS_add0_crl(cms, crl); | 532 | r = CMS_add0_crl(cms, crl); |
| 554 | if (r > 0) | 533 | if (r > 0) |
| 555 | CRYPTO_add(&crl->references, 1, CRYPTO_LOCK_X509_CRL); | 534 | CRYPTO_add(&crl->references, 1, CRYPTO_LOCK_X509_CRL); |
| 556 | return r; | 535 | return r; |
| 557 | } | 536 | } |
| 558 | 537 | ||
| 559 | STACK_OF(X509) *CMS_get1_certs(CMS_ContentInfo *cms) | 538 | STACK_OF(X509) *CMS_get1_certs(CMS_ContentInfo *cms) |
| 560 | { | 539 | { |
| 561 | STACK_OF(X509) *certs = NULL; | 540 | STACK_OF(X509) *certs = NULL; |
| 562 | CMS_CertificateChoices *cch; | 541 | CMS_CertificateChoices *cch; |
| 563 | STACK_OF(CMS_CertificateChoices) **pcerts; | 542 | STACK_OF(CMS_CertificateChoices) **pcerts; |
| 564 | int i; | 543 | int i; |
| 544 | |||
| 565 | pcerts = cms_get0_certificate_choices(cms); | 545 | pcerts = cms_get0_certificate_choices(cms); |
| 566 | if (!pcerts) | 546 | if (!pcerts) |
| 567 | return NULL; | 547 | return NULL; |
| 568 | for (i = 0; i < sk_CMS_CertificateChoices_num(*pcerts); i++) | 548 | for (i = 0; i < sk_CMS_CertificateChoices_num(*pcerts); i++) { |
| 569 | { | ||
| 570 | cch = sk_CMS_CertificateChoices_value(*pcerts, i); | 549 | cch = sk_CMS_CertificateChoices_value(*pcerts, i); |
| 571 | if (cch->type == 0) | 550 | if (cch->type == 0) { |
| 572 | { | 551 | if (!certs) { |
| 573 | if (!certs) | ||
| 574 | { | ||
| 575 | certs = sk_X509_new_null(); | 552 | certs = sk_X509_new_null(); |
| 576 | if (!certs) | 553 | if (!certs) |
| 577 | return NULL; | 554 | return NULL; |
| 578 | } | 555 | } |
| 579 | if (!sk_X509_push(certs, cch->d.certificate)) | 556 | if (!sk_X509_push(certs, cch->d.certificate)) { |
| 580 | { | ||
| 581 | sk_X509_pop_free(certs, X509_free); | 557 | sk_X509_pop_free(certs, X509_free); |
| 582 | return NULL; | 558 | return NULL; |
| 583 | } | ||
| 584 | CRYPTO_add(&cch->d.certificate->references, | ||
| 585 | 1, CRYPTO_LOCK_X509); | ||
| 586 | } | 559 | } |
| 560 | CRYPTO_add(&cch->d.certificate->references, | ||
| 561 | 1, CRYPTO_LOCK_X509); | ||
| 587 | } | 562 | } |
| 563 | } | ||
| 588 | return certs; | 564 | return certs; |
| 589 | 565 | ||
| 590 | } | 566 | } |
| 591 | 567 | ||
| 592 | STACK_OF(X509_CRL) *CMS_get1_crls(CMS_ContentInfo *cms) | 568 | STACK_OF(X509_CRL) *CMS_get1_crls(CMS_ContentInfo *cms) |
| 593 | { | 569 | { |
| 594 | STACK_OF(X509_CRL) *crls = NULL; | 570 | STACK_OF(X509_CRL) *crls = NULL; |
| 595 | STACK_OF(CMS_RevocationInfoChoice) **pcrls; | 571 | STACK_OF(CMS_RevocationInfoChoice) **pcrls; |
| 596 | CMS_RevocationInfoChoice *rch; | 572 | CMS_RevocationInfoChoice *rch; |
| 597 | int i; | 573 | int i; |
| 574 | |||
| 598 | pcrls = cms_get0_revocation_choices(cms); | 575 | pcrls = cms_get0_revocation_choices(cms); |
| 599 | if (!pcrls) | 576 | if (!pcrls) |
| 600 | return NULL; | 577 | return NULL; |
| 601 | for (i = 0; i < sk_CMS_RevocationInfoChoice_num(*pcrls); i++) | 578 | for (i = 0; i < sk_CMS_RevocationInfoChoice_num(*pcrls); i++) { |
| 602 | { | ||
| 603 | rch = sk_CMS_RevocationInfoChoice_value(*pcrls, i); | 579 | rch = sk_CMS_RevocationInfoChoice_value(*pcrls, i); |
| 604 | if (rch->type == 0) | 580 | if (rch->type == 0) { |
| 605 | { | 581 | if (!crls) { |
| 606 | if (!crls) | ||
| 607 | { | ||
| 608 | crls = sk_X509_CRL_new_null(); | 582 | crls = sk_X509_CRL_new_null(); |
| 609 | if (!crls) | 583 | if (!crls) |
| 610 | return NULL; | 584 | return NULL; |
| 611 | } | 585 | } |
| 612 | if (!sk_X509_CRL_push(crls, rch->d.crl)) | 586 | if (!sk_X509_CRL_push(crls, rch->d.crl)) { |
| 613 | { | ||
| 614 | sk_X509_CRL_pop_free(crls, X509_CRL_free); | 587 | sk_X509_CRL_pop_free(crls, X509_CRL_free); |
| 615 | return NULL; | 588 | return NULL; |
| 616 | } | ||
| 617 | CRYPTO_add(&rch->d.crl->references, | ||
| 618 | 1, CRYPTO_LOCK_X509_CRL); | ||
| 619 | } | 589 | } |
| 590 | CRYPTO_add(&rch->d.crl->references, | ||
| 591 | 1, CRYPTO_LOCK_X509_CRL); | ||
| 620 | } | 592 | } |
| 621 | return crls; | ||
| 622 | } | 593 | } |
| 594 | return crls; | ||
| 595 | } | ||
diff --git a/src/lib/libcrypto/cms/cms_pwri.c b/src/lib/libcrypto/cms/cms_pwri.c index 36d50f1797..1399cbd606 100644 --- a/src/lib/libcrypto/cms/cms_pwri.c +++ b/src/lib/libcrypto/cms/cms_pwri.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * are met: | 10 | * are met: |
| 11 | * | 11 | * |
| 12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * | 14 | * |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
| @@ -62,15 +62,16 @@ | |||
| 62 | #include "cms_lcl.h" | 62 | #include "cms_lcl.h" |
| 63 | #include "asn1_locl.h" | 63 | #include "asn1_locl.h" |
| 64 | 64 | ||
| 65 | int CMS_RecipientInfo_set0_password(CMS_RecipientInfo *ri, | 65 | int |
| 66 | unsigned char *pass, ssize_t passlen) | 66 | CMS_RecipientInfo_set0_password(CMS_RecipientInfo *ri, unsigned char *pass, |
| 67 | { | 67 | ssize_t passlen) |
| 68 | { | ||
| 68 | CMS_PasswordRecipientInfo *pwri; | 69 | CMS_PasswordRecipientInfo *pwri; |
| 69 | if (ri->type != CMS_RECIPINFO_PASS) | 70 | |
| 70 | { | 71 | if (ri->type != CMS_RECIPINFO_PASS) { |
| 71 | CMSerr(CMS_F_CMS_RECIPIENTINFO_SET0_PASSWORD, CMS_R_NOT_PWRI); | 72 | CMSerr(CMS_F_CMS_RECIPIENTINFO_SET0_PASSWORD, CMS_R_NOT_PWRI); |
| 72 | return 0; | 73 | return 0; |
| 73 | } | 74 | } |
| 74 | 75 | ||
| 75 | pwri = ri->d.pwri; | 76 | pwri = ri->d.pwri; |
| 76 | pwri->pass = pass; | 77 | pwri->pass = pass; |
| @@ -78,14 +79,13 @@ int CMS_RecipientInfo_set0_password(CMS_RecipientInfo *ri, | |||
| 78 | passlen = strlen((char *)pass); | 79 | passlen = strlen((char *)pass); |
| 79 | pwri->passlen = passlen; | 80 | pwri->passlen = passlen; |
| 80 | return 1; | 81 | return 1; |
| 81 | } | 82 | } |
| 82 | 83 | ||
| 83 | CMS_RecipientInfo *CMS_add0_recipient_password(CMS_ContentInfo *cms, | 84 | CMS_RecipientInfo * |
| 84 | int iter, int wrap_nid, int pbe_nid, | 85 | CMS_add0_recipient_password(CMS_ContentInfo *cms, int iter, int wrap_nid, |
| 85 | unsigned char *pass, | 86 | int pbe_nid, unsigned char *pass, ssize_t passlen, |
| 86 | ssize_t passlen, | 87 | const EVP_CIPHER *kekciph) |
| 87 | const EVP_CIPHER *kekciph) | 88 | { |
| 88 | { | ||
| 89 | CMS_RecipientInfo *ri = NULL; | 89 | CMS_RecipientInfo *ri = NULL; |
| 90 | CMS_EnvelopedData *env; | 90 | CMS_EnvelopedData *env; |
| 91 | CMS_PasswordRecipientInfo *pwri; | 91 | CMS_PasswordRecipientInfo *pwri; |
| @@ -93,6 +93,7 @@ CMS_RecipientInfo *CMS_add0_recipient_password(CMS_ContentInfo *cms, | |||
| 93 | X509_ALGOR *encalg = NULL; | 93 | X509_ALGOR *encalg = NULL; |
| 94 | unsigned char iv[EVP_MAX_IV_LENGTH]; | 94 | unsigned char iv[EVP_MAX_IV_LENGTH]; |
| 95 | int ivlen; | 95 | int ivlen; |
| 96 | |||
| 96 | env = cms_get0_enveloped(cms); | 97 | env = cms_get0_enveloped(cms); |
| 97 | if (!env) | 98 | if (!env) |
| 98 | goto err; | 99 | goto err; |
| @@ -107,54 +108,47 @@ CMS_RecipientInfo *CMS_add0_recipient_password(CMS_ContentInfo *cms, | |||
| 107 | if (kekciph == NULL) | 108 | if (kekciph == NULL) |
| 108 | kekciph = env->encryptedContentInfo->cipher; | 109 | kekciph = env->encryptedContentInfo->cipher; |
| 109 | 110 | ||
| 110 | if (kekciph == NULL) | 111 | if (kekciph == NULL) { |
| 111 | { | ||
| 112 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_PASSWORD, CMS_R_NO_CIPHER); | 112 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_PASSWORD, CMS_R_NO_CIPHER); |
| 113 | return NULL; | 113 | return NULL; |
| 114 | } | 114 | } |
| 115 | if (wrap_nid != NID_id_alg_PWRI_KEK) | 115 | if (wrap_nid != NID_id_alg_PWRI_KEK) { |
| 116 | { | ||
| 117 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_PASSWORD, | 116 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_PASSWORD, |
| 118 | CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM); | 117 | CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM); |
| 119 | return NULL; | 118 | return NULL; |
| 120 | } | 119 | } |
| 121 | 120 | ||
| 122 | /* Setup algorithm identifier for cipher */ | 121 | /* Setup algorithm identifier for cipher */ |
| 123 | encalg = X509_ALGOR_new(); | 122 | encalg = X509_ALGOR_new(); |
| 124 | EVP_CIPHER_CTX_init(&ctx); | 123 | EVP_CIPHER_CTX_init(&ctx); |
| 125 | 124 | ||
| 126 | if (EVP_EncryptInit_ex(&ctx, kekciph, NULL, NULL, NULL) <= 0) | 125 | if (EVP_EncryptInit_ex(&ctx, kekciph, NULL, NULL, NULL) <= 0) { |
| 127 | { | ||
| 128 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_PASSWORD, ERR_R_EVP_LIB); | 126 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_PASSWORD, ERR_R_EVP_LIB); |
| 129 | goto err; | 127 | goto err; |
| 130 | } | 128 | } |
| 131 | 129 | ||
| 132 | ivlen = EVP_CIPHER_CTX_iv_length(&ctx); | 130 | ivlen = EVP_CIPHER_CTX_iv_length(&ctx); |
| 133 | 131 | ||
| 134 | if (ivlen > 0) | 132 | if (ivlen > 0) { |
| 135 | { | ||
| 136 | if (RAND_pseudo_bytes(iv, ivlen) <= 0) | 133 | if (RAND_pseudo_bytes(iv, ivlen) <= 0) |
| 137 | goto err; | 134 | goto err; |
| 138 | if (EVP_EncryptInit_ex(&ctx, NULL, NULL, NULL, iv) <= 0) | 135 | if (EVP_EncryptInit_ex(&ctx, NULL, NULL, NULL, iv) <= 0) { |
| 139 | { | ||
| 140 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_PASSWORD, | 136 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_PASSWORD, |
| 141 | ERR_R_EVP_LIB); | 137 | ERR_R_EVP_LIB); |
| 142 | goto err; | 138 | goto err; |
| 143 | } | 139 | } |
| 144 | encalg->parameter = ASN1_TYPE_new(); | 140 | encalg->parameter = ASN1_TYPE_new(); |
| 145 | if (!encalg->parameter) | 141 | if (!encalg->parameter) { |
| 146 | { | ||
| 147 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_PASSWORD, | 142 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_PASSWORD, |
| 148 | ERR_R_MALLOC_FAILURE); | 143 | ERR_R_MALLOC_FAILURE); |
| 149 | goto err; | 144 | goto err; |
| 150 | } | 145 | } |
| 151 | if (EVP_CIPHER_param_to_asn1(&ctx, encalg->parameter) <= 0) | 146 | if (EVP_CIPHER_param_to_asn1(&ctx, encalg->parameter) <= 0) { |
| 152 | { | ||
| 153 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_PASSWORD, | 147 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_PASSWORD, |
| 154 | CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR); | 148 | CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR); |
| 155 | goto err; | 149 | goto err; |
| 156 | } | ||
| 157 | } | 150 | } |
| 151 | } | ||
| 158 | 152 | ||
| 159 | 153 | ||
| 160 | encalg->algorithm = OBJ_nid2obj(EVP_CIPHER_CTX_type(&ctx)); | 154 | encalg->algorithm = OBJ_nid2obj(EVP_CIPHER_CTX_type(&ctx)); |
| @@ -182,10 +176,10 @@ CMS_RecipientInfo *CMS_add0_recipient_password(CMS_ContentInfo *cms, | |||
| 182 | if (!pwri->keyEncryptionAlgorithm->parameter) | 176 | if (!pwri->keyEncryptionAlgorithm->parameter) |
| 183 | goto merr; | 177 | goto merr; |
| 184 | 178 | ||
| 185 | if(!ASN1_item_pack(encalg, ASN1_ITEM_rptr(X509_ALGOR), | 179 | if (!ASN1_item_pack(encalg, ASN1_ITEM_rptr(X509_ALGOR), |
| 186 | &pwri->keyEncryptionAlgorithm->parameter->value.sequence)) | 180 | &pwri->keyEncryptionAlgorithm->parameter->value.sequence)) |
| 187 | goto merr; | 181 | goto merr; |
| 188 | pwri->keyEncryptionAlgorithm->parameter->type = V_ASN1_SEQUENCE; | 182 | pwri->keyEncryptionAlgorithm->parameter->type = V_ASN1_SEQUENCE; |
| 189 | 183 | ||
| 190 | X509_ALGOR_free(encalg); | 184 | X509_ALGOR_free(encalg); |
| 191 | encalg = NULL; | 185 | encalg = NULL; |
| @@ -205,48 +199,47 @@ CMS_RecipientInfo *CMS_add0_recipient_password(CMS_ContentInfo *cms, | |||
| 205 | 199 | ||
| 206 | return ri; | 200 | return ri; |
| 207 | 201 | ||
| 208 | merr: | 202 | merr: |
| 209 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_PASSWORD, ERR_R_MALLOC_FAILURE); | 203 | CMSerr(CMS_F_CMS_ADD0_RECIPIENT_PASSWORD, ERR_R_MALLOC_FAILURE); |
| 210 | err: | 204 | err: |
| 211 | EVP_CIPHER_CTX_cleanup(&ctx); | 205 | EVP_CIPHER_CTX_cleanup(&ctx); |
| 212 | if (ri) | 206 | if (ri) |
| 213 | M_ASN1_free_of(ri, CMS_RecipientInfo); | 207 | M_ASN1_free_of(ri, CMS_RecipientInfo); |
| 214 | if (encalg) | 208 | if (encalg) |
| 215 | X509_ALGOR_free(encalg); | 209 | X509_ALGOR_free(encalg); |
| 216 | return NULL; | 210 | return NULL; |
| 217 | 211 | } | |
| 218 | } | ||
| 219 | 212 | ||
| 220 | /* This is an implementation of the key wrapping mechanism in RFC3211, | 213 | /* This is an implementation of the key wrapping mechanism in RFC3211, |
| 221 | * at some point this should go into EVP. | 214 | * at some point this should go into EVP. |
| 222 | */ | 215 | */ |
| 223 | 216 | ||
| 224 | static int kek_unwrap_key(unsigned char *out, size_t *outlen, | 217 | static int |
| 225 | const unsigned char *in, size_t inlen, EVP_CIPHER_CTX *ctx) | 218 | kek_unwrap_key(unsigned char *out, size_t *outlen, const unsigned char *in, |
| 226 | { | 219 | size_t inlen, EVP_CIPHER_CTX *ctx) |
| 220 | { | ||
| 227 | size_t blocklen = EVP_CIPHER_CTX_block_size(ctx); | 221 | size_t blocklen = EVP_CIPHER_CTX_block_size(ctx); |
| 228 | unsigned char *tmp; | 222 | unsigned char *tmp; |
| 229 | int outl, rv = 0; | 223 | int outl, rv = 0; |
| 230 | if (inlen < 2 * blocklen) | 224 | |
| 231 | { | 225 | if (inlen < 2 * blocklen) { |
| 232 | /* too small */ | 226 | /* too small */ |
| 233 | return 0; | 227 | return 0; |
| 234 | } | 228 | } |
| 235 | if (inlen % blocklen) | 229 | if (inlen % blocklen) { |
| 236 | { | ||
| 237 | /* Invalid size */ | 230 | /* Invalid size */ |
| 238 | return 0; | 231 | return 0; |
| 239 | } | 232 | } |
| 240 | tmp = malloc(inlen); | 233 | tmp = malloc(inlen); |
| 241 | /* setup IV by decrypting last two blocks */ | 234 | /* setup IV by decrypting last two blocks */ |
| 242 | EVP_DecryptUpdate(ctx, tmp + inlen - 2 * blocklen, &outl, | 235 | EVP_DecryptUpdate(ctx, tmp + inlen - 2 * blocklen, &outl, |
| 243 | in + inlen - 2 * blocklen, blocklen * 2); | 236 | in + inlen - 2 * blocklen, blocklen * 2); |
| 244 | /* Do a decrypt of last decrypted block to set IV to correct value | 237 | /* Do a decrypt of last decrypted block to set IV to correct value |
| 245 | * output it to start of buffer so we don't corrupt decrypted block | 238 | * output it to start of buffer so we don't corrupt decrypted block |
| 246 | * this works because buffer is at least two block lengths long. | 239 | * this works because buffer is at least two block lengths long. |
| 247 | */ | 240 | */ |
| 248 | EVP_DecryptUpdate(ctx, tmp, &outl, | 241 | EVP_DecryptUpdate(ctx, tmp, &outl, |
| 249 | tmp + inlen - blocklen, blocklen); | 242 | tmp + inlen - blocklen, blocklen); |
| 250 | /* Can now decrypt first n - 1 blocks */ | 243 | /* Can now decrypt first n - 1 blocks */ |
| 251 | EVP_DecryptUpdate(ctx, tmp, &outl, in, inlen - blocklen); | 244 | EVP_DecryptUpdate(ctx, tmp, &outl, in, inlen - blocklen); |
| 252 | 245 | ||
| @@ -255,49 +248,47 @@ static int kek_unwrap_key(unsigned char *out, size_t *outlen, | |||
| 255 | /* Decrypt again */ | 248 | /* Decrypt again */ |
| 256 | EVP_DecryptUpdate(ctx, tmp, &outl, tmp, inlen); | 249 | EVP_DecryptUpdate(ctx, tmp, &outl, tmp, inlen); |
| 257 | /* Check check bytes */ | 250 | /* Check check bytes */ |
| 258 | if (((tmp[1] ^ tmp[4]) & (tmp[2] ^ tmp[5]) & (tmp[3] ^ tmp[6])) != 0xff) | 251 | if (((tmp[1] ^ tmp[4]) & (tmp[2] ^ tmp[5]) & |
| 259 | { | 252 | (tmp[3] ^ tmp[6])) != 0xff) { |
| 260 | /* Check byte failure */ | 253 | /* Check byte failure */ |
| 261 | goto err; | 254 | goto err; |
| 262 | } | 255 | } |
| 263 | if (inlen < (size_t)(tmp[0] - 4 )) | 256 | if (inlen < (size_t)(tmp[0] - 4 )) { |
| 264 | { | ||
| 265 | /* Invalid length value */ | 257 | /* Invalid length value */ |
| 266 | goto err; | 258 | goto err; |
| 267 | } | 259 | } |
| 268 | *outlen = (size_t)tmp[0]; | 260 | *outlen = (size_t)tmp[0]; |
| 269 | memcpy(out, tmp + 4, *outlen); | 261 | memcpy(out, tmp + 4, *outlen); |
| 270 | rv = 1; | 262 | rv = 1; |
| 271 | err: | 263 | |
| 264 | err: | ||
| 272 | OPENSSL_cleanse(tmp, inlen); | 265 | OPENSSL_cleanse(tmp, inlen); |
| 273 | free(tmp); | 266 | free(tmp); |
| 274 | return rv; | 267 | return rv; |
| 268 | } | ||
| 275 | 269 | ||
| 276 | } | 270 | static int |
| 277 | 271 | kek_wrap_key(unsigned char *out, size_t *outlen, const unsigned char *in, | |
| 278 | static int kek_wrap_key(unsigned char *out, size_t *outlen, | 272 | size_t inlen, EVP_CIPHER_CTX *ctx) |
| 279 | const unsigned char *in, size_t inlen, EVP_CIPHER_CTX *ctx) | 273 | { |
| 280 | { | ||
| 281 | size_t blocklen = EVP_CIPHER_CTX_block_size(ctx); | 274 | size_t blocklen = EVP_CIPHER_CTX_block_size(ctx); |
| 282 | size_t olen; | 275 | size_t olen; |
| 283 | int dummy; | 276 | int dummy; |
| 277 | |||
| 284 | /* First decide length of output buffer: need header and round up to | 278 | /* First decide length of output buffer: need header and round up to |
| 285 | * multiple of block length. | 279 | * multiple of block length. |
| 286 | */ | 280 | */ |
| 287 | olen = (inlen + 4 + blocklen - 1)/blocklen; | 281 | olen = (inlen + 4 + blocklen - 1)/blocklen; |
| 288 | olen *= blocklen; | 282 | olen *= blocklen; |
| 289 | if (olen < 2 * blocklen) | 283 | if (olen < 2 * blocklen) { |
| 290 | { | ||
| 291 | /* Key too small */ | 284 | /* Key too small */ |
| 292 | return 0; | 285 | return 0; |
| 293 | } | 286 | } |
| 294 | if (inlen > 0xFF) | 287 | if (inlen > 0xFF) { |
| 295 | { | ||
| 296 | /* Key too large */ | 288 | /* Key too large */ |
| 297 | return 0; | 289 | return 0; |
| 298 | } | 290 | } |
| 299 | if (out) | 291 | if (out) { |
| 300 | { | ||
| 301 | /* Set header */ | 292 | /* Set header */ |
| 302 | out[0] = (unsigned char)inlen; | 293 | out[0] = (unsigned char)inlen; |
| 303 | out[1] = in[0] ^ 0xFF; | 294 | out[1] = in[0] ^ 0xFF; |
| @@ -310,18 +301,19 @@ static int kek_wrap_key(unsigned char *out, size_t *outlen, | |||
| 310 | /* Encrypt twice */ | 301 | /* Encrypt twice */ |
| 311 | EVP_EncryptUpdate(ctx, out, &dummy, out, olen); | 302 | EVP_EncryptUpdate(ctx, out, &dummy, out, olen); |
| 312 | EVP_EncryptUpdate(ctx, out, &dummy, out, olen); | 303 | EVP_EncryptUpdate(ctx, out, &dummy, out, olen); |
| 313 | } | 304 | } |
| 314 | 305 | ||
| 315 | *outlen = olen; | 306 | *outlen = olen; |
| 316 | 307 | ||
| 317 | return 1; | 308 | return 1; |
| 318 | } | 309 | } |
| 319 | 310 | ||
| 320 | /* Encrypt/Decrypt content key in PWRI recipient info */ | 311 | /* Encrypt/Decrypt content key in PWRI recipient info */ |
| 321 | 312 | ||
| 322 | int cms_RecipientInfo_pwri_crypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri, | 313 | int |
| 323 | int en_de) | 314 | cms_RecipientInfo_pwri_crypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri, |
| 324 | { | 315 | int en_de) |
| 316 | { | ||
| 325 | CMS_EncryptedContentInfo *ec; | 317 | CMS_EncryptedContentInfo *ec; |
| 326 | CMS_PasswordRecipientInfo *pwri; | 318 | CMS_PasswordRecipientInfo *pwri; |
| 327 | const unsigned char *p = NULL; | 319 | const unsigned char *p = NULL; |
| @@ -338,69 +330,61 @@ int cms_RecipientInfo_pwri_crypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri, | |||
| 338 | pwri = ri->d.pwri; | 330 | pwri = ri->d.pwri; |
| 339 | EVP_CIPHER_CTX_init(&kekctx); | 331 | EVP_CIPHER_CTX_init(&kekctx); |
| 340 | 332 | ||
| 341 | if (!pwri->pass) | 333 | if (!pwri->pass) { |
| 342 | { | ||
| 343 | CMSerr(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT, CMS_R_NO_PASSWORD); | 334 | CMSerr(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT, CMS_R_NO_PASSWORD); |
| 344 | return 0; | 335 | return 0; |
| 345 | } | 336 | } |
| 346 | algtmp = pwri->keyEncryptionAlgorithm; | 337 | algtmp = pwri->keyEncryptionAlgorithm; |
| 347 | 338 | ||
| 348 | if (!algtmp || OBJ_obj2nid(algtmp->algorithm) != NID_id_alg_PWRI_KEK) | 339 | if (!algtmp || OBJ_obj2nid(algtmp->algorithm) != NID_id_alg_PWRI_KEK) { |
| 349 | { | ||
| 350 | CMSerr(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT, | 340 | CMSerr(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT, |
| 351 | CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM); | 341 | CMS_R_UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM); |
| 352 | return 0; | 342 | return 0; |
| 353 | } | 343 | } |
| 354 | 344 | ||
| 355 | if (algtmp->parameter->type == V_ASN1_SEQUENCE) | 345 | if (algtmp->parameter->type == V_ASN1_SEQUENCE) { |
| 356 | { | ||
| 357 | p = algtmp->parameter->value.sequence->data; | 346 | p = algtmp->parameter->value.sequence->data; |
| 358 | plen = algtmp->parameter->value.sequence->length; | 347 | plen = algtmp->parameter->value.sequence->length; |
| 359 | kekalg = d2i_X509_ALGOR(NULL, &p, plen); | 348 | kekalg = d2i_X509_ALGOR(NULL, &p, plen); |
| 360 | } | 349 | } |
| 361 | if (kekalg == NULL) | 350 | if (kekalg == NULL) { |
| 362 | { | ||
| 363 | CMSerr(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT, | 351 | CMSerr(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT, |
| 364 | CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER); | 352 | CMS_R_INVALID_KEY_ENCRYPTION_PARAMETER); |
| 365 | return 0; | 353 | return 0; |
| 366 | } | 354 | } |
| 367 | 355 | ||
| 368 | kekcipher = EVP_get_cipherbyobj(kekalg->algorithm); | 356 | kekcipher = EVP_get_cipherbyobj(kekalg->algorithm); |
| 369 | 357 | ||
| 370 | if(!kekcipher) | 358 | if (!kekcipher) { |
| 371 | { | ||
| 372 | CMSerr(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT, | 359 | CMSerr(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT, |
| 373 | CMS_R_UNKNOWN_CIPHER); | 360 | CMS_R_UNKNOWN_CIPHER); |
| 374 | goto err; | 361 | goto err; |
| 375 | } | 362 | } |
| 376 | 363 | ||
| 377 | /* Fixup cipher based on AlgorithmIdentifier to set IV etc */ | 364 | /* Fixup cipher based on AlgorithmIdentifier to set IV etc */ |
| 378 | if (!EVP_CipherInit_ex(&kekctx, kekcipher, NULL, NULL, NULL, en_de)) | 365 | if (!EVP_CipherInit_ex(&kekctx, kekcipher, NULL, NULL, NULL, en_de)) |
| 379 | goto err; | 366 | goto err; |
| 380 | EVP_CIPHER_CTX_set_padding(&kekctx, 0); | 367 | EVP_CIPHER_CTX_set_padding(&kekctx, 0); |
| 381 | if(EVP_CIPHER_asn1_to_param(&kekctx, kekalg->parameter) < 0) | 368 | if (EVP_CIPHER_asn1_to_param(&kekctx, kekalg->parameter) < 0) { |
| 382 | { | ||
| 383 | CMSerr(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT, | 369 | CMSerr(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT, |
| 384 | CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR); | 370 | CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR); |
| 385 | goto err; | 371 | goto err; |
| 386 | } | 372 | } |
| 387 | 373 | ||
| 388 | algtmp = pwri->keyDerivationAlgorithm; | 374 | algtmp = pwri->keyDerivationAlgorithm; |
| 389 | 375 | ||
| 390 | /* Finish password based key derivation to setup key in "ctx" */ | 376 | /* Finish password based key derivation to setup key in "ctx" */ |
| 391 | 377 | ||
| 392 | if (EVP_PBE_CipherInit(algtmp->algorithm, | 378 | if (EVP_PBE_CipherInit(algtmp->algorithm, |
| 393 | (char *)pwri->pass, pwri->passlen, | 379 | (char *)pwri->pass, pwri->passlen, |
| 394 | algtmp->parameter, &kekctx, en_de) < 0) | 380 | algtmp->parameter, &kekctx, en_de) < 0) { |
| 395 | { | ||
| 396 | CMSerr(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT, ERR_R_EVP_LIB); | 381 | CMSerr(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT, ERR_R_EVP_LIB); |
| 397 | goto err; | 382 | goto err; |
| 398 | } | 383 | } |
| 399 | 384 | ||
| 400 | /* Finally wrap/unwrap the key */ | 385 | /* Finally wrap/unwrap the key */ |
| 401 | 386 | ||
| 402 | if (en_de) | 387 | if (en_de) { |
| 403 | { | ||
| 404 | 388 | ||
| 405 | if (!kek_wrap_key(NULL, &keylen, ec->key, ec->keylen, &kekctx)) | 389 | if (!kek_wrap_key(NULL, &keylen, ec->key, ec->keylen, &kekctx)) |
| 406 | goto err; | 390 | goto err; |
| @@ -414,41 +398,34 @@ int cms_RecipientInfo_pwri_crypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri, | |||
| 414 | goto err; | 398 | goto err; |
| 415 | pwri->encryptedKey->data = key; | 399 | pwri->encryptedKey->data = key; |
| 416 | pwri->encryptedKey->length = keylen; | 400 | pwri->encryptedKey->length = keylen; |
| 417 | } | 401 | } else { |
| 418 | else | ||
| 419 | { | ||
| 420 | key = malloc(pwri->encryptedKey->length); | 402 | key = malloc(pwri->encryptedKey->length); |
| 421 | 403 | ||
| 422 | if (!key) | 404 | if (!key) { |
| 423 | { | ||
| 424 | CMSerr(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT, | 405 | CMSerr(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT, |
| 425 | ERR_R_MALLOC_FAILURE); | 406 | ERR_R_MALLOC_FAILURE); |
| 426 | goto err; | 407 | goto err; |
| 427 | } | 408 | } |
| 428 | if (!kek_unwrap_key(key, &keylen, | 409 | if (!kek_unwrap_key(key, &keylen, |
| 429 | pwri->encryptedKey->data, | 410 | pwri->encryptedKey->data, |
| 430 | pwri->encryptedKey->length, &kekctx)) | 411 | pwri->encryptedKey->length, &kekctx)) { |
| 431 | { | ||
| 432 | CMSerr(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT, | 412 | CMSerr(CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT, |
| 433 | CMS_R_UNWRAP_FAILURE); | 413 | CMS_R_UNWRAP_FAILURE); |
| 434 | goto err; | 414 | goto err; |
| 435 | } | 415 | } |
| 436 | 416 | ||
| 437 | ec->key = key; | 417 | ec->key = key; |
| 438 | ec->keylen = keylen; | 418 | ec->keylen = keylen; |
| 439 | 419 | ||
| 440 | } | 420 | } |
| 441 | 421 | ||
| 442 | r = 1; | 422 | r = 1; |
| 443 | 423 | ||
| 444 | err: | 424 | err: |
| 445 | |||
| 446 | EVP_CIPHER_CTX_cleanup(&kekctx); | 425 | EVP_CIPHER_CTX_cleanup(&kekctx); |
| 447 | |||
| 448 | if (!r && key) | 426 | if (!r && key) |
| 449 | free(key); | 427 | free(key); |
| 450 | X509_ALGOR_free(kekalg); | 428 | X509_ALGOR_free(kekalg); |
| 451 | 429 | ||
| 452 | return r; | 430 | return r; |
| 453 | 431 | } | |
| 454 | } | ||
diff --git a/src/lib/libcrypto/cms/cms_sd.c b/src/lib/libcrypto/cms/cms_sd.c index 976881743b..7fbc0490ba 100644 --- a/src/lib/libcrypto/cms/cms_sd.c +++ b/src/lib/libcrypto/cms/cms_sd.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * are met: | 10 | * are met: |
| 11 | * | 11 | * |
| 12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * | 14 | * |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
| @@ -64,119 +64,111 @@ | |||
| 64 | 64 | ||
| 65 | DECLARE_ASN1_ITEM(CMS_SignedData) | 65 | DECLARE_ASN1_ITEM(CMS_SignedData) |
| 66 | 66 | ||
| 67 | static CMS_SignedData *cms_get0_signed(CMS_ContentInfo *cms) | 67 | static CMS_SignedData * |
| 68 | { | 68 | cms_get0_signed(CMS_ContentInfo *cms) |
| 69 | if (OBJ_obj2nid(cms->contentType) != NID_pkcs7_signed) | 69 | { |
| 70 | { | 70 | if (OBJ_obj2nid(cms->contentType) != NID_pkcs7_signed) { |
| 71 | CMSerr(CMS_F_CMS_GET0_SIGNED, CMS_R_CONTENT_TYPE_NOT_SIGNED_DATA); | 71 | CMSerr(CMS_F_CMS_GET0_SIGNED, |
| 72 | CMS_R_CONTENT_TYPE_NOT_SIGNED_DATA); | ||
| 72 | return NULL; | 73 | return NULL; |
| 73 | } | ||
| 74 | return cms->d.signedData; | ||
| 75 | } | 74 | } |
| 75 | return cms->d.signedData; | ||
| 76 | } | ||
| 76 | 77 | ||
| 77 | static CMS_SignedData *cms_signed_data_init(CMS_ContentInfo *cms) | 78 | static CMS_SignedData * |
| 78 | { | 79 | cms_signed_data_init(CMS_ContentInfo *cms) |
| 79 | if (cms->d.other == NULL) | 80 | { |
| 80 | { | 81 | if (cms->d.other == NULL) { |
| 81 | cms->d.signedData = M_ASN1_new_of(CMS_SignedData); | 82 | cms->d.signedData = M_ASN1_new_of(CMS_SignedData); |
| 82 | if (!cms->d.signedData) | 83 | if (!cms->d.signedData) { |
| 83 | { | 84 | CMSerr(CMS_F_CMS_SIGNED_DATA_INIT, |
| 84 | CMSerr(CMS_F_CMS_SIGNED_DATA_INIT, ERR_R_MALLOC_FAILURE); | 85 | ERR_R_MALLOC_FAILURE); |
| 85 | return NULL; | 86 | return NULL; |
| 86 | } | 87 | } |
| 87 | cms->d.signedData->version = 1; | 88 | cms->d.signedData->version = 1; |
| 88 | cms->d.signedData->encapContentInfo->eContentType = | 89 | cms->d.signedData->encapContentInfo->eContentType = |
| 89 | OBJ_nid2obj(NID_pkcs7_data); | 90 | OBJ_nid2obj(NID_pkcs7_data); |
| 90 | cms->d.signedData->encapContentInfo->partial = 1; | 91 | cms->d.signedData->encapContentInfo->partial = 1; |
| 91 | ASN1_OBJECT_free(cms->contentType); | 92 | ASN1_OBJECT_free(cms->contentType); |
| 92 | cms->contentType = OBJ_nid2obj(NID_pkcs7_signed); | 93 | cms->contentType = OBJ_nid2obj(NID_pkcs7_signed); |
| 93 | return cms->d.signedData; | 94 | return cms->d.signedData; |
| 94 | } | ||
| 95 | return cms_get0_signed(cms); | ||
| 96 | } | 95 | } |
| 96 | return cms_get0_signed(cms); | ||
| 97 | } | ||
| 97 | 98 | ||
| 98 | /* Just initialize SignedData e.g. for certs only structure */ | 99 | /* Just initialize SignedData e.g. for certs only structure */ |
| 99 | 100 | ||
| 100 | int CMS_SignedData_init(CMS_ContentInfo *cms) | 101 | int |
| 101 | { | 102 | CMS_SignedData_init(CMS_ContentInfo *cms) |
| 103 | { | ||
| 102 | if (cms_signed_data_init(cms)) | 104 | if (cms_signed_data_init(cms)) |
| 103 | return 1; | 105 | return 1; |
| 104 | else | 106 | else |
| 105 | return 0; | 107 | return 0; |
| 106 | } | 108 | } |
| 107 | 109 | ||
| 108 | /* Check structures and fixup version numbers (if necessary) */ | 110 | /* Check structures and fixup version numbers (if necessary) */ |
| 109 | 111 | ||
| 110 | static void cms_sd_set_version(CMS_SignedData *sd) | 112 | static void |
| 111 | { | 113 | cms_sd_set_version(CMS_SignedData *sd) |
| 114 | { | ||
| 112 | int i; | 115 | int i; |
| 113 | CMS_CertificateChoices *cch; | 116 | CMS_CertificateChoices *cch; |
| 114 | CMS_RevocationInfoChoice *rch; | 117 | CMS_RevocationInfoChoice *rch; |
| 115 | CMS_SignerInfo *si; | 118 | CMS_SignerInfo *si; |
| 116 | 119 | ||
| 117 | for (i = 0; i < sk_CMS_CertificateChoices_num(sd->certificates); i++) | 120 | for (i = 0; i < sk_CMS_CertificateChoices_num(sd->certificates); i++) { |
| 118 | { | ||
| 119 | cch = sk_CMS_CertificateChoices_value(sd->certificates, i); | 121 | cch = sk_CMS_CertificateChoices_value(sd->certificates, i); |
| 120 | if (cch->type == CMS_CERTCHOICE_OTHER) | 122 | if (cch->type == CMS_CERTCHOICE_OTHER) { |
| 121 | { | ||
| 122 | if (sd->version < 5) | 123 | if (sd->version < 5) |
| 123 | sd->version = 5; | 124 | sd->version = 5; |
| 124 | } | 125 | } else if (cch->type == CMS_CERTCHOICE_V2ACERT) { |
| 125 | else if (cch->type == CMS_CERTCHOICE_V2ACERT) | ||
| 126 | { | ||
| 127 | if (sd->version < 4) | 126 | if (sd->version < 4) |
| 128 | sd->version = 4; | 127 | sd->version = 4; |
| 129 | } | 128 | } else if (cch->type == CMS_CERTCHOICE_V1ACERT) { |
| 130 | else if (cch->type == CMS_CERTCHOICE_V1ACERT) | ||
| 131 | { | ||
| 132 | if (sd->version < 3) | 129 | if (sd->version < 3) |
| 133 | sd->version = 3; | 130 | sd->version = 3; |
| 134 | } | ||
| 135 | } | 131 | } |
| 132 | } | ||
| 136 | 133 | ||
| 137 | for (i = 0; i < sk_CMS_RevocationInfoChoice_num(sd->crls); i++) | 134 | for (i = 0; i < sk_CMS_RevocationInfoChoice_num(sd->crls); i++) { |
| 138 | { | ||
| 139 | rch = sk_CMS_RevocationInfoChoice_value(sd->crls, i); | 135 | rch = sk_CMS_RevocationInfoChoice_value(sd->crls, i); |
| 140 | if (rch->type == CMS_REVCHOICE_OTHER) | 136 | if (rch->type == CMS_REVCHOICE_OTHER) { |
| 141 | { | ||
| 142 | if (sd->version < 5) | 137 | if (sd->version < 5) |
| 143 | sd->version = 5; | 138 | sd->version = 5; |
| 144 | } | ||
| 145 | } | 139 | } |
| 140 | } | ||
| 146 | 141 | ||
| 147 | if ((OBJ_obj2nid(sd->encapContentInfo->eContentType) != NID_pkcs7_data) | 142 | if ((OBJ_obj2nid(sd->encapContentInfo->eContentType) != |
| 148 | && (sd->version < 3)) | 143 | NID_pkcs7_data) && (sd->version < 3)) |
| 149 | sd->version = 3; | 144 | sd->version = 3; |
| 150 | 145 | ||
| 151 | for (i = 0; i < sk_CMS_SignerInfo_num(sd->signerInfos); i++) | 146 | for (i = 0; i < sk_CMS_SignerInfo_num(sd->signerInfos); i++) { |
| 152 | { | ||
| 153 | si = sk_CMS_SignerInfo_value(sd->signerInfos, i); | 147 | si = sk_CMS_SignerInfo_value(sd->signerInfos, i); |
| 154 | if (si->sid->type == CMS_SIGNERINFO_KEYIDENTIFIER) | 148 | if (si->sid->type == CMS_SIGNERINFO_KEYIDENTIFIER) { |
| 155 | { | ||
| 156 | if (si->version < 3) | 149 | if (si->version < 3) |
| 157 | si->version = 3; | 150 | si->version = 3; |
| 158 | if (sd->version < 3) | 151 | if (sd->version < 3) |
| 159 | sd->version = 3; | 152 | sd->version = 3; |
| 160 | } | 153 | } else |
| 161 | else | ||
| 162 | sd->version = 1; | 154 | sd->version = 1; |
| 163 | } | 155 | } |
| 164 | 156 | ||
| 165 | if (sd->version < 1) | 157 | if (sd->version < 1) |
| 166 | sd->version = 1; | 158 | sd->version = 1; |
| 159 | } | ||
| 167 | 160 | ||
| 168 | } | ||
| 169 | |||
| 170 | /* Copy an existing messageDigest value */ | 161 | /* Copy an existing messageDigest value */ |
| 171 | 162 | ||
| 172 | static int cms_copy_messageDigest(CMS_ContentInfo *cms, CMS_SignerInfo *si) | 163 | static int |
| 173 | { | 164 | cms_copy_messageDigest(CMS_ContentInfo *cms, CMS_SignerInfo *si) |
| 165 | { | ||
| 174 | STACK_OF(CMS_SignerInfo) *sinfos; | 166 | STACK_OF(CMS_SignerInfo) *sinfos; |
| 175 | CMS_SignerInfo *sitmp; | 167 | CMS_SignerInfo *sitmp; |
| 176 | int i; | 168 | int i; |
| 169 | |||
| 177 | sinfos = CMS_get0_SignerInfos(cms); | 170 | sinfos = CMS_get0_SignerInfos(cms); |
| 178 | for (i = 0; i < sk_CMS_SignerInfo_num(sinfos); i++) | 171 | for (i = 0; i < sk_CMS_SignerInfo_num(sinfos); i++) { |
| 179 | { | ||
| 180 | ASN1_OCTET_STRING *messageDigest; | 172 | ASN1_OCTET_STRING *messageDigest; |
| 181 | sitmp = sk_CMS_SignerInfo_value(sinfos, i); | 173 | sitmp = sk_CMS_SignerInfo_value(sinfos, i); |
| 182 | if (sitmp == si) | 174 | if (sitmp == si) |
| @@ -184,133 +176,124 @@ static int cms_copy_messageDigest(CMS_ContentInfo *cms, CMS_SignerInfo *si) | |||
| 184 | if (CMS_signed_get_attr_count(sitmp) < 0) | 176 | if (CMS_signed_get_attr_count(sitmp) < 0) |
| 185 | continue; | 177 | continue; |
| 186 | if (OBJ_cmp(si->digestAlgorithm->algorithm, | 178 | if (OBJ_cmp(si->digestAlgorithm->algorithm, |
| 187 | sitmp->digestAlgorithm->algorithm)) | 179 | sitmp->digestAlgorithm->algorithm)) |
| 188 | continue; | 180 | continue; |
| 189 | messageDigest = CMS_signed_get0_data_by_OBJ(sitmp, | 181 | messageDigest = CMS_signed_get0_data_by_OBJ(sitmp, |
| 190 | OBJ_nid2obj(NID_pkcs9_messageDigest), | 182 | OBJ_nid2obj(NID_pkcs9_messageDigest), |
| 191 | -3, V_ASN1_OCTET_STRING); | 183 | -3, V_ASN1_OCTET_STRING); |
| 192 | if (!messageDigest) | 184 | if (!messageDigest) { |
| 193 | { | ||
| 194 | CMSerr(CMS_F_CMS_COPY_MESSAGEDIGEST, | 185 | CMSerr(CMS_F_CMS_COPY_MESSAGEDIGEST, |
| 195 | CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE); | 186 | CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE); |
| 196 | return 0; | 187 | return 0; |
| 197 | } | 188 | } |
| 198 | 189 | ||
| 199 | if (CMS_signed_add1_attr_by_NID(si, NID_pkcs9_messageDigest, | 190 | if (CMS_signed_add1_attr_by_NID(si, NID_pkcs9_messageDigest, |
| 200 | V_ASN1_OCTET_STRING, | 191 | V_ASN1_OCTET_STRING, |
| 201 | messageDigest, -1)) | 192 | messageDigest, -1)) |
| 202 | return 1; | 193 | return 1; |
| 203 | else | 194 | else |
| 204 | return 0; | 195 | return 0; |
| 205 | } | ||
| 206 | CMSerr(CMS_F_CMS_COPY_MESSAGEDIGEST, CMS_R_NO_MATCHING_DIGEST); | ||
| 207 | return 0; | ||
| 208 | } | 196 | } |
| 197 | CMSerr(CMS_F_CMS_COPY_MESSAGEDIGEST, CMS_R_NO_MATCHING_DIGEST); | ||
| 198 | return 0; | ||
| 199 | } | ||
| 209 | 200 | ||
| 210 | int cms_set1_SignerIdentifier(CMS_SignerIdentifier *sid, X509 *cert, int type) | 201 | int |
| 211 | { | 202 | cms_set1_SignerIdentifier(CMS_SignerIdentifier *sid, X509 *cert, int type) |
| 212 | switch(type) | 203 | { |
| 213 | { | 204 | switch (type) { |
| 214 | case CMS_SIGNERINFO_ISSUER_SERIAL: | 205 | case CMS_SIGNERINFO_ISSUER_SERIAL: |
| 215 | sid->d.issuerAndSerialNumber = | 206 | sid->d.issuerAndSerialNumber = |
| 216 | M_ASN1_new_of(CMS_IssuerAndSerialNumber); | 207 | M_ASN1_new_of(CMS_IssuerAndSerialNumber); |
| 217 | if (!sid->d.issuerAndSerialNumber) | 208 | if (!sid->d.issuerAndSerialNumber) |
| 218 | goto merr; | 209 | goto merr; |
| 219 | if (!X509_NAME_set(&sid->d.issuerAndSerialNumber->issuer, | 210 | if (!X509_NAME_set(&sid->d.issuerAndSerialNumber->issuer, |
| 220 | X509_get_issuer_name(cert))) | 211 | X509_get_issuer_name(cert))) |
| 221 | goto merr; | 212 | goto merr; |
| 222 | if (!ASN1_STRING_copy( | 213 | if (!ASN1_STRING_copy( |
| 223 | sid->d.issuerAndSerialNumber->serialNumber, | 214 | sid->d.issuerAndSerialNumber->serialNumber, |
| 224 | X509_get_serialNumber(cert))) | 215 | X509_get_serialNumber(cert))) |
| 225 | goto merr; | 216 | goto merr; |
| 226 | break; | 217 | break; |
| 227 | 218 | ||
| 228 | case CMS_SIGNERINFO_KEYIDENTIFIER: | 219 | case CMS_SIGNERINFO_KEYIDENTIFIER: |
| 229 | if (!cert->skid) | 220 | if (!cert->skid) { |
| 230 | { | ||
| 231 | CMSerr(CMS_F_CMS_SET1_SIGNERIDENTIFIER, | 221 | CMSerr(CMS_F_CMS_SET1_SIGNERIDENTIFIER, |
| 232 | CMS_R_CERTIFICATE_HAS_NO_KEYID); | 222 | CMS_R_CERTIFICATE_HAS_NO_KEYID); |
| 233 | return 0; | 223 | return 0; |
| 234 | } | 224 | } |
| 235 | sid->d.subjectKeyIdentifier = ASN1_STRING_dup(cert->skid); | 225 | sid->d.subjectKeyIdentifier = ASN1_STRING_dup(cert->skid); |
| 236 | if (!sid->d.subjectKeyIdentifier) | 226 | if (!sid->d.subjectKeyIdentifier) |
| 237 | goto merr; | 227 | goto merr; |
| 238 | break; | 228 | break; |
| 239 | 229 | ||
| 240 | default: | 230 | default: |
| 241 | CMSerr(CMS_F_CMS_SET1_SIGNERIDENTIFIER, CMS_R_UNKNOWN_ID); | 231 | CMSerr(CMS_F_CMS_SET1_SIGNERIDENTIFIER, CMS_R_UNKNOWN_ID); |
| 242 | return 0; | 232 | return 0; |
| 243 | } | 233 | } |
| 244 | 234 | ||
| 245 | sid->type = type; | 235 | sid->type = type; |
| 246 | 236 | ||
| 247 | return 1; | 237 | return 1; |
| 248 | 238 | ||
| 249 | merr: | 239 | merr: |
| 250 | CMSerr(CMS_F_CMS_SET1_SIGNERIDENTIFIER, ERR_R_MALLOC_FAILURE); | 240 | CMSerr(CMS_F_CMS_SET1_SIGNERIDENTIFIER, ERR_R_MALLOC_FAILURE); |
| 251 | return 0; | 241 | return 0; |
| 242 | } | ||
| 252 | 243 | ||
| 253 | } | 244 | int |
| 254 | 245 | cms_SignerIdentifier_get0_signer_id(CMS_SignerIdentifier *sid, | |
| 255 | int cms_SignerIdentifier_get0_signer_id(CMS_SignerIdentifier *sid, | 246 | ASN1_OCTET_STRING **keyid, X509_NAME **issuer, ASN1_INTEGER **sno) |
| 256 | ASN1_OCTET_STRING **keyid, | 247 | { |
| 257 | X509_NAME **issuer, ASN1_INTEGER **sno) | 248 | if (sid->type == CMS_SIGNERINFO_ISSUER_SERIAL) { |
| 258 | { | ||
| 259 | if (sid->type == CMS_SIGNERINFO_ISSUER_SERIAL) | ||
| 260 | { | ||
| 261 | if (issuer) | 249 | if (issuer) |
| 262 | *issuer = sid->d.issuerAndSerialNumber->issuer; | 250 | *issuer = sid->d.issuerAndSerialNumber->issuer; |
| 263 | if (sno) | 251 | if (sno) |
| 264 | *sno = sid->d.issuerAndSerialNumber->serialNumber; | 252 | *sno = sid->d.issuerAndSerialNumber->serialNumber; |
| 265 | } | 253 | } else if (sid->type == CMS_SIGNERINFO_KEYIDENTIFIER) { |
| 266 | else if (sid->type == CMS_SIGNERINFO_KEYIDENTIFIER) | ||
| 267 | { | ||
| 268 | if (keyid) | 254 | if (keyid) |
| 269 | *keyid = sid->d.subjectKeyIdentifier; | 255 | *keyid = sid->d.subjectKeyIdentifier; |
| 270 | } | 256 | } else |
| 271 | else | ||
| 272 | return 0; | 257 | return 0; |
| 273 | return 1; | 258 | return 1; |
| 274 | } | 259 | } |
| 275 | 260 | ||
| 276 | int cms_SignerIdentifier_cert_cmp(CMS_SignerIdentifier *sid, X509 *cert) | 261 | int |
| 277 | { | 262 | cms_SignerIdentifier_cert_cmp(CMS_SignerIdentifier *sid, X509 *cert) |
| 263 | { | ||
| 278 | int ret; | 264 | int ret; |
| 279 | if (sid->type == CMS_SIGNERINFO_ISSUER_SERIAL) | 265 | |
| 280 | { | 266 | if (sid->type == CMS_SIGNERINFO_ISSUER_SERIAL) { |
| 281 | ret = X509_NAME_cmp(sid->d.issuerAndSerialNumber->issuer, | 267 | ret = X509_NAME_cmp(sid->d.issuerAndSerialNumber->issuer, |
| 282 | X509_get_issuer_name(cert)); | 268 | X509_get_issuer_name(cert)); |
| 283 | if (ret) | 269 | if (ret) |
| 284 | return ret; | 270 | return ret; |
| 285 | return ASN1_INTEGER_cmp(sid->d.issuerAndSerialNumber->serialNumber, | 271 | return ASN1_INTEGER_cmp(sid->d.issuerAndSerialNumber->serialNumber, |
| 286 | X509_get_serialNumber(cert)); | 272 | X509_get_serialNumber(cert)); |
| 287 | } | 273 | } else if (sid->type == CMS_SIGNERINFO_KEYIDENTIFIER) { |
| 288 | else if (sid->type == CMS_SIGNERINFO_KEYIDENTIFIER) | ||
| 289 | { | ||
| 290 | X509_check_purpose(cert, -1, -1); | 274 | X509_check_purpose(cert, -1, -1); |
| 291 | if (!cert->skid) | 275 | if (!cert->skid) |
| 292 | return -1; | 276 | return -1; |
| 293 | return ASN1_OCTET_STRING_cmp(sid->d.subjectKeyIdentifier, | 277 | return ASN1_OCTET_STRING_cmp(sid->d.subjectKeyIdentifier, |
| 294 | cert->skid); | 278 | cert->skid); |
| 295 | } | 279 | } else |
| 296 | else | ||
| 297 | return -1; | 280 | return -1; |
| 298 | } | 281 | } |
| 299 | 282 | ||
| 300 | CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms, | 283 | CMS_SignerInfo * |
| 301 | X509 *signer, EVP_PKEY *pk, const EVP_MD *md, | 284 | CMS_add1_signer(CMS_ContentInfo *cms, X509 *signer, EVP_PKEY *pk, |
| 302 | unsigned int flags) | 285 | const EVP_MD *md, unsigned int flags) |
| 303 | { | 286 | { |
| 304 | CMS_SignedData *sd; | 287 | CMS_SignedData *sd; |
| 305 | CMS_SignerInfo *si = NULL; | 288 | CMS_SignerInfo *si = NULL; |
| 306 | X509_ALGOR *alg; | 289 | X509_ALGOR *alg; |
| 307 | int i, type; | 290 | int i, type; |
| 308 | if(!X509_check_private_key(signer, pk)) | 291 | |
| 309 | { | 292 | if (!X509_check_private_key(signer, pk)) { |
| 310 | CMSerr(CMS_F_CMS_ADD1_SIGNER, | 293 | CMSerr(CMS_F_CMS_ADD1_SIGNER, |
| 311 | CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE); | 294 | CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE); |
| 312 | return NULL; | 295 | return NULL; |
| 313 | } | 296 | } |
| 314 | sd = cms_signed_data_init(cms); | 297 | sd = cms_signed_data_init(cms); |
| 315 | if (!sd) | 298 | if (!sd) |
| 316 | goto err; | 299 | goto err; |
| @@ -325,98 +308,83 @@ CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms, | |||
| 325 | si->pkey = pk; | 308 | si->pkey = pk; |
| 326 | si->signer = signer; | 309 | si->signer = signer; |
| 327 | 310 | ||
| 328 | if (flags & CMS_USE_KEYID) | 311 | if (flags & CMS_USE_KEYID) { |
| 329 | { | ||
| 330 | si->version = 3; | 312 | si->version = 3; |
| 331 | if (sd->version < 3) | 313 | if (sd->version < 3) |
| 332 | sd->version = 3; | 314 | sd->version = 3; |
| 333 | type = CMS_SIGNERINFO_KEYIDENTIFIER; | 315 | type = CMS_SIGNERINFO_KEYIDENTIFIER; |
| 334 | } | 316 | } else { |
| 335 | else | ||
| 336 | { | ||
| 337 | type = CMS_SIGNERINFO_ISSUER_SERIAL; | 317 | type = CMS_SIGNERINFO_ISSUER_SERIAL; |
| 338 | si->version = 1; | 318 | si->version = 1; |
| 339 | } | 319 | } |
| 340 | 320 | ||
| 341 | if (!cms_set1_SignerIdentifier(si->sid, signer, type)) | 321 | if (!cms_set1_SignerIdentifier(si->sid, signer, type)) |
| 342 | goto err; | 322 | goto err; |
| 343 | 323 | ||
| 344 | if (md == NULL) | 324 | if (md == NULL) { |
| 345 | { | ||
| 346 | int def_nid; | 325 | int def_nid; |
| 347 | if (EVP_PKEY_get_default_digest_nid(pk, &def_nid) <= 0) | 326 | if (EVP_PKEY_get_default_digest_nid(pk, &def_nid) <= 0) |
| 348 | goto err; | 327 | goto err; |
| 349 | md = EVP_get_digestbynid(def_nid); | 328 | md = EVP_get_digestbynid(def_nid); |
| 350 | if (md == NULL) | 329 | if (md == NULL) { |
| 351 | { | ||
| 352 | CMSerr(CMS_F_CMS_ADD1_SIGNER, CMS_R_NO_DEFAULT_DIGEST); | 330 | CMSerr(CMS_F_CMS_ADD1_SIGNER, CMS_R_NO_DEFAULT_DIGEST); |
| 353 | goto err; | 331 | goto err; |
| 354 | } | ||
| 355 | } | 332 | } |
| 333 | } | ||
| 356 | 334 | ||
| 357 | if (!md) | 335 | if (!md) { |
| 358 | { | ||
| 359 | CMSerr(CMS_F_CMS_ADD1_SIGNER, CMS_R_NO_DIGEST_SET); | 336 | CMSerr(CMS_F_CMS_ADD1_SIGNER, CMS_R_NO_DIGEST_SET); |
| 360 | goto err; | 337 | goto err; |
| 361 | } | 338 | } |
| 362 | 339 | ||
| 363 | cms_DigestAlgorithm_set(si->digestAlgorithm, md); | 340 | cms_DigestAlgorithm_set(si->digestAlgorithm, md); |
| 364 | 341 | ||
| 365 | /* See if digest is present in digestAlgorithms */ | 342 | /* See if digest is present in digestAlgorithms */ |
| 366 | for (i = 0; i < sk_X509_ALGOR_num(sd->digestAlgorithms); i++) | 343 | for (i = 0; i < sk_X509_ALGOR_num(sd->digestAlgorithms); i++) { |
| 367 | { | ||
| 368 | ASN1_OBJECT *aoid; | 344 | ASN1_OBJECT *aoid; |
| 369 | alg = sk_X509_ALGOR_value(sd->digestAlgorithms, i); | 345 | alg = sk_X509_ALGOR_value(sd->digestAlgorithms, i); |
| 370 | X509_ALGOR_get0(&aoid, NULL, NULL, alg); | 346 | X509_ALGOR_get0(&aoid, NULL, NULL, alg); |
| 371 | if (OBJ_obj2nid(aoid) == EVP_MD_type(md)) | 347 | if (OBJ_obj2nid(aoid) == EVP_MD_type(md)) |
| 372 | break; | 348 | break; |
| 373 | } | 349 | } |
| 374 | 350 | ||
| 375 | if (i == sk_X509_ALGOR_num(sd->digestAlgorithms)) | 351 | if (i == sk_X509_ALGOR_num(sd->digestAlgorithms)) { |
| 376 | { | ||
| 377 | alg = X509_ALGOR_new(); | 352 | alg = X509_ALGOR_new(); |
| 378 | if (!alg) | 353 | if (!alg) |
| 379 | goto merr; | 354 | goto merr; |
| 380 | cms_DigestAlgorithm_set(alg, md); | 355 | cms_DigestAlgorithm_set(alg, md); |
| 381 | if (!sk_X509_ALGOR_push(sd->digestAlgorithms, alg)) | 356 | if (!sk_X509_ALGOR_push(sd->digestAlgorithms, alg)) { |
| 382 | { | ||
| 383 | X509_ALGOR_free(alg); | 357 | X509_ALGOR_free(alg); |
| 384 | goto merr; | 358 | goto merr; |
| 385 | } | ||
| 386 | } | 359 | } |
| 360 | } | ||
| 387 | 361 | ||
| 388 | if (pk->ameth && pk->ameth->pkey_ctrl) | 362 | if (pk->ameth && pk->ameth->pkey_ctrl) { |
| 389 | { | ||
| 390 | i = pk->ameth->pkey_ctrl(pk, ASN1_PKEY_CTRL_CMS_SIGN, | 363 | i = pk->ameth->pkey_ctrl(pk, ASN1_PKEY_CTRL_CMS_SIGN, |
| 391 | 0, si); | 364 | 0, si); |
| 392 | if (i == -2) | 365 | if (i == -2) { |
| 393 | { | ||
| 394 | CMSerr(CMS_F_CMS_ADD1_SIGNER, | 366 | CMSerr(CMS_F_CMS_ADD1_SIGNER, |
| 395 | CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE); | 367 | CMS_R_NOT_SUPPORTED_FOR_THIS_KEY_TYPE); |
| 396 | goto err; | 368 | goto err; |
| 397 | } | 369 | } |
| 398 | if (i <= 0) | 370 | if (i <= 0) { |
| 399 | { | ||
| 400 | CMSerr(CMS_F_CMS_ADD1_SIGNER, CMS_R_CTRL_FAILURE); | 371 | CMSerr(CMS_F_CMS_ADD1_SIGNER, CMS_R_CTRL_FAILURE); |
| 401 | goto err; | 372 | goto err; |
| 402 | } | ||
| 403 | } | 373 | } |
| 374 | } | ||
| 404 | 375 | ||
| 405 | if (!(flags & CMS_NOATTR)) | 376 | if (!(flags & CMS_NOATTR)) { |
| 406 | { | ||
| 407 | /* Initialialize signed attributes strutucture so other | 377 | /* Initialialize signed attributes strutucture so other |
| 408 | * attributes such as signing time etc are added later | 378 | * attributes such as signing time etc are added later |
| 409 | * even if we add none here. | 379 | * even if we add none here. |
| 410 | */ | 380 | */ |
| 411 | if (!si->signedAttrs) | 381 | if (!si->signedAttrs) { |
| 412 | { | ||
| 413 | si->signedAttrs = sk_X509_ATTRIBUTE_new_null(); | 382 | si->signedAttrs = sk_X509_ATTRIBUTE_new_null(); |
| 414 | if (!si->signedAttrs) | 383 | if (!si->signedAttrs) |
| 415 | goto merr; | 384 | goto merr; |
| 416 | } | 385 | } |
| 417 | 386 | ||
| 418 | if (!(flags & CMS_NOSMIMECAP)) | 387 | if (!(flags & CMS_NOSMIMECAP)) { |
| 419 | { | ||
| 420 | STACK_OF(X509_ALGOR) *smcap = NULL; | 388 | STACK_OF(X509_ALGOR) *smcap = NULL; |
| 421 | i = CMS_add_standard_smimecap(&smcap); | 389 | i = CMS_add_standard_smimecap(&smcap); |
| 422 | if (i) | 390 | if (i) |
| @@ -424,45 +392,44 @@ CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms, | |||
| 424 | sk_X509_ALGOR_pop_free(smcap, X509_ALGOR_free); | 392 | sk_X509_ALGOR_pop_free(smcap, X509_ALGOR_free); |
| 425 | if (!i) | 393 | if (!i) |
| 426 | goto merr; | 394 | goto merr; |
| 427 | } | 395 | } |
| 428 | if (flags & CMS_REUSE_DIGEST) | 396 | if (flags & CMS_REUSE_DIGEST) { |
| 429 | { | ||
| 430 | if (!cms_copy_messageDigest(cms, si)) | 397 | if (!cms_copy_messageDigest(cms, si)) |
| 431 | goto err; | 398 | goto err; |
| 432 | if (!(flags & CMS_PARTIAL) && | 399 | if (!(flags & CMS_PARTIAL) && |
| 433 | !CMS_SignerInfo_sign(si)) | 400 | !CMS_SignerInfo_sign(si)) |
| 434 | goto err; | 401 | goto err; |
| 435 | } | ||
| 436 | } | 402 | } |
| 403 | } | ||
| 437 | 404 | ||
| 438 | if (!(flags & CMS_NOCERTS)) | 405 | if (!(flags & CMS_NOCERTS)) { |
| 439 | { | ||
| 440 | /* NB ignore -1 return for duplicate cert */ | 406 | /* NB ignore -1 return for duplicate cert */ |
| 441 | if (!CMS_add1_cert(cms, signer)) | 407 | if (!CMS_add1_cert(cms, signer)) |
| 442 | goto merr; | 408 | goto merr; |
| 443 | } | 409 | } |
| 444 | 410 | ||
| 445 | if (!sd->signerInfos) | 411 | if (!sd->signerInfos) |
| 446 | sd->signerInfos = sk_CMS_SignerInfo_new_null(); | 412 | sd->signerInfos = sk_CMS_SignerInfo_new_null(); |
| 447 | if (!sd->signerInfos || | 413 | if (!sd->signerInfos || |
| 448 | !sk_CMS_SignerInfo_push(sd->signerInfos, si)) | 414 | !sk_CMS_SignerInfo_push(sd->signerInfos, si)) |
| 449 | goto merr; | 415 | goto merr; |
| 450 | 416 | ||
| 451 | return si; | 417 | return si; |
| 452 | 418 | ||
| 453 | merr: | 419 | merr: |
| 454 | CMSerr(CMS_F_CMS_ADD1_SIGNER, ERR_R_MALLOC_FAILURE); | 420 | CMSerr(CMS_F_CMS_ADD1_SIGNER, ERR_R_MALLOC_FAILURE); |
| 455 | err: | 421 | err: |
| 456 | if (si) | 422 | if (si) |
| 457 | M_ASN1_free_of(si, CMS_SignerInfo); | 423 | M_ASN1_free_of(si, CMS_SignerInfo); |
| 458 | return NULL; | 424 | return NULL; |
| 425 | } | ||
| 459 | 426 | ||
| 460 | } | 427 | static int |
| 461 | 428 | cms_add1_signingTime(CMS_SignerInfo *si, ASN1_TIME *t) | |
| 462 | static int cms_add1_signingTime(CMS_SignerInfo *si, ASN1_TIME *t) | 429 | { |
| 463 | { | ||
| 464 | ASN1_TIME *tt; | 430 | ASN1_TIME *tt; |
| 465 | int r = 0; | 431 | int r = 0; |
| 432 | |||
| 466 | if (t) | 433 | if (t) |
| 467 | tt = t; | 434 | tt = t; |
| 468 | else | 435 | else |
| @@ -472,89 +439,88 @@ static int cms_add1_signingTime(CMS_SignerInfo *si, ASN1_TIME *t) | |||
| 472 | goto merr; | 439 | goto merr; |
| 473 | 440 | ||
| 474 | if (CMS_signed_add1_attr_by_NID(si, NID_pkcs9_signingTime, | 441 | if (CMS_signed_add1_attr_by_NID(si, NID_pkcs9_signingTime, |
| 475 | tt->type, tt, -1) <= 0) | 442 | tt->type, tt, -1) <= 0) |
| 476 | goto merr; | 443 | goto merr; |
| 477 | 444 | ||
| 478 | r = 1; | 445 | r = 1; |
| 479 | 446 | ||
| 480 | merr: | 447 | merr: |
| 481 | |||
| 482 | if (!t) | 448 | if (!t) |
| 483 | ASN1_TIME_free(tt); | 449 | ASN1_TIME_free(tt); |
| 484 | |||
| 485 | if (!r) | 450 | if (!r) |
| 486 | CMSerr(CMS_F_CMS_ADD1_SIGNINGTIME, ERR_R_MALLOC_FAILURE); | 451 | CMSerr(CMS_F_CMS_ADD1_SIGNINGTIME, ERR_R_MALLOC_FAILURE); |
| 487 | 452 | ||
| 488 | return r; | 453 | return r; |
| 454 | } | ||
| 489 | 455 | ||
| 490 | } | 456 | STACK_OF(CMS_SignerInfo) * |
| 491 | 457 | CMS_get0_SignerInfos(CMS_ContentInfo *cms) | |
| 492 | STACK_OF(CMS_SignerInfo) *CMS_get0_SignerInfos(CMS_ContentInfo *cms) | 458 | { |
| 493 | { | ||
| 494 | CMS_SignedData *sd; | 459 | CMS_SignedData *sd; |
| 460 | |||
| 495 | sd = cms_get0_signed(cms); | 461 | sd = cms_get0_signed(cms); |
| 496 | if (!sd) | 462 | if (!sd) |
| 497 | return NULL; | 463 | return NULL; |
| 498 | return sd->signerInfos; | 464 | return sd->signerInfos; |
| 499 | } | 465 | } |
| 500 | 466 | ||
| 501 | STACK_OF(X509) *CMS_get0_signers(CMS_ContentInfo *cms) | 467 | STACK_OF(X509) * |
| 502 | { | 468 | CMS_get0_signers(CMS_ContentInfo *cms) |
| 469 | { | ||
| 503 | STACK_OF(X509) *signers = NULL; | 470 | STACK_OF(X509) *signers = NULL; |
| 504 | STACK_OF(CMS_SignerInfo) *sinfos; | 471 | STACK_OF(CMS_SignerInfo) *sinfos; |
| 505 | CMS_SignerInfo *si; | 472 | CMS_SignerInfo *si; |
| 506 | int i; | 473 | int i; |
| 474 | |||
| 507 | sinfos = CMS_get0_SignerInfos(cms); | 475 | sinfos = CMS_get0_SignerInfos(cms); |
| 508 | for (i = 0; i < sk_CMS_SignerInfo_num(sinfos); i++) | 476 | for (i = 0; i < sk_CMS_SignerInfo_num(sinfos); i++) { |
| 509 | { | ||
| 510 | si = sk_CMS_SignerInfo_value(sinfos, i); | 477 | si = sk_CMS_SignerInfo_value(sinfos, i); |
| 511 | if (si->signer) | 478 | if (si->signer) { |
| 512 | { | 479 | if (!signers) { |
| 513 | if (!signers) | ||
| 514 | { | ||
| 515 | signers = sk_X509_new_null(); | 480 | signers = sk_X509_new_null(); |
| 516 | if (!signers) | 481 | if (!signers) |
| 517 | return NULL; | 482 | return NULL; |
| 518 | } | 483 | } |
| 519 | if (!sk_X509_push(signers, si->signer)) | 484 | if (!sk_X509_push(signers, si->signer)) { |
| 520 | { | ||
| 521 | sk_X509_free(signers); | 485 | sk_X509_free(signers); |
| 522 | return NULL; | 486 | return NULL; |
| 523 | } | ||
| 524 | } | 487 | } |
| 525 | } | 488 | } |
| 526 | return signers; | ||
| 527 | } | 489 | } |
| 490 | return signers; | ||
| 491 | } | ||
| 528 | 492 | ||
| 529 | void CMS_SignerInfo_set1_signer_cert(CMS_SignerInfo *si, X509 *signer) | 493 | void |
| 530 | { | 494 | CMS_SignerInfo_set1_signer_cert(CMS_SignerInfo *si, X509 *signer) |
| 531 | if (signer) | 495 | { |
| 532 | { | 496 | if (signer) { |
| 533 | CRYPTO_add(&signer->references, 1, CRYPTO_LOCK_X509); | 497 | CRYPTO_add(&signer->references, 1, CRYPTO_LOCK_X509); |
| 534 | if (si->pkey) | 498 | if (si->pkey) |
| 535 | EVP_PKEY_free(si->pkey); | 499 | EVP_PKEY_free(si->pkey); |
| 536 | si->pkey = X509_get_pubkey(signer); | 500 | si->pkey = X509_get_pubkey(signer); |
| 537 | } | 501 | } |
| 538 | if (si->signer) | 502 | if (si->signer) |
| 539 | X509_free(si->signer); | 503 | X509_free(si->signer); |
| 540 | si->signer = signer; | 504 | si->signer = signer; |
| 541 | } | 505 | } |
| 542 | 506 | ||
| 543 | int CMS_SignerInfo_get0_signer_id(CMS_SignerInfo *si, | 507 | int |
| 544 | ASN1_OCTET_STRING **keyid, | 508 | CMS_SignerInfo_get0_signer_id(CMS_SignerInfo *si, ASN1_OCTET_STRING **keyid, |
| 545 | X509_NAME **issuer, ASN1_INTEGER **sno) | 509 | X509_NAME **issuer, ASN1_INTEGER **sno) |
| 546 | { | 510 | { |
| 547 | return cms_SignerIdentifier_get0_signer_id(si->sid, keyid, issuer, sno); | 511 | return cms_SignerIdentifier_get0_signer_id(si->sid, keyid, issuer, sno); |
| 548 | } | 512 | } |
| 549 | 513 | ||
| 550 | int CMS_SignerInfo_cert_cmp(CMS_SignerInfo *si, X509 *cert) | 514 | int |
| 551 | { | 515 | CMS_SignerInfo_cert_cmp(CMS_SignerInfo *si, X509 *cert) |
| 516 | { | ||
| 552 | return cms_SignerIdentifier_cert_cmp(si->sid, cert); | 517 | return cms_SignerIdentifier_cert_cmp(si->sid, cert); |
| 553 | } | 518 | } |
| 554 | 519 | ||
| 555 | int CMS_set1_signers_certs(CMS_ContentInfo *cms, STACK_OF(X509) *scerts, | 520 | int |
| 556 | unsigned int flags) | 521 | CMS_set1_signers_certs(CMS_ContentInfo *cms, STACK_OF(X509) *scerts, |
| 557 | { | 522 | unsigned int flags) |
| 523 | { | ||
| 558 | CMS_SignedData *sd; | 524 | CMS_SignedData *sd; |
| 559 | CMS_SignerInfo *si; | 525 | CMS_SignerInfo *si; |
| 560 | CMS_CertificateChoices *cch; | 526 | CMS_CertificateChoices *cch; |
| @@ -562,50 +528,47 @@ int CMS_set1_signers_certs(CMS_ContentInfo *cms, STACK_OF(X509) *scerts, | |||
| 562 | X509 *x; | 528 | X509 *x; |
| 563 | int i, j; | 529 | int i, j; |
| 564 | int ret = 0; | 530 | int ret = 0; |
| 531 | |||
| 565 | sd = cms_get0_signed(cms); | 532 | sd = cms_get0_signed(cms); |
| 566 | if (!sd) | 533 | if (!sd) |
| 567 | return -1; | 534 | return -1; |
| 568 | certs = sd->certificates; | 535 | certs = sd->certificates; |
| 569 | for (i = 0; i < sk_CMS_SignerInfo_num(sd->signerInfos); i++) | 536 | for (i = 0; i < sk_CMS_SignerInfo_num(sd->signerInfos); i++) { |
| 570 | { | ||
| 571 | si = sk_CMS_SignerInfo_value(sd->signerInfos, i); | 537 | si = sk_CMS_SignerInfo_value(sd->signerInfos, i); |
| 572 | if (si->signer) | 538 | if (si->signer) |
| 573 | continue; | 539 | continue; |
| 574 | 540 | ||
| 575 | for (j = 0; j < sk_X509_num(scerts); j++) | 541 | for (j = 0; j < sk_X509_num(scerts); j++) { |
| 576 | { | ||
| 577 | x = sk_X509_value(scerts, j); | 542 | x = sk_X509_value(scerts, j); |
| 578 | if (CMS_SignerInfo_cert_cmp(si, x) == 0) | 543 | if (CMS_SignerInfo_cert_cmp(si, x) == 0) { |
| 579 | { | ||
| 580 | CMS_SignerInfo_set1_signer_cert(si, x); | 544 | CMS_SignerInfo_set1_signer_cert(si, x); |
| 581 | ret++; | 545 | ret++; |
| 582 | break; | 546 | break; |
| 583 | } | ||
| 584 | } | 547 | } |
| 548 | } | ||
| 585 | 549 | ||
| 586 | if (si->signer || (flags & CMS_NOINTERN)) | 550 | if (si->signer || (flags & CMS_NOINTERN)) |
| 587 | continue; | 551 | continue; |
| 588 | 552 | ||
| 589 | for (j = 0; j < sk_CMS_CertificateChoices_num(certs); j++) | 553 | for (j = 0; j < sk_CMS_CertificateChoices_num(certs); j++) { |
| 590 | { | ||
| 591 | cch = sk_CMS_CertificateChoices_value(certs, j); | 554 | cch = sk_CMS_CertificateChoices_value(certs, j); |
| 592 | if (cch->type != 0) | 555 | if (cch->type != 0) |
| 593 | continue; | 556 | continue; |
| 594 | x = cch->d.certificate; | 557 | x = cch->d.certificate; |
| 595 | if (CMS_SignerInfo_cert_cmp(si, x) == 0) | 558 | if (CMS_SignerInfo_cert_cmp(si, x) == 0) { |
| 596 | { | ||
| 597 | CMS_SignerInfo_set1_signer_cert(si, x); | 559 | CMS_SignerInfo_set1_signer_cert(si, x); |
| 598 | ret++; | 560 | ret++; |
| 599 | break; | 561 | break; |
| 600 | } | ||
| 601 | } | 562 | } |
| 602 | } | 563 | } |
| 603 | return ret; | ||
| 604 | } | 564 | } |
| 565 | return ret; | ||
| 566 | } | ||
| 605 | 567 | ||
| 606 | void CMS_SignerInfo_get0_algs(CMS_SignerInfo *si, EVP_PKEY **pk, X509 **signer, | 568 | void |
| 607 | X509_ALGOR **pdig, X509_ALGOR **psig) | 569 | CMS_SignerInfo_get0_algs(CMS_SignerInfo *si, EVP_PKEY **pk, X509 **signer, |
| 608 | { | 570 | X509_ALGOR **pdig, X509_ALGOR **psig) |
| 571 | { | ||
| 609 | if (pk) | 572 | if (pk) |
| 610 | *pk = si->pkey; | 573 | *pk = si->pkey; |
| 611 | if (signer) | 574 | if (signer) |
| @@ -614,93 +577,88 @@ void CMS_SignerInfo_get0_algs(CMS_SignerInfo *si, EVP_PKEY **pk, X509 **signer, | |||
| 614 | *pdig = si->digestAlgorithm; | 577 | *pdig = si->digestAlgorithm; |
| 615 | if (psig) | 578 | if (psig) |
| 616 | *psig = si->signatureAlgorithm; | 579 | *psig = si->signatureAlgorithm; |
| 617 | } | 580 | } |
| 618 | 581 | ||
| 619 | static int cms_SignerInfo_content_sign(CMS_ContentInfo *cms, | 582 | static int |
| 620 | CMS_SignerInfo *si, BIO *chain) | 583 | cms_SignerInfo_content_sign(CMS_ContentInfo *cms, CMS_SignerInfo *si, |
| 621 | { | 584 | BIO *chain) |
| 585 | { | ||
| 622 | EVP_MD_CTX mctx; | 586 | EVP_MD_CTX mctx; |
| 623 | int r = 0; | 587 | int r = 0; |
| 624 | EVP_MD_CTX_init(&mctx); | 588 | EVP_MD_CTX_init(&mctx); |
| 625 | 589 | ||
| 626 | 590 | if (!si->pkey) { | |
| 627 | if (!si->pkey) | ||
| 628 | { | ||
| 629 | CMSerr(CMS_F_CMS_SIGNERINFO_CONTENT_SIGN, CMS_R_NO_PRIVATE_KEY); | 591 | CMSerr(CMS_F_CMS_SIGNERINFO_CONTENT_SIGN, CMS_R_NO_PRIVATE_KEY); |
| 630 | return 0; | 592 | return 0; |
| 631 | } | 593 | } |
| 632 | 594 | ||
| 633 | if (!cms_DigestAlgorithm_find_ctx(&mctx, chain, si->digestAlgorithm)) | 595 | if (!cms_DigestAlgorithm_find_ctx(&mctx, chain, si->digestAlgorithm)) |
| 634 | goto err; | 596 | goto err; |
| 635 | 597 | ||
| 636 | /* If any signed attributes calculate and add messageDigest attribute */ | 598 | /* If any signed attributes calculate and add messageDigest attribute */ |
| 637 | 599 | ||
| 638 | if (CMS_signed_get_attr_count(si) >= 0) | 600 | if (CMS_signed_get_attr_count(si) >= 0) { |
| 639 | { | ||
| 640 | ASN1_OBJECT *ctype = | 601 | ASN1_OBJECT *ctype = |
| 641 | cms->d.signedData->encapContentInfo->eContentType; | 602 | cms->d.signedData->encapContentInfo->eContentType; |
| 642 | unsigned char md[EVP_MAX_MD_SIZE]; | 603 | unsigned char md[EVP_MAX_MD_SIZE]; |
| 643 | unsigned int mdlen; | 604 | unsigned int mdlen; |
| 644 | if (!EVP_DigestFinal_ex(&mctx, md, &mdlen)) | 605 | if (!EVP_DigestFinal_ex(&mctx, md, &mdlen)) |
| 645 | goto err; | 606 | goto err; |
| 646 | if (!CMS_signed_add1_attr_by_NID(si, NID_pkcs9_messageDigest, | 607 | if (!CMS_signed_add1_attr_by_NID(si, NID_pkcs9_messageDigest, |
| 647 | V_ASN1_OCTET_STRING, | 608 | V_ASN1_OCTET_STRING, |
| 648 | md, mdlen)) | 609 | md, mdlen)) |
| 649 | goto err; | 610 | goto err; |
| 650 | /* Copy content type across */ | 611 | /* Copy content type across */ |
| 651 | if (CMS_signed_add1_attr_by_NID(si, NID_pkcs9_contentType, | 612 | if (CMS_signed_add1_attr_by_NID(si, NID_pkcs9_contentType, |
| 652 | V_ASN1_OBJECT, ctype, -1) <= 0) | 613 | V_ASN1_OBJECT, ctype, -1) <= 0) |
| 653 | goto err; | 614 | goto err; |
| 654 | if (!CMS_SignerInfo_sign(si)) | 615 | if (!CMS_SignerInfo_sign(si)) |
| 655 | goto err; | 616 | goto err; |
| 656 | } | 617 | } else { |
| 657 | else | ||
| 658 | { | ||
| 659 | unsigned char *sig; | 618 | unsigned char *sig; |
| 660 | unsigned int siglen; | 619 | unsigned int siglen; |
| 661 | sig = malloc(EVP_PKEY_size(si->pkey)); | 620 | sig = malloc(EVP_PKEY_size(si->pkey)); |
| 662 | if (!sig) | 621 | if (!sig) { |
| 663 | { | ||
| 664 | CMSerr(CMS_F_CMS_SIGNERINFO_CONTENT_SIGN, | 622 | CMSerr(CMS_F_CMS_SIGNERINFO_CONTENT_SIGN, |
| 665 | ERR_R_MALLOC_FAILURE); | 623 | ERR_R_MALLOC_FAILURE); |
| 666 | goto err; | 624 | goto err; |
| 667 | } | 625 | } |
| 668 | if (!EVP_SignFinal(&mctx, sig, &siglen, si->pkey)) | 626 | if (!EVP_SignFinal(&mctx, sig, &siglen, si->pkey)) { |
| 669 | { | ||
| 670 | CMSerr(CMS_F_CMS_SIGNERINFO_CONTENT_SIGN, | 627 | CMSerr(CMS_F_CMS_SIGNERINFO_CONTENT_SIGN, |
| 671 | CMS_R_SIGNFINAL_ERROR); | 628 | CMS_R_SIGNFINAL_ERROR); |
| 672 | free(sig); | 629 | free(sig); |
| 673 | goto err; | 630 | goto err; |
| 674 | } | ||
| 675 | ASN1_STRING_set0(si->signature, sig, siglen); | ||
| 676 | } | 631 | } |
| 632 | ASN1_STRING_set0(si->signature, sig, siglen); | ||
| 633 | } | ||
| 677 | 634 | ||
| 678 | r = 1; | 635 | r = 1; |
| 679 | 636 | ||
| 680 | err: | 637 | err: |
| 681 | EVP_MD_CTX_cleanup(&mctx); | 638 | EVP_MD_CTX_cleanup(&mctx); |
| 682 | return r; | 639 | return r; |
| 640 | } | ||
| 683 | 641 | ||
| 684 | } | 642 | int |
| 685 | 643 | cms_SignedData_final(CMS_ContentInfo *cms, BIO *chain) | |
| 686 | int cms_SignedData_final(CMS_ContentInfo *cms, BIO *chain) | 644 | { |
| 687 | { | ||
| 688 | STACK_OF(CMS_SignerInfo) *sinfos; | 645 | STACK_OF(CMS_SignerInfo) *sinfos; |
| 689 | CMS_SignerInfo *si; | 646 | CMS_SignerInfo *si; |
| 690 | int i; | 647 | int i; |
| 648 | |||
| 691 | sinfos = CMS_get0_SignerInfos(cms); | 649 | sinfos = CMS_get0_SignerInfos(cms); |
| 692 | for (i = 0; i < sk_CMS_SignerInfo_num(sinfos); i++) | 650 | for (i = 0; i < sk_CMS_SignerInfo_num(sinfos); i++) { |
| 693 | { | ||
| 694 | si = sk_CMS_SignerInfo_value(sinfos, i); | 651 | si = sk_CMS_SignerInfo_value(sinfos, i); |
| 695 | if (!cms_SignerInfo_content_sign(cms, si, chain)) | 652 | if (!cms_SignerInfo_content_sign(cms, si, chain)) |
| 696 | return 0; | 653 | return 0; |
| 697 | } | 654 | } |
| 698 | cms->d.signedData->encapContentInfo->partial = 0; | 655 | cms->d.signedData->encapContentInfo->partial = 0; |
| 699 | return 1; | 656 | return 1; |
| 700 | } | 657 | } |
| 701 | 658 | ||
| 702 | int CMS_SignerInfo_sign(CMS_SignerInfo *si) | 659 | int |
| 703 | { | 660 | CMS_SignerInfo_sign(CMS_SignerInfo *si) |
| 661 | { | ||
| 704 | EVP_MD_CTX mctx; | 662 | EVP_MD_CTX mctx; |
| 705 | EVP_PKEY_CTX *pctx; | 663 | EVP_PKEY_CTX *pctx; |
| 706 | unsigned char *abuf = NULL; | 664 | unsigned char *abuf = NULL; |
| @@ -714,25 +672,23 @@ int CMS_SignerInfo_sign(CMS_SignerInfo *si) | |||
| 714 | 672 | ||
| 715 | EVP_MD_CTX_init(&mctx); | 673 | EVP_MD_CTX_init(&mctx); |
| 716 | 674 | ||
| 717 | if (CMS_signed_get_attr_by_NID(si, NID_pkcs9_signingTime, -1) < 0) | 675 | if (CMS_signed_get_attr_by_NID(si, NID_pkcs9_signingTime, -1) < 0) { |
| 718 | { | ||
| 719 | if (!cms_add1_signingTime(si, NULL)) | 676 | if (!cms_add1_signingTime(si, NULL)) |
| 720 | goto err; | 677 | goto err; |
| 721 | } | 678 | } |
| 722 | 679 | ||
| 723 | if (EVP_DigestSignInit(&mctx, &pctx, md, NULL, si->pkey) <= 0) | 680 | if (EVP_DigestSignInit(&mctx, &pctx, md, NULL, si->pkey) <= 0) |
| 724 | goto err; | 681 | goto err; |
| 725 | 682 | ||
| 726 | if (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_SIGN, | 683 | if (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_SIGN, |
| 727 | EVP_PKEY_CTRL_CMS_SIGN, 0, si) <= 0) | 684 | EVP_PKEY_CTRL_CMS_SIGN, 0, si) <= 0) { |
| 728 | { | ||
| 729 | CMSerr(CMS_F_CMS_SIGNERINFO_SIGN, CMS_R_CTRL_ERROR); | 685 | CMSerr(CMS_F_CMS_SIGNERINFO_SIGN, CMS_R_CTRL_ERROR); |
| 730 | goto err; | 686 | goto err; |
| 731 | } | 687 | } |
| 732 | 688 | ||
| 733 | alen = ASN1_item_i2d((ASN1_VALUE *)si->signedAttrs,&abuf, | 689 | alen = ASN1_item_i2d((ASN1_VALUE *)si->signedAttrs, &abuf, |
| 734 | ASN1_ITEM_rptr(CMS_Attributes_Sign)); | 690 | ASN1_ITEM_rptr(CMS_Attributes_Sign)); |
| 735 | if(!abuf) | 691 | if (!abuf) |
| 736 | goto err; | 692 | goto err; |
| 737 | if (EVP_DigestSignUpdate(&mctx, abuf, alen) <= 0) | 693 | if (EVP_DigestSignUpdate(&mctx, abuf, alen) <= 0) |
| 738 | goto err; | 694 | goto err; |
| @@ -740,17 +696,16 @@ int CMS_SignerInfo_sign(CMS_SignerInfo *si) | |||
| 740 | goto err; | 696 | goto err; |
| 741 | free(abuf); | 697 | free(abuf); |
| 742 | abuf = malloc(siglen); | 698 | abuf = malloc(siglen); |
| 743 | if(!abuf) | 699 | if (!abuf) |
| 744 | goto err; | 700 | goto err; |
| 745 | if (EVP_DigestSignFinal(&mctx, abuf, &siglen) <= 0) | 701 | if (EVP_DigestSignFinal(&mctx, abuf, &siglen) <= 0) |
| 746 | goto err; | 702 | goto err; |
| 747 | 703 | ||
| 748 | if (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_SIGN, | 704 | if (EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_SIGN, |
| 749 | EVP_PKEY_CTRL_CMS_SIGN, 1, si) <= 0) | 705 | EVP_PKEY_CTRL_CMS_SIGN, 1, si) <= 0) { |
| 750 | { | ||
| 751 | CMSerr(CMS_F_CMS_SIGNERINFO_SIGN, CMS_R_CTRL_ERROR); | 706 | CMSerr(CMS_F_CMS_SIGNERINFO_SIGN, CMS_R_CTRL_ERROR); |
| 752 | goto err; | 707 | goto err; |
| 753 | } | 708 | } |
| 754 | 709 | ||
| 755 | EVP_MD_CTX_cleanup(&mctx); | 710 | EVP_MD_CTX_cleanup(&mctx); |
| 756 | 711 | ||
| @@ -758,26 +713,25 @@ int CMS_SignerInfo_sign(CMS_SignerInfo *si) | |||
| 758 | 713 | ||
| 759 | return 1; | 714 | return 1; |
| 760 | 715 | ||
| 761 | err: | 716 | err: |
| 762 | free(abuf); | 717 | free(abuf); |
| 763 | EVP_MD_CTX_cleanup(&mctx); | 718 | EVP_MD_CTX_cleanup(&mctx); |
| 764 | return 0; | 719 | return 0; |
| 720 | } | ||
| 765 | 721 | ||
| 766 | } | 722 | int |
| 767 | 723 | CMS_SignerInfo_verify(CMS_SignerInfo *si) | |
| 768 | int CMS_SignerInfo_verify(CMS_SignerInfo *si) | 724 | { |
| 769 | { | ||
| 770 | EVP_MD_CTX mctx; | 725 | EVP_MD_CTX mctx; |
| 771 | EVP_PKEY_CTX *pctx; | 726 | EVP_PKEY_CTX *pctx; |
| 772 | unsigned char *abuf = NULL; | 727 | unsigned char *abuf = NULL; |
| 773 | int alen, r = -1; | 728 | int alen, r = -1; |
| 774 | const EVP_MD *md = NULL; | 729 | const EVP_MD *md = NULL; |
| 775 | 730 | ||
| 776 | if (!si->pkey) | 731 | if (!si->pkey) { |
| 777 | { | ||
| 778 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY, CMS_R_NO_PUBLIC_KEY); | 732 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY, CMS_R_NO_PUBLIC_KEY); |
| 779 | return -1; | 733 | return -1; |
| 780 | } | 734 | } |
| 781 | 735 | ||
| 782 | md = EVP_get_digestbyobj(si->digestAlgorithm->algorithm); | 736 | md = EVP_get_digestbyobj(si->digestAlgorithm->algorithm); |
| 783 | if (md == NULL) | 737 | if (md == NULL) |
| @@ -786,199 +740,195 @@ int CMS_SignerInfo_verify(CMS_SignerInfo *si) | |||
| 786 | if (EVP_DigestVerifyInit(&mctx, &pctx, md, NULL, si->pkey) <= 0) | 740 | if (EVP_DigestVerifyInit(&mctx, &pctx, md, NULL, si->pkey) <= 0) |
| 787 | goto err; | 741 | goto err; |
| 788 | 742 | ||
| 789 | alen = ASN1_item_i2d((ASN1_VALUE *)si->signedAttrs,&abuf, | 743 | alen = ASN1_item_i2d((ASN1_VALUE *)si->signedAttrs, &abuf, |
| 790 | ASN1_ITEM_rptr(CMS_Attributes_Verify)); | 744 | ASN1_ITEM_rptr(CMS_Attributes_Verify)); |
| 791 | if(!abuf) | 745 | if (!abuf) |
| 792 | goto err; | 746 | goto err; |
| 793 | r = EVP_DigestVerifyUpdate(&mctx, abuf, alen); | 747 | r = EVP_DigestVerifyUpdate(&mctx, abuf, alen); |
| 794 | free(abuf); | 748 | free(abuf); |
| 795 | if (r <= 0) | 749 | if (r <= 0) { |
| 796 | { | ||
| 797 | r = -1; | 750 | r = -1; |
| 798 | goto err; | 751 | goto err; |
| 799 | } | 752 | } |
| 800 | r = EVP_DigestVerifyFinal(&mctx, | 753 | r = EVP_DigestVerifyFinal(&mctx, |
| 801 | si->signature->data, si->signature->length); | 754 | si->signature->data, si->signature->length); |
| 802 | if (r <= 0) | 755 | if (r <= 0) |
| 803 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY, CMS_R_VERIFICATION_FAILURE); | 756 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY, CMS_R_VERIFICATION_FAILURE); |
| 804 | err: | 757 | |
| 758 | err: | ||
| 805 | EVP_MD_CTX_cleanup(&mctx); | 759 | EVP_MD_CTX_cleanup(&mctx); |
| 806 | return r; | 760 | return r; |
| 807 | } | 761 | } |
| 808 | 762 | ||
| 809 | /* Create a chain of digest BIOs from a CMS ContentInfo */ | 763 | /* Create a chain of digest BIOs from a CMS ContentInfo */ |
| 810 | 764 | ||
| 811 | BIO *cms_SignedData_init_bio(CMS_ContentInfo *cms) | 765 | BIO * |
| 812 | { | 766 | cms_SignedData_init_bio(CMS_ContentInfo *cms) |
| 767 | { | ||
| 813 | int i; | 768 | int i; |
| 814 | CMS_SignedData *sd; | 769 | CMS_SignedData *sd; |
| 815 | BIO *chain = NULL; | 770 | BIO *chain = NULL; |
| 771 | |||
| 816 | sd = cms_get0_signed(cms); | 772 | sd = cms_get0_signed(cms); |
| 817 | if (!sd) | 773 | if (!sd) |
| 818 | return NULL; | 774 | return NULL; |
| 819 | if (cms->d.signedData->encapContentInfo->partial) | 775 | if (cms->d.signedData->encapContentInfo->partial) |
| 820 | cms_sd_set_version(sd); | 776 | cms_sd_set_version(sd); |
| 821 | for (i = 0; i < sk_X509_ALGOR_num(sd->digestAlgorithms); i++) | 777 | for (i = 0; i < sk_X509_ALGOR_num(sd->digestAlgorithms); i++) { |
| 822 | { | ||
| 823 | X509_ALGOR *digestAlgorithm; | 778 | X509_ALGOR *digestAlgorithm; |
| 824 | BIO *mdbio; | 779 | BIO *mdbio; |
| 825 | digestAlgorithm = sk_X509_ALGOR_value(sd->digestAlgorithms, i); | 780 | digestAlgorithm = sk_X509_ALGOR_value(sd->digestAlgorithms, i); |
| 826 | mdbio = cms_DigestAlgorithm_init_bio(digestAlgorithm); | 781 | mdbio = cms_DigestAlgorithm_init_bio(digestAlgorithm); |
| 827 | if (!mdbio) | 782 | if (!mdbio) |
| 828 | goto err; | 783 | goto err; |
| 829 | if (chain) | 784 | if (chain) |
| 830 | BIO_push(chain, mdbio); | 785 | BIO_push(chain, mdbio); |
| 831 | else | 786 | else |
| 832 | chain = mdbio; | 787 | chain = mdbio; |
| 833 | } | 788 | } |
| 834 | return chain; | 789 | return chain; |
| 835 | err: | 790 | |
| 791 | err: | ||
| 836 | if (chain) | 792 | if (chain) |
| 837 | BIO_free_all(chain); | 793 | BIO_free_all(chain); |
| 838 | return NULL; | 794 | return NULL; |
| 839 | } | 795 | } |
| 840 | 796 | ||
| 841 | int CMS_SignerInfo_verify_content(CMS_SignerInfo *si, BIO *chain) | 797 | int |
| 842 | { | 798 | CMS_SignerInfo_verify_content(CMS_SignerInfo *si, BIO *chain) |
| 799 | { | ||
| 843 | ASN1_OCTET_STRING *os = NULL; | 800 | ASN1_OCTET_STRING *os = NULL; |
| 844 | EVP_MD_CTX mctx; | 801 | EVP_MD_CTX mctx; |
| 845 | int r = -1; | 802 | int r = -1; |
| 803 | |||
| 846 | EVP_MD_CTX_init(&mctx); | 804 | EVP_MD_CTX_init(&mctx); |
| 847 | /* If we have any signed attributes look for messageDigest value */ | 805 | /* If we have any signed attributes look for messageDigest value */ |
| 848 | if (CMS_signed_get_attr_count(si) >= 0) | 806 | if (CMS_signed_get_attr_count(si) >= 0) { |
| 849 | { | ||
| 850 | os = CMS_signed_get0_data_by_OBJ(si, | 807 | os = CMS_signed_get0_data_by_OBJ(si, |
| 851 | OBJ_nid2obj(NID_pkcs9_messageDigest), | 808 | OBJ_nid2obj(NID_pkcs9_messageDigest), |
| 852 | -3, V_ASN1_OCTET_STRING); | 809 | -3, V_ASN1_OCTET_STRING); |
| 853 | if (!os) | 810 | if (!os) { |
| 854 | { | ||
| 855 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT, | 811 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT, |
| 856 | CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE); | 812 | CMS_R_ERROR_READING_MESSAGEDIGEST_ATTRIBUTE); |
| 857 | goto err; | 813 | goto err; |
| 858 | } | ||
| 859 | } | 814 | } |
| 815 | } | ||
| 860 | 816 | ||
| 861 | if (!cms_DigestAlgorithm_find_ctx(&mctx, chain, si->digestAlgorithm)) | 817 | if (!cms_DigestAlgorithm_find_ctx(&mctx, chain, si->digestAlgorithm)) |
| 862 | goto err; | 818 | goto err; |
| 863 | 819 | ||
| 864 | /* If messageDigest found compare it */ | 820 | /* If messageDigest found compare it */ |
| 865 | 821 | ||
| 866 | if (os) | 822 | if (os) { |
| 867 | { | ||
| 868 | unsigned char mval[EVP_MAX_MD_SIZE]; | 823 | unsigned char mval[EVP_MAX_MD_SIZE]; |
| 869 | unsigned int mlen; | 824 | unsigned int mlen; |
| 870 | if (EVP_DigestFinal_ex(&mctx, mval, &mlen) <= 0) | 825 | if (EVP_DigestFinal_ex(&mctx, mval, &mlen) <= 0) { |
| 871 | { | ||
| 872 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT, | 826 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT, |
| 873 | CMS_R_UNABLE_TO_FINALIZE_CONTEXT); | 827 | CMS_R_UNABLE_TO_FINALIZE_CONTEXT); |
| 874 | goto err; | 828 | goto err; |
| 875 | } | 829 | } |
| 876 | if (mlen != (unsigned int)os->length) | 830 | if (mlen != (unsigned int)os->length) { |
| 877 | { | ||
| 878 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT, | 831 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT, |
| 879 | CMS_R_MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH); | 832 | CMS_R_MESSAGEDIGEST_ATTRIBUTE_WRONG_LENGTH); |
| 880 | goto err; | 833 | goto err; |
| 881 | } | 834 | } |
| 882 | 835 | ||
| 883 | if (memcmp(mval, os->data, mlen)) | 836 | if (memcmp(mval, os->data, mlen)) { |
| 884 | { | ||
| 885 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT, | 837 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT, |
| 886 | CMS_R_VERIFICATION_FAILURE); | 838 | CMS_R_VERIFICATION_FAILURE); |
| 887 | r = 0; | 839 | r = 0; |
| 888 | } | 840 | } else |
| 889 | else | ||
| 890 | r = 1; | 841 | r = 1; |
| 891 | } | 842 | } else { |
| 892 | else | ||
| 893 | { | ||
| 894 | r = EVP_VerifyFinal(&mctx, si->signature->data, | 843 | r = EVP_VerifyFinal(&mctx, si->signature->data, |
| 895 | si->signature->length, si->pkey); | 844 | si->signature->length, si->pkey); |
| 896 | if (r <= 0) | 845 | if (r <= 0) { |
| 897 | { | ||
| 898 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT, | 846 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT, |
| 899 | CMS_R_VERIFICATION_FAILURE); | 847 | CMS_R_VERIFICATION_FAILURE); |
| 900 | r = 0; | 848 | r = 0; |
| 901 | } | ||
| 902 | } | 849 | } |
| 850 | } | ||
| 903 | 851 | ||
| 904 | err: | 852 | err: |
| 905 | EVP_MD_CTX_cleanup(&mctx); | 853 | EVP_MD_CTX_cleanup(&mctx); |
| 906 | return r; | 854 | return r; |
| 855 | } | ||
| 907 | 856 | ||
| 908 | } | 857 | int |
| 909 | 858 | CMS_add_smimecap(CMS_SignerInfo *si, STACK_OF(X509_ALGOR) *algs) | |
| 910 | int CMS_add_smimecap(CMS_SignerInfo *si, STACK_OF(X509_ALGOR) *algs) | 859 | { |
| 911 | { | ||
| 912 | unsigned char *smder = NULL; | 860 | unsigned char *smder = NULL; |
| 913 | int smderlen, r; | 861 | int smderlen, r; |
| 862 | |||
| 914 | smderlen = i2d_X509_ALGORS(algs, &smder); | 863 | smderlen = i2d_X509_ALGORS(algs, &smder); |
| 915 | if (smderlen <= 0) | 864 | if (smderlen <= 0) |
| 916 | return 0; | 865 | return 0; |
| 917 | r = CMS_signed_add1_attr_by_NID(si, NID_SMIMECapabilities, | 866 | r = CMS_signed_add1_attr_by_NID(si, NID_SMIMECapabilities, |
| 918 | V_ASN1_SEQUENCE, smder, smderlen); | 867 | V_ASN1_SEQUENCE, smder, smderlen); |
| 919 | free(smder); | 868 | free(smder); |
| 920 | return r; | 869 | return r; |
| 921 | } | 870 | } |
| 922 | 871 | ||
| 923 | int CMS_add_simple_smimecap(STACK_OF(X509_ALGOR) **algs, | 872 | int |
| 924 | int algnid, int keysize) | 873 | CMS_add_simple_smimecap(STACK_OF(X509_ALGOR) **algs, int algnid, int keysize) |
| 925 | { | 874 | { |
| 926 | X509_ALGOR *alg; | 875 | X509_ALGOR *alg; |
| 927 | ASN1_INTEGER *key = NULL; | 876 | ASN1_INTEGER *key = NULL; |
| 928 | if (keysize > 0) | 877 | |
| 929 | { | 878 | if (keysize > 0) { |
| 930 | key = ASN1_INTEGER_new(); | 879 | key = ASN1_INTEGER_new(); |
| 931 | if (!key || !ASN1_INTEGER_set(key, keysize)) | 880 | if (!key || !ASN1_INTEGER_set(key, keysize)) |
| 932 | return 0; | 881 | return 0; |
| 933 | } | 882 | } |
| 934 | alg = X509_ALGOR_new(); | 883 | alg = X509_ALGOR_new(); |
| 935 | if (!alg) | 884 | if (!alg) { |
| 936 | { | ||
| 937 | if (key) | 885 | if (key) |
| 938 | ASN1_INTEGER_free(key); | 886 | ASN1_INTEGER_free(key); |
| 939 | return 0; | 887 | return 0; |
| 940 | } | 888 | } |
| 941 | 889 | ||
| 942 | X509_ALGOR_set0(alg, OBJ_nid2obj(algnid), | 890 | X509_ALGOR_set0(alg, OBJ_nid2obj(algnid), |
| 943 | key ? V_ASN1_INTEGER : V_ASN1_UNDEF, key); | 891 | key ? V_ASN1_INTEGER : V_ASN1_UNDEF, key); |
| 944 | if (!*algs) | 892 | if (!*algs) |
| 945 | *algs = sk_X509_ALGOR_new_null(); | 893 | *algs = sk_X509_ALGOR_new_null(); |
| 946 | if (!*algs || !sk_X509_ALGOR_push(*algs, alg)) | 894 | if (!*algs || !sk_X509_ALGOR_push(*algs, alg)) { |
| 947 | { | ||
| 948 | X509_ALGOR_free(alg); | 895 | X509_ALGOR_free(alg); |
| 949 | return 0; | 896 | return 0; |
| 950 | } | ||
| 951 | return 1; | ||
| 952 | } | 897 | } |
| 898 | return 1; | ||
| 899 | } | ||
| 953 | 900 | ||
| 954 | /* Check to see if a cipher exists and if so add S/MIME capabilities */ | 901 | /* Check to see if a cipher exists and if so add S/MIME capabilities */ |
| 955 | 902 | ||
| 956 | static int cms_add_cipher_smcap(STACK_OF(X509_ALGOR) **sk, int nid, int arg) | 903 | static int |
| 957 | { | 904 | cms_add_cipher_smcap(STACK_OF(X509_ALGOR) **sk, int nid, int arg) |
| 905 | { | ||
| 958 | if (EVP_get_cipherbynid(nid)) | 906 | if (EVP_get_cipherbynid(nid)) |
| 959 | return CMS_add_simple_smimecap(sk, nid, arg); | 907 | return CMS_add_simple_smimecap(sk, nid, arg); |
| 960 | return 1; | 908 | return 1; |
| 961 | } | 909 | } |
| 962 | 910 | ||
| 963 | static int cms_add_digest_smcap(STACK_OF(X509_ALGOR) **sk, int nid, int arg) | 911 | static int |
| 964 | { | 912 | cms_add_digest_smcap(STACK_OF(X509_ALGOR) **sk, int nid, int arg) |
| 913 | { | ||
| 965 | if (EVP_get_digestbynid(nid)) | 914 | if (EVP_get_digestbynid(nid)) |
| 966 | return CMS_add_simple_smimecap(sk, nid, arg); | 915 | return CMS_add_simple_smimecap(sk, nid, arg); |
| 967 | return 1; | 916 | return 1; |
| 968 | } | 917 | } |
| 969 | 918 | ||
| 970 | int CMS_add_standard_smimecap(STACK_OF(X509_ALGOR) **smcap) | 919 | int |
| 971 | { | 920 | CMS_add_standard_smimecap(STACK_OF(X509_ALGOR) **smcap) |
| 972 | if (!cms_add_cipher_smcap(smcap, NID_aes_256_cbc, -1) | 921 | { |
| 973 | || !cms_add_digest_smcap(smcap, NID_id_GostR3411_94, -1) | 922 | if (!cms_add_cipher_smcap(smcap, NID_aes_256_cbc, -1) || |
| 974 | || !cms_add_cipher_smcap(smcap, NID_id_Gost28147_89, -1) | 923 | !cms_add_digest_smcap(smcap, NID_id_GostR3411_94, -1) || |
| 975 | || !cms_add_cipher_smcap(smcap, NID_aes_192_cbc, -1) | 924 | !cms_add_cipher_smcap(smcap, NID_id_Gost28147_89, -1) || |
| 976 | || !cms_add_cipher_smcap(smcap, NID_aes_128_cbc, -1) | 925 | !cms_add_cipher_smcap(smcap, NID_aes_192_cbc, -1) || |
| 977 | || !cms_add_cipher_smcap(smcap, NID_des_ede3_cbc, -1) | 926 | !cms_add_cipher_smcap(smcap, NID_aes_128_cbc, -1) || |
| 978 | || !cms_add_cipher_smcap(smcap, NID_rc2_cbc, 128) | 927 | !cms_add_cipher_smcap(smcap, NID_des_ede3_cbc, -1) || |
| 979 | || !cms_add_cipher_smcap(smcap, NID_rc2_cbc, 64) | 928 | !cms_add_cipher_smcap(smcap, NID_rc2_cbc, 128) || |
| 980 | || !cms_add_cipher_smcap(smcap, NID_des_cbc, -1) | 929 | !cms_add_cipher_smcap(smcap, NID_rc2_cbc, 64) || |
| 981 | || !cms_add_cipher_smcap(smcap, NID_rc2_cbc, 40)) | 930 | !cms_add_cipher_smcap(smcap, NID_des_cbc, -1) || |
| 931 | !cms_add_cipher_smcap(smcap, NID_rc2_cbc, 40)) | ||
| 982 | return 0; | 932 | return 0; |
| 983 | return 1; | 933 | return 1; |
| 984 | } | 934 | } |
diff --git a/src/lib/libcrypto/cms/cms_smime.c b/src/lib/libcrypto/cms/cms_smime.c index 94f60c1b5c..e32a58b3bc 100644 --- a/src/lib/libcrypto/cms/cms_smime.c +++ b/src/lib/libcrypto/cms/cms_smime.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | * are met: | 10 | * are met: |
| 11 | * | 11 | * |
| 12 | * 1. Redistributions of source code must retain the above copyright | 12 | * 1. Redistributions of source code must retain the above copyright |
| 13 | * notice, this list of conditions and the following disclaimer. | 13 | * notice, this list of conditions and the following disclaimer. |
| 14 | * | 14 | * |
| 15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright |
| 16 | * notice, this list of conditions and the following disclaimer in | 16 | * notice, this list of conditions and the following disclaimer in |
| @@ -59,114 +59,107 @@ | |||
| 59 | #include <openssl/cms.h> | 59 | #include <openssl/cms.h> |
| 60 | #include "cms_lcl.h" | 60 | #include "cms_lcl.h" |
| 61 | 61 | ||
| 62 | static int cms_copy_content(BIO *out, BIO *in, unsigned int flags) | 62 | static int |
| 63 | { | 63 | cms_copy_content(BIO *out, BIO *in, unsigned int flags) |
| 64 | { | ||
| 64 | unsigned char buf[4096]; | 65 | unsigned char buf[4096]; |
| 65 | int r = 0, i; | 66 | int r = 0, i; |
| 66 | BIO *tmpout = NULL; | 67 | BIO *tmpout = NULL; |
| 67 | 68 | ||
| 68 | if (out == NULL) | 69 | if (out == NULL) |
| 69 | tmpout = BIO_new(BIO_s_null()); | 70 | tmpout = BIO_new(BIO_s_null()); |
| 70 | else if (flags & CMS_TEXT) | 71 | else if (flags & CMS_TEXT) { |
| 71 | { | ||
| 72 | tmpout = BIO_new(BIO_s_mem()); | 72 | tmpout = BIO_new(BIO_s_mem()); |
| 73 | BIO_set_mem_eof_return(tmpout, 0); | 73 | BIO_set_mem_eof_return(tmpout, 0); |
| 74 | } | 74 | } else |
| 75 | else | ||
| 76 | tmpout = out; | 75 | tmpout = out; |
| 77 | 76 | ||
| 78 | if(!tmpout) | 77 | if (!tmpout) { |
| 79 | { | 78 | CMSerr(CMS_F_CMS_COPY_CONTENT, ERR_R_MALLOC_FAILURE); |
| 80 | CMSerr(CMS_F_CMS_COPY_CONTENT,ERR_R_MALLOC_FAILURE); | ||
| 81 | goto err; | 79 | goto err; |
| 82 | } | 80 | } |
| 83 | 81 | ||
| 84 | /* Read all content through chain to process digest, decrypt etc */ | 82 | /* Read all content through chain to process digest, decrypt etc */ |
| 85 | for (;;) | 83 | for (;;) { |
| 86 | { | 84 | i = BIO_read(in, buf, sizeof(buf)); |
| 87 | i=BIO_read(in,buf,sizeof(buf)); | 85 | if (i <= 0) { |
| 88 | if (i <= 0) | 86 | if (BIO_method_type(in) == BIO_TYPE_CIPHER) { |
| 89 | { | ||
| 90 | if (BIO_method_type(in) == BIO_TYPE_CIPHER) | ||
| 91 | { | ||
| 92 | if (!BIO_get_cipher_status(in)) | 87 | if (!BIO_get_cipher_status(in)) |
| 93 | goto err; | 88 | goto err; |
| 94 | } | 89 | } |
| 95 | if (i < 0) | 90 | if (i < 0) |
| 96 | goto err; | 91 | goto err; |
| 97 | break; | 92 | break; |
| 98 | } | 93 | } |
| 99 | 94 | ||
| 100 | if (tmpout && (BIO_write(tmpout, buf, i) != i)) | 95 | if (tmpout && (BIO_write(tmpout, buf, i) != i)) |
| 101 | goto err; | 96 | goto err; |
| 102 | } | 97 | } |
| 103 | 98 | ||
| 104 | if(flags & CMS_TEXT) | 99 | if (flags & CMS_TEXT) { |
| 105 | { | 100 | if (!SMIME_text(tmpout, out)) { |
| 106 | if(!SMIME_text(tmpout, out)) | 101 | CMSerr(CMS_F_CMS_COPY_CONTENT, CMS_R_SMIME_TEXT_ERROR); |
| 107 | { | ||
| 108 | CMSerr(CMS_F_CMS_COPY_CONTENT,CMS_R_SMIME_TEXT_ERROR); | ||
| 109 | goto err; | 102 | goto err; |
| 110 | } | ||
| 111 | } | 103 | } |
| 104 | } | ||
| 112 | 105 | ||
| 113 | r = 1; | 106 | r = 1; |
| 114 | 107 | ||
| 115 | err: | 108 | err: |
| 116 | if (tmpout && (tmpout != out)) | 109 | if (tmpout && (tmpout != out)) |
| 117 | BIO_free(tmpout); | 110 | BIO_free(tmpout); |
| 118 | return r; | 111 | return r; |
| 112 | } | ||
| 119 | 113 | ||
| 120 | } | 114 | static int |
| 121 | 115 | check_content(CMS_ContentInfo *cms) | |
| 122 | static int check_content(CMS_ContentInfo *cms) | 116 | { |
| 123 | { | ||
| 124 | ASN1_OCTET_STRING **pos = CMS_get0_content(cms); | 117 | ASN1_OCTET_STRING **pos = CMS_get0_content(cms); |
| 125 | if (!pos || !*pos) | 118 | |
| 126 | { | 119 | if (!pos || !*pos) { |
| 127 | CMSerr(CMS_F_CHECK_CONTENT, CMS_R_NO_CONTENT); | 120 | CMSerr(CMS_F_CHECK_CONTENT, CMS_R_NO_CONTENT); |
| 128 | return 0; | 121 | return 0; |
| 129 | } | ||
| 130 | return 1; | ||
| 131 | } | 122 | } |
| 123 | return 1; | ||
| 124 | } | ||
| 132 | 125 | ||
| 133 | static void do_free_upto(BIO *f, BIO *upto) | 126 | static void |
| 134 | { | 127 | do_free_upto(BIO *f, BIO *upto) |
| 135 | if (upto) | 128 | { |
| 136 | { | 129 | if (upto) { |
| 137 | BIO *tbio; | 130 | BIO *tbio; |
| 138 | do | 131 | do { |
| 139 | { | ||
| 140 | tbio = BIO_pop(f); | 132 | tbio = BIO_pop(f); |
| 141 | BIO_free(f); | 133 | BIO_free(f); |
| 142 | f = tbio; | 134 | f = tbio; |
| 143 | } | 135 | } while (f != upto); |
| 144 | while (f != upto); | 136 | } else |
| 145 | } | ||
| 146 | else | ||
| 147 | BIO_free_all(f); | 137 | BIO_free_all(f); |
| 148 | } | 138 | } |
| 149 | 139 | ||
| 150 | int CMS_data(CMS_ContentInfo *cms, BIO *out, unsigned int flags) | 140 | int |
| 151 | { | 141 | CMS_data(CMS_ContentInfo *cms, BIO *out, unsigned int flags) |
| 142 | { | ||
| 152 | BIO *cont; | 143 | BIO *cont; |
| 153 | int r; | 144 | int r; |
| 154 | if (OBJ_obj2nid(CMS_get0_type(cms)) != NID_pkcs7_data) | 145 | |
| 155 | { | 146 | if (OBJ_obj2nid(CMS_get0_type(cms)) != NID_pkcs7_data) { |
| 156 | CMSerr(CMS_F_CMS_DATA, CMS_R_TYPE_NOT_DATA); | 147 | CMSerr(CMS_F_CMS_DATA, CMS_R_TYPE_NOT_DATA); |
| 157 | return 0; | 148 | return 0; |
| 158 | } | 149 | } |
| 159 | cont = CMS_dataInit(cms, NULL); | 150 | cont = CMS_dataInit(cms, NULL); |
| 160 | if (!cont) | 151 | if (!cont) |
| 161 | return 0; | 152 | return 0; |
| 162 | r = cms_copy_content(out, cont, flags); | 153 | r = cms_copy_content(out, cont, flags); |
| 163 | BIO_free_all(cont); | 154 | BIO_free_all(cont); |
| 164 | return r; | 155 | return r; |
| 165 | } | 156 | } |
| 166 | 157 | ||
| 167 | CMS_ContentInfo *CMS_data_create(BIO *in, unsigned int flags) | 158 | CMS_ContentInfo * |
| 168 | { | 159 | CMS_data_create(BIO *in, unsigned int flags) |
| 160 | { | ||
| 169 | CMS_ContentInfo *cms; | 161 | CMS_ContentInfo *cms; |
| 162 | |||
| 170 | cms = cms_Data_create(); | 163 | cms = cms_Data_create(); |
| 171 | if (!cms) | 164 | if (!cms) |
| 172 | return NULL; | 165 | return NULL; |
| @@ -177,18 +170,19 @@ CMS_ContentInfo *CMS_data_create(BIO *in, unsigned int flags) | |||
| 177 | CMS_ContentInfo_free(cms); | 170 | CMS_ContentInfo_free(cms); |
| 178 | 171 | ||
| 179 | return NULL; | 172 | return NULL; |
| 180 | } | 173 | } |
| 181 | 174 | ||
| 182 | int CMS_digest_verify(CMS_ContentInfo *cms, BIO *dcont, BIO *out, | 175 | int |
| 183 | unsigned int flags) | 176 | CMS_digest_verify(CMS_ContentInfo *cms, BIO *dcont, BIO *out, |
| 184 | { | 177 | unsigned int flags) |
| 178 | { | ||
| 185 | BIO *cont; | 179 | BIO *cont; |
| 186 | int r; | 180 | int r; |
| 187 | if (OBJ_obj2nid(CMS_get0_type(cms)) != NID_pkcs7_digest) | 181 | |
| 188 | { | 182 | if (OBJ_obj2nid(CMS_get0_type(cms)) != NID_pkcs7_digest) { |
| 189 | CMSerr(CMS_F_CMS_DIGEST_VERIFY, CMS_R_TYPE_NOT_DIGESTED_DATA); | 183 | CMSerr(CMS_F_CMS_DIGEST_VERIFY, CMS_R_TYPE_NOT_DIGESTED_DATA); |
| 190 | return 0; | 184 | return 0; |
| 191 | } | 185 | } |
| 192 | 186 | ||
| 193 | if (!dcont && !check_content(cms)) | 187 | if (!dcont && !check_content(cms)) |
| 194 | return 0; | 188 | return 0; |
| @@ -201,19 +195,20 @@ int CMS_digest_verify(CMS_ContentInfo *cms, BIO *dcont, BIO *out, | |||
| 201 | r = cms_DigestedData_do_final(cms, cont, 1); | 195 | r = cms_DigestedData_do_final(cms, cont, 1); |
| 202 | do_free_upto(cont, dcont); | 196 | do_free_upto(cont, dcont); |
| 203 | return r; | 197 | return r; |
| 204 | } | 198 | } |
| 205 | 199 | ||
| 206 | CMS_ContentInfo *CMS_digest_create(BIO *in, const EVP_MD *md, | 200 | CMS_ContentInfo * |
| 207 | unsigned int flags) | 201 | CMS_digest_create(BIO *in, const EVP_MD *md, unsigned int flags) |
| 208 | { | 202 | { |
| 209 | CMS_ContentInfo *cms; | 203 | CMS_ContentInfo *cms; |
| 204 | |||
| 210 | if (!md) | 205 | if (!md) |
| 211 | md = EVP_sha1(); | 206 | md = EVP_sha1(); |
| 212 | cms = cms_DigestedData_create(md); | 207 | cms = cms_DigestedData_create(md); |
| 213 | if (!cms) | 208 | if (!cms) |
| 214 | return NULL; | 209 | return NULL; |
| 215 | 210 | ||
| 216 | if(!(flags & CMS_DETACHED)) | 211 | if (!(flags & CMS_DETACHED)) |
| 217 | CMS_set_detached(cms, 0); | 212 | CMS_set_detached(cms, 0); |
| 218 | 213 | ||
| 219 | if ((flags & CMS_STREAM) || CMS_final(cms, in, NULL, flags)) | 214 | if ((flags & CMS_STREAM) || CMS_final(cms, in, NULL, flags)) |
| @@ -221,20 +216,20 @@ CMS_ContentInfo *CMS_digest_create(BIO *in, const EVP_MD *md, | |||
| 221 | 216 | ||
| 222 | CMS_ContentInfo_free(cms); | 217 | CMS_ContentInfo_free(cms); |
| 223 | return NULL; | 218 | return NULL; |
| 224 | } | 219 | } |
| 225 | 220 | ||
| 226 | int CMS_EncryptedData_decrypt(CMS_ContentInfo *cms, | 221 | int |
| 227 | const unsigned char *key, size_t keylen, | 222 | CMS_EncryptedData_decrypt(CMS_ContentInfo *cms, const unsigned char *key, |
| 228 | BIO *dcont, BIO *out, unsigned int flags) | 223 | size_t keylen, BIO *dcont, BIO *out, unsigned int flags) |
| 229 | { | 224 | { |
| 230 | BIO *cont; | 225 | BIO *cont; |
| 231 | int r; | 226 | int r; |
| 232 | if (OBJ_obj2nid(CMS_get0_type(cms)) != NID_pkcs7_encrypted) | 227 | |
| 233 | { | 228 | if (OBJ_obj2nid(CMS_get0_type(cms)) != NID_pkcs7_encrypted) { |
| 234 | CMSerr(CMS_F_CMS_ENCRYPTEDDATA_DECRYPT, | 229 | CMSerr(CMS_F_CMS_ENCRYPTEDDATA_DECRYPT, |
| 235 | CMS_R_TYPE_NOT_ENCRYPTED_DATA); | 230 | CMS_R_TYPE_NOT_ENCRYPTED_DATA); |
| 236 | return 0; | 231 | return 0; |
| 237 | } | 232 | } |
| 238 | 233 | ||
| 239 | if (!dcont && !check_content(cms)) | 234 | if (!dcont && !check_content(cms)) |
| 240 | return 0; | 235 | return 0; |
| @@ -247,75 +242,73 @@ int CMS_EncryptedData_decrypt(CMS_ContentInfo *cms, | |||
| 247 | r = cms_copy_content(out, cont, flags); | 242 | r = cms_copy_content(out, cont, flags); |
| 248 | do_free_upto(cont, dcont); | 243 | do_free_upto(cont, dcont); |
| 249 | return r; | 244 | return r; |
| 250 | } | 245 | } |
| 251 | 246 | ||
| 252 | CMS_ContentInfo *CMS_EncryptedData_encrypt(BIO *in, const EVP_CIPHER *cipher, | 247 | CMS_ContentInfo * |
| 253 | const unsigned char *key, size_t keylen, | 248 | CMS_EncryptedData_encrypt(BIO *in, const EVP_CIPHER *cipher, |
| 254 | unsigned int flags) | 249 | const unsigned char *key, size_t keylen, unsigned int flags) |
| 255 | { | 250 | { |
| 256 | CMS_ContentInfo *cms; | 251 | CMS_ContentInfo *cms; |
| 257 | if (!cipher) | 252 | |
| 258 | { | 253 | if (!cipher) { |
| 259 | CMSerr(CMS_F_CMS_ENCRYPTEDDATA_ENCRYPT, CMS_R_NO_CIPHER); | 254 | CMSerr(CMS_F_CMS_ENCRYPTEDDATA_ENCRYPT, CMS_R_NO_CIPHER); |
| 260 | return NULL; | 255 | return NULL; |
| 261 | } | 256 | } |
| 262 | cms = CMS_ContentInfo_new(); | 257 | cms = CMS_ContentInfo_new(); |
| 263 | if (!cms) | 258 | if (!cms) |
| 264 | return NULL; | 259 | return NULL; |
| 265 | if (!CMS_EncryptedData_set1_key(cms, cipher, key, keylen)) | 260 | if (!CMS_EncryptedData_set1_key(cms, cipher, key, keylen)) |
| 266 | return NULL; | 261 | return NULL; |
| 267 | 262 | ||
| 268 | if(!(flags & CMS_DETACHED)) | 263 | if (!(flags & CMS_DETACHED)) |
| 269 | CMS_set_detached(cms, 0); | 264 | CMS_set_detached(cms, 0); |
| 270 | 265 | ||
| 271 | if ((flags & (CMS_STREAM|CMS_PARTIAL)) | 266 | if ((flags & (CMS_STREAM|CMS_PARTIAL)) || |
| 272 | || CMS_final(cms, in, NULL, flags)) | 267 | CMS_final(cms, in, NULL, flags)) |
| 273 | return cms; | 268 | return cms; |
| 274 | 269 | ||
| 275 | CMS_ContentInfo_free(cms); | 270 | CMS_ContentInfo_free(cms); |
| 276 | return NULL; | 271 | return NULL; |
| 277 | } | 272 | } |
| 278 | 273 | ||
| 279 | static int cms_signerinfo_verify_cert(CMS_SignerInfo *si, | 274 | static int |
| 280 | X509_STORE *store, | 275 | cms_signerinfo_verify_cert(CMS_SignerInfo *si, X509_STORE *store, |
| 281 | STACK_OF(X509) *certs, | 276 | STACK_OF(X509) *certs, STACK_OF(X509_CRL) *crls, unsigned int flags) |
| 282 | STACK_OF(X509_CRL) *crls, | 277 | { |
| 283 | unsigned int flags) | ||
| 284 | { | ||
| 285 | X509_STORE_CTX ctx; | 278 | X509_STORE_CTX ctx; |
| 286 | X509 *signer; | 279 | X509 *signer; |
| 287 | int i, j, r = 0; | 280 | int i, j, r = 0; |
| 281 | |||
| 288 | CMS_SignerInfo_get0_algs(si, NULL, &signer, NULL, NULL); | 282 | CMS_SignerInfo_get0_algs(si, NULL, &signer, NULL, NULL); |
| 289 | if (!X509_STORE_CTX_init(&ctx, store, signer, certs)) | 283 | if (!X509_STORE_CTX_init(&ctx, store, signer, certs)) { |
| 290 | { | ||
| 291 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY_CERT, | 284 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY_CERT, |
| 292 | CMS_R_STORE_INIT_ERROR); | 285 | CMS_R_STORE_INIT_ERROR); |
| 293 | goto err; | 286 | goto err; |
| 294 | } | 287 | } |
| 295 | X509_STORE_CTX_set_default(&ctx, "smime_sign"); | 288 | X509_STORE_CTX_set_default(&ctx, "smime_sign"); |
| 296 | if (crls) | 289 | if (crls) |
| 297 | X509_STORE_CTX_set0_crls(&ctx, crls); | 290 | X509_STORE_CTX_set0_crls(&ctx, crls); |
| 298 | 291 | ||
| 299 | i = X509_verify_cert(&ctx); | 292 | i = X509_verify_cert(&ctx); |
| 300 | if (i <= 0) | 293 | if (i <= 0) { |
| 301 | { | ||
| 302 | j = X509_STORE_CTX_get_error(&ctx); | 294 | j = X509_STORE_CTX_get_error(&ctx); |
| 303 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY_CERT, | 295 | CMSerr(CMS_F_CMS_SIGNERINFO_VERIFY_CERT, |
| 304 | CMS_R_CERTIFICATE_VERIFY_ERROR); | 296 | CMS_R_CERTIFICATE_VERIFY_ERROR); |
| 305 | ERR_asprintf_error_data("Verify error:%s", | 297 | ERR_asprintf_error_data("Verify error:%s", |
| 306 | X509_verify_cert_error_string(j)); | 298 | X509_verify_cert_error_string(j)); |
| 307 | goto err; | 299 | goto err; |
| 308 | } | 300 | } |
| 309 | r = 1; | 301 | r = 1; |
| 310 | err: | 302 | |
| 303 | err: | ||
| 311 | X509_STORE_CTX_cleanup(&ctx); | 304 | X509_STORE_CTX_cleanup(&ctx); |
| 312 | return r; | 305 | return r; |
| 306 | } | ||
| 313 | 307 | ||
| 314 | } | 308 | int |
| 315 | 309 | CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs, X509_STORE *store, | |
| 316 | int CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs, | 310 | BIO *dcont, BIO *out, unsigned int flags) |
| 317 | X509_STORE *store, BIO *dcont, BIO *out, unsigned int flags) | 311 | { |
| 318 | { | ||
| 319 | CMS_SignerInfo *si; | 312 | CMS_SignerInfo *si; |
| 320 | STACK_OF(CMS_SignerInfo) *sinfos; | 313 | STACK_OF(CMS_SignerInfo) *sinfos; |
| 321 | STACK_OF(X509) *cms_certs = NULL; | 314 | STACK_OF(X509) *cms_certs = NULL; |
| @@ -331,58 +324,51 @@ int CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs, | |||
| 331 | 324 | ||
| 332 | sinfos = CMS_get0_SignerInfos(cms); | 325 | sinfos = CMS_get0_SignerInfos(cms); |
| 333 | 326 | ||
| 334 | if (sk_CMS_SignerInfo_num(sinfos) <= 0) | 327 | if (sk_CMS_SignerInfo_num(sinfos) <= 0) { |
| 335 | { | ||
| 336 | CMSerr(CMS_F_CMS_VERIFY, CMS_R_NO_SIGNERS); | 328 | CMSerr(CMS_F_CMS_VERIFY, CMS_R_NO_SIGNERS); |
| 337 | goto err; | 329 | goto err; |
| 338 | } | 330 | } |
| 339 | 331 | ||
| 340 | for (i = 0; i < sk_CMS_SignerInfo_num(sinfos); i++) | 332 | for (i = 0; i < sk_CMS_SignerInfo_num(sinfos); i++) { |
| 341 | { | ||
| 342 | si = sk_CMS_SignerInfo_value(sinfos, i); | 333 | si = sk_CMS_SignerInfo_value(sinfos, i); |
| 343 | CMS_SignerInfo_get0_algs(si, NULL, &signer, NULL, NULL); | 334 | CMS_SignerInfo_get0_algs(si, NULL, &signer, NULL, NULL); |
| 344 | if (signer) | 335 | if (signer) |
| 345 | scount++; | 336 | scount++; |
| 346 | } | 337 | } |
| 347 | 338 | ||
| 348 | if (scount != sk_CMS_SignerInfo_num(sinfos)) | 339 | if (scount != sk_CMS_SignerInfo_num(sinfos)) |
| 349 | scount += CMS_set1_signers_certs(cms, certs, flags); | 340 | scount += CMS_set1_signers_certs(cms, certs, flags); |
| 350 | 341 | ||
| 351 | if (scount != sk_CMS_SignerInfo_num(sinfos)) | 342 | if (scount != sk_CMS_SignerInfo_num(sinfos)) { |
| 352 | { | ||
| 353 | CMSerr(CMS_F_CMS_VERIFY, CMS_R_SIGNER_CERTIFICATE_NOT_FOUND); | 343 | CMSerr(CMS_F_CMS_VERIFY, CMS_R_SIGNER_CERTIFICATE_NOT_FOUND); |
| 354 | goto err; | 344 | goto err; |
| 355 | } | 345 | } |
| 356 | 346 | ||
| 357 | /* Attempt to verify all signers certs */ | 347 | /* Attempt to verify all signers certs */ |
| 358 | 348 | ||
| 359 | if (!(flags & CMS_NO_SIGNER_CERT_VERIFY)) | 349 | if (!(flags & CMS_NO_SIGNER_CERT_VERIFY)) { |
| 360 | { | ||
| 361 | cms_certs = CMS_get1_certs(cms); | 350 | cms_certs = CMS_get1_certs(cms); |
| 362 | if (!(flags & CMS_NOCRL)) | 351 | if (!(flags & CMS_NOCRL)) |
| 363 | crls = CMS_get1_crls(cms); | 352 | crls = CMS_get1_crls(cms); |
| 364 | for (i = 0; i < sk_CMS_SignerInfo_num(sinfos); i++) | 353 | for (i = 0; i < sk_CMS_SignerInfo_num(sinfos); i++) { |
| 365 | { | ||
| 366 | si = sk_CMS_SignerInfo_value(sinfos, i); | 354 | si = sk_CMS_SignerInfo_value(sinfos, i); |
| 367 | if (!cms_signerinfo_verify_cert(si, store, | 355 | if (!cms_signerinfo_verify_cert(si, store, |
| 368 | cms_certs, crls, flags)) | 356 | cms_certs, crls, flags)) |
| 369 | goto err; | 357 | goto err; |
| 370 | } | ||
| 371 | } | 358 | } |
| 359 | } | ||
| 372 | 360 | ||
| 373 | /* Attempt to verify all SignerInfo signed attribute signatures */ | 361 | /* Attempt to verify all SignerInfo signed attribute signatures */ |
| 374 | 362 | ||
| 375 | if (!(flags & CMS_NO_ATTR_VERIFY)) | 363 | if (!(flags & CMS_NO_ATTR_VERIFY)) { |
| 376 | { | 364 | for (i = 0; i < sk_CMS_SignerInfo_num(sinfos); i++) { |
| 377 | for (i = 0; i < sk_CMS_SignerInfo_num(sinfos); i++) | ||
| 378 | { | ||
| 379 | si = sk_CMS_SignerInfo_value(sinfos, i); | 365 | si = sk_CMS_SignerInfo_value(sinfos, i); |
| 380 | if (CMS_signed_get_attr_count(si) < 0) | 366 | if (CMS_signed_get_attr_count(si) < 0) |
| 381 | continue; | 367 | continue; |
| 382 | if (CMS_SignerInfo_verify(si) <= 0) | 368 | if (CMS_SignerInfo_verify(si) <= 0) |
| 383 | goto err; | 369 | goto err; |
| 384 | } | ||
| 385 | } | 370 | } |
| 371 | } | ||
| 386 | 372 | ||
| 387 | /* Performance optimization: if the content is a memory BIO then | 373 | /* Performance optimization: if the content is a memory BIO then |
| 388 | * store its contents in a temporary read only memory BIO. This | 374 | * store its contents in a temporary read only memory BIO. This |
| @@ -391,47 +377,40 @@ int CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs, | |||
| 391 | * are calculated. | 377 | * are calculated. |
| 392 | */ | 378 | */ |
| 393 | 379 | ||
| 394 | if (dcont && (BIO_method_type(dcont) == BIO_TYPE_MEM)) | 380 | if (dcont && (BIO_method_type(dcont) == BIO_TYPE_MEM)) { |
| 395 | { | ||
| 396 | char *ptr; | 381 | char *ptr; |
| 397 | long len; | 382 | long len; |
| 398 | len = BIO_get_mem_data(dcont, &ptr); | 383 | len = BIO_get_mem_data(dcont, &ptr); |
| 399 | tmpin = BIO_new_mem_buf(ptr, len); | 384 | tmpin = BIO_new_mem_buf(ptr, len); |
| 400 | if (tmpin == NULL) | 385 | if (tmpin == NULL) { |
| 401 | { | 386 | CMSerr(CMS_F_CMS_VERIFY, ERR_R_MALLOC_FAILURE); |
| 402 | CMSerr(CMS_F_CMS_VERIFY,ERR_R_MALLOC_FAILURE); | ||
| 403 | return 0; | 387 | return 0; |
| 404 | } | ||
| 405 | } | 388 | } |
| 406 | else | 389 | } else |
| 407 | tmpin = dcont; | 390 | tmpin = dcont; |
| 408 | |||
| 409 | 391 | ||
| 410 | cmsbio=CMS_dataInit(cms, tmpin); | 392 | |
| 393 | cmsbio = CMS_dataInit(cms, tmpin); | ||
| 411 | if (!cmsbio) | 394 | if (!cmsbio) |
| 412 | goto err; | 395 | goto err; |
| 413 | 396 | ||
| 414 | if (!cms_copy_content(out, cmsbio, flags)) | 397 | if (!cms_copy_content(out, cmsbio, flags)) |
| 415 | goto err; | 398 | goto err; |
| 416 | 399 | ||
| 417 | if (!(flags & CMS_NO_CONTENT_VERIFY)) | 400 | if (!(flags & CMS_NO_CONTENT_VERIFY)) { |
| 418 | { | 401 | for (i = 0; i < sk_CMS_SignerInfo_num(sinfos); i++) { |
| 419 | for (i = 0; i < sk_CMS_SignerInfo_num(sinfos); i++) | ||
| 420 | { | ||
| 421 | si = sk_CMS_SignerInfo_value(sinfos, i); | 402 | si = sk_CMS_SignerInfo_value(sinfos, i); |
| 422 | if (CMS_SignerInfo_verify_content(si, cmsbio) <= 0) | 403 | if (CMS_SignerInfo_verify_content(si, cmsbio) <= 0) { |
| 423 | { | ||
| 424 | CMSerr(CMS_F_CMS_VERIFY, | 404 | CMSerr(CMS_F_CMS_VERIFY, |
| 425 | CMS_R_CONTENT_VERIFY_ERROR); | 405 | CMS_R_CONTENT_VERIFY_ERROR); |
| 426 | goto err; | 406 | goto err; |
| 427 | } | ||
| 428 | } | 407 | } |
| 429 | } | 408 | } |
| 409 | } | ||
| 430 | 410 | ||
| 431 | ret = 1; | 411 | ret = 1; |
| 432 | 412 | ||
| 433 | err: | 413 | err: |
| 434 | |||
| 435 | if (dcont && (tmpin == dcont)) | 414 | if (dcont && (tmpin == dcont)) |
| 436 | do_free_upto(cmsbio, dcont); | 415 | do_free_upto(cmsbio, dcont); |
| 437 | else | 416 | else |
| @@ -443,23 +422,25 @@ int CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs, | |||
| 443 | sk_X509_CRL_pop_free(crls, X509_CRL_free); | 422 | sk_X509_CRL_pop_free(crls, X509_CRL_free); |
| 444 | 423 | ||
| 445 | return ret; | 424 | return ret; |
| 446 | } | 425 | } |
| 447 | 426 | ||
| 448 | int CMS_verify_receipt(CMS_ContentInfo *rcms, CMS_ContentInfo *ocms, | 427 | int |
| 449 | STACK_OF(X509) *certs, | 428 | CMS_verify_receipt(CMS_ContentInfo *rcms, CMS_ContentInfo *ocms, |
| 450 | X509_STORE *store, unsigned int flags) | 429 | STACK_OF(X509) *certs, X509_STORE *store, unsigned int flags) |
| 451 | { | 430 | { |
| 452 | int r; | 431 | int r; |
| 432 | |||
| 453 | flags &= ~(CMS_DETACHED|CMS_TEXT); | 433 | flags &= ~(CMS_DETACHED|CMS_TEXT); |
| 454 | r = CMS_verify(rcms, certs, store, NULL, NULL, flags); | 434 | r = CMS_verify(rcms, certs, store, NULL, NULL, flags); |
| 455 | if (r <= 0) | 435 | if (r <= 0) |
| 456 | return r; | 436 | return r; |
| 457 | return cms_Receipt_verify(rcms, ocms); | 437 | return cms_Receipt_verify(rcms, ocms); |
| 458 | } | 438 | } |
| 459 | 439 | ||
| 460 | CMS_ContentInfo *CMS_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, | 440 | CMS_ContentInfo * |
| 461 | BIO *data, unsigned int flags) | 441 | CMS_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, BIO *data, |
| 462 | { | 442 | unsigned int flags) |
| 443 | { | ||
| 463 | CMS_ContentInfo *cms; | 444 | CMS_ContentInfo *cms; |
| 464 | int i; | 445 | int i; |
| 465 | 446 | ||
| @@ -467,42 +448,38 @@ CMS_ContentInfo *CMS_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs, | |||
| 467 | if (!cms || !CMS_SignedData_init(cms)) | 448 | if (!cms || !CMS_SignedData_init(cms)) |
| 468 | goto merr; | 449 | goto merr; |
| 469 | 450 | ||
| 470 | if (pkey && !CMS_add1_signer(cms, signcert, pkey, NULL, flags)) | 451 | if (pkey && !CMS_add1_signer(cms, signcert, pkey, NULL, flags)) { |
| 471 | { | ||
| 472 | CMSerr(CMS_F_CMS_SIGN, CMS_R_ADD_SIGNER_ERROR); | 452 | CMSerr(CMS_F_CMS_SIGN, CMS_R_ADD_SIGNER_ERROR); |
| 473 | goto err; | 453 | goto err; |
| 474 | } | 454 | } |
| 475 | 455 | ||
| 476 | for (i = 0; i < sk_X509_num(certs); i++) | 456 | for (i = 0; i < sk_X509_num(certs); i++) { |
| 477 | { | ||
| 478 | X509 *x = sk_X509_value(certs, i); | 457 | X509 *x = sk_X509_value(certs, i); |
| 479 | if (!CMS_add1_cert(cms, x)) | 458 | if (!CMS_add1_cert(cms, x)) |
| 480 | goto merr; | 459 | goto merr; |
| 481 | } | 460 | } |
| 482 | 461 | ||
| 483 | if(!(flags & CMS_DETACHED)) | 462 | if (!(flags & CMS_DETACHED)) |
| 484 | CMS_set_detached(cms, 0); | 463 | CMS_set_detached(cms, 0); |
| 485 | 464 | ||
| 486 | if ((flags & (CMS_STREAM|CMS_PARTIAL)) | 465 | if ((flags & (CMS_STREAM|CMS_PARTIAL)) || |
| 487 | || CMS_final(cms, data, NULL, flags)) | 466 | CMS_final(cms, data, NULL, flags)) |
| 488 | return cms; | 467 | return cms; |
| 489 | else | 468 | else |
| 490 | goto err; | 469 | goto err; |
| 491 | 470 | ||
| 492 | merr: | 471 | merr: |
| 493 | CMSerr(CMS_F_CMS_SIGN, ERR_R_MALLOC_FAILURE); | 472 | CMSerr(CMS_F_CMS_SIGN, ERR_R_MALLOC_FAILURE); |
| 494 | 473 | err: | |
| 495 | err: | ||
| 496 | if (cms) | 474 | if (cms) |
| 497 | CMS_ContentInfo_free(cms); | 475 | CMS_ContentInfo_free(cms); |
| 498 | return NULL; | 476 | return NULL; |
| 499 | } | 477 | } |
| 500 | 478 | ||
| 501 | CMS_ContentInfo *CMS_sign_receipt(CMS_SignerInfo *si, | 479 | CMS_ContentInfo * |
| 502 | X509 *signcert, EVP_PKEY *pkey, | 480 | CMS_sign_receipt(CMS_SignerInfo *si, X509 *signcert, EVP_PKEY *pkey, |
| 503 | STACK_OF(X509) *certs, | 481 | STACK_OF(X509) *certs, unsigned int flags) |
| 504 | unsigned int flags) | 482 | { |
| 505 | { | ||
| 506 | CMS_SignerInfo *rct_si; | 483 | CMS_SignerInfo *rct_si; |
| 507 | CMS_ContentInfo *cms = NULL; | 484 | CMS_ContentInfo *cms = NULL; |
| 508 | ASN1_OCTET_STRING **pos, *os; | 485 | ASN1_OCTET_STRING **pos, *os; |
| @@ -512,11 +489,10 @@ CMS_ContentInfo *CMS_sign_receipt(CMS_SignerInfo *si, | |||
| 512 | flags &= ~(CMS_STREAM|CMS_TEXT); | 489 | flags &= ~(CMS_STREAM|CMS_TEXT); |
| 513 | /* Not really detached but avoids content being allocated */ | 490 | /* Not really detached but avoids content being allocated */ |
| 514 | flags |= CMS_PARTIAL|CMS_BINARY|CMS_DETACHED; | 491 | flags |= CMS_PARTIAL|CMS_BINARY|CMS_DETACHED; |
| 515 | if (!pkey || !signcert) | 492 | if (!pkey || !signcert) { |
| 516 | { | ||
| 517 | CMSerr(CMS_F_CMS_SIGN_RECEIPT, CMS_R_NO_KEY_OR_CERT); | 493 | CMSerr(CMS_F_CMS_SIGN_RECEIPT, CMS_R_NO_KEY_OR_CERT); |
| 518 | return NULL; | 494 | return NULL; |
| 519 | } | 495 | } |
| 520 | 496 | ||
| 521 | /* Initialize signed data */ | 497 | /* Initialize signed data */ |
| 522 | 498 | ||
| @@ -529,11 +505,10 @@ CMS_ContentInfo *CMS_sign_receipt(CMS_SignerInfo *si, | |||
| 529 | goto err; | 505 | goto err; |
| 530 | 506 | ||
| 531 | rct_si = CMS_add1_signer(cms, signcert, pkey, NULL, flags); | 507 | rct_si = CMS_add1_signer(cms, signcert, pkey, NULL, flags); |
| 532 | if (!rct_si) | 508 | if (!rct_si) { |
| 533 | { | ||
| 534 | CMSerr(CMS_F_CMS_SIGN_RECEIPT, CMS_R_ADD_SIGNER_ERROR); | 509 | CMSerr(CMS_F_CMS_SIGN_RECEIPT, CMS_R_ADD_SIGNER_ERROR); |
| 535 | goto err; | 510 | goto err; |
| 536 | } | 511 | } |
| 537 | 512 | ||
| 538 | os = cms_encode_Receipt(si); | 513 | os = cms_encode_Receipt(si); |
| 539 | 514 | ||
| @@ -560,91 +535,88 @@ CMS_ContentInfo *CMS_sign_receipt(CMS_SignerInfo *si, | |||
| 560 | 535 | ||
| 561 | r = 1; | 536 | r = 1; |
| 562 | 537 | ||
| 563 | err: | 538 | err: |
| 564 | if (rct_cont) | 539 | if (rct_cont) |
| 565 | BIO_free(rct_cont); | 540 | BIO_free(rct_cont); |
| 566 | if (r) | 541 | if (r) |
| 567 | return cms; | 542 | return cms; |
| 568 | CMS_ContentInfo_free(cms); | 543 | CMS_ContentInfo_free(cms); |
| 569 | return NULL; | 544 | return NULL; |
| 545 | } | ||
| 570 | 546 | ||
| 571 | } | 547 | CMS_ContentInfo * |
| 572 | 548 | CMS_encrypt(STACK_OF(X509) *certs, BIO *data, const EVP_CIPHER *cipher, | |
| 573 | CMS_ContentInfo *CMS_encrypt(STACK_OF(X509) *certs, BIO *data, | 549 | unsigned int flags) |
| 574 | const EVP_CIPHER *cipher, unsigned int flags) | 550 | { |
| 575 | { | ||
| 576 | CMS_ContentInfo *cms; | 551 | CMS_ContentInfo *cms; |
| 577 | int i; | 552 | int i; |
| 578 | X509 *recip; | 553 | X509 *recip; |
| 554 | |||
| 579 | cms = CMS_EnvelopedData_create(cipher); | 555 | cms = CMS_EnvelopedData_create(cipher); |
| 580 | if (!cms) | 556 | if (!cms) |
| 581 | goto merr; | 557 | goto merr; |
| 582 | for (i = 0; i < sk_X509_num(certs); i++) | 558 | for (i = 0; i < sk_X509_num(certs); i++) { |
| 583 | { | ||
| 584 | recip = sk_X509_value(certs, i); | 559 | recip = sk_X509_value(certs, i); |
| 585 | if (!CMS_add1_recipient_cert(cms, recip, flags)) | 560 | if (!CMS_add1_recipient_cert(cms, recip, flags)) { |
| 586 | { | ||
| 587 | CMSerr(CMS_F_CMS_ENCRYPT, CMS_R_RECIPIENT_ERROR); | 561 | CMSerr(CMS_F_CMS_ENCRYPT, CMS_R_RECIPIENT_ERROR); |
| 588 | goto err; | 562 | goto err; |
| 589 | } | ||
| 590 | } | 563 | } |
| 564 | } | ||
| 591 | 565 | ||
| 592 | if(!(flags & CMS_DETACHED)) | 566 | if (!(flags & CMS_DETACHED)) |
| 593 | CMS_set_detached(cms, 0); | 567 | CMS_set_detached(cms, 0); |
| 594 | 568 | ||
| 595 | if ((flags & (CMS_STREAM|CMS_PARTIAL)) | 569 | if ((flags & (CMS_STREAM|CMS_PARTIAL)) || |
| 596 | || CMS_final(cms, data, NULL, flags)) | 570 | CMS_final(cms, data, NULL, flags)) |
| 597 | return cms; | 571 | return cms; |
| 598 | else | 572 | else |
| 599 | goto err; | 573 | goto err; |
| 600 | 574 | ||
| 601 | merr: | 575 | merr: |
| 602 | CMSerr(CMS_F_CMS_ENCRYPT, ERR_R_MALLOC_FAILURE); | 576 | CMSerr(CMS_F_CMS_ENCRYPT, ERR_R_MALLOC_FAILURE); |
| 603 | err: | 577 | err: |
| 604 | if (cms) | 578 | if (cms) |
| 605 | CMS_ContentInfo_free(cms); | 579 | CMS_ContentInfo_free(cms); |
| 606 | return NULL; | 580 | return NULL; |
| 607 | } | 581 | } |
| 608 | 582 | ||
| 609 | int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert) | 583 | int |
| 610 | { | 584 | CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert) |
| 585 | { | ||
| 611 | STACK_OF(CMS_RecipientInfo) *ris; | 586 | STACK_OF(CMS_RecipientInfo) *ris; |
| 612 | CMS_RecipientInfo *ri; | 587 | CMS_RecipientInfo *ri; |
| 613 | int i, r; | 588 | int i, r; |
| 614 | int debug = 0; | 589 | int debug = 0; |
| 590 | |||
| 615 | ris = CMS_get0_RecipientInfos(cms); | 591 | ris = CMS_get0_RecipientInfos(cms); |
| 616 | if (ris) | 592 | if (ris) |
| 617 | debug = cms->d.envelopedData->encryptedContentInfo->debug; | 593 | debug = cms->d.envelopedData->encryptedContentInfo->debug; |
| 618 | for (i = 0; i < sk_CMS_RecipientInfo_num(ris); i++) | 594 | for (i = 0; i < sk_CMS_RecipientInfo_num(ris); i++) { |
| 619 | { | ||
| 620 | ri = sk_CMS_RecipientInfo_value(ris, i); | 595 | ri = sk_CMS_RecipientInfo_value(ris, i); |
| 621 | if (CMS_RecipientInfo_type(ri) != CMS_RECIPINFO_TRANS) | 596 | if (CMS_RecipientInfo_type(ri) != CMS_RECIPINFO_TRANS) |
| 622 | continue; | 597 | continue; |
| 623 | /* If we have a cert try matching RecipientInfo | 598 | /* If we have a cert try matching RecipientInfo |
| 624 | * otherwise try them all. | 599 | * otherwise try them all. |
| 625 | */ | 600 | */ |
| 626 | if (!cert || (CMS_RecipientInfo_ktri_cert_cmp(ri, cert) == 0)) | 601 | if (!cert || (CMS_RecipientInfo_ktri_cert_cmp(ri, cert) == 0)) { |
| 627 | { | ||
| 628 | CMS_RecipientInfo_set0_pkey(ri, pk); | 602 | CMS_RecipientInfo_set0_pkey(ri, pk); |
| 629 | r = CMS_RecipientInfo_decrypt(cms, ri); | 603 | r = CMS_RecipientInfo_decrypt(cms, ri); |
| 630 | CMS_RecipientInfo_set0_pkey(ri, NULL); | 604 | CMS_RecipientInfo_set0_pkey(ri, NULL); |
| 631 | if (cert) | 605 | if (cert) { |
| 632 | { | ||
| 633 | /* If not debugging clear any error and | 606 | /* If not debugging clear any error and |
| 634 | * return success to avoid leaking of | 607 | * return success to avoid leaking of |
| 635 | * information useful to MMA | 608 | * information useful to MMA |
| 636 | */ | 609 | */ |
| 637 | if (!debug) | 610 | if (!debug) { |
| 638 | { | ||
| 639 | ERR_clear_error(); | 611 | ERR_clear_error(); |
| 640 | return 1; | 612 | return 1; |
| 641 | } | 613 | } |
| 642 | if (r > 0) | 614 | if (r > 0) |
| 643 | return 1; | 615 | return 1; |
| 644 | CMSerr(CMS_F_CMS_DECRYPT_SET1_PKEY, | 616 | CMSerr(CMS_F_CMS_DECRYPT_SET1_PKEY, |
| 645 | CMS_R_DECRYPT_ERROR); | 617 | CMS_R_DECRYPT_ERROR); |
| 646 | return 0; | 618 | return 0; |
| 647 | } | 619 | } |
| 648 | /* If no cert and not debugging don't leave loop | 620 | /* If no cert and not debugging don't leave loop |
| 649 | * after first successful decrypt. Always attempt | 621 | * after first successful decrypt. Always attempt |
| 650 | * to decrypt all recipients to avoid leaking timing | 622 | * to decrypt all recipients to avoid leaking timing |
| @@ -652,94 +624,90 @@ int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert) | |||
| 652 | */ | 624 | */ |
| 653 | else if (r > 0 && debug) | 625 | else if (r > 0 && debug) |
| 654 | return 1; | 626 | return 1; |
| 655 | } | ||
| 656 | } | 627 | } |
| 628 | } | ||
| 657 | /* If no cert and not debugging always return success */ | 629 | /* If no cert and not debugging always return success */ |
| 658 | if (!cert && !debug) | 630 | if (!cert && !debug) { |
| 659 | { | ||
| 660 | ERR_clear_error(); | 631 | ERR_clear_error(); |
| 661 | return 1; | 632 | return 1; |
| 662 | } | 633 | } |
| 663 | 634 | ||
| 664 | CMSerr(CMS_F_CMS_DECRYPT_SET1_PKEY, CMS_R_NO_MATCHING_RECIPIENT); | 635 | CMSerr(CMS_F_CMS_DECRYPT_SET1_PKEY, CMS_R_NO_MATCHING_RECIPIENT); |
| 665 | return 0; | 636 | return 0; |
| 637 | } | ||
| 666 | 638 | ||
| 667 | } | 639 | int |
| 668 | 640 | CMS_decrypt_set1_key(CMS_ContentInfo *cms, unsigned char *key, size_t keylen, | |
| 669 | int CMS_decrypt_set1_key(CMS_ContentInfo *cms, | 641 | unsigned char *id, size_t idlen) |
| 670 | unsigned char *key, size_t keylen, | 642 | { |
| 671 | unsigned char *id, size_t idlen) | ||
| 672 | { | ||
| 673 | STACK_OF(CMS_RecipientInfo) *ris; | 643 | STACK_OF(CMS_RecipientInfo) *ris; |
| 674 | CMS_RecipientInfo *ri; | 644 | CMS_RecipientInfo *ri; |
| 675 | int i, r; | 645 | int i, r; |
| 646 | |||
| 676 | ris = CMS_get0_RecipientInfos(cms); | 647 | ris = CMS_get0_RecipientInfos(cms); |
| 677 | for (i = 0; i < sk_CMS_RecipientInfo_num(ris); i++) | 648 | for (i = 0; i < sk_CMS_RecipientInfo_num(ris); i++) { |
| 678 | { | ||
| 679 | ri = sk_CMS_RecipientInfo_value(ris, i); | 649 | ri = sk_CMS_RecipientInfo_value(ris, i); |
| 680 | if (CMS_RecipientInfo_type(ri) != CMS_RECIPINFO_KEK) | 650 | if (CMS_RecipientInfo_type(ri) != CMS_RECIPINFO_KEK) |
| 681 | continue; | 651 | continue; |
| 682 | 652 | ||
| 683 | /* If we have an id try matching RecipientInfo | 653 | /* If we have an id try matching RecipientInfo |
| 684 | * otherwise try them all. | 654 | * otherwise try them all. |
| 685 | */ | 655 | */ |
| 686 | if (!id || (CMS_RecipientInfo_kekri_id_cmp(ri, id, idlen) == 0)) | 656 | if (!id || |
| 687 | { | 657 | (CMS_RecipientInfo_kekri_id_cmp(ri, id, idlen) == 0)) { |
| 688 | CMS_RecipientInfo_set0_key(ri, key, keylen); | 658 | CMS_RecipientInfo_set0_key(ri, key, keylen); |
| 689 | r = CMS_RecipientInfo_decrypt(cms, ri); | 659 | r = CMS_RecipientInfo_decrypt(cms, ri); |
| 690 | CMS_RecipientInfo_set0_key(ri, NULL, 0); | 660 | CMS_RecipientInfo_set0_key(ri, NULL, 0); |
| 691 | if (r > 0) | 661 | if (r > 0) |
| 692 | return 1; | 662 | return 1; |
| 693 | if (id) | 663 | if (id) { |
| 694 | { | ||
| 695 | CMSerr(CMS_F_CMS_DECRYPT_SET1_KEY, | 664 | CMSerr(CMS_F_CMS_DECRYPT_SET1_KEY, |
| 696 | CMS_R_DECRYPT_ERROR); | 665 | CMS_R_DECRYPT_ERROR); |
| 697 | return 0; | 666 | return 0; |
| 698 | } | ||
| 699 | ERR_clear_error(); | ||
| 700 | } | 667 | } |
| 668 | ERR_clear_error(); | ||
| 701 | } | 669 | } |
| 670 | } | ||
| 702 | 671 | ||
| 703 | CMSerr(CMS_F_CMS_DECRYPT_SET1_KEY, CMS_R_NO_MATCHING_RECIPIENT); | 672 | CMSerr(CMS_F_CMS_DECRYPT_SET1_KEY, CMS_R_NO_MATCHING_RECIPIENT); |
| 704 | return 0; | 673 | return 0; |
| 674 | } | ||
| 705 | 675 | ||
| 706 | } | 676 | int |
| 707 | 677 | CMS_decrypt_set1_password(CMS_ContentInfo *cms, unsigned char *pass, | |
| 708 | int CMS_decrypt_set1_password(CMS_ContentInfo *cms, | 678 | ssize_t passlen) |
| 709 | unsigned char *pass, ssize_t passlen) | 679 | { |
| 710 | { | ||
| 711 | STACK_OF(CMS_RecipientInfo) *ris; | 680 | STACK_OF(CMS_RecipientInfo) *ris; |
| 712 | CMS_RecipientInfo *ri; | 681 | CMS_RecipientInfo *ri; |
| 713 | int i, r; | 682 | int i, r; |
| 683 | |||
| 714 | ris = CMS_get0_RecipientInfos(cms); | 684 | ris = CMS_get0_RecipientInfos(cms); |
| 715 | for (i = 0; i < sk_CMS_RecipientInfo_num(ris); i++) | 685 | for (i = 0; i < sk_CMS_RecipientInfo_num(ris); i++) { |
| 716 | { | ||
| 717 | ri = sk_CMS_RecipientInfo_value(ris, i); | 686 | ri = sk_CMS_RecipientInfo_value(ris, i); |
| 718 | if (CMS_RecipientInfo_type(ri) != CMS_RECIPINFO_PASS) | 687 | if (CMS_RecipientInfo_type(ri) != CMS_RECIPINFO_PASS) |
| 719 | continue; | 688 | continue; |
| 720 | CMS_RecipientInfo_set0_password(ri, pass, passlen); | 689 | CMS_RecipientInfo_set0_password(ri, pass, passlen); |
| 721 | r = CMS_RecipientInfo_decrypt(cms, ri); | 690 | r = CMS_RecipientInfo_decrypt(cms, ri); |
| 722 | CMS_RecipientInfo_set0_password(ri, NULL, 0); | 691 | CMS_RecipientInfo_set0_password(ri, NULL, 0); |
| 723 | if (r > 0) | 692 | if (r > 0) |
| 724 | return 1; | 693 | return 1; |
| 725 | } | 694 | } |
| 726 | 695 | ||
| 727 | CMSerr(CMS_F_CMS_DECRYPT_SET1_PASSWORD, CMS_R_NO_MATCHING_RECIPIENT); | 696 | CMSerr(CMS_F_CMS_DECRYPT_SET1_PASSWORD, CMS_R_NO_MATCHING_RECIPIENT); |
| 728 | return 0; | 697 | return 0; |
| 698 | } | ||
| 729 | 699 | ||
| 730 | } | 700 | int |
| 731 | 701 | CMS_decrypt(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert, BIO *dcont, | |
| 732 | int CMS_decrypt(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert, | 702 | BIO *out, unsigned int flags) |
| 733 | BIO *dcont, BIO *out, | 703 | { |
| 734 | unsigned int flags) | ||
| 735 | { | ||
| 736 | int r; | 704 | int r; |
| 737 | BIO *cont; | 705 | BIO *cont; |
| 738 | if (OBJ_obj2nid(CMS_get0_type(cms)) != NID_pkcs7_enveloped) | 706 | |
| 739 | { | 707 | if (OBJ_obj2nid(CMS_get0_type(cms)) != NID_pkcs7_enveloped) { |
| 740 | CMSerr(CMS_F_CMS_DECRYPT, CMS_R_TYPE_NOT_ENVELOPED_DATA); | 708 | CMSerr(CMS_F_CMS_DECRYPT, CMS_R_TYPE_NOT_ENVELOPED_DATA); |
| 741 | return 0; | 709 | return 0; |
| 742 | } | 710 | } |
| 743 | if (!dcont && !check_content(cms)) | 711 | if (!dcont && !check_content(cms)) |
| 744 | return 0; | 712 | return 0; |
| 745 | if (flags & CMS_DEBUG_DECRYPT) | 713 | if (flags & CMS_DEBUG_DECRYPT) |
| @@ -756,51 +724,50 @@ int CMS_decrypt(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert, | |||
| 756 | r = cms_copy_content(out, cont, flags); | 724 | r = cms_copy_content(out, cont, flags); |
| 757 | do_free_upto(cont, dcont); | 725 | do_free_upto(cont, dcont); |
| 758 | return r; | 726 | return r; |
| 759 | } | 727 | } |
| 760 | 728 | ||
| 761 | int CMS_final(CMS_ContentInfo *cms, BIO *data, BIO *dcont, unsigned int flags) | 729 | int |
| 762 | { | 730 | CMS_final(CMS_ContentInfo *cms, BIO *data, BIO *dcont, unsigned int flags) |
| 731 | { | ||
| 763 | BIO *cmsbio; | 732 | BIO *cmsbio; |
| 764 | int ret = 0; | 733 | int ret = 0; |
| 765 | if (!(cmsbio = CMS_dataInit(cms, dcont))) | 734 | |
| 766 | { | 735 | if (!(cmsbio = CMS_dataInit(cms, dcont))) { |
| 767 | CMSerr(CMS_F_CMS_FINAL,ERR_R_MALLOC_FAILURE); | 736 | CMSerr(CMS_F_CMS_FINAL, ERR_R_MALLOC_FAILURE); |
| 768 | return 0; | 737 | return 0; |
| 769 | } | 738 | } |
| 770 | 739 | ||
| 771 | SMIME_crlf_copy(data, cmsbio, flags); | 740 | SMIME_crlf_copy(data, cmsbio, flags); |
| 772 | 741 | ||
| 773 | (void)BIO_flush(cmsbio); | 742 | (void)BIO_flush(cmsbio); |
| 774 | 743 | ||
| 775 | 744 | ||
| 776 | if (!CMS_dataFinal(cms, cmsbio)) | 745 | if (!CMS_dataFinal(cms, cmsbio)) { |
| 777 | { | 746 | CMSerr(CMS_F_CMS_FINAL, CMS_R_CMS_DATAFINAL_ERROR); |
| 778 | CMSerr(CMS_F_CMS_FINAL,CMS_R_CMS_DATAFINAL_ERROR); | ||
| 779 | goto err; | 747 | goto err; |
| 780 | } | 748 | } |
| 781 | 749 | ||
| 782 | ret = 1; | 750 | ret = 1; |
| 783 | 751 | ||
| 784 | err: | 752 | err: |
| 785 | do_free_upto(cmsbio, dcont); | 753 | do_free_upto(cmsbio, dcont); |
| 786 | 754 | ||
| 787 | return ret; | 755 | return ret; |
| 788 | 756 | } | |
| 789 | } | ||
| 790 | 757 | ||
| 791 | #ifdef ZLIB | 758 | #ifdef ZLIB |
| 792 | 759 | ||
| 793 | int CMS_uncompress(CMS_ContentInfo *cms, BIO *dcont, BIO *out, | 760 | int |
| 794 | unsigned int flags) | 761 | CMS_uncompress(CMS_ContentInfo *cms, BIO *dcont, BIO *out, unsigned int flags) |
| 795 | { | 762 | { |
| 796 | BIO *cont; | 763 | BIO *cont; |
| 797 | int r; | 764 | int r; |
| 798 | if (OBJ_obj2nid(CMS_get0_type(cms)) != NID_id_smime_ct_compressedData) | 765 | |
| 799 | { | 766 | if (OBJ_obj2nid(CMS_get0_type(cms)) != NID_id_smime_ct_compressedData) { |
| 800 | CMSerr(CMS_F_CMS_UNCOMPRESS, | 767 | CMSerr(CMS_F_CMS_UNCOMPRESS, |
| 801 | CMS_R_TYPE_NOT_COMPRESSED_DATA); | 768 | CMS_R_TYPE_NOT_COMPRESSED_DATA); |
| 802 | return 0; | 769 | return 0; |
| 803 | } | 770 | } |
| 804 | 771 | ||
| 805 | if (!dcont && !check_content(cms)) | 772 | if (!dcont && !check_content(cms)) |
| 806 | return 0; | 773 | return 0; |
| @@ -811,18 +778,20 @@ int CMS_uncompress(CMS_ContentInfo *cms, BIO *dcont, BIO *out, | |||
| 811 | r = cms_copy_content(out, cont, flags); | 778 | r = cms_copy_content(out, cont, flags); |
| 812 | do_free_upto(cont, dcont); | 779 | do_free_upto(cont, dcont); |
| 813 | return r; | 780 | return r; |
| 814 | } | 781 | } |
| 815 | 782 | ||
| 816 | CMS_ContentInfo *CMS_compress(BIO *in, int comp_nid, unsigned int flags) | 783 | CMS_ContentInfo * |
| 817 | { | 784 | CMS_compress(BIO *in, int comp_nid, unsigned int flags) |
| 785 | { | ||
| 818 | CMS_ContentInfo *cms; | 786 | CMS_ContentInfo *cms; |
| 787 | |||
| 819 | if (comp_nid <= 0) | 788 | if (comp_nid <= 0) |
| 820 | comp_nid = NID_zlib_compression; | 789 | comp_nid = NID_zlib_compression; |
| 821 | cms = cms_CompressedData_create(comp_nid); | 790 | cms = cms_CompressedData_create(comp_nid); |
| 822 | if (!cms) | 791 | if (!cms) |
| 823 | return NULL; | 792 | return NULL; |
| 824 | 793 | ||
| 825 | if(!(flags & CMS_DETACHED)) | 794 | if (!(flags & CMS_DETACHED)) |
| 826 | CMS_set_detached(cms, 0); | 795 | CMS_set_detached(cms, 0); |
| 827 | 796 | ||
| 828 | if ((flags & CMS_STREAM) || CMS_final(cms, in, NULL, flags)) | 797 | if ((flags & CMS_STREAM) || CMS_final(cms, in, NULL, flags)) |
| @@ -830,21 +799,22 @@ CMS_ContentInfo *CMS_compress(BIO *in, int comp_nid, unsigned int flags) | |||
| 830 | 799 | ||
| 831 | CMS_ContentInfo_free(cms); | 800 | CMS_ContentInfo_free(cms); |
| 832 | return NULL; | 801 | return NULL; |
| 833 | } | 802 | } |
| 834 | 803 | ||
| 835 | #else | 804 | #else |
| 836 | 805 | ||
| 837 | int CMS_uncompress(CMS_ContentInfo *cms, BIO *dcont, BIO *out, | 806 | int |
| 838 | unsigned int flags) | 807 | CMS_uncompress(CMS_ContentInfo *cms, BIO *dcont, BIO *out, unsigned int flags) |
| 839 | { | 808 | { |
| 840 | CMSerr(CMS_F_CMS_UNCOMPRESS, CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM); | 809 | CMSerr(CMS_F_CMS_UNCOMPRESS, CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM); |
| 841 | return 0; | 810 | return 0; |
| 842 | } | 811 | } |
| 843 | 812 | ||
| 844 | CMS_ContentInfo *CMS_compress(BIO *in, int comp_nid, unsigned int flags) | 813 | CMS_ContentInfo * |
| 845 | { | 814 | CMS_compress(BIO *in, int comp_nid, unsigned int flags) |
| 815 | { | ||
| 846 | CMSerr(CMS_F_CMS_COMPRESS, CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM); | 816 | CMSerr(CMS_F_CMS_COMPRESS, CMS_R_UNSUPPORTED_COMPRESSION_ALGORITHM); |
| 847 | return NULL; | 817 | return NULL; |
| 848 | } | 818 | } |
| 849 | 819 | ||
| 850 | #endif | 820 | #endif |
