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 <cmscertchoice.h>
20 #include "pkcs7asn1.h"
26 //Implementation of CMS Certificate Choice
28 CCmsCertificateChoice* CCmsCertificateChoice::NewL(const TDesC8& aRawData)
30 CCmsCertificateChoice* self = new (ELeave) CCmsCertificateChoice();
31 CleanupStack::PushL(self);
32 self->ConstructL(aRawData);
33 CleanupStack::Pop(self);
37 CCmsCertificateChoice::~CCmsCertificateChoice()
40 delete iEncodedAttributeCertificate;
43 CCmsCertificateChoice::CCmsCertificateChoice()
47 void CCmsCertificateChoice::ConstructL(const TDesC8& aRawData)
49 TASN1DecGeneric decGen(aRawData);
52 if (decGen.Tag()==EASN1Sequence && decGen.Class()==EUniversal)
55 iCertificateType=ECertificateX509;
56 iCertificate = CX509Certificate::NewL(aRawData);
58 else if (decGen.Tag()==1 && decGen.Class()==EContextSpecific)
60 // Attribute certificate
61 iCertificateType=ECertificateAttribute;
62 CASN1EncEncoding* enc=CASN1EncEncoding::NewLC(aRawData, EASN1Sequence, EUniversal);
63 iEncodedAttributeCertificate=CmsUtils::CreateDEREncodingLC(*enc);
64 CleanupStack::Pop(iEncodedAttributeCertificate);
65 CleanupStack::PopAndDestroy(enc);
67 else if (decGen.Tag()==0 && decGen.Class()==EContextSpecific)
69 // extended certificates not supported
70 iCertificateType=ECertificateExtendedCerificate;
71 User::Leave(KErrNotSupported);
75 User::Leave(KErrArgument);
79 EXPORT_C const CX509Certificate& CCmsCertificateChoice::Certificate(void) const
84 CCmsCertificateChoice* CCmsCertificateChoice::NewLC(const CX509Certificate& aCertificate)
86 CCmsCertificateChoice* self = new (ELeave) CCmsCertificateChoice();
87 CleanupStack::PushL(self);
88 self->ConstructL(aCertificate);
92 CCmsCertificateChoice* CCmsCertificateChoice::NewL(const CX509Certificate& aCertificate)
94 CCmsCertificateChoice* self = CCmsCertificateChoice::NewLC(aCertificate);
100 CCmsCertificateChoice* CCmsCertificateChoice::NewLC(TCertificateType aCertType, const TDesC8& aEncodedCertificate)
102 CCmsCertificateChoice* self = new (ELeave) CCmsCertificateChoice();
103 CleanupStack::PushL(self);
104 self->ConstructL(aCertType, aEncodedCertificate);
108 CCmsCertificateChoice* CCmsCertificateChoice::NewL(TCertificateType aCertType, const TDesC8& aEncodedCertificate)
110 CCmsCertificateChoice* self = CCmsCertificateChoice::NewLC(aCertType, aEncodedCertificate);
115 void CCmsCertificateChoice::ConstructL(const CX509Certificate& aCertificate)
117 iCertificateType=ECertificateX509;
118 iCertificate=CX509Certificate::NewL(aCertificate);
121 void CCmsCertificateChoice::ConstructL(TCertificateType aCertType, const TDesC8& aEncodedCertificate)
123 iCertificateType=aCertType;
124 if (aCertType==ECertificateAttribute)
126 iEncodedAttributeCertificate=aEncodedCertificate.AllocL();
128 else if (aCertType==ECertificateX509)
130 iCertificate=CX509Certificate::NewL(aEncodedCertificate);
134 User::Leave(KErrNotSupported);
139 EXPORT_C const HBufC8* CCmsCertificateChoice::AttributeCertificate() const
141 return iEncodedAttributeCertificate;
144 CASN1EncEncoding* CCmsCertificateChoice::EncodeASN1DERLC() const
146 CASN1EncEncoding* enc(NULL);
147 if (iCertificateType==ECertificateX509)
149 enc=CASN1EncEncoding::NewLC(iCertificate->Encoding());
151 else if (iCertificateType==ECertificateAttribute)
153 TASN1DecGeneric decGen(*iEncodedAttributeCertificate);
155 if (decGen.Tag()!=EASN1Sequence)
157 User::Leave(KErrArgument);
159 enc=CASN1EncEncoding::NewLC(*iEncodedAttributeCertificate, 1, EContextSpecific);
163 //Extended Certificate
164 User::Leave(KErrNotSupported);
169 EXPORT_C CCmsCertificateChoice::TCertificateType CCmsCertificateChoice::CertificateType()
171 return iCertificateType;