summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/cms/cms_asn1.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/cms/cms_asn1.c')
-rw-r--r--src/lib/libcrypto/cms/cms_asn1.c408
1 files changed, 204 insertions, 204 deletions
diff --git a/src/lib/libcrypto/cms/cms_asn1.c b/src/lib/libcrypto/cms/cms_asn1.c
index 70f245ea40..fbe27892dc 100644
--- a/src/lib/libcrypto/cms/cms_asn1.c
+++ b/src/lib/libcrypto/cms/cms_asn1.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: cms_asn1.c,v 1.12 2019/08/10 16:03:53 jsing Exp $ */ 1/* $OpenBSD: cms_asn1.c,v 1.13 2019/08/10 16:42:20 jsing Exp $ */
2/* 2/*
3 * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 3 * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
4 * project. 4 * project.
@@ -60,102 +60,102 @@
60 60
61 61
62ASN1_SEQUENCE(CMS_IssuerAndSerialNumber) = { 62ASN1_SEQUENCE(CMS_IssuerAndSerialNumber) = {
63 ASN1_SIMPLE(CMS_IssuerAndSerialNumber, issuer, X509_NAME), 63 ASN1_SIMPLE(CMS_IssuerAndSerialNumber, issuer, X509_NAME),
64 ASN1_SIMPLE(CMS_IssuerAndSerialNumber, serialNumber, ASN1_INTEGER) 64 ASN1_SIMPLE(CMS_IssuerAndSerialNumber, serialNumber, ASN1_INTEGER)
65} ASN1_SEQUENCE_END(CMS_IssuerAndSerialNumber) 65} ASN1_SEQUENCE_END(CMS_IssuerAndSerialNumber)
66 66
67ASN1_SEQUENCE(CMS_OtherCertificateFormat) = { 67ASN1_SEQUENCE(CMS_OtherCertificateFormat) = {
68 ASN1_SIMPLE(CMS_OtherCertificateFormat, otherCertFormat, ASN1_OBJECT), 68 ASN1_SIMPLE(CMS_OtherCertificateFormat, otherCertFormat, ASN1_OBJECT),
69 ASN1_OPT(CMS_OtherCertificateFormat, otherCert, ASN1_ANY) 69 ASN1_OPT(CMS_OtherCertificateFormat, otherCert, ASN1_ANY)
70} static_ASN1_SEQUENCE_END(CMS_OtherCertificateFormat) 70} static_ASN1_SEQUENCE_END(CMS_OtherCertificateFormat)
71 71
72ASN1_CHOICE(CMS_CertificateChoices) = { 72ASN1_CHOICE(CMS_CertificateChoices) = {
73 ASN1_SIMPLE(CMS_CertificateChoices, d.certificate, X509), 73 ASN1_SIMPLE(CMS_CertificateChoices, d.certificate, X509),
74 ASN1_IMP(CMS_CertificateChoices, d.extendedCertificate, ASN1_SEQUENCE, 0), 74 ASN1_IMP(CMS_CertificateChoices, d.extendedCertificate, ASN1_SEQUENCE, 0),
75 ASN1_IMP(CMS_CertificateChoices, d.v1AttrCert, ASN1_SEQUENCE, 1), 75 ASN1_IMP(CMS_CertificateChoices, d.v1AttrCert, ASN1_SEQUENCE, 1),
76 ASN1_IMP(CMS_CertificateChoices, d.v2AttrCert, ASN1_SEQUENCE, 2), 76 ASN1_IMP(CMS_CertificateChoices, d.v2AttrCert, ASN1_SEQUENCE, 2),
77 ASN1_IMP(CMS_CertificateChoices, d.other, CMS_OtherCertificateFormat, 3) 77 ASN1_IMP(CMS_CertificateChoices, d.other, CMS_OtherCertificateFormat, 3)
78} ASN1_CHOICE_END(CMS_CertificateChoices) 78} ASN1_CHOICE_END(CMS_CertificateChoices)
79 79
80ASN1_CHOICE(CMS_SignerIdentifier) = { 80ASN1_CHOICE(CMS_SignerIdentifier) = {
81 ASN1_SIMPLE(CMS_SignerIdentifier, d.issuerAndSerialNumber, CMS_IssuerAndSerialNumber), 81 ASN1_SIMPLE(CMS_SignerIdentifier, d.issuerAndSerialNumber, CMS_IssuerAndSerialNumber),
82 ASN1_IMP(CMS_SignerIdentifier, d.subjectKeyIdentifier, ASN1_OCTET_STRING, 0) 82 ASN1_IMP(CMS_SignerIdentifier, d.subjectKeyIdentifier, ASN1_OCTET_STRING, 0)
83} static_ASN1_CHOICE_END(CMS_SignerIdentifier) 83} static_ASN1_CHOICE_END(CMS_SignerIdentifier)
84 84
85ASN1_NDEF_SEQUENCE(CMS_EncapsulatedContentInfo) = { 85ASN1_NDEF_SEQUENCE(CMS_EncapsulatedContentInfo) = {
86 ASN1_SIMPLE(CMS_EncapsulatedContentInfo, eContentType, ASN1_OBJECT), 86 ASN1_SIMPLE(CMS_EncapsulatedContentInfo, eContentType, ASN1_OBJECT),
87 ASN1_NDEF_EXP_OPT(CMS_EncapsulatedContentInfo, eContent, ASN1_OCTET_STRING_NDEF, 0) 87 ASN1_NDEF_EXP_OPT(CMS_EncapsulatedContentInfo, eContent, ASN1_OCTET_STRING_NDEF, 0)
88} static_ASN1_NDEF_SEQUENCE_END(CMS_EncapsulatedContentInfo) 88} static_ASN1_NDEF_SEQUENCE_END(CMS_EncapsulatedContentInfo)
89 89
90/* Minor tweak to operation: free up signer key, cert */ 90/* Minor tweak to operation: free up signer key, cert */
91static int cms_si_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, 91static int cms_si_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
92 void *exarg) 92 void *exarg)
93{ 93{
94 if (operation == ASN1_OP_FREE_POST) { 94 if (operation == ASN1_OP_FREE_POST) {
95 CMS_SignerInfo *si = (CMS_SignerInfo *)*pval; 95 CMS_SignerInfo *si = (CMS_SignerInfo *)*pval;
96 EVP_PKEY_free(si->pkey); 96 EVP_PKEY_free(si->pkey);
97 X509_free(si->signer); 97 X509_free(si->signer);
98 EVP_MD_CTX_free(si->mctx); 98 EVP_MD_CTX_free(si->mctx);
99 } 99 }
100 return 1; 100 return 1;
101} 101}
102 102
103ASN1_SEQUENCE_cb(CMS_SignerInfo, cms_si_cb) = { 103ASN1_SEQUENCE_cb(CMS_SignerInfo, cms_si_cb) = {
104 ASN1_EMBED(CMS_SignerInfo, version, INT32), 104 ASN1_EMBED(CMS_SignerInfo, version, INT32),
105 ASN1_SIMPLE(CMS_SignerInfo, sid, CMS_SignerIdentifier), 105 ASN1_SIMPLE(CMS_SignerInfo, sid, CMS_SignerIdentifier),
106 ASN1_SIMPLE(CMS_SignerInfo, digestAlgorithm, X509_ALGOR), 106 ASN1_SIMPLE(CMS_SignerInfo, digestAlgorithm, X509_ALGOR),
107 ASN1_IMP_SET_OF_OPT(CMS_SignerInfo, signedAttrs, X509_ATTRIBUTE, 0), 107 ASN1_IMP_SET_OF_OPT(CMS_SignerInfo, signedAttrs, X509_ATTRIBUTE, 0),
108 ASN1_SIMPLE(CMS_SignerInfo, signatureAlgorithm, X509_ALGOR), 108 ASN1_SIMPLE(CMS_SignerInfo, signatureAlgorithm, X509_ALGOR),
109 ASN1_SIMPLE(CMS_SignerInfo, signature, ASN1_OCTET_STRING), 109 ASN1_SIMPLE(CMS_SignerInfo, signature, ASN1_OCTET_STRING),
110 ASN1_IMP_SET_OF_OPT(CMS_SignerInfo, unsignedAttrs, X509_ATTRIBUTE, 1) 110 ASN1_IMP_SET_OF_OPT(CMS_SignerInfo, unsignedAttrs, X509_ATTRIBUTE, 1)
111} ASN1_SEQUENCE_END_cb(CMS_SignerInfo, CMS_SignerInfo) 111} ASN1_SEQUENCE_END_cb(CMS_SignerInfo, CMS_SignerInfo)
112 112
113ASN1_SEQUENCE(CMS_OtherRevocationInfoFormat) = { 113ASN1_SEQUENCE(CMS_OtherRevocationInfoFormat) = {
114 ASN1_SIMPLE(CMS_OtherRevocationInfoFormat, otherRevInfoFormat, ASN1_OBJECT), 114 ASN1_SIMPLE(CMS_OtherRevocationInfoFormat, otherRevInfoFormat, ASN1_OBJECT),
115 ASN1_OPT(CMS_OtherRevocationInfoFormat, otherRevInfo, ASN1_ANY) 115 ASN1_OPT(CMS_OtherRevocationInfoFormat, otherRevInfo, ASN1_ANY)
116} static_ASN1_SEQUENCE_END(CMS_OtherRevocationInfoFormat) 116} static_ASN1_SEQUENCE_END(CMS_OtherRevocationInfoFormat)
117 117
118ASN1_CHOICE(CMS_RevocationInfoChoice) = { 118ASN1_CHOICE(CMS_RevocationInfoChoice) = {
119 ASN1_SIMPLE(CMS_RevocationInfoChoice, d.crl, X509_CRL), 119 ASN1_SIMPLE(CMS_RevocationInfoChoice, d.crl, X509_CRL),
120 ASN1_IMP(CMS_RevocationInfoChoice, d.other, CMS_OtherRevocationInfoFormat, 1) 120 ASN1_IMP(CMS_RevocationInfoChoice, d.other, CMS_OtherRevocationInfoFormat, 1)
121} ASN1_CHOICE_END(CMS_RevocationInfoChoice) 121} ASN1_CHOICE_END(CMS_RevocationInfoChoice)
122 122
123ASN1_NDEF_SEQUENCE(CMS_SignedData) = { 123ASN1_NDEF_SEQUENCE(CMS_SignedData) = {
124 ASN1_EMBED(CMS_SignedData, version, INT32), 124 ASN1_EMBED(CMS_SignedData, version, INT32),
125 ASN1_SET_OF(CMS_SignedData, digestAlgorithms, X509_ALGOR), 125 ASN1_SET_OF(CMS_SignedData, digestAlgorithms, X509_ALGOR),
126 ASN1_SIMPLE(CMS_SignedData, encapContentInfo, CMS_EncapsulatedContentInfo), 126 ASN1_SIMPLE(CMS_SignedData, encapContentInfo, CMS_EncapsulatedContentInfo),
127 ASN1_IMP_SET_OF_OPT(CMS_SignedData, certificates, CMS_CertificateChoices, 0), 127 ASN1_IMP_SET_OF_OPT(CMS_SignedData, certificates, CMS_CertificateChoices, 0),
128 ASN1_IMP_SET_OF_OPT(CMS_SignedData, crls, CMS_RevocationInfoChoice, 1), 128 ASN1_IMP_SET_OF_OPT(CMS_SignedData, crls, CMS_RevocationInfoChoice, 1),
129 ASN1_SET_OF(CMS_SignedData, signerInfos, CMS_SignerInfo) 129 ASN1_SET_OF(CMS_SignedData, signerInfos, CMS_SignerInfo)
130} ASN1_NDEF_SEQUENCE_END(CMS_SignedData) 130} ASN1_NDEF_SEQUENCE_END(CMS_SignedData)
131 131
132ASN1_SEQUENCE(CMS_OriginatorInfo) = { 132ASN1_SEQUENCE(CMS_OriginatorInfo) = {
133 ASN1_IMP_SET_OF_OPT(CMS_OriginatorInfo, certificates, CMS_CertificateChoices, 0), 133 ASN1_IMP_SET_OF_OPT(CMS_OriginatorInfo, certificates, CMS_CertificateChoices, 0),
134 ASN1_IMP_SET_OF_OPT(CMS_OriginatorInfo, crls, CMS_RevocationInfoChoice, 1) 134 ASN1_IMP_SET_OF_OPT(CMS_OriginatorInfo, crls, CMS_RevocationInfoChoice, 1)
135} static_ASN1_SEQUENCE_END(CMS_OriginatorInfo) 135} static_ASN1_SEQUENCE_END(CMS_OriginatorInfo)
136 136
137ASN1_NDEF_SEQUENCE(CMS_EncryptedContentInfo) = { 137ASN1_NDEF_SEQUENCE(CMS_EncryptedContentInfo) = {
138 ASN1_SIMPLE(CMS_EncryptedContentInfo, contentType, ASN1_OBJECT), 138 ASN1_SIMPLE(CMS_EncryptedContentInfo, contentType, ASN1_OBJECT),
139 ASN1_SIMPLE(CMS_EncryptedContentInfo, contentEncryptionAlgorithm, X509_ALGOR), 139 ASN1_SIMPLE(CMS_EncryptedContentInfo, contentEncryptionAlgorithm, X509_ALGOR),
140 ASN1_IMP_OPT(CMS_EncryptedContentInfo, encryptedContent, ASN1_OCTET_STRING_NDEF, 0) 140 ASN1_IMP_OPT(CMS_EncryptedContentInfo, encryptedContent, ASN1_OCTET_STRING_NDEF, 0)
141} static_ASN1_NDEF_SEQUENCE_END(CMS_EncryptedContentInfo) 141} static_ASN1_NDEF_SEQUENCE_END(CMS_EncryptedContentInfo)
142 142
143ASN1_SEQUENCE(CMS_KeyTransRecipientInfo) = { 143ASN1_SEQUENCE(CMS_KeyTransRecipientInfo) = {
144 ASN1_EMBED(CMS_KeyTransRecipientInfo, version, INT32), 144 ASN1_EMBED(CMS_KeyTransRecipientInfo, version, INT32),
145 ASN1_SIMPLE(CMS_KeyTransRecipientInfo, rid, CMS_SignerIdentifier), 145 ASN1_SIMPLE(CMS_KeyTransRecipientInfo, rid, CMS_SignerIdentifier),
146 ASN1_SIMPLE(CMS_KeyTransRecipientInfo, keyEncryptionAlgorithm, X509_ALGOR), 146 ASN1_SIMPLE(CMS_KeyTransRecipientInfo, keyEncryptionAlgorithm, X509_ALGOR),
147 ASN1_SIMPLE(CMS_KeyTransRecipientInfo, encryptedKey, ASN1_OCTET_STRING) 147 ASN1_SIMPLE(CMS_KeyTransRecipientInfo, encryptedKey, ASN1_OCTET_STRING)
148} ASN1_SEQUENCE_END(CMS_KeyTransRecipientInfo) 148} ASN1_SEQUENCE_END(CMS_KeyTransRecipientInfo)
149 149
150ASN1_SEQUENCE(CMS_OtherKeyAttribute) = { 150ASN1_SEQUENCE(CMS_OtherKeyAttribute) = {
151 ASN1_SIMPLE(CMS_OtherKeyAttribute, keyAttrId, ASN1_OBJECT), 151 ASN1_SIMPLE(CMS_OtherKeyAttribute, keyAttrId, ASN1_OBJECT),
152 ASN1_OPT(CMS_OtherKeyAttribute, keyAttr, ASN1_ANY) 152 ASN1_OPT(CMS_OtherKeyAttribute, keyAttr, ASN1_ANY)
153} ASN1_SEQUENCE_END(CMS_OtherKeyAttribute) 153} ASN1_SEQUENCE_END(CMS_OtherKeyAttribute)
154 154
155ASN1_SEQUENCE(CMS_RecipientKeyIdentifier) = { 155ASN1_SEQUENCE(CMS_RecipientKeyIdentifier) = {
156 ASN1_SIMPLE(CMS_RecipientKeyIdentifier, subjectKeyIdentifier, ASN1_OCTET_STRING), 156 ASN1_SIMPLE(CMS_RecipientKeyIdentifier, subjectKeyIdentifier, ASN1_OCTET_STRING),
157 ASN1_OPT(CMS_RecipientKeyIdentifier, date, ASN1_GENERALIZEDTIME), 157 ASN1_OPT(CMS_RecipientKeyIdentifier, date, ASN1_GENERALIZEDTIME),
158 ASN1_OPT(CMS_RecipientKeyIdentifier, other, CMS_OtherKeyAttribute) 158 ASN1_OPT(CMS_RecipientKeyIdentifier, other, CMS_OtherKeyAttribute)
159} ASN1_SEQUENCE_END(CMS_RecipientKeyIdentifier) 159} ASN1_SEQUENCE_END(CMS_RecipientKeyIdentifier)
160 160
161ASN1_CHOICE(CMS_KeyAgreeRecipientIdentifier) = { 161ASN1_CHOICE(CMS_KeyAgreeRecipientIdentifier) = {
@@ -164,18 +164,18 @@ ASN1_CHOICE(CMS_KeyAgreeRecipientIdentifier) = {
164} static_ASN1_CHOICE_END(CMS_KeyAgreeRecipientIdentifier) 164} static_ASN1_CHOICE_END(CMS_KeyAgreeRecipientIdentifier)
165 165
166static int cms_rek_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, 166static int cms_rek_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
167 void *exarg) 167 void *exarg)
168{ 168{
169 CMS_RecipientEncryptedKey *rek = (CMS_RecipientEncryptedKey *)*pval; 169 CMS_RecipientEncryptedKey *rek = (CMS_RecipientEncryptedKey *)*pval;
170 if (operation == ASN1_OP_FREE_POST) { 170 if (operation == ASN1_OP_FREE_POST) {
171 EVP_PKEY_free(rek->pkey); 171 EVP_PKEY_free(rek->pkey);
172 } 172 }
173 return 1; 173 return 1;
174} 174}
175 175
176ASN1_SEQUENCE_cb(CMS_RecipientEncryptedKey, cms_rek_cb) = { 176ASN1_SEQUENCE_cb(CMS_RecipientEncryptedKey, cms_rek_cb) = {
177 ASN1_SIMPLE(CMS_RecipientEncryptedKey, rid, CMS_KeyAgreeRecipientIdentifier), 177 ASN1_SIMPLE(CMS_RecipientEncryptedKey, rid, CMS_KeyAgreeRecipientIdentifier),
178 ASN1_SIMPLE(CMS_RecipientEncryptedKey, encryptedKey, ASN1_OCTET_STRING) 178 ASN1_SIMPLE(CMS_RecipientEncryptedKey, encryptedKey, ASN1_OCTET_STRING)
179} ASN1_SEQUENCE_END_cb(CMS_RecipientEncryptedKey, CMS_RecipientEncryptedKey) 179} ASN1_SEQUENCE_END_cb(CMS_RecipientEncryptedKey, CMS_RecipientEncryptedKey)
180 180
181ASN1_SEQUENCE(CMS_OriginatorPublicKey) = { 181ASN1_SEQUENCE(CMS_OriginatorPublicKey) = {
@@ -190,48 +190,48 @@ ASN1_CHOICE(CMS_OriginatorIdentifierOrKey) = {
190} static_ASN1_CHOICE_END(CMS_OriginatorIdentifierOrKey) 190} static_ASN1_CHOICE_END(CMS_OriginatorIdentifierOrKey)
191 191
192static int cms_kari_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, 192static int cms_kari_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
193 void *exarg) 193 void *exarg)
194{ 194{
195 CMS_KeyAgreeRecipientInfo *kari = (CMS_KeyAgreeRecipientInfo *)*pval; 195 CMS_KeyAgreeRecipientInfo *kari = (CMS_KeyAgreeRecipientInfo *)*pval;
196 if (operation == ASN1_OP_NEW_POST) { 196 if (operation == ASN1_OP_NEW_POST) {
197 kari->ctx = EVP_CIPHER_CTX_new(); 197 kari->ctx = EVP_CIPHER_CTX_new();
198 if (kari->ctx == NULL) 198 if (kari->ctx == NULL)
199 return 0; 199 return 0;
200 EVP_CIPHER_CTX_set_flags(kari->ctx, EVP_CIPHER_CTX_FLAG_WRAP_ALLOW); 200 EVP_CIPHER_CTX_set_flags(kari->ctx, EVP_CIPHER_CTX_FLAG_WRAP_ALLOW);
201 kari->pctx = NULL; 201 kari->pctx = NULL;
202 } else if (operation == ASN1_OP_FREE_POST) { 202 } else if (operation == ASN1_OP_FREE_POST) {
203 EVP_PKEY_CTX_free(kari->pctx); 203 EVP_PKEY_CTX_free(kari->pctx);
204 EVP_CIPHER_CTX_free(kari->ctx); 204 EVP_CIPHER_CTX_free(kari->ctx);
205 } 205 }
206 return 1; 206 return 1;
207} 207}
208 208
209ASN1_SEQUENCE_cb(CMS_KeyAgreeRecipientInfo, cms_kari_cb) = { 209ASN1_SEQUENCE_cb(CMS_KeyAgreeRecipientInfo, cms_kari_cb) = {
210 ASN1_EMBED(CMS_KeyAgreeRecipientInfo, version, INT32), 210 ASN1_EMBED(CMS_KeyAgreeRecipientInfo, version, INT32),
211 ASN1_EXP(CMS_KeyAgreeRecipientInfo, originator, CMS_OriginatorIdentifierOrKey, 0), 211 ASN1_EXP(CMS_KeyAgreeRecipientInfo, originator, CMS_OriginatorIdentifierOrKey, 0),
212 ASN1_EXP_OPT(CMS_KeyAgreeRecipientInfo, ukm, ASN1_OCTET_STRING, 1), 212 ASN1_EXP_OPT(CMS_KeyAgreeRecipientInfo, ukm, ASN1_OCTET_STRING, 1),
213 ASN1_SIMPLE(CMS_KeyAgreeRecipientInfo, keyEncryptionAlgorithm, X509_ALGOR), 213 ASN1_SIMPLE(CMS_KeyAgreeRecipientInfo, keyEncryptionAlgorithm, X509_ALGOR),
214 ASN1_SEQUENCE_OF(CMS_KeyAgreeRecipientInfo, recipientEncryptedKeys, CMS_RecipientEncryptedKey) 214 ASN1_SEQUENCE_OF(CMS_KeyAgreeRecipientInfo, recipientEncryptedKeys, CMS_RecipientEncryptedKey)
215} ASN1_SEQUENCE_END_cb(CMS_KeyAgreeRecipientInfo, CMS_KeyAgreeRecipientInfo) 215} ASN1_SEQUENCE_END_cb(CMS_KeyAgreeRecipientInfo, CMS_KeyAgreeRecipientInfo)
216 216
217ASN1_SEQUENCE(CMS_KEKIdentifier) = { 217ASN1_SEQUENCE(CMS_KEKIdentifier) = {
218 ASN1_SIMPLE(CMS_KEKIdentifier, keyIdentifier, ASN1_OCTET_STRING), 218 ASN1_SIMPLE(CMS_KEKIdentifier, keyIdentifier, ASN1_OCTET_STRING),
219 ASN1_OPT(CMS_KEKIdentifier, date, ASN1_GENERALIZEDTIME), 219 ASN1_OPT(CMS_KEKIdentifier, date, ASN1_GENERALIZEDTIME),
220 ASN1_OPT(CMS_KEKIdentifier, other, CMS_OtherKeyAttribute) 220 ASN1_OPT(CMS_KEKIdentifier, other, CMS_OtherKeyAttribute)
221} static_ASN1_SEQUENCE_END(CMS_KEKIdentifier) 221} static_ASN1_SEQUENCE_END(CMS_KEKIdentifier)
222 222
223ASN1_SEQUENCE(CMS_KEKRecipientInfo) = { 223ASN1_SEQUENCE(CMS_KEKRecipientInfo) = {
224 ASN1_EMBED(CMS_KEKRecipientInfo, version, INT32), 224 ASN1_EMBED(CMS_KEKRecipientInfo, version, INT32),
225 ASN1_SIMPLE(CMS_KEKRecipientInfo, kekid, CMS_KEKIdentifier), 225 ASN1_SIMPLE(CMS_KEKRecipientInfo, kekid, CMS_KEKIdentifier),
226 ASN1_SIMPLE(CMS_KEKRecipientInfo, keyEncryptionAlgorithm, X509_ALGOR), 226 ASN1_SIMPLE(CMS_KEKRecipientInfo, keyEncryptionAlgorithm, X509_ALGOR),
227 ASN1_SIMPLE(CMS_KEKRecipientInfo, encryptedKey, ASN1_OCTET_STRING) 227 ASN1_SIMPLE(CMS_KEKRecipientInfo, encryptedKey, ASN1_OCTET_STRING)
228} ASN1_SEQUENCE_END(CMS_KEKRecipientInfo) 228} ASN1_SEQUENCE_END(CMS_KEKRecipientInfo)
229 229
230ASN1_SEQUENCE(CMS_PasswordRecipientInfo) = { 230ASN1_SEQUENCE(CMS_PasswordRecipientInfo) = {
231 ASN1_EMBED(CMS_PasswordRecipientInfo, version, INT32), 231 ASN1_EMBED(CMS_PasswordRecipientInfo, version, INT32),
232 ASN1_IMP_OPT(CMS_PasswordRecipientInfo, keyDerivationAlgorithm, X509_ALGOR, 0), 232 ASN1_IMP_OPT(CMS_PasswordRecipientInfo, keyDerivationAlgorithm, X509_ALGOR, 0),
233 ASN1_SIMPLE(CMS_PasswordRecipientInfo, keyEncryptionAlgorithm, X509_ALGOR), 233 ASN1_SIMPLE(CMS_PasswordRecipientInfo, keyEncryptionAlgorithm, X509_ALGOR),
234 ASN1_SIMPLE(CMS_PasswordRecipientInfo, encryptedKey, ASN1_OCTET_STRING) 234 ASN1_SIMPLE(CMS_PasswordRecipientInfo, encryptedKey, ASN1_OCTET_STRING)
235} ASN1_SEQUENCE_END(CMS_PasswordRecipientInfo) 235} ASN1_SEQUENCE_END(CMS_PasswordRecipientInfo)
236 236
237ASN1_SEQUENCE(CMS_OtherRecipientInfo) = { 237ASN1_SEQUENCE(CMS_OtherRecipientInfo) = {
@@ -241,71 +241,71 @@ ASN1_SEQUENCE(CMS_OtherRecipientInfo) = {
241 241
242/* Free up RecipientInfo additional data */ 242/* Free up RecipientInfo additional data */
243static int cms_ri_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, 243static int cms_ri_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
244 void *exarg) 244 void *exarg)
245{ 245{
246 if (operation == ASN1_OP_FREE_PRE) { 246 if (operation == ASN1_OP_FREE_PRE) {
247 CMS_RecipientInfo *ri = (CMS_RecipientInfo *)*pval; 247 CMS_RecipientInfo *ri = (CMS_RecipientInfo *)*pval;
248 if (ri->type == CMS_RECIPINFO_TRANS) { 248 if (ri->type == CMS_RECIPINFO_TRANS) {
249 CMS_KeyTransRecipientInfo *ktri = ri->d.ktri; 249 CMS_KeyTransRecipientInfo *ktri = ri->d.ktri;
250 EVP_PKEY_free(ktri->pkey); 250 EVP_PKEY_free(ktri->pkey);
251 X509_free(ktri->recip); 251 X509_free(ktri->recip);
252 EVP_PKEY_CTX_free(ktri->pctx); 252 EVP_PKEY_CTX_free(ktri->pctx);
253 } else if (ri->type == CMS_RECIPINFO_KEK) { 253 } else if (ri->type == CMS_RECIPINFO_KEK) {
254 CMS_KEKRecipientInfo *kekri = ri->d.kekri; 254 CMS_KEKRecipientInfo *kekri = ri->d.kekri;
255 OPENSSL_clear_free(kekri->key, kekri->keylen); 255 OPENSSL_clear_free(kekri->key, kekri->keylen);
256 } else if (ri->type == CMS_RECIPINFO_PASS) { 256 } else if (ri->type == CMS_RECIPINFO_PASS) {
257 CMS_PasswordRecipientInfo *pwri = ri->d.pwri; 257 CMS_PasswordRecipientInfo *pwri = ri->d.pwri;
258 OPENSSL_clear_free(pwri->pass, pwri->passlen); 258 OPENSSL_clear_free(pwri->pass, pwri->passlen);
259 } 259 }
260 } 260 }
261 return 1; 261 return 1;
262} 262}
263 263
264ASN1_CHOICE_cb(CMS_RecipientInfo, cms_ri_cb) = { 264ASN1_CHOICE_cb(CMS_RecipientInfo, cms_ri_cb) = {
265 ASN1_SIMPLE(CMS_RecipientInfo, d.ktri, CMS_KeyTransRecipientInfo), 265 ASN1_SIMPLE(CMS_RecipientInfo, d.ktri, CMS_KeyTransRecipientInfo),
266 ASN1_IMP(CMS_RecipientInfo, d.kari, CMS_KeyAgreeRecipientInfo, 1), 266 ASN1_IMP(CMS_RecipientInfo, d.kari, CMS_KeyAgreeRecipientInfo, 1),
267 ASN1_IMP(CMS_RecipientInfo, d.kekri, CMS_KEKRecipientInfo, 2), 267 ASN1_IMP(CMS_RecipientInfo, d.kekri, CMS_KEKRecipientInfo, 2),
268 ASN1_IMP(CMS_RecipientInfo, d.pwri, CMS_PasswordRecipientInfo, 3), 268 ASN1_IMP(CMS_RecipientInfo, d.pwri, CMS_PasswordRecipientInfo, 3),
269 ASN1_IMP(CMS_RecipientInfo, d.ori, CMS_OtherRecipientInfo, 4) 269 ASN1_IMP(CMS_RecipientInfo, d.ori, CMS_OtherRecipientInfo, 4)
270} ASN1_CHOICE_END_cb(CMS_RecipientInfo, CMS_RecipientInfo, type) 270} ASN1_CHOICE_END_cb(CMS_RecipientInfo, CMS_RecipientInfo, type)
271 271
272ASN1_NDEF_SEQUENCE(CMS_EnvelopedData) = { 272ASN1_NDEF_SEQUENCE(CMS_EnvelopedData) = {
273 ASN1_EMBED(CMS_EnvelopedData, version, INT32), 273 ASN1_EMBED(CMS_EnvelopedData, version, INT32),
274 ASN1_IMP_OPT(CMS_EnvelopedData, originatorInfo, CMS_OriginatorInfo, 0), 274 ASN1_IMP_OPT(CMS_EnvelopedData, originatorInfo, CMS_OriginatorInfo, 0),
275 ASN1_SET_OF(CMS_EnvelopedData, recipientInfos, CMS_RecipientInfo), 275 ASN1_SET_OF(CMS_EnvelopedData, recipientInfos, CMS_RecipientInfo),
276 ASN1_SIMPLE(CMS_EnvelopedData, encryptedContentInfo, CMS_EncryptedContentInfo), 276 ASN1_SIMPLE(CMS_EnvelopedData, encryptedContentInfo, CMS_EncryptedContentInfo),
277 ASN1_IMP_SET_OF_OPT(CMS_EnvelopedData, unprotectedAttrs, X509_ATTRIBUTE, 1) 277 ASN1_IMP_SET_OF_OPT(CMS_EnvelopedData, unprotectedAttrs, X509_ATTRIBUTE, 1)
278} ASN1_NDEF_SEQUENCE_END(CMS_EnvelopedData) 278} ASN1_NDEF_SEQUENCE_END(CMS_EnvelopedData)
279 279
280ASN1_NDEF_SEQUENCE(CMS_DigestedData) = { 280ASN1_NDEF_SEQUENCE(CMS_DigestedData) = {
281 ASN1_EMBED(CMS_DigestedData, version, INT32), 281 ASN1_EMBED(CMS_DigestedData, version, INT32),
282 ASN1_SIMPLE(CMS_DigestedData, digestAlgorithm, X509_ALGOR), 282 ASN1_SIMPLE(CMS_DigestedData, digestAlgorithm, X509_ALGOR),
283 ASN1_SIMPLE(CMS_DigestedData, encapContentInfo, CMS_EncapsulatedContentInfo), 283 ASN1_SIMPLE(CMS_DigestedData, encapContentInfo, CMS_EncapsulatedContentInfo),
284 ASN1_SIMPLE(CMS_DigestedData, digest, ASN1_OCTET_STRING) 284 ASN1_SIMPLE(CMS_DigestedData, digest, ASN1_OCTET_STRING)
285} ASN1_NDEF_SEQUENCE_END(CMS_DigestedData) 285} ASN1_NDEF_SEQUENCE_END(CMS_DigestedData)
286 286
287ASN1_NDEF_SEQUENCE(CMS_EncryptedData) = { 287ASN1_NDEF_SEQUENCE(CMS_EncryptedData) = {
288 ASN1_EMBED(CMS_EncryptedData, version, INT32), 288 ASN1_EMBED(CMS_EncryptedData, version, INT32),
289 ASN1_SIMPLE(CMS_EncryptedData, encryptedContentInfo, CMS_EncryptedContentInfo), 289 ASN1_SIMPLE(CMS_EncryptedData, encryptedContentInfo, CMS_EncryptedContentInfo),
290 ASN1_IMP_SET_OF_OPT(CMS_EncryptedData, unprotectedAttrs, X509_ATTRIBUTE, 1) 290 ASN1_IMP_SET_OF_OPT(CMS_EncryptedData, unprotectedAttrs, X509_ATTRIBUTE, 1)
291} ASN1_NDEF_SEQUENCE_END(CMS_EncryptedData) 291} ASN1_NDEF_SEQUENCE_END(CMS_EncryptedData)
292 292
293ASN1_NDEF_SEQUENCE(CMS_AuthenticatedData) = { 293ASN1_NDEF_SEQUENCE(CMS_AuthenticatedData) = {
294 ASN1_EMBED(CMS_AuthenticatedData, version, INT32), 294 ASN1_EMBED(CMS_AuthenticatedData, version, INT32),
295 ASN1_IMP_OPT(CMS_AuthenticatedData, originatorInfo, CMS_OriginatorInfo, 0), 295 ASN1_IMP_OPT(CMS_AuthenticatedData, originatorInfo, CMS_OriginatorInfo, 0),
296 ASN1_SET_OF(CMS_AuthenticatedData, recipientInfos, CMS_RecipientInfo), 296 ASN1_SET_OF(CMS_AuthenticatedData, recipientInfos, CMS_RecipientInfo),
297 ASN1_SIMPLE(CMS_AuthenticatedData, macAlgorithm, X509_ALGOR), 297 ASN1_SIMPLE(CMS_AuthenticatedData, macAlgorithm, X509_ALGOR),
298 ASN1_IMP(CMS_AuthenticatedData, digestAlgorithm, X509_ALGOR, 1), 298 ASN1_IMP(CMS_AuthenticatedData, digestAlgorithm, X509_ALGOR, 1),
299 ASN1_SIMPLE(CMS_AuthenticatedData, encapContentInfo, CMS_EncapsulatedContentInfo), 299 ASN1_SIMPLE(CMS_AuthenticatedData, encapContentInfo, CMS_EncapsulatedContentInfo),
300 ASN1_IMP_SET_OF_OPT(CMS_AuthenticatedData, authAttrs, X509_ALGOR, 2), 300 ASN1_IMP_SET_OF_OPT(CMS_AuthenticatedData, authAttrs, X509_ALGOR, 2),
301 ASN1_SIMPLE(CMS_AuthenticatedData, mac, ASN1_OCTET_STRING), 301 ASN1_SIMPLE(CMS_AuthenticatedData, mac, ASN1_OCTET_STRING),
302 ASN1_IMP_SET_OF_OPT(CMS_AuthenticatedData, unauthAttrs, X509_ALGOR, 3) 302 ASN1_IMP_SET_OF_OPT(CMS_AuthenticatedData, unauthAttrs, X509_ALGOR, 3)
303} static_ASN1_NDEF_SEQUENCE_END(CMS_AuthenticatedData) 303} static_ASN1_NDEF_SEQUENCE_END(CMS_AuthenticatedData)
304 304
305ASN1_NDEF_SEQUENCE(CMS_CompressedData) = { 305ASN1_NDEF_SEQUENCE(CMS_CompressedData) = {
306 ASN1_EMBED(CMS_CompressedData, version, INT32), 306 ASN1_EMBED(CMS_CompressedData, version, INT32),
307 ASN1_SIMPLE(CMS_CompressedData, compressionAlgorithm, X509_ALGOR), 307 ASN1_SIMPLE(CMS_CompressedData, compressionAlgorithm, X509_ALGOR),
308 ASN1_SIMPLE(CMS_CompressedData, encapContentInfo, CMS_EncapsulatedContentInfo), 308 ASN1_SIMPLE(CMS_CompressedData, encapContentInfo, CMS_EncapsulatedContentInfo),
309} ASN1_NDEF_SEQUENCE_END(CMS_CompressedData) 309} ASN1_NDEF_SEQUENCE_END(CMS_CompressedData)
310 310
311/* This is the ANY DEFINED BY table for the top level ContentInfo structure */ 311/* This is the ANY DEFINED BY table for the top level ContentInfo structure */
@@ -313,50 +313,50 @@ ASN1_NDEF_SEQUENCE(CMS_CompressedData) = {
313ASN1_ADB_TEMPLATE(cms_default) = ASN1_EXP(CMS_ContentInfo, d.other, ASN1_ANY, 0); 313ASN1_ADB_TEMPLATE(cms_default) = ASN1_EXP(CMS_ContentInfo, d.other, ASN1_ANY, 0);
314 314
315ASN1_ADB(CMS_ContentInfo) = { 315ASN1_ADB(CMS_ContentInfo) = {
316 ADB_ENTRY(NID_pkcs7_data, ASN1_NDEF_EXP(CMS_ContentInfo, d.data, ASN1_OCTET_STRING_NDEF, 0)), 316 ADB_ENTRY(NID_pkcs7_data, ASN1_NDEF_EXP(CMS_ContentInfo, d.data, ASN1_OCTET_STRING_NDEF, 0)),
317 ADB_ENTRY(NID_pkcs7_signed, ASN1_NDEF_EXP(CMS_ContentInfo, d.signedData, CMS_SignedData, 0)), 317 ADB_ENTRY(NID_pkcs7_signed, ASN1_NDEF_EXP(CMS_ContentInfo, d.signedData, CMS_SignedData, 0)),
318 ADB_ENTRY(NID_pkcs7_enveloped, ASN1_NDEF_EXP(CMS_ContentInfo, d.envelopedData, CMS_EnvelopedData, 0)), 318 ADB_ENTRY(NID_pkcs7_enveloped, ASN1_NDEF_EXP(CMS_ContentInfo, d.envelopedData, CMS_EnvelopedData, 0)),
319 ADB_ENTRY(NID_pkcs7_digest, ASN1_NDEF_EXP(CMS_ContentInfo, d.digestedData, CMS_DigestedData, 0)), 319 ADB_ENTRY(NID_pkcs7_digest, ASN1_NDEF_EXP(CMS_ContentInfo, d.digestedData, CMS_DigestedData, 0)),
320 ADB_ENTRY(NID_pkcs7_encrypted, ASN1_NDEF_EXP(CMS_ContentInfo, d.encryptedData, CMS_EncryptedData, 0)), 320 ADB_ENTRY(NID_pkcs7_encrypted, ASN1_NDEF_EXP(CMS_ContentInfo, d.encryptedData, CMS_EncryptedData, 0)),
321 ADB_ENTRY(NID_id_smime_ct_authData, ASN1_NDEF_EXP(CMS_ContentInfo, d.authenticatedData, CMS_AuthenticatedData, 0)), 321 ADB_ENTRY(NID_id_smime_ct_authData, ASN1_NDEF_EXP(CMS_ContentInfo, d.authenticatedData, CMS_AuthenticatedData, 0)),
322 ADB_ENTRY(NID_id_smime_ct_compressedData, ASN1_NDEF_EXP(CMS_ContentInfo, d.compressedData, CMS_CompressedData, 0)), 322 ADB_ENTRY(NID_id_smime_ct_compressedData, ASN1_NDEF_EXP(CMS_ContentInfo, d.compressedData, CMS_CompressedData, 0)),
323} ASN1_ADB_END(CMS_ContentInfo, 0, contentType, 0, &cms_default_tt, NULL); 323} ASN1_ADB_END(CMS_ContentInfo, 0, contentType, 0, &cms_default_tt, NULL);
324 324
325/* CMS streaming support */ 325/* CMS streaming support */
326static int cms_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it, 326static int cms_cb(int operation, ASN1_VALUE **pval, const ASN1_ITEM *it,
327 void *exarg) 327 void *exarg)
328{ 328{
329 ASN1_STREAM_ARG *sarg = exarg; 329 ASN1_STREAM_ARG *sarg = exarg;
330 CMS_ContentInfo *cms = NULL; 330 CMS_ContentInfo *cms = NULL;
331 if (pval) 331 if (pval)
332 cms = (CMS_ContentInfo *)*pval; 332 cms = (CMS_ContentInfo *)*pval;
333 else 333 else
334 return 1; 334 return 1;
335 switch (operation) { 335 switch (operation) {
336 336
337 case ASN1_OP_STREAM_PRE: 337 case ASN1_OP_STREAM_PRE:
338 if (CMS_stream(&sarg->boundary, cms) <= 0) 338 if (CMS_stream(&sarg->boundary, cms) <= 0)
339 return 0; 339 return 0;
340 /* fall thru */ 340 /* fall thru */
341 case ASN1_OP_DETACHED_PRE: 341 case ASN1_OP_DETACHED_PRE:
342 sarg->ndef_bio = CMS_dataInit(cms, sarg->out); 342 sarg->ndef_bio = CMS_dataInit(cms, sarg->out);
343 if (!sarg->ndef_bio) 343 if (!sarg->ndef_bio)
344 return 0; 344 return 0;
345 break; 345 break;
346 346
347 case ASN1_OP_STREAM_POST: 347 case ASN1_OP_STREAM_POST:
348 case ASN1_OP_DETACHED_POST: 348 case ASN1_OP_DETACHED_POST:
349 if (CMS_dataFinal(cms, sarg->ndef_bio) <= 0) 349 if (CMS_dataFinal(cms, sarg->ndef_bio) <= 0)
350 return 0; 350 return 0;
351 break; 351 break;
352 352
353 } 353 }
354 return 1; 354 return 1;
355} 355}
356 356
357ASN1_NDEF_SEQUENCE_cb(CMS_ContentInfo, cms_cb) = { 357ASN1_NDEF_SEQUENCE_cb(CMS_ContentInfo, cms_cb) = {
358 ASN1_SIMPLE(CMS_ContentInfo, contentType, ASN1_OBJECT), 358 ASN1_SIMPLE(CMS_ContentInfo, contentType, ASN1_OBJECT),
359 ASN1_ADB_OBJECT(CMS_ContentInfo) 359 ASN1_ADB_OBJECT(CMS_ContentInfo)
360} ASN1_NDEF_SEQUENCE_END_cb(CMS_ContentInfo, CMS_ContentInfo) 360} ASN1_NDEF_SEQUENCE_END_cb(CMS_ContentInfo, CMS_ContentInfo)
361 361
362/* Specials for signed attributes */ 362/* Specials for signed attributes */
@@ -367,7 +367,7 @@ ASN1_NDEF_SEQUENCE_cb(CMS_ContentInfo, cms_cb) = {
367 */ 367 */
368 368
369ASN1_ITEM_TEMPLATE(CMS_Attributes_Sign) = 369ASN1_ITEM_TEMPLATE(CMS_Attributes_Sign) =
370 ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SET_ORDER, 0, CMS_ATTRIBUTES, X509_ATTRIBUTE) 370 ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SET_ORDER, 0, CMS_ATTRIBUTES, X509_ATTRIBUTE)
371ASN1_ITEM_TEMPLATE_END(CMS_Attributes_Sign) 371ASN1_ITEM_TEMPLATE_END(CMS_Attributes_Sign)
372 372
373/* 373/*
@@ -376,8 +376,8 @@ ASN1_ITEM_TEMPLATE_END(CMS_Attributes_Sign)
376 */ 376 */
377 377
378ASN1_ITEM_TEMPLATE(CMS_Attributes_Verify) = 378ASN1_ITEM_TEMPLATE(CMS_Attributes_Verify) =
379 ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_IMPTAG | ASN1_TFLG_UNIVERSAL, 379 ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_IMPTAG | ASN1_TFLG_UNIVERSAL,
380 V_ASN1_SET, CMS_ATTRIBUTES, X509_ATTRIBUTE) 380 V_ASN1_SET, CMS_ATTRIBUTES, X509_ATTRIBUTE)
381ASN1_ITEM_TEMPLATE_END(CMS_Attributes_Verify) 381ASN1_ITEM_TEMPLATE_END(CMS_Attributes_Verify)
382 382
383 383
@@ -406,9 +406,9 @@ ASN1_SEQUENCE(CMS_Receipt) = {
406 */ 406 */
407 407
408typedef struct { 408typedef struct {
409 X509_ALGOR *keyInfo; 409 X509_ALGOR *keyInfo;
410 ASN1_OCTET_STRING *entityUInfo; 410 ASN1_OCTET_STRING *entityUInfo;
411 ASN1_OCTET_STRING *suppPubInfo; 411 ASN1_OCTET_STRING *suppPubInfo;
412} CMS_SharedInfo; 412} CMS_SharedInfo;
413 413
414ASN1_SEQUENCE(CMS_SharedInfo) = { 414ASN1_SEQUENCE(CMS_SharedInfo) = {
@@ -418,31 +418,31 @@ ASN1_SEQUENCE(CMS_SharedInfo) = {
418} static_ASN1_SEQUENCE_END(CMS_SharedInfo) 418} static_ASN1_SEQUENCE_END(CMS_SharedInfo)
419 419
420int CMS_SharedInfo_encode(unsigned char **pder, X509_ALGOR *kekalg, 420int CMS_SharedInfo_encode(unsigned char **pder, X509_ALGOR *kekalg,
421 ASN1_OCTET_STRING *ukm, int keylen) 421 ASN1_OCTET_STRING *ukm, int keylen)
422{ 422{
423 union { 423 union {
424 CMS_SharedInfo *pecsi; 424 CMS_SharedInfo *pecsi;
425 ASN1_VALUE *a; 425 ASN1_VALUE *a;
426 } intsi = { 426 } intsi = {
427 NULL 427 NULL
428 }; 428 };
429 429
430 ASN1_OCTET_STRING oklen; 430 ASN1_OCTET_STRING oklen;
431 unsigned char kl[4]; 431 unsigned char kl[4];
432 CMS_SharedInfo ecsi; 432 CMS_SharedInfo ecsi;
433 433
434 keylen <<= 3; 434 keylen <<= 3;
435 kl[0] = (keylen >> 24) & 0xff; 435 kl[0] = (keylen >> 24) & 0xff;
436 kl[1] = (keylen >> 16) & 0xff; 436 kl[1] = (keylen >> 16) & 0xff;
437 kl[2] = (keylen >> 8) & 0xff; 437 kl[2] = (keylen >> 8) & 0xff;
438 kl[3] = keylen & 0xff; 438 kl[3] = keylen & 0xff;
439 oklen.length = 4; 439 oklen.length = 4;
440 oklen.data = kl; 440 oklen.data = kl;
441 oklen.type = V_ASN1_OCTET_STRING; 441 oklen.type = V_ASN1_OCTET_STRING;
442 oklen.flags = 0; 442 oklen.flags = 0;
443 ecsi.keyInfo = kekalg; 443 ecsi.keyInfo = kekalg;
444 ecsi.entityUInfo = ukm; 444 ecsi.entityUInfo = ukm;
445 ecsi.suppPubInfo = &oklen; 445 ecsi.suppPubInfo = &oklen;
446 intsi.pecsi = &ecsi; 446 intsi.pecsi = &ecsi;
447 return ASN1_item_i2d(intsi.a, pder, ASN1_ITEM_rptr(CMS_SharedInfo)); 447 return ASN1_item_i2d(intsi.a, pder, ASN1_ITEM_rptr(CMS_SharedInfo));
448} 448}