os/security/cryptoplugins/cryptospiplugins/source/softwarecrypto/rsasignerimpl.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 "rsasignerimpl.h"
20 #include "pluginconfig.h"
21 #include "rsafunction.h"
23 using namespace SoftwareCrypto;
25 // Implementation of CRSASignerImpl
26 CRSASignerImpl* CRSASignerImpl::NewL(const CKey& aKey, TUid aPaddingMode)
28 CRSASignerImpl* self = CRSASignerImpl::NewLC(aKey, aPaddingMode);
29 CleanupStack::Pop(self);
33 CRSASignerImpl* CRSASignerImpl::NewLC(const CKey& aKey, TUid aPaddingMode)
35 CRSASignerImpl* self = new(ELeave) CRSASignerImpl(aPaddingMode);
36 CleanupStack::PushL(self);
37 self->ConstructL(aKey);
41 CRSASignerImpl::CRSASignerImpl(TUid aPaddingMode)
42 : iPaddingMode(aPaddingMode)
46 CRSASignerImpl::~CRSASignerImpl()
51 void CRSASignerImpl::ConstructL(const CKey& aKey)
53 CSignerImpl::ConstructL(aKey);
54 SetPaddingModeL(iPaddingMode);
57 CExtendedCharacteristics* CRSASignerImpl::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* CRSASignerImpl::GetExtendedCharacteristicsL()
66 return CRSASignerImpl::CreateExtendedCharacteristicsL();
69 TUid CRSASignerImpl::ImplementationUid() const
71 return KCryptoPluginRsaSignerUid;
74 void CRSASignerImpl::SetKeyL(const CKey& aPrivateKey)
76 DoSetKeyL(aPrivateKey);
80 void CRSASignerImpl::SetPaddingModeL(TUid aPaddingMode)
83 switch (aPaddingMode.iUid)
85 case KPaddingModeNone:
86 padding = CPaddingNone::NewL(GetMaximumOutputLengthL());
88 case KPaddingModePkcs1_v1_5_Signature:
89 padding = CPaddingPKCS1Signature::NewL(GetMaximumOutputLengthL());
92 User::Leave(KErrNotSupported);
97 iPaddingMode = aPaddingMode;
101 TInt CRSASignerImpl::GetMaximumInputLengthL() const
103 return GetMaximumOutputLengthL() - iPadding->MinPaddingLength();
106 TInt CRSASignerImpl::GetMaximumOutputLengthL() const
108 const TInteger& paramN = iKey->GetBigIntL(KRsaKeyParameterNUid);
109 return paramN.ByteCount();
112 void CRSASignerImpl::SignL(const TDesC8& aInput, CCryptoParams& aSignature)
114 HBufC8* buf = HBufC8::NewLC(GetMaximumOutputLengthL());
115 TPtr8 ptr = buf->Des();
117 //The following will panic if aInput is larger than MaxOutputLength() It is
118 //likely that the caller has passed in something that has not been hashed.
119 //This is a programming, and likely a security error, in client code, not a
121 iPadding->PadL(aInput, ptr);
123 RInteger input = RInteger::NewL(ptr);
124 CleanupClosePushL(input);
127 RSAFunction::SignL(*iKey, input, output);
128 CleanupClosePushL(output);
130 aSignature.AddL(output, KRsaSignatureParameterSUid);
131 CleanupStack::PopAndDestroy(3, buf); //input, buf