crypto/weakcryptospi/source/asymmetric/rsashim.cpp
changeset 19 cd501b96611d
child 43 2f10d260163b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/crypto/weakcryptospi/source/asymmetric/rsashim.cpp	Fri Nov 06 13:21:00 2009 +0200
@@ -0,0 +1,365 @@
+/*
+* 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 "rsashim.h"
+#include "cryptoasymmetriccipherapi.h"
+#include "cryptosignatureapi.h"
+#include <cryptospi/cryptospidef.h>
+#include "keyconverter.h"
+#include "keys.h"
+
+#include "../common/inlines.h"
+
+
+using namespace CryptoSpi;
+
+// CRSAPKCS1v15EncryptorShim ////////////////////////////////////////////////////////
+
+CRSAPKCS1v15EncryptorShim* CRSAPKCS1v15EncryptorShim::NewL(const CRSAPublicKey& aKey)
+	{
+	CRSAPKCS1v15EncryptorShim* self = CRSAPKCS1v15EncryptorShim::NewLC(aKey);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CRSAPKCS1v15EncryptorShim* CRSAPKCS1v15EncryptorShim::NewLC(const CRSAPublicKey& aKey)
+	{
+	CRSAPKCS1v15EncryptorShim* self = new (ELeave) CRSAPKCS1v15EncryptorShim(aKey);
+	CleanupStack::PushL(self);
+	self->ConstructL(aKey);
+	return self;
+	}
+
+CRSAPKCS1v15EncryptorShim::CRSAPKCS1v15EncryptorShim(const CRSAPublicKey& aKey)
+	: CRSAPKCS1v15Encryptor(aKey)
+	{
+	}
+
+CRSAPKCS1v15EncryptorShim::~CRSAPKCS1v15EncryptorShim()
+	{
+	delete iAsymmetricCipherImpl;
+	delete iKey;
+	}
+
+void CRSAPKCS1v15EncryptorShim::ConstructL(const CRSAPublicKey& aKey)
+	{
+	iKey = KeyConverter::CreateKeyL(aKey);
+	CAsymmetricCipherFactory::CreateAsymmetricCipherL(
+												iAsymmetricCipherImpl,
+												KRsaCipherUid,
+												*iKey,
+												KCryptoModeEncryptUid,
+												KPaddingModePkcs1_v1_5_EncryptionUid,
+												NULL);
+	}
+
+void CRSAPKCS1v15EncryptorShim::EncryptL(const TDesC8& aInput, TDes8& aOutput) const
+	{
+	iAsymmetricCipherImpl->ProcessL(aInput, aOutput);
+	}
+
+TInt CRSAPKCS1v15EncryptorShim::MaxInputLength(void) const
+	{
+	TInt maxInputLength=0; 
+	TRAPD(err, maxInputLength=iAsymmetricCipherImpl->GetMaximumInputLengthL())
+	if (err==KErrNone)
+		{
+		return maxInputLength;
+		}
+	else
+		{
+		return err;
+		}
+	}
+
+TInt CRSAPKCS1v15EncryptorShim::MaxOutputLength(void) const
+	{
+	TInt maxOutputLength=0; 
+	TRAPD(err, maxOutputLength=iAsymmetricCipherImpl->GetMaximumOutputLengthL())
+	if (err==KErrNone)
+		{
+		return maxOutputLength;
+		}
+	else
+		{
+		return err;
+		}
+	}
+
+// CRSAPKCS1v15DecryptorShim ////////////////////////////////////////////////////////
+CRSAPKCS1v15DecryptorShim* CRSAPKCS1v15DecryptorShim::NewL(const CRSAPrivateKey& aKey)
+	{
+	CRSAPKCS1v15DecryptorShim* self = CRSAPKCS1v15DecryptorShim::NewLC(aKey);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+
+CRSAPKCS1v15DecryptorShim* CRSAPKCS1v15DecryptorShim::NewLC(const CRSAPrivateKey& aKey)
+	{
+	CRSAPKCS1v15DecryptorShim* self = new (ELeave) CRSAPKCS1v15DecryptorShim(aKey);
+	CleanupStack::PushL(self);
+	self->ConstructL(aKey);
+	return self;
+	}
+
+CRSAPKCS1v15DecryptorShim::CRSAPKCS1v15DecryptorShim(const CRSAPrivateKey& aKey)
+	: CRSAPKCS1v15Decryptor(aKey)
+	{
+	}
+
+CRSAPKCS1v15DecryptorShim::~CRSAPKCS1v15DecryptorShim()
+	{
+	delete iAsymmetricCipherImpl;
+	delete iKey;
+	}
+
+void CRSAPKCS1v15DecryptorShim::ConstructL(const CRSAPrivateKey& aKey)
+	{
+	iKey = KeyConverter::CreateKeyL(aKey);
+	CAsymmetricCipherFactory::CreateAsymmetricCipherL(
+												iAsymmetricCipherImpl,
+												KRsaCipherUid,
+												*iKey,
+												KCryptoModeDecryptUid,
+												KPaddingModePkcs1_v1_5_EncryptionUid,
+												NULL);
+	}
+
+void CRSAPKCS1v15DecryptorShim::DecryptL(const TDesC8& aInput, TDes8& aOutput) const
+	{
+	iAsymmetricCipherImpl->ProcessL(aInput, aOutput);
+	}
+
+TInt CRSAPKCS1v15DecryptorShim::MaxInputLength(void) const
+	{
+	TInt maxInputLength=0; 
+	TRAPD(err, maxInputLength=iAsymmetricCipherImpl->GetMaximumInputLengthL())
+	if (err==KErrNone)
+		{
+		return maxInputLength;
+		}
+	else
+		{
+		return err;
+		}
+	}
+
+TInt CRSAPKCS1v15DecryptorShim::MaxOutputLength(void) const
+	{
+	TInt maxOutputLength=0; 
+	TRAPD(err, maxOutputLength=iAsymmetricCipherImpl->GetMaximumOutputLengthL())
+	if (err==KErrNone)
+		{
+		return maxOutputLength;
+		}
+	else
+		{
+		return err;
+		}
+	}
+
+// CRSAPKCS1v15SignerShim ////////////////////////////////////////////////////////
+CRSAPKCS1v15SignerShim* CRSAPKCS1v15SignerShim::NewL(const CRSAPrivateKey& aKey)
+	{
+	CRSAPKCS1v15SignerShim* self = CRSAPKCS1v15SignerShim::NewLC(aKey);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CRSAPKCS1v15SignerShim* CRSAPKCS1v15SignerShim::NewLC(const CRSAPrivateKey& aKey)
+	{
+	CRSAPKCS1v15SignerShim* self = new (ELeave) CRSAPKCS1v15SignerShim(aKey);
+	CleanupStack::PushL(self);
+	self->ConstructL(aKey);
+	return self;
+	}
+
+CRSASignature* CRSAPKCS1v15SignerShim::SignL(const TDesC8& aInput) const
+	{
+	//Sign the input data
+	CCryptoParams* signature = CCryptoParams::NewLC();
+	iSignerImpl->SignL(aInput, *signature);
+
+	//Retrieve the S in RSA signature from the array
+	const TInteger& cS=signature->GetBigIntL(KRsaSignatureParameterSUid);
+
+	//Make copies of the RSA signature
+	RInteger s=RInteger::NewL(cS);
+	CleanupClosePushL(s);	
+
+	//Create the RSA signature object, the ownership of s is transfered to rsaSig
+	CRSASignature* rsaSig=CRSASignature::NewL(s);
+
+	//Cleanup
+	CleanupStack::Pop(&s);
+	CleanupStack::PopAndDestroy(signature);
+	return rsaSig;
+	}
+
+TInt CRSAPKCS1v15SignerShim::MaxInputLength(void) const
+	{
+	TInt maxInputLength=0; 
+	TRAPD(err, maxInputLength=iSignerImpl->GetMaximumInputLengthL())
+	if (err==KErrNone)
+		{
+		return maxInputLength;
+		}
+	else
+		{
+		return err;
+		}
+	}
+	
+TInt CRSAPKCS1v15SignerShim::MaxOutputLength(void) const
+	{
+	TInt maxOutputLength=0; 
+	TRAPD(err, maxOutputLength=iSignerImpl->GetMaximumOutputLengthL())
+	if (err==KErrNone)
+		{
+		return maxOutputLength;
+		}
+	else
+		{
+		return err;
+		}
+	}
+
+CRSAPKCS1v15SignerShim::~CRSAPKCS1v15SignerShim(void)
+	{
+	delete iSignerImpl;
+	delete iKey;
+	}
+
+CRSAPKCS1v15SignerShim::CRSAPKCS1v15SignerShim(const CRSAPrivateKey& aKey)
+	: CRSAPKCS1v15Signer(aKey)
+	{
+	}
+	
+void CRSAPKCS1v15SignerShim::ConstructL(const CRSAPrivateKey& aKey)
+	{
+	iKey = KeyConverter::CreateKeyL(aKey);
+	CSignatureFactory::CreateSignerL(
+									iSignerImpl,
+									KRsaSignerUid,
+									*iKey,
+									KPaddingModePkcs1_v1_5_SignatureUid,
+									NULL);
+	}
+
+// CRSAPKCS1v15VerifierShim ////////////////////////////////////////////////////////
+CRSAPKCS1v15VerifierShim* CRSAPKCS1v15VerifierShim::NewL(const CRSAPublicKey& aKey)
+	{
+	CRSAPKCS1v15VerifierShim* self = CRSAPKCS1v15VerifierShim::NewLC(aKey);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CRSAPKCS1v15VerifierShim* CRSAPKCS1v15VerifierShim::NewLC(const CRSAPublicKey& aKey)
+	{
+	CRSAPKCS1v15VerifierShim* self = new (ELeave) CRSAPKCS1v15VerifierShim(aKey);
+	CleanupStack::PushL(self);
+	self->ConstructL(aKey);
+	return self;
+	}
+	
+TBool CRSAPKCS1v15VerifierShim::VerifyL(const TDesC8& aInput, const CRSASignature& aSignature) const
+	{
+	//create the array format rsa signature for the new crypto spi
+	CCryptoParams* rsaSig = CCryptoParams::NewLC();
+
+	rsaSig->AddL(aSignature.S(), KRsaSignatureParameterSUid);
+
+	//pass the signature and input to crypto spi to be verified
+	TBool verificationResult = EFalse;	
+	iVerifierImpl->VerifyL(aInput, *rsaSig, verificationResult);
+
+	//Cleanup the array
+	CleanupStack::PopAndDestroy(rsaSig);
+	return verificationResult;
+	}
+
+HBufC8* CRSAPKCS1v15VerifierShim::InverseSignLC(const CRSASignature& aSignature) const
+	{
+	//create the array format rsa signature for the new crypto spi
+	CCryptoParams* rsaSig = CCryptoParams::NewLC();
+
+	rsaSig->AddL(aSignature.S(), KRsaSignatureParameterSUid);
+
+	//pass the signature and input to crypto spi to be verified
+	HBufC8* output = NULL;
+	iVerifierImpl->InverseSignL(output, *rsaSig);
+
+	//Cleanup the array
+	CleanupStack::PopAndDestroy(rsaSig);
+
+	// leave output on the cleanup stack
+	CleanupStack::PushL(output);
+	return output;
+	}
+
+TInt CRSAPKCS1v15VerifierShim::MaxInputLength(void) const
+	{
+	TInt maxInputLength=0; 
+	TRAPD(err, maxInputLength=iVerifierImpl->GetMaximumInputLengthL())
+	if (err==KErrNone)
+		{
+		return maxInputLength;
+		}
+	else
+		{
+		return err;
+		}
+	}
+	
+TInt CRSAPKCS1v15VerifierShim::MaxOutputLength(void) const
+	{
+	TInt maxOutputLength=0; 
+	TRAPD(err, maxOutputLength=iVerifierImpl->GetMaximumOutputLengthL())
+	if (err==KErrNone)
+		{
+		return maxOutputLength;
+		}
+	else
+		{
+		return err;
+		}
+	}
+
+CRSAPKCS1v15VerifierShim::~CRSAPKCS1v15VerifierShim(void)
+	{
+	delete iVerifierImpl;
+	delete iKey;
+	}
+
+CRSAPKCS1v15VerifierShim::CRSAPKCS1v15VerifierShim(const CRSAPublicKey& aKey)
+	: CRSAPKCS1v15Verifier(aKey)
+	{
+	}
+
+void CRSAPKCS1v15VerifierShim::ConstructL(const CRSAPublicKey& aKey)
+	{
+	iKey = KeyConverter::CreateKeyL(aKey);
+	CSignatureFactory::CreateVerifierL(
+									iVerifierImpl,
+									KRsaVerifierUid,
+									*iKey,
+									KPaddingModePkcs1_v1_5_SignatureUid,
+									NULL);
+	}
+