diff options
author | Dr. Stephen Henson <steve@openssl.org> | 2013-07-10 18:36:37 +0100 |
---|---|---|
committer | Dr. Stephen Henson <steve@openssl.org> | 2013-10-01 14:01:17 +0100 |
commit | 5c49a98c5e3e134f71f8600735987a82b8565a36 (patch) | |
tree | f37e7ac39b9644f6fd4bbad8fb7b71a0e0993045 /crypto/cms | |
parent | 869772ff08fceb1082750572ce131af78f30d96e (diff) |
Set CMS EnvelopedData version correctly.
(cherry picked from commit ff7b6ce9db329eb48775bb81e0ecbbd2a9b23c1c)
Diffstat (limited to 'crypto/cms')
-rw-r--r-- | crypto/cms/cms_env.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/crypto/cms/cms_env.c b/crypto/cms/cms_env.c index c26dd59738..cef825be2b 100644 --- a/crypto/cms/cms_env.c +++ b/crypto/cms/cms_env.c @@ -865,6 +865,78 @@ int CMS_RecipientInfo_encrypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri) } } +/* Check structures and fixup version numbers (if necessary) */ + +static void cms_env_set_originfo_version(CMS_EnvelopedData *env) + { + CMS_OriginatorInfo *org = env->originatorInfo; + int i; + if (org == NULL) + return; + for (i = 0; i < sk_CMS_CertificateChoices_num(org->certificates); i++) + { + CMS_CertificateChoices *cch; + cch = sk_CMS_CertificateChoices_value(org->certificates, i); + if (cch->type == CMS_CERTCHOICE_OTHER) + { + env->version = 4; + return; + } + else if (cch->type == CMS_CERTCHOICE_V2ACERT) + { + if (env->version < 3) + env->version = 3; + } + } + + for (i = 0; i < sk_CMS_RevocationInfoChoice_num(org->crls); i++) + { + CMS_RevocationInfoChoice *rch; + rch = sk_CMS_RevocationInfoChoice_value(org->crls, i); + if (rch->type == CMS_REVCHOICE_OTHER) + { + env->version = 4; + return; + } + } + } + +static void cms_env_set_version(CMS_EnvelopedData *env) + { + int i; + CMS_RecipientInfo *ri; + + /* Can't set version higher than 4 so if 4 or more already nothing + * to do. + */ + if (env->version >= 4) + return; + + cms_env_set_originfo_version(env); + + if (env->version >= 3) + return; + + for (i = 0; i < sk_CMS_RecipientInfo_num(env->recipientInfos); i++) + { + ri = sk_CMS_RecipientInfo_value(env->recipientInfos, i); + if (ri->type == CMS_RECIPINFO_PASS || ri->type == CMS_RECIPINFO_OTHER) + { + env->version = 3; + return; + } + else if (ri->type != CMS_RECIPINFO_TRANS) + { + env->version = 2; + } + } + if (env->version == 2) + return; + if (env->originatorInfo || env->unprotectedAttrs) + env->version = 2; + env->version = 0; + } + BIO *cms_EnvelopedData_init_bio(CMS_ContentInfo *cms) { CMS_EncryptedContentInfo *ec; @@ -897,6 +969,7 @@ BIO *cms_EnvelopedData_init_bio(CMS_ContentInfo *cms) goto err; } } + cms_env_set_version(cms->d.envelopedData); ok = 1; |