diff -r 000000000000 -r 2c201484c85f cryptoservices/certificateandkeymgmt/pkcs7/pkcs7contentinfo_v2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cryptoservices/certificateandkeymgmt/pkcs7/pkcs7contentinfo_v2.cpp Wed Jul 08 11:25:26 2009 +0100 @@ -0,0 +1,148 @@ +/* +* Copyright (c) 2003-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 "pkcs7contentinfo_v2.h" +#include "pkcs7asn1.h" + +EXPORT_C CPKCS7ContentInfo* CPKCS7ContentInfo::NewL(const TDesC8& aRawData) + { + CPKCS7ContentInfo* self = new (ELeave) CPKCS7ContentInfo(); + CleanupStack::PushL(self); + self->ConstructL(aRawData); + CleanupStack::Pop(self); + return self; + } + +CPKCS7ContentInfo::~CPKCS7ContentInfo() + { + } + +EXPORT_C CPKCS7ContentInfo::TContentInfoType CPKCS7ContentInfo::ContentType() const + { + return iContentType; + } + +EXPORT_C const TPtrC8 CPKCS7ContentInfo::ContentData() const + { + return iContentData; + } + +CPKCS7ContentInfo::CPKCS7ContentInfo(void) + { + } + +void CPKCS7ContentInfo::ConstructL(const TDesC8& aRawData) + { + const TInt minItems = 1; // Must have OID + const TInt maxItems = 2; // May have data + + CArrayPtr* contentInfo = PKCS7ASN1::DecodeSequenceLC(aRawData, minItems, maxItems); + + const TASN1DecGeneric* contentInfoAt0 = contentInfo->At(0); + // Checks its a oid id + if(contentInfoAt0->Tag()==EASN1ObjectIdentifier || contentInfoAt0->Class() == EUniversal) + { + // Gets the oid + TASN1DecObjectIdentifier oidDec; + HBufC* oidVal = oidDec.DecodeDERL(*contentInfo->At(0)); + CleanupStack::PushL(oidVal); + // Data itself is optional so make sure its there + if(contentInfo->Count() == 2) + { + const TASN1DecGeneric* contentInfoAt1 = contentInfo->At(1); + if ( contentInfoAt1->Tag() == 0 || contentInfoAt1->Class() == EContextSpecific ) + { + TASN1DecGeneric decGen(contentInfoAt1->GetContentDER()); + decGen.InitL(); + if(*oidVal == KPkcs7DataOID) + { + // ContentData is OctetString if ContentType is Data + if(decGen.Tag() == EASN1OctetString) + { + iContentData.Set(decGen.GetContentDER()); + } + else + { + User::Leave(KErrArgument); + } + } + else + { + iContentData.Set(decGen.Encoding()); + } + } + } + else + { + iContentData.Set(KNullDesC8()); + } + // Checks if it is data OID. + if(*oidVal == KPkcs7DataOID) + { + // The Content Type is indicated by an Integer. + // Here if Content Type is equal to Data then,it is represented by 1 + // 1 indicates the numeric value of last element in the PKCS7 Data OID. + iContentType = EContentTypeData; + } + else if(*oidVal == KPkcs7SignedDataOID) + { + // The Content Type is indicated by an Integer. + // Here if Content Type is equal to SignedData then,it is represented by 2 + // 2 indicates the numeric value of last element in the PKCS7 SignedData OID. + iContentType = EContentTypeSignedData; + } + else if(*oidVal == KPkcs7EnvelopedDataOID) + { + // The Content Type is indicated by an Integer. + // Here if Content Type is equal to EnvelopedData then,it is represented by 3. + // 3 indicates the numeric value of last element in the PKCS7 EnvelopedData OID. + iContentType = EContentTypeEnvelopedData; + } + else if(*oidVal == KPkcs7SignedAndEnvelopedDataOID) + { + // The Content Type is indicated by an Integer. + // Here if Content Type is equal to SignedAndEnvelopedData then,it is represented by 4. + // 4 indicates the numeric value of last element in the PKCS7 SignedAndEnvelopedData OID. + iContentType = EContentTypeSignedAndEnvelopedData; + } + else if(*oidVal == KPkcs7DigestedDataOID) + { + // The Content Type is indicated by an Integer. + // Here if Content Type is equal to DigestedData then,it is represented by 5. + // 5 indicates the numeric value of last element in the PKCS7 DigestedData OID. + iContentType = EContentTypeDigestedData; + } + else if(*oidVal == KPkcs7EncryptedDataOID) + { + // The Content Type is indicated by an Integer. + // Here if Content Type is equal to EncryptedData then,it is represented by 6 + // 6 indicates the numeric value of last element in the PKCS7 EncryptedData OID. + iContentType = EContentTypeEncryptedData; + } + else + { + User::Leave(KErrNotSupported); + } + CleanupStack::PopAndDestroy(oidVal); + } + else + { + User::Leave(KErrArgument); + } + CleanupStack::PopAndDestroy(contentInfo); + }