diff -r 000000000000 -r 2c201484c85f cryptoservices/certificateandkeymgmt/pkcs7/pkcs7digestinfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cryptoservices/certificateandkeymgmt/pkcs7/pkcs7digestinfo.cpp Wed Jul 08 11:25:26 2009 +0100 @@ -0,0 +1,107 @@ +/* +* Copyright (c) 2005-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 "pkcs7digestinfo.h" +#include "pkcs7asn1.h" + +EXPORT_C CPKCS7DigestInfo* CPKCS7DigestInfo::NewL(const TDesC8& aRawData) + { + CPKCS7DigestInfo* self = new (ELeave) CPKCS7DigestInfo(); + CleanupStack::PushL(self); + self->ConstructL(aRawData); + CleanupStack::Pop(self); + return self; + } + +CPKCS7DigestInfo::~CPKCS7DigestInfo() + { + } + +CPKCS7DigestInfo::CPKCS7DigestInfo() + { + } + +EXPORT_C const TDesC8& CPKCS7DigestInfo::Digest() const + { + return iDigest; + } + +EXPORT_C TAlgorithmId CPKCS7DigestInfo::Algorithm() const + { + return iAlgorithmId; + } + +EXPORT_C const TPtrC8& CPKCS7DigestInfo::EncodedParams() const + { + return iEncodedParams; + } + +void CPKCS7DigestInfo::ConstructL(const TDesC8& aDigestData) + { + CArrayPtr* digestInfo = PKCS7ASN1::DecodeSequenceLC(aDigestData); + + // Check if both the digestAlgorithm and the Digest are present. + if ( digestInfo->Count() != 2 ) + { + User::Leave(KErrArgument); + } + + // DIGEST ALGORITHM + // Get the algorithm identifier and the encoded parameters present in the sequence. + const TASN1DecGeneric* digestInfoAt0 = digestInfo->At(0); + if(digestInfoAt0->Tag() != EASN1Sequence || digestInfoAt0->Class() != EUniversal) + { + User::Leave(KErrArgument); + } + CX509AlgorithmIdentifier* digestAlg = CX509AlgorithmIdentifier::NewLC(digestInfo->At(0)->Encoding()); + TAlgorithmId algorithmId = digestAlg->Algorithm(); + switch(algorithmId) + { + case EMD2: + { + iAlgorithmId = EMD2; + } + break; + case EMD5: + { + iAlgorithmId = EMD5; + } + break; + case ESHA1: + { + iAlgorithmId = ESHA1; + } + break; + default: + User::Leave(KErrNotSupported); + } + + iEncodedParams.Set(digestAlg->EncodedParams()); + + // DIGEST + const TASN1DecGeneric* digestInfoAt1 = digestInfo->At(1); + if(digestInfoAt1->Tag() != EASN1OctetString || digestInfoAt1->Class() != EUniversal) + { + User::Leave(KErrArgument); + } + TASN1DecGeneric octetStringDecoder(*(digestInfo->At(1))); + octetStringDecoder.InitL(); + iDigest.Set(octetStringDecoder.GetContentDER()); + + CleanupStack::PopAndDestroy(2,digestInfo);// digestInfo, digestAlg + }