os/security/cryptoplugins/cryptospiplugins/source/softwarecrypto/rsaverifyimpl.cpp
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 "rsaverifyimpl.h"
20 #include "pluginconfig.h"
21 #include "rsafunction.h"
23 using namespace SoftwareCrypto;
25 // Implementation of CRSAVerifierImpl
26 CRSAVerifierImpl* CRSAVerifierImpl::NewL(const CKey& aKey, TUid aPaddingMode)
28 CRSAVerifierImpl* self = CRSAVerifierImpl::NewLC(aKey, aPaddingMode);
29 CleanupStack::Pop(self);
33 CRSAVerifierImpl* CRSAVerifierImpl::NewLC(const CKey& aKey, TUid aPaddingMode)
35 CRSAVerifierImpl* self = new(ELeave) CRSAVerifierImpl(aPaddingMode);
36 CleanupStack::PushL(self);
37 self->ConstructL(aKey);
41 CRSAVerifierImpl::CRSAVerifierImpl(TUid aPaddingMode)
42 : iPaddingMode(aPaddingMode)
46 CRSAVerifierImpl::~CRSAVerifierImpl()
51 void CRSAVerifierImpl::ConstructL(const CKey& aKey)
53 CVerifierImpl::ConstructL(aKey);
54 SetPaddingModeL(iPaddingMode);
57 CExtendedCharacteristics* CRSAVerifierImpl::CreateExtendedCharacteristicsL()
59 // All Symbian software plug-ins have unlimited concurrency, cannot be reserved
60 // for exclusive use and are not CERTIFIED to be standards compliant.
61 return CExtendedCharacteristics::NewL(KMaxTInt, EFalse);
64 const CExtendedCharacteristics* CRSAVerifierImpl::GetExtendedCharacteristicsL()
66 return CRSAVerifierImpl::CreateExtendedCharacteristicsL();
69 TUid CRSAVerifierImpl::ImplementationUid() const
71 return KCryptoPluginRsaVerifierUid;
74 void CRSAVerifierImpl::SetPaddingModeL(TUid aPaddingMode)
77 switch (aPaddingMode.iUid)
79 case KPaddingModeNone:
80 padding = CPaddingNone::NewL(GetMaximumOutputLengthL());
82 case KPaddingModePkcs1_v1_5_Signature:
83 padding = CPaddingPKCS1Signature::NewL(GetMaximumOutputLengthL());
86 User::Leave(KErrNotSupported);
90 iPaddingMode = aPaddingMode;
94 void CRSAVerifierImpl::SetKeyL(const CKey& aPublicKey)
96 DoSetKeyL(aPublicKey);
100 TInt CRSAVerifierImpl::GetMaximumInputLengthL() const
102 return GetMaximumOutputLengthL() - iPadding->MinPaddingLength();
105 TInt CRSAVerifierImpl::GetMaximumOutputLengthL() const
107 const TInteger& paramN = iKey->GetBigIntL(KRsaKeyParameterNUid);
108 return paramN.ByteCount();
111 void CRSAVerifierImpl::VerifyL(const TDesC8& aInput, const CCryptoParams& aSignature, TBool& aVerificationResult)
113 HBufC8* output = NULL;
114 InverseSignL(output, aSignature);
115 CleanupStack::PushL(output);
117 // is the original hash the same as the hash extracted from the signature
118 aVerificationResult = EFalse;
119 if (!output->Compare(aInput))
121 aVerificationResult = ETrue;
123 CleanupStack::PopAndDestroy(output);
126 void CRSAVerifierImpl::InverseSignL(HBufC8*& aOutput, const CCryptoParams& aSignature)
128 // extract the original hash from the signature
129 const TInteger& signature = aSignature.GetBigIntL(KRsaSignatureParameterSUid);
131 RSAFunction::VerifyL(*iKey, signature, output);
132 CleanupClosePushL(output);
134 // format the extracted hash so it can be compared with the original hash
135 HBufC8* paddedHashPtr = output.BufferLC();
136 aOutput = HBufC8::NewLC(GetMaximumOutputLengthL());
137 TPtr8 unpaddedHash = aOutput->Des();
139 iPadding->UnPadL(*paddedHashPtr, unpaddedHash);
141 CleanupStack::Pop(aOutput);
142 CleanupStack::PopAndDestroy(2, &output);