diff -r 000000000000 -r 2c201484c85f cryptoservices/certificateandkeymgmt/pkcs7/cmscontentinfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cryptoservices/certificateandkeymgmt/pkcs7/cmscontentinfo.cpp Wed Jul 08 11:25:26 2009 +0100 @@ -0,0 +1,279 @@ +/* +* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include +#include +#include +#include "pkcs7asn1.h" +#include "cmsutils.h" + +// +//Implementation of CMS ContentInfo Identity +// + +EXPORT_C CCmsContentInfo* CCmsContentInfo::NewLC(const TDesC8& aRawData) + { + CCmsContentInfo* self = new (ELeave) CCmsContentInfo(); + CleanupStack::PushL(self); + self->ConstructL(aRawData); + return self; + } + +EXPORT_C CCmsContentInfo* CCmsContentInfo::NewL(const TDesC8& aRawData) + { + CCmsContentInfo* self = NewLC(aRawData); + CleanupStack::Pop(self); + return self; + } + +EXPORT_C CCmsContentInfo* CCmsContentInfo::NewL(TCmsContentInfoType aContentInfoType, const TDesC8& aContentData) + { + CCmsContentInfo* self = NewLC(aContentInfoType, aContentData); + CleanupStack::Pop(self); + return self; + } + +EXPORT_C CCmsContentInfo* CCmsContentInfo::NewLC(TCmsContentInfoType aContentInfoType, const TDesC8& aContentData) + { + CCmsContentInfo* self = new (ELeave) CCmsContentInfo(aContentInfoType, aContentData); + CleanupStack::PushL(self); + return self; + } + +EXPORT_C CCmsContentInfo::~CCmsContentInfo() + { + + } +CCmsContentInfo::CCmsContentInfo() + { + } + +CCmsContentInfo::CCmsContentInfo(TCmsContentInfoType aContentInfoType, const TDesC8& aContentData) +:iContentType(aContentInfoType) + { + iContentData.Set(aContentData); + } + +void CCmsContentInfo::ConstructL(const TDesC8& aRawData) + { + const TInt minItems = 2; // Must have OID + const TInt maxItems = 2; // Must have data + CArrayPtr* contentInfo = PKCS7ASN1::DecodeSequenceLC(aRawData, minItems, maxItems); + + //Decode Content Type + iContentType=(TCmsContentInfoType)(CmsUtils::DecodeContentTypeL(contentInfo->At(0))); + + //Decode Content Data + const TASN1DecGeneric* contentInfoAt1 = contentInfo->At(1); + if ( contentInfoAt1->Tag() == 0 || contentInfoAt1->Class() == EContextSpecific ) + { + TASN1DecGeneric decGen(contentInfoAt1->GetContentDER()); + decGen.InitL(); + if (iContentType==EContentTypeData) + { + if (decGen.Tag()!=EASN1OctetString || decGen.Class()!=EUniversal) + { + User::Leave(KErrArgument); + } + else + { + iContentData.Set(decGen.GetContentDER()); + } + } + else + { + iContentData.Set(decGen.Encoding()); + } + } + else + { + User::Leave(KErrArgument); + } + + CleanupStack::PopAndDestroy(contentInfo); + } + +EXPORT_C CASN1EncSequence* CCmsContentInfo::EncodeASN1DERLC() const + { + // the root sequence contains the OID and the content data + CASN1EncSequence* root = CASN1EncSequence::NewLC(); + + //Encode the OID + CASN1EncObjectIdentifier* oid = CmsUtils::EncodeContentTypeLC(iContentType); + root->AddAndPopChildL(oid); + + CASN1EncBase* enc(NULL); + if (iContentType==EContentTypeData) + { + enc=CASN1EncOctetString::NewL(iContentData); + } + else + { + //Encode the Content + //iContentData already encoded in sequence + //so just rebuild the structure + enc = CASN1EncEncoding::NewL(iContentData); + } + // Add [0] EXPLICT + CASN1EncExplicitTag* Enc=CASN1EncExplicitTag::NewLC(enc, 0); + root->AddAndPopChildL(Enc); + + return root; + } + +EXPORT_C const TPtrC8 CCmsContentInfo::ContentData() const + { + return iContentData; + } + +EXPORT_C TCmsContentInfoType CCmsContentInfo::ContentType() const + { + return iContentType; + } + + +// +//Implementation of CMS EncapsulatedContentInfo Identity +// +CEncapsulatedContentInfo* CEncapsulatedContentInfo::NewLC(const TDesC8& aRawData) + { + CEncapsulatedContentInfo* self = new (ELeave) CEncapsulatedContentInfo(); + CleanupStack::PushL(self); + self->ConstructL(aRawData); + return self; + } + +CEncapsulatedContentInfo* CEncapsulatedContentInfo::NewL(const TDesC8& aRawData) + { + CEncapsulatedContentInfo* self = NewLC(aRawData); + CleanupStack::Pop(self); + return self; + } + +CEncapsulatedContentInfo* CEncapsulatedContentInfo::NewLC(TCmsContentInfoType aContentInfoType, TBool aIsEContentDataPresent, const TDesC8& aContentData) + { + CEncapsulatedContentInfo* self = new (ELeave) CEncapsulatedContentInfo(aContentInfoType, aIsEContentDataPresent, aContentData); + CleanupStack::PushL(self); + return self; + } + +CEncapsulatedContentInfo* CEncapsulatedContentInfo::NewL(TCmsContentInfoType aContentInfoType, TBool aIsEContentDataPresent, const TDesC8& aContentData) + { + CEncapsulatedContentInfo* self = NewLC(aContentInfoType, aIsEContentDataPresent, aContentData); + CleanupStack::Pop(self); + return self; + } + +CEncapsulatedContentInfo::CEncapsulatedContentInfo() + { + } + +CEncapsulatedContentInfo::CEncapsulatedContentInfo(TCmsContentInfoType aContentInfoType, TBool aIsEContentDataPresent, const TDesC8& aContentData) +:iContentType(aContentInfoType), + iIsContentDataPresent(aIsEContentDataPresent) + { + if (aIsEContentDataPresent) + { + iContentData.Set(aContentData); + } + } + +void CEncapsulatedContentInfo::ConstructL(const TDesC8& aRawData) + { + const TInt minItems = 1; // Must have OID + const TInt maxItems = 2; // Must have data + CArrayPtr* contentInfo = PKCS7ASN1::DecodeSequenceLC(aRawData, minItems, maxItems); + + //Decode Content Type + iContentType=(TCmsContentInfoType)(CmsUtils::DecodeContentTypeL(contentInfo->At(0))); + + //Decode Content Data + if(contentInfo->Count() == 2) + { + iIsContentDataPresent=ETrue; + const TASN1DecGeneric* contentInfoAt1 = contentInfo->At(1); + + //Decode [0] Explicit + if ( contentInfoAt1->Tag() == 0 || contentInfoAt1->Class() == EContextSpecific ) + { + //Decode Wrapper Octet string + TASN1DecGeneric decGen(contentInfoAt1->GetContentDER()); + decGen.InitL(); + if(decGen.Tag() == EASN1OctetString && decGen.Class() == EUniversal) + { + iContentData.Set(decGen.GetContentDER()); + } + else + { + //Wrapper is not an Octect String + User::Leave(KErrArgument); + } + } + else + { + //Not [0] Explicit + User::Leave(KErrArgument); + } + } + else + { + //No optional data + iContentData.Set(KNullDesC8()); + } + CleanupStack::PopAndDestroy(contentInfo); + } + + +CASN1EncSequence* CEncapsulatedContentInfo::EncodeASN1DERLC() const + { + // the root sequence contains the OID and the content data + CASN1EncSequence* root = CASN1EncSequence::NewLC(); + + //Encode the OID + CASN1EncObjectIdentifier* oid = CmsUtils::EncodeContentTypeLC(iContentType); + root->AddAndPopChildL(oid); + + //Encode the Content + if (iIsContentDataPresent) + { + //Wrapper Octect String + CASN1EncOctetString* octetString=CASN1EncOctetString::NewL(iContentData); + + // Add [0] EXPLICT + CASN1EncExplicitTag* Enc=CASN1EncExplicitTag::NewLC(octetString, 0); + root->AddAndPopChildL(Enc); + } + + return root; + } + + +EXPORT_C TBool CEncapsulatedContentInfo::IsContentDataPresent() const + { + return iIsContentDataPresent; + } + +EXPORT_C const TPtrC8 CEncapsulatedContentInfo::ContentData() const + { + return iContentData; + } + +EXPORT_C TCmsContentInfoType CEncapsulatedContentInfo::ContentType() const + { + return iContentType; + }