First public contribution.
2 * Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
4 * This component and the accompanying materials are made available
5 * under the terms of the License "Eclipse Public License v1.0"
6 * which accompanies this distribution, and is available
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
9 * Initial Contributors:
10 * Nokia Corporation - initial contribution.
19 #include <cmscontentinfo.h>
22 #include "pkcs7asn1.h"
26 //Implementation of CMS ContentInfo Identity
29 EXPORT_C CCmsContentInfo* CCmsContentInfo::NewLC(const TDesC8& aRawData)
31 CCmsContentInfo* self = new (ELeave) CCmsContentInfo();
32 CleanupStack::PushL(self);
33 self->ConstructL(aRawData);
37 EXPORT_C CCmsContentInfo* CCmsContentInfo::NewL(const TDesC8& aRawData)
39 CCmsContentInfo* self = NewLC(aRawData);
40 CleanupStack::Pop(self);
44 EXPORT_C CCmsContentInfo* CCmsContentInfo::NewL(TCmsContentInfoType aContentInfoType, const TDesC8& aContentData)
46 CCmsContentInfo* self = NewLC(aContentInfoType, aContentData);
47 CleanupStack::Pop(self);
51 EXPORT_C CCmsContentInfo* CCmsContentInfo::NewLC(TCmsContentInfoType aContentInfoType, const TDesC8& aContentData)
53 CCmsContentInfo* self = new (ELeave) CCmsContentInfo(aContentInfoType, aContentData);
54 CleanupStack::PushL(self);
58 EXPORT_C CCmsContentInfo::~CCmsContentInfo()
62 CCmsContentInfo::CCmsContentInfo()
66 CCmsContentInfo::CCmsContentInfo(TCmsContentInfoType aContentInfoType, const TDesC8& aContentData)
67 :iContentType(aContentInfoType)
69 iContentData.Set(aContentData);
72 void CCmsContentInfo::ConstructL(const TDesC8& aRawData)
74 const TInt minItems = 2; // Must have OID
75 const TInt maxItems = 2; // Must have data
76 CArrayPtr<TASN1DecGeneric>* contentInfo = PKCS7ASN1::DecodeSequenceLC(aRawData, minItems, maxItems);
79 iContentType=(TCmsContentInfoType)(CmsUtils::DecodeContentTypeL(contentInfo->At(0)));
82 const TASN1DecGeneric* contentInfoAt1 = contentInfo->At(1);
83 if ( contentInfoAt1->Tag() == 0 || contentInfoAt1->Class() == EContextSpecific )
85 TASN1DecGeneric decGen(contentInfoAt1->GetContentDER());
87 if (iContentType==EContentTypeData)
89 if (decGen.Tag()!=EASN1OctetString || decGen.Class()!=EUniversal)
91 User::Leave(KErrArgument);
95 iContentData.Set(decGen.GetContentDER());
100 iContentData.Set(decGen.Encoding());
105 User::Leave(KErrArgument);
108 CleanupStack::PopAndDestroy(contentInfo);
111 EXPORT_C CASN1EncSequence* CCmsContentInfo::EncodeASN1DERLC() const
113 // the root sequence contains the OID and the content data
114 CASN1EncSequence* root = CASN1EncSequence::NewLC();
117 CASN1EncObjectIdentifier* oid = CmsUtils::EncodeContentTypeLC(iContentType);
118 root->AddAndPopChildL(oid);
120 CASN1EncBase* enc(NULL);
121 if (iContentType==EContentTypeData)
123 enc=CASN1EncOctetString::NewL(iContentData);
128 //iContentData already encoded in sequence
129 //so just rebuild the structure
130 enc = CASN1EncEncoding::NewL(iContentData);
133 CASN1EncExplicitTag* Enc=CASN1EncExplicitTag::NewLC(enc, 0);
134 root->AddAndPopChildL(Enc);
139 EXPORT_C const TPtrC8 CCmsContentInfo::ContentData() const
144 EXPORT_C TCmsContentInfoType CCmsContentInfo::ContentType() const
151 //Implementation of CMS EncapsulatedContentInfo Identity
153 CEncapsulatedContentInfo* CEncapsulatedContentInfo::NewLC(const TDesC8& aRawData)
155 CEncapsulatedContentInfo* self = new (ELeave) CEncapsulatedContentInfo();
156 CleanupStack::PushL(self);
157 self->ConstructL(aRawData);
161 CEncapsulatedContentInfo* CEncapsulatedContentInfo::NewL(const TDesC8& aRawData)
163 CEncapsulatedContentInfo* self = NewLC(aRawData);
164 CleanupStack::Pop(self);
168 CEncapsulatedContentInfo* CEncapsulatedContentInfo::NewLC(TCmsContentInfoType aContentInfoType, TBool aIsEContentDataPresent, const TDesC8& aContentData)
170 CEncapsulatedContentInfo* self = new (ELeave) CEncapsulatedContentInfo(aContentInfoType, aIsEContentDataPresent, aContentData);
171 CleanupStack::PushL(self);
175 CEncapsulatedContentInfo* CEncapsulatedContentInfo::NewL(TCmsContentInfoType aContentInfoType, TBool aIsEContentDataPresent, const TDesC8& aContentData)
177 CEncapsulatedContentInfo* self = NewLC(aContentInfoType, aIsEContentDataPresent, aContentData);
178 CleanupStack::Pop(self);
182 CEncapsulatedContentInfo::CEncapsulatedContentInfo()
186 CEncapsulatedContentInfo::CEncapsulatedContentInfo(TCmsContentInfoType aContentInfoType, TBool aIsEContentDataPresent, const TDesC8& aContentData)
187 :iContentType(aContentInfoType),
188 iIsContentDataPresent(aIsEContentDataPresent)
190 if (aIsEContentDataPresent)
192 iContentData.Set(aContentData);
196 void CEncapsulatedContentInfo::ConstructL(const TDesC8& aRawData)
198 const TInt minItems = 1; // Must have OID
199 const TInt maxItems = 2; // Must have data
200 CArrayPtr<TASN1DecGeneric>* contentInfo = PKCS7ASN1::DecodeSequenceLC(aRawData, minItems, maxItems);
202 //Decode Content Type
203 iContentType=(TCmsContentInfoType)(CmsUtils::DecodeContentTypeL(contentInfo->At(0)));
205 //Decode Content Data
206 if(contentInfo->Count() == 2)
208 iIsContentDataPresent=ETrue;
209 const TASN1DecGeneric* contentInfoAt1 = contentInfo->At(1);
211 //Decode [0] Explicit
212 if ( contentInfoAt1->Tag() == 0 || contentInfoAt1->Class() == EContextSpecific )
214 //Decode Wrapper Octet string
215 TASN1DecGeneric decGen(contentInfoAt1->GetContentDER());
217 if(decGen.Tag() == EASN1OctetString && decGen.Class() == EUniversal)
219 iContentData.Set(decGen.GetContentDER());
223 //Wrapper is not an Octect String
224 User::Leave(KErrArgument);
230 User::Leave(KErrArgument);
236 iContentData.Set(KNullDesC8());
238 CleanupStack::PopAndDestroy(contentInfo);
242 CASN1EncSequence* CEncapsulatedContentInfo::EncodeASN1DERLC() const
244 // the root sequence contains the OID and the content data
245 CASN1EncSequence* root = CASN1EncSequence::NewLC();
248 CASN1EncObjectIdentifier* oid = CmsUtils::EncodeContentTypeLC(iContentType);
249 root->AddAndPopChildL(oid);
252 if (iIsContentDataPresent)
254 //Wrapper Octect String
255 CASN1EncOctetString* octetString=CASN1EncOctetString::NewL(iContentData);
258 CASN1EncExplicitTag* Enc=CASN1EncExplicitTag::NewLC(octetString, 0);
259 root->AddAndPopChildL(Enc);
266 EXPORT_C TBool CEncapsulatedContentInfo::IsContentDataPresent() const
268 return iIsContentDataPresent;
271 EXPORT_C const TPtrC8 CEncapsulatedContentInfo::ContentData() const
276 EXPORT_C TCmsContentInfoType CEncapsulatedContentInfo::ContentType() const