crypto/weakcrypto/source/hash/shacommon.h
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
#ifndef __CRYPTO_SHACOMMON_H_
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     2
#define __CRYPTO_SHACOMMON_H_
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     3
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     4
#include <e32base.h>/*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     5
* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     6
* All rights reserved.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     7
* This component and the accompanying materials are made available
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     8
* under the terms of the License "Eclipse Public License v1.0"
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     9
* which accompanies this distribution, and is available
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    10
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    11
*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    12
* Initial Contributors:
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    13
* Nokia Corporation - initial contribution.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    14
*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    15
* Contributors:
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    16
*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    17
* Description: 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    18
* Same as used in SHA1
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    19
* SHA_CH		> CSHA1_F
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    20
* SHA_Maj		> CSHA1_H
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    21
* SHA_Parity	> CSHA1_G
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    22
* The following definitions are equivalent and potentially faster.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    23
* #define SHA_Ch(x, y, z)      (((x) & ((y) ^ (z))) ^ (z))
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    24
* #define SHA_Maj(x, y, z)     (((x) & ((y) | (z))) | ((y) & (z)))
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    25
* These functions are defined in FIPS 180-2 Section 4.1
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    26
* Equation 4.1, 4.2, 4.3, 4.8, 4.9
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    27
*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    28
*/
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    29
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    30
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    31
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    32
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    33
/**
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    34
 @file
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    35
 @internalComponent
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    36
 @released
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    37
*/
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    38
template<typename T>
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    39
inline T SHA_Ch(T aX, T aY, T aZ)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    40
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    41
	return ((aX & aY) ^ ((~aX) & aZ));
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    42
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    43
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    44
template<typename T>
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    45
inline T SHA_Maj(T aX, T aY, T aZ)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    46
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    47
	return ((aX & aY) ^ (aX & aZ) ^ (aY & aZ));
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    48
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    49
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    50
template<typename T>
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    51
inline T SHA_Parity(T aX, T aY, T aZ)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    52
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    53
	return (aX ^ aY ^ aZ);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    54
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    55
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    56
/**
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    57
 * Define the SHA shift, and rotate right macro 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    58
 * Defined in FIPS 180-2 Section 3.2
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    59
 */
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    60
/** 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    61
 * SHA Right Shift operation: The right shift operation SHR^n(x), 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    62
 * where x is a w-bit word and n is an integer with 0 <= n < w, 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    63
 * is defined by  SHR^n(x) = x >> n.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    64
 */
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    65
template<typename T>
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    66
inline T SHA_SHR(T aBits, T aWord)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    67
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    68
	return (aWord >> aBits);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    69
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    70
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    71
/**
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    72
 * SHA Rotate Right Operation: The rotate right (circular right shift) operation
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    73
 * ROTR^n(x), where x is a w-bit word and n is an integer with 0 <= n < w, 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    74
 * is defined by ROTR n(x)=(x >> n) || (x << w - n).
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    75
 */
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    76
template<typename T>
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    77
inline T SHA_ROTR(T aBits, T aWord)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    78
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    79
	TInt totalBits = sizeof(T) << 3;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    80
	return ((aWord >> aBits) | (aWord << (totalBits-aBits)));
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    81
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    82
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    83
NONSHARABLE_CLASS(MSHA2Impl)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    84
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    85
public:
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    86
	/**
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    87
	 * This function will reset the state of hash.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    88
	 */
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    89
	virtual void Reset(const TAny*) = 0;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    90
	/**
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    91
	 * This function will finalize the hash and return
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    92
	 * the calculated hash.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    93
	 * @return Final hash
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    94
	 */ 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    95
	virtual const TDesC8& Final() = 0;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    96
	/**
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    97
	 * This function will add the message to the internal
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    98
	 * buffer and if the block size is reached then calcualte
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    99
	 * the hash till that point.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   100
	 * @param aMessage Message to be updated.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   101
	 * @param aLength Length of the message to be updated.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   102
	 */ 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   103
	virtual void Update(const TUint8* aMessage, TUint aLength) = 0;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   104
	/**
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   105
	 * This function will save the internal state of the hash.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   106
	 */ 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   107
	virtual void StoreState() = 0;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   108
	/**
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   109
	 * This function will retrieve the saved the internal state 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   110
	 * of the hash.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   111
	 */ 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   112
	virtual void RestoreState() = 0;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   113
	/**
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   114
	 * virtual distructor.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   115
	 */
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   116
	virtual ~MSHA2Impl(){}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   117
	};
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   118
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   119
#endif //__CRYPTO_SHACOMMON_H_