crypto/weakcrypto/source/asymmetric/dsaverifier.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 <asymmetric.h>
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    20
#include <asymmetrickeys.h>
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    21
#include <bigint.h>
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    22
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    23
EXPORT_C CDSAVerifier* CDSAVerifier::NewL(const CDSAPublicKey& aKey)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    24
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    25
	CDSAVerifier* self = new(ELeave)CDSAVerifier(aKey);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    26
	return self;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    27
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    28
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    29
EXPORT_C CDSAVerifier* CDSAVerifier::NewLC(const CDSAPublicKey& aKey)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    30
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    31
	CDSAVerifier* self = NewL(aKey);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    32
	CleanupStack::PushL(self);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    33
	return self;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    34
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    35
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    36
TInt CDSAVerifier::MaxInputLength(void) const
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    37
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    38
	// return CSHA1::DIGESTBYTES
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    39
	return 160;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    40
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    41
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    42
TBool CDSAVerifier::VerifyL(const TDesC8& aInput, 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    43
	const CDSASignature& aSignature) const
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    44
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    45
	//see HAC 11.56 or DSS section 6
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    46
	//I'll follow HAC as I like the description better
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    47
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    48
	// a) Obtain A's authenticate public key
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    49
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    50
	// b) Verify that 0 < r < q and 0 < s < q; if not reject signature
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    51
	if (aSignature.R() <= 0 || aSignature.R() >= iPublicKey.Q())
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    52
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    53
		return EFalse;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    54
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    55
	if (aSignature.S() <= 0 || aSignature.S() >= iPublicKey.Q())
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    56
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    57
		return EFalse;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    58
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    59
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    60
	TBool result = EFalse;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    61
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    62
	// c) Compute w = s^(-1) mod q and h(m)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    63
	RInteger w = aSignature.S().InverseModL(iPublicKey.Q());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    64
	CleanupStack::PushL(w);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    65
	// Note that in order to be interoperable, compliant with the DSS, and
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    66
	// secure, aInput must be the result of a SHA-1 hash
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    67
	RInteger hm = RInteger::NewL(aInput);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    68
	CleanupStack::PushL(hm);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    69
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    70
	// d) Compute u1 = w * hm mod q and u2 = r * w mod q
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    71
	RInteger u1 = TInteger::ModularMultiplyL(w, hm, iPublicKey.Q());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    72
	CleanupStack::PushL(u1);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    73
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    74
	RInteger u2 = TInteger::ModularMultiplyL(aSignature.R(), w, iPublicKey.Q());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    75
	CleanupStack::PushL(u2);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    76
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    77
	// e) Compute v = ((g^u1 * y^u2) mod p) mod q
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    78
	RInteger temp = TInteger::ModularExponentiateL(iPublicKey.G(), u1,
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    79
		iPublicKey.P());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    80
	CleanupStack::PushL(temp);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    81
	RInteger temp1 = TInteger::ModularExponentiateL(iPublicKey.Y(), u2,
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    82
		iPublicKey.P());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    83
	CleanupStack::PushL(temp1);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    84
	RInteger v = TInteger::ModularMultiplyL(temp, temp1, iPublicKey.P());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    85
	CleanupStack::PushL(v);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    86
	v %= iPublicKey.Q();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    87
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    88
	// f) Accept the signature iff v == r
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    89
	if(v == aSignature.R())
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    90
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    91
		result = ETrue;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    92
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    93
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    94
	CleanupStack::PopAndDestroy(&v);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    95
	CleanupStack::PopAndDestroy(&temp1);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    96
	CleanupStack::PopAndDestroy(&temp);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    97
	CleanupStack::PopAndDestroy(&u2);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    98
	CleanupStack::PopAndDestroy(&u1);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    99
	CleanupStack::PopAndDestroy(&hm);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   100
	CleanupStack::PopAndDestroy(&w); 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   101
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   102
	return result;	
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   103
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   104
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   105
CDSAVerifier::CDSAVerifier(const CDSAPublicKey& aKey)  
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   106
	: iPublicKey(aKey)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   107
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   108
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   109