diff -r da2ae96f639b -r cd501b96611d cryptoplugins/cryptospiplugins/source/softwarecrypto/rsasignerimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cryptoplugins/cryptospiplugins/source/softwarecrypto/rsasignerimpl.cpp Fri Nov 06 13:21:00 2009 +0200 @@ -0,0 +1,132 @@ +/* +* 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 "rsasignerimpl.h" +#include "pluginconfig.h" +#include "rsafunction.h" + +using namespace SoftwareCrypto; + +// Implementation of CRSASignerImpl +CRSASignerImpl* CRSASignerImpl::NewL(const CKey& aKey, TUid aPaddingMode) + { + CRSASignerImpl* self = CRSASignerImpl::NewLC(aKey, aPaddingMode); + CleanupStack::Pop(self); + return self; + } + +CRSASignerImpl* CRSASignerImpl::NewLC(const CKey& aKey, TUid aPaddingMode) + { + CRSASignerImpl* self = new(ELeave) CRSASignerImpl(aPaddingMode); + CleanupStack::PushL(self); + self->ConstructL(aKey); + return self; + } + +CRSASignerImpl::CRSASignerImpl(TUid aPaddingMode) + : iPaddingMode(aPaddingMode) + { + } + +CRSASignerImpl::~CRSASignerImpl() + { + delete iPadding; + } + +void CRSASignerImpl::ConstructL(const CKey& aKey) + { + CSignerImpl::ConstructL(aKey); + SetPaddingModeL(iPaddingMode); + } + +CExtendedCharacteristics* CRSASignerImpl::CreateExtendedCharacteristicsL() + { + // All Symbian software plug-ins have unlimited concurrency, cannot be reserved + // for exclusive use and are not CERTIFIED to be standards compliant. + return CExtendedCharacteristics::NewL(KMaxTInt, EFalse); + } + +const CExtendedCharacteristics* CRSASignerImpl::GetExtendedCharacteristicsL() + { + return CRSASignerImpl::CreateExtendedCharacteristicsL(); + } + +TUid CRSASignerImpl::ImplementationUid() const + { + return KCryptoPluginRsaSignerUid; + } + +void CRSASignerImpl::SetKeyL(const CKey& aPrivateKey) + { + DoSetKeyL(aPrivateKey); + Reset(); + } + +void CRSASignerImpl::SetPaddingModeL(TUid aPaddingMode) + { + CPadding* padding(0); + switch (aPaddingMode.iUid) + { + case KPaddingModeNone: + padding = CPaddingNone::NewL(GetMaximumOutputLengthL()); + break; + case KPaddingModePkcs1_v1_5_Signature: + padding = CPaddingPKCS1Signature::NewL(GetMaximumOutputLengthL()); + break; + default: + User::Leave(KErrNotSupported); + } + + delete iPadding; + iPadding = padding; + iPaddingMode = aPaddingMode; + Reset(); + } + +TInt CRSASignerImpl::GetMaximumInputLengthL() const + { + return GetMaximumOutputLengthL() - iPadding->MinPaddingLength(); + } + +TInt CRSASignerImpl::GetMaximumOutputLengthL() const + { + const TInteger& paramN = iKey->GetBigIntL(KRsaKeyParameterNUid); + return paramN.ByteCount(); + } + +void CRSASignerImpl::SignL(const TDesC8& aInput, CCryptoParams& aSignature) + { + HBufC8* buf = HBufC8::NewLC(GetMaximumOutputLengthL()); + TPtr8 ptr = buf->Des(); + + //The following will panic if aInput is larger than MaxOutputLength() It is + //likely that the caller has passed in something that has not been hashed. + //This is a programming, and likely a security error, in client code, not a + //problem here. + iPadding->PadL(aInput, ptr); + + RInteger input = RInteger::NewL(ptr); + CleanupClosePushL(input); + RInteger output; + + RSAFunction::SignL(*iKey, input, output); + CleanupClosePushL(output); + + aSignature.AddL(output, KRsaSignatureParameterSUid); + CleanupStack::PopAndDestroy(3, buf); //input, buf + }