crypto/weakcrypto/source/asymmetric/rsafunction.cpp
author hgs
Thu, 24 Jun 2010 15:39:07 +0530
changeset 72 de46a57f75fb
permissions -rw-r--r--
201023_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
72
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     1
/*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     2
* Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     3
* All rights reserved.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     5
* under the terms of the License "Eclipse Public License v1.0"
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     8
*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     9
* Initial Contributors:
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    11
*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    12
* Contributors:
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    13
*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    14
* Description: 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    15
*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    16
*/
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    17
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    18
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    19
#include <bigint.h>
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    20
#include <asymmetrickeys.h>
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    21
#include "rsafunction.h"
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    22
#include "../bigint/mont.h"
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    23
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    24
//Public Encrypt
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    25
void RSAFunction::EncryptL(const CRSAPublicKey& aPublicKey, 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    26
	const TInteger& aInput, RInteger& aOutput)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    27
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    28
	FunctionL(aPublicKey.N(), aPublicKey.E(), aInput, aOutput);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    29
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    30
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    31
//Private Decrypt
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    32
void RSAFunction::DecryptL(const CRSAPrivateKey& aPrivateKey, 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    33
							const TInteger& aInput, RInteger& aOutput)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    34
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    35
	if (aPrivateKey.PrivateKeyType()==EStandard)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    36
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    37
		const CRSAPrivateKeyStandard* stdKey = 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    38
			static_cast<const CRSAPrivateKeyStandard*>(&aPrivateKey);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    39
		FunctionL(aPrivateKey.N(), stdKey->D(), aInput, aOutput);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    40
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    41
	else if (aPrivateKey.PrivateKeyType()==EStandardCRT)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    42
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    43
		FunctionCRTL(static_cast<const CRSAPrivateKeyCRT&>(aPrivateKey), aInput, 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    44
			aOutput);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    45
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    46
	else
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    47
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    48
		User::Leave(KErrNotSupported);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    49
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    50
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    51
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    52
//Private Encrypt
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    53
void RSAFunction::SignL(const CRSAPrivateKey& aPrivateKey, 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    54
	const TInteger& aInput, RInteger& aOutput)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    55
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    56
	if (aPrivateKey.PrivateKeyType()==EStandard)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    57
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    58
		const CRSAPrivateKeyStandard* stdKey = 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    59
			static_cast<const CRSAPrivateKeyStandard*>(&aPrivateKey);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    60
		FunctionL(aPrivateKey.N(), stdKey->D(), aInput, aOutput);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    61
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    62
	else if (aPrivateKey.PrivateKeyType()==EStandardCRT)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    63
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    64
		FunctionCRTL(static_cast<const CRSAPrivateKeyCRT&>(aPrivateKey), aInput, 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    65
			aOutput);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    66
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    67
	else
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    68
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    69
		User::Leave(KErrNotSupported);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    70
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    71
}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    72
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    73
//Public Decrypt
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    74
void RSAFunction::VerifyL(const CRSAPublicKey& aPublicKey,
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    75
	const TInteger& aInput, RInteger& aOutput)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    76
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    77
	FunctionL(aPublicKey.N(), aPublicKey.E(), aInput, aOutput);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    78
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    79
	
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    80
//The RSA Trapdoor Function
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    81
void RSAFunction::FunctionL(const TInteger& aModulus, const TInteger& aExponent, 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    82
							 const TInteger& aBase, RInteger& aOutput)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    83
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    84
	IsInputValidL(aBase, aModulus);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    85
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    86
	aOutput = TInteger::ModularExponentiateL(aBase, aExponent, aModulus);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    87
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    88
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    89
//The CRT version of the RSA Trapdoor Function
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    90
void RSAFunction::FunctionCRTL(const CRSAPrivateKeyCRT& aPrivateKey,
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    91
								const TInteger& aInput, RInteger& aOutput)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    92
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    93
	IsInputValidL(aInput, aPrivateKey.N());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    94
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    95
	CMontgomeryStructure* montP = CMontgomeryStructure::NewLC(aPrivateKey.P());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    96
	CMontgomeryStructure* montQ = CMontgomeryStructure::NewLC(aPrivateKey.Q());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    97
	
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    98
	const TInteger& p = aPrivateKey.P();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    99
	const TInteger& q = aPrivateKey.Q();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   100
	const TInteger& u = aPrivateKey.QInv();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   101
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   102
	//m1 = c^(dP) mod(p)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   103
	RInteger inputReduced = aInput.ModuloL(aPrivateKey.P());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   104
	CleanupStack::PushL(inputReduced);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   105
	const TInteger& m1 = montP->ExponentiateL(inputReduced, aPrivateKey.DP());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   106
	CleanupStack::PopAndDestroy(&inputReduced);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   107
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   108
	//m2 = c^(dQ) mod(Q)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   109
	inputReduced = aInput.ModuloL(aPrivateKey.Q());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   110
	CleanupStack::PushL(inputReduced);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   111
	const TInteger& m2 = montQ->ExponentiateL(inputReduced, aPrivateKey.DQ());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   112
	CleanupStack::PopAndDestroy(&inputReduced);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   113
	
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   114
	//Calculate CRT
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   115
	//h = (m1-m2) qInv mod(p)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   116
	RInteger h = m1.MinusL(m2);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   117
	CleanupStack::PushL(h);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   118
	h *= u;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   119
	h %= p; 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   120
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   121
	//m = m2 + q * h	
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   122
	h *= q;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   123
	h += m2;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   124
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   125
	aOutput = h;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   126
	CleanupStack::Pop(&h);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   127
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   128
	CleanupStack::PopAndDestroy(montQ);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   129
	CleanupStack::PopAndDestroy(montP);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   130
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   131