os/security/crypto/weakcrypto/inc/hash.h
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of the License "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description: 
sl@0
    15
* ** IMPORTANT ** PublishedPartner API's in this file are published to 3rd party developers via the 
sl@0
    16
* Symbian website. Changes to these API's should be treated as PublishedAll API changes and the Security TA should be consulted.
sl@0
    17
* This header contains the definition of the message digest classes
sl@0
    18
*
sl@0
    19
*/
sl@0
    20
sl@0
    21
sl@0
    22
/**
sl@0
    23
 @file 
sl@0
    24
 @publishedAll
sl@0
    25
 @released
sl@0
    26
*/
sl@0
    27
sl@0
    28
#ifndef __HASH_H__
sl@0
    29
#define __HASH_H__
sl@0
    30
sl@0
    31
#include <e32base.h>
sl@0
    32
sl@0
    33
sl@0
    34
//Forward Declarations
sl@0
    35
class MSHA2Impl;
sl@0
    36
sl@0
    37
/**
sl@0
    38
 * Base class for message digests.
sl@0
    39
 */
sl@0
    40
class CMessageDigest:public CBase
sl@0
    41
	{
sl@0
    42
	public:
sl@0
    43
	/**
sl@0
    44
	 *	Enumeration to identify hash functions (aka message-digest algorithms).
sl@0
    45
	 */
sl@0
    46
	enum THashId
sl@0
    47
	{
sl@0
    48
		/** 
sl@0
    49
		 * Message Digest algorithm developed by Rivest for digital signature
sl@0
    50
		 * applications (and optimized for 8-bit machines). 
sl@0
    51
		 * 
sl@0
    52
		 * Takes a message of arbitrary length and produces a 128-bit message digest. 
sl@0
    53
		 *
sl@0
    54
		 * See RFC 1319
sl@0
    55
		 */
sl@0
    56
		EMD2,
sl@0
    57
		/** 
sl@0
    58
		 * Message Digest algorithm developed by Rivest for digital signature
sl@0
    59
		 * applications (and optimized for 32-bit machines). 
sl@0
    60
		 * 
sl@0
    61
		 * Takes a message of arbitrary length and produces a 128-bit message digest. 
sl@0
    62
		 * 
sl@0
    63
		 * See RFC 1321
sl@0
    64
		 */
sl@0
    65
		EMD5,
sl@0
    66
		/** 
sl@0
    67
		 * Secure Hash Algorithm (version 1) is a message digest algorithm developed by 
sl@0
    68
		 * NIST, along with the NSA, for use with the Digital Signature Standard (DSS).
sl@0
    69
		 * 
sl@0
    70
		 * It takes a message of less than 2^64 bits in length and produces
sl@0
    71
		 * a 160-bit message digest.
sl@0
    72
		 *
sl@0
    73
		 * See FIPS 180-1 and RFC 3174
sl@0
    74
		 */
sl@0
    75
		ESHA1,
sl@0
    76
		/** 
sl@0
    77
		 * HMAC - Hash function based Message Authentication Code is a mechanism
sl@0
    78
		 * for message authentication using cryptographic hash functions. (A checksum.)
sl@0
    79
		 * 
sl@0
    80
		 * It can be used with any iterative cryptographic hash function,
sl@0
    81
   		 * e.g., MD5, SHA-1, in combination with a secret shared key
sl@0
    82
   		 * to produce a checksum that is appended to the message.
sl@0
    83
   		 * The cryptographic strength of HMAC depends on the properties
sl@0
    84
   		 * of the underlying hash function.
sl@0
    85
		 *
sl@0
    86
		 * See RFC 2104 
sl@0
    87
		 */
sl@0
    88
		HMAC,
sl@0
    89
		/** 
sl@0
    90
		 * Message Digest algorithm developed by Rivest for digital signature
sl@0
    91
		 * applications (and optimized for 32-bit machines). 
sl@0
    92
		 * 
sl@0
    93
		 * Takes a message of arbitrary length and produces a 128-bit message digest. 
sl@0
    94
		 * 
sl@0
    95
		 * See RFC 1320
sl@0
    96
		 */
sl@0
    97
		EMD4,
sl@0
    98
		/** 
sl@0
    99
		 * Secure Hash Algorithm - 224 (version 2) is a message digest algorithm developed by 
sl@0
   100
		 * NIST, along with the NSA, for use with the Digital Signature Standard (DSS).
sl@0
   101
		 * 
sl@0
   102
		 * It takes a message of less than 2^64 bits in length and produces
sl@0
   103
		 * a 224-bit message digest.
sl@0
   104
		 *
sl@0
   105
		 * See FIPS 180-2 (with change notice), RFC3874 and FIPS 180-3
sl@0
   106
		 */
sl@0
   107
		ESHA224,
sl@0
   108
		/** 
sl@0
   109
		 * Secure Hash Algorithm - 256 (version 2) is a message digest algorithm developed by 
sl@0
   110
		 * NIST, along with the NSA, for use with the Digital Signature Standard (DSS).
sl@0
   111
		 * 
sl@0
   112
		 * It takes a message of less than 2^64 bits in length and produces
sl@0
   113
		 * a 256-bit message digest.
sl@0
   114
		 *
sl@0
   115
		 * See FIPS 180-2 and RFC 4634
sl@0
   116
		 */
sl@0
   117
		ESHA256,
sl@0
   118
		/** 
sl@0
   119
		 * Secure Hash Algorithm - 384 (version 2) is a message digest algorithm developed by 
sl@0
   120
		 * NIST, along with the NSA, for use with the Digital Signature Standard (DSS).
sl@0
   121
		 * 
sl@0
   122
		 * It takes a message of less than 2^128 bits in length and produces
sl@0
   123
		 * a 384-bit message digest.
sl@0
   124
		 *
sl@0
   125
		 * See FIPS 180-2 and RFC 4634
sl@0
   126
		 */
sl@0
   127
		ESHA384,
sl@0
   128
		/** 
sl@0
   129
		 * Secure Hash Algorithm - 512 (version 2) is a message digest algorithm developed by 
sl@0
   130
		 * NIST, along with the NSA, for use with the Digital Signature Standard (DSS).
sl@0
   131
		 * 
sl@0
   132
		 * It takes a message of less than 2^128 bits in length and produces
sl@0
   133
		 * a 512-bit message digest.
sl@0
   134
		 *
sl@0
   135
		 * See FIPS 180-2 and RFC 4634
sl@0
   136
		 */
sl@0
   137
		ESHA512
sl@0
   138
	};
sl@0
   139
	
sl@0
   140
	public:
sl@0
   141
		/** 
sl@0
   142
		 * Creates a brand new reset CMessageDigest object containing no state
sl@0
   143
		 * information from the current object.  
sl@0
   144
		 * 
sl@0
   145
		 * To make a copy of a message digest with its internal state intact,
sl@0
   146
		 * see CopyL().
sl@0
   147
		 *
sl@0
   148
		 * @return A pointer to the new reset CMessageDigest object
sl@0
   149
		 */
sl@0
   150
		IMPORT_C virtual CMessageDigest* ReplicateL(void)=0;		
sl@0
   151
sl@0
   152
		/** 
sl@0
   153
		 * Adds aMessage to the internal representation of data to be hashed,
sl@0
   154
		 * then returns a TPtrC8 of the finalised hash of all the previously
sl@0
   155
		 * appended messages.
sl@0
   156
		 * 
sl@0
   157
		 * @param aMessage	Data to be included in the hash.
sl@0
   158
		 * @return			A descriptor pointer to the buffer containing the
sl@0
   159
		 *					resulting hash.
sl@0
   160
		 */
sl@0
   161
		IMPORT_C virtual TPtrC8 Hash(const TDesC8& aMessage)=0;
sl@0
   162
sl@0
   163
		/** 
sl@0
   164
		 * Creates a new CMessageDigest object with the exact same state as
sl@0
   165
		 * the current object.  
sl@0
   166
		 *
sl@0
   167
		 * This function copies all internal state of the message digest.
sl@0
   168
		 * To create a new CMessageDigest object without the state of
sl@0
   169
		 * the current object, see ReplicateL().
sl@0
   170
		 *
sl@0
   171
		 * @return A pointer to the new CMessageDigest object
sl@0
   172
		 */
sl@0
   173
		IMPORT_C virtual CMessageDigest* CopyL(void)=0;
sl@0
   174
		
sl@0
   175
		/** 
sl@0
   176
		 * Gets the internal block size of the message digest.
sl@0
   177
		 * 
sl@0
   178
		 * @return	Internal block size of message digest in bytes.
sl@0
   179
		 */
sl@0
   180
		IMPORT_C virtual TInt BlockSize(void)=0;
sl@0
   181
		
sl@0
   182
		/** 
sl@0
   183
		 * Gets the size of the message digest output.
sl@0
   184
		 *
sl@0
   185
		 * @return	Output size of the message digest in bytes.
sl@0
   186
		 */
sl@0
   187
		IMPORT_C virtual TInt HashSize(void)=0;
sl@0
   188
		
sl@0
   189
		/** 
sl@0
   190
		 * Resets the internal state of the message digest.  
sl@0
   191
		 *
sl@0
   192
		 * A reset hash object loses all internal state representing the hashed
sl@0
   193
		 * data. A reset message digest is suitable to begin a new, distinct hash
sl@0
   194
		 * of different data.  Any previously returned TPtrC8 from a call to
sl@0
   195
		 * Final() remains valid until any subsequent call to Update() or
sl@0
   196
		 * Final().
sl@0
   197
		 */
sl@0
   198
		IMPORT_C virtual void Reset(void)=0;
sl@0
   199
		
sl@0
   200
		/**
sl@0
   201
		 * Destructor.
sl@0
   202
		 */		
sl@0
   203
		IMPORT_C ~CMessageDigest(void);
sl@0
   204
	public:
sl@0
   205
		/** 
sl@0
   206
		 * Adds data to the internal representation of messages to be hashed.
sl@0
   207
		 *
sl@0
   208
		 * @param aMessage	Data to be included in the hash.
sl@0
   209
		 * @since v8.0
sl@0
   210
		 */
sl@0
   211
		IMPORT_C virtual void Update(const TDesC8& aMessage)=0;
sl@0
   212
		
sl@0
   213
		/** 
sl@0
   214
		 * Adds aMessage to the internal representation of data to be hashed,
sl@0
   215
		 * returns a TPtrC8 of the finalised hash of all the previously
sl@0
   216
		 * appended messages, and calls Reset().
sl@0
   217
		 * 
sl@0
   218
		 * @param aMessage	Data to be included in the hash 
sl@0
   219
		 * @return			A descriptor pointer to the buffer containing the
sl@0
   220
		 *					resulting hash.
sl@0
   221
		 * @since v8.0
sl@0
   222
		 */
sl@0
   223
		IMPORT_C virtual TPtrC8 Final(const TDesC8& aMessage)=0;
sl@0
   224
		
sl@0
   225
		/** 
sl@0
   226
		 * Gets a TPtrC8 of the finalised hash of all the previously
sl@0
   227
		 * appended messages and then calls Reset().
sl@0
   228
		 * 
sl@0
   229
		 * @return	A descriptor pointer to the buffer containing the
sl@0
   230
		 * 			resulting hash.
sl@0
   231
		 * @since v8.0
sl@0
   232
		 */
sl@0
   233
		IMPORT_C virtual TPtrC8 Final(void)=0;
sl@0
   234
	public:
sl@0
   235
		/**
sl@0
   236
		 * Restores the internal state of the message digest
sl@0
   237
		 * to a previously stored state.
sl@0
   238
		 *
sl@0
   239
		 * @see StoreState()
sl@0
   240
		 */
sl@0
   241
		virtual void RestoreState() = 0;
sl@0
   242
sl@0
   243
		/**
sl@0
   244
		 * Stores the internal state of the message digest. 
sl@0
   245
		 */
sl@0
   246
		virtual void StoreState() = 0;
sl@0
   247
	protected:
sl@0
   248
		/**
sl@0
   249
		 * Constructor
sl@0
   250
		 */
sl@0
   251
		IMPORT_C CMessageDigest(void);
sl@0
   252
sl@0
   253
		/**
sl@0
   254
		 * Copy constructor
sl@0
   255
		 *
sl@0
   256
		 * @param aMD	A CMessageDigest object
sl@0
   257
		 */
sl@0
   258
		IMPORT_C CMessageDigest(const CMessageDigest& aMD);
sl@0
   259
	};
sl@0
   260
sl@0
   261
/** 
sl@0
   262
 * The MD2 block size (in bytes) 
sl@0
   263
 * 
sl@0
   264
 */
sl@0
   265
const TInt MD2_BLOCK=16;
sl@0
   266
sl@0
   267
/** The size (in bytes) of the MD2 message digest */
sl@0
   268
const TInt MD2_HASH=16;
sl@0
   269
sl@0
   270
/**
sl@0
   271
 * An MD2 message digest
sl@0
   272
 */
sl@0
   273
class CMD2:public CMessageDigest
sl@0
   274
sl@0
   275
	{
sl@0
   276
	public:
sl@0
   277
		/**
sl@0
   278
		 * Creates a new MD2 object.
sl@0
   279
		 *
sl@0
   280
		 * @return	A pointer to the new CMD2 object
sl@0
   281
		 */
sl@0
   282
		IMPORT_C static CMD2* NewL(void);
sl@0
   283
		IMPORT_C CMessageDigest* ReplicateL(void);
sl@0
   284
		IMPORT_C TPtrC8 Hash(const TDesC8& aMessage);
sl@0
   285
		/** Destructor */
sl@0
   286
		IMPORT_C ~CMD2(void);
sl@0
   287
		IMPORT_C CMessageDigest* CopyL(void);
sl@0
   288
		IMPORT_C TInt BlockSize(void);
sl@0
   289
		IMPORT_C TInt HashSize(void);
sl@0
   290
		IMPORT_C void Reset(void);
sl@0
   291
		IMPORT_C void Update(const TDesC8& aMessage);
sl@0
   292
		IMPORT_C TPtrC8 Final(const TDesC8& aMessage);
sl@0
   293
		IMPORT_C TPtrC8 Final();
sl@0
   294
	public:
sl@0
   295
		void RestoreState();
sl@0
   296
		void StoreState();
sl@0
   297
	private:
sl@0
   298
		void DoUpdate(const TUint8* aData,TUint aLength);
sl@0
   299
		void DoFinal(void);
sl@0
   300
		void Block(const TUint8* aData);
sl@0
   301
	private:
sl@0
   302
		CMD2(void);
sl@0
   303
		CMD2(const CMD2& aMD2);
sl@0
   304
	private:
sl@0
   305
		TBuf8<MD2_HASH> iHash;
sl@0
   306
		TInt iNum;
sl@0
   307
		TUint8 iData[MD2_BLOCK];
sl@0
   308
		TUint iChecksum[MD2_BLOCK];
sl@0
   309
		TUint iState[MD2_BLOCK];
sl@0
   310
	private:
sl@0
   311
		TBuf8<MD2_HASH> iHashBuf;
sl@0
   312
		TUint8 iDataTemp[MD2_BLOCK];
sl@0
   313
		TUint iChecksumTemp[MD2_BLOCK];
sl@0
   314
		TUint iStateTemp[MD2_BLOCK];
sl@0
   315
	};
sl@0
   316
sl@0
   317
/** 
sl@0
   318
 * The MD5 block size (in bytes)
sl@0
   319
 * 
sl@0
   320
 */
sl@0
   321
const TUint MD5_LBLOCK=16;
sl@0
   322
sl@0
   323
/** The size (in bytes) of the MD5 message digest */
sl@0
   324
const TUint MD5_HASH=16;
sl@0
   325
sl@0
   326
/**
sl@0
   327
 * An MD5 message digest
sl@0
   328
 *
sl@0
   329
 * Takes a message of arbitrary length as input and produces a 128-bit message digest. 
sl@0
   330
 *
sl@0
   331
 * The length of input data should not be longer than 2^32 in bits(2^31 in bytes)
sl@0
   332
 * which is roughly half a gig.
sl@0
   333
 *
sl@0
   334
 */
sl@0
   335
class CMD5:public CMessageDigest
sl@0
   336
	{
sl@0
   337
	public:
sl@0
   338
		/**
sl@0
   339
		 * Creates a new MD5 object.
sl@0
   340
		 *
sl@0
   341
		 * @return	A pointer to the new CMD5 object
sl@0
   342
		 */
sl@0
   343
		IMPORT_C static CMD5* NewL(void);
sl@0
   344
		IMPORT_C CMessageDigest* ReplicateL(void);
sl@0
   345
		IMPORT_C TPtrC8 Hash(const TDesC8& aMessage);
sl@0
   346
		/** Destructor */
sl@0
   347
		IMPORT_C ~CMD5(void);
sl@0
   348
		IMPORT_C CMessageDigest* CopyL(void);
sl@0
   349
		IMPORT_C TInt BlockSize(void);
sl@0
   350
		IMPORT_C TInt HashSize(void);
sl@0
   351
		IMPORT_C void Reset(void);
sl@0
   352
		IMPORT_C void Update(const TDesC8& aMessage);
sl@0
   353
		IMPORT_C TPtrC8 Final(const TDesC8& aMessage);
sl@0
   354
		IMPORT_C TPtrC8 Final();
sl@0
   355
	public:
sl@0
   356
		void RestoreState();
sl@0
   357
		void StoreState();
sl@0
   358
	private:
sl@0
   359
		CMD5(void);
sl@0
   360
		CMD5(const CMD5& aMD5);
sl@0
   361
	private:
sl@0
   362
		void DoUpdate(const TUint8* aData,TUint aLength);
sl@0
   363
		void DoFinal(void);
sl@0
   364
		void Block();
sl@0
   365
	private:
sl@0
   366
		TBuf8<MD5_HASH> iHash;
sl@0
   367
	private:
sl@0
   368
		TUint iA;
sl@0
   369
		TUint iB;
sl@0
   370
		TUint iC;
sl@0
   371
		TUint iD;
sl@0
   372
		TUint iNl;
sl@0
   373
		TUint iNh;
sl@0
   374
		TUint iData[MD5_LBLOCK];
sl@0
   375
	private:
sl@0
   376
		TUint iACopy;
sl@0
   377
		TUint iBCopy;
sl@0
   378
		TUint iCCopy;
sl@0
   379
		TUint iDCopy;
sl@0
   380
		TUint iNlCopy;
sl@0
   381
		TUint iNhCopy;
sl@0
   382
		TUint iDataCopy[MD5_LBLOCK];
sl@0
   383
	};
sl@0
   384
sl@0
   385
/** 
sl@0
   386
 * The SHA-1 block size (in bytes) 
sl@0
   387
 * 
sl@0
   388
 */
sl@0
   389
const TUint SHA1_LBLOCK=16;
sl@0
   390
sl@0
   391
/** The size (in bytes) of the SHA-1 message digest */
sl@0
   392
const TUint SHA1_HASH=20;
sl@0
   393
sl@0
   394
/** The size (in bytes) of the SHA message digest */
sl@0
   395
const TUint SHA_HASH=SHA1_HASH;
sl@0
   396
sl@0
   397
/**
sl@0
   398
 * A SHA-1 message digest
sl@0
   399
 */
sl@0
   400
class CSHA1:public CMessageDigest
sl@0
   401
	{
sl@0
   402
	public:
sl@0
   403
		/**
sl@0
   404
		 * Creates a new SHA-1 object.
sl@0
   405
		 *
sl@0
   406
		 * @return	A pointer to the new SHA-1 object
sl@0
   407
		 */
sl@0
   408
		IMPORT_C static CSHA1* NewL(void);
sl@0
   409
		IMPORT_C CMessageDigest* ReplicateL(void);
sl@0
   410
		IMPORT_C TPtrC8 Hash(const TDesC8& aMessage);
sl@0
   411
		/** Destructor */
sl@0
   412
		IMPORT_C ~CSHA1(void);
sl@0
   413
		IMPORT_C CMessageDigest* CopyL(void);
sl@0
   414
		IMPORT_C TInt BlockSize(void);
sl@0
   415
		IMPORT_C TInt HashSize(void);
sl@0
   416
		IMPORT_C void Reset(void);
sl@0
   417
		IMPORT_C void Update(const TDesC8& aMessage);
sl@0
   418
		IMPORT_C TPtrC8 Final(const TDesC8& aMessage);
sl@0
   419
		IMPORT_C TPtrC8 Final();
sl@0
   420
	public:
sl@0
   421
		void RestoreState();
sl@0
   422
		void StoreState();
sl@0
   423
	private:
sl@0
   424
		CSHA1(void);
sl@0
   425
		CSHA1(const CSHA1& aSHA1);
sl@0
   426
		void ConstructL(void);
sl@0
   427
	private:
sl@0
   428
		void DoUpdate(const TUint8* aData,TUint aLength);
sl@0
   429
		void DoFinal(void);
sl@0
   430
		void Block();
sl@0
   431
	private:
sl@0
   432
		TBuf8<SHA1_HASH> iHash;
sl@0
   433
		TUint iA;
sl@0
   434
		TUint iB;
sl@0
   435
		TUint iC;
sl@0
   436
		TUint iD;
sl@0
   437
		TUint iE;
sl@0
   438
		TUint iNl;
sl@0
   439
		TUint iNh;
sl@0
   440
		TUint iData[SHA1_LBLOCK*5];
sl@0
   441
	private:
sl@0
   442
		TUint iACopy;
sl@0
   443
		TUint iBCopy;
sl@0
   444
		TUint iCCopy;
sl@0
   445
		TUint iDCopy;
sl@0
   446
		TUint iECopy;
sl@0
   447
		TUint iNlCopy;
sl@0
   448
		TUint iNhCopy;	
sl@0
   449
		TUint iDataCopy[SHA1_LBLOCK*5];
sl@0
   450
	};
sl@0
   451
sl@0
   452
enum TSH2Algo
sl@0
   453
	{
sl@0
   454
	E224Bit,
sl@0
   455
	E256Bit,
sl@0
   456
	E384Bit,
sl@0
   457
	E512Bit
sl@0
   458
	};
sl@0
   459
	
sl@0
   460
/**
sl@0
   461
 * A SHA-2 message digest
sl@0
   462
 * 
sl@0
   463
 * SHA-2 comprises of SHA-224, SHA256, SHA384 and SHA512
sl@0
   464
 */
sl@0
   465
class CSHA2 : public CMessageDigest
sl@0
   466
	{
sl@0
   467
public:
sl@0
   468
	//NewL & NewLC	
sl@0
   469
	IMPORT_C static CSHA2* NewL(TSH2Algo aAlgorithmId);
sl@0
   470
	IMPORT_C static CSHA2* NewLC(TSH2Algo aAlgorithmId);
sl@0
   471
	
sl@0
   472
	/** Destructor */
sl@0
   473
	IMPORT_C ~CSHA2(void);
sl@0
   474
	
sl@0
   475
	//From CMessageDigest
sl@0
   476
	IMPORT_C CMessageDigest* ReplicateL(void);
sl@0
   477
	IMPORT_C TPtrC8 Hash(const TDesC8& aMessage);
sl@0
   478
	IMPORT_C CMessageDigest* CopyL(void);
sl@0
   479
	IMPORT_C TInt BlockSize(void);
sl@0
   480
	IMPORT_C TInt HashSize(void);
sl@0
   481
	IMPORT_C void Reset(void);
sl@0
   482
	IMPORT_C void Update(const TDesC8& aMessage);
sl@0
   483
	IMPORT_C TPtrC8 Final(const TDesC8& aMessage);
sl@0
   484
	IMPORT_C TPtrC8 Final();
sl@0
   485
sl@0
   486
public:
sl@0
   487
	void RestoreState();
sl@0
   488
	void StoreState();
sl@0
   489
	
sl@0
   490
private:
sl@0
   491
	//Constructors
sl@0
   492
	void ConstructL(TSH2Algo aAlgorithmId);
sl@0
   493
	void ConstructL(const CSHA2& aSHA512);
sl@0
   494
	
sl@0
   495
private:
sl@0
   496
	MSHA2Impl*	iImplementation;
sl@0
   497
	const TAny*	iInitValues;
sl@0
   498
	TSH2Algo	iAlgorithmType;
sl@0
   499
	TUint		iHashSize;
sl@0
   500
	};	
sl@0
   501
	
sl@0
   502
/**
sl@0
   503
 * A SHA message digest
sl@0
   504
 *
sl@0
   505
 * @deprecated Replaced by CSHA1
sl@0
   506
 */
sl@0
   507
class CSHA:public CMessageDigest
sl@0
   508
	{
sl@0
   509
	public:
sl@0
   510
		/**
sl@0
   511
		 * Creates a new SHA object.
sl@0
   512
		 *
sl@0
   513
		 * @return	A pointer to the new SHA object
sl@0
   514
		 */
sl@0
   515
		IMPORT_C static CSHA* NewL(void);
sl@0
   516
		IMPORT_C CMessageDigest* ReplicateL(void);
sl@0
   517
		IMPORT_C TPtrC8 Hash(const TDesC8& aMessage);
sl@0
   518
		/** Destructor */
sl@0
   519
		IMPORT_C ~CSHA(void);
sl@0
   520
		IMPORT_C CMessageDigest* CopyL(void);
sl@0
   521
		IMPORT_C TInt BlockSize(void);
sl@0
   522
		IMPORT_C TInt HashSize(void);
sl@0
   523
		IMPORT_C void Reset(void);
sl@0
   524
		IMPORT_C void Update(const TDesC8& aMessage);
sl@0
   525
		IMPORT_C TPtrC8 Final(const TDesC8& aMessage);
sl@0
   526
		IMPORT_C TPtrC8 Final();
sl@0
   527
	public:
sl@0
   528
		void RestoreState();
sl@0
   529
		void StoreState();
sl@0
   530
	};
sl@0
   531
sl@0
   532
/**
sl@0
   533
 * This is the maximum block size currently supported by HMAC implementation.
sl@0
   534
 */ 
sl@0
   535
	const TUint KMaxBlockSize=128;
sl@0
   536
sl@0
   537
/**
sl@0
   538
 * An HMAC (Hashed Message Authentication Code)
sl@0
   539
 */
sl@0
   540
	class CHMAC:public CMessageDigest
sl@0
   541
sl@0
   542
	{
sl@0
   543
	public:
sl@0
   544
		/**
sl@0
   545
		 * Creates a new HMAC object from a specified type of message digest 
sl@0
   546
		 * and authentication key.
sl@0
   547
		 * 
sl@0
   548
		 * @param aKey		Authentication key.
sl@0
   549
		 * @param aDigest	A message digest to construct the HMAC from.
sl@0
   550
		 * @return			A pointer to the new CHMAC object. 
sl@0
   551
		 *					The resulting HMAC object takes ownership of aDigest
sl@0
   552
		 *					and is responsible for its deletion.
sl@0
   553
		 */
sl@0
   554
		IMPORT_C static CHMAC* NewL(const TDesC8& aKey,CMessageDigest* aDigest);
sl@0
   555
		IMPORT_C CMessageDigest* ReplicateL(void);
sl@0
   556
		IMPORT_C TPtrC8 Hash(const TDesC8& aMessage);
sl@0
   557
		/** Destructor */
sl@0
   558
		IMPORT_C ~CHMAC(void);
sl@0
   559
		IMPORT_C CMessageDigest* CopyL(void);
sl@0
   560
		IMPORT_C TInt BlockSize(void);
sl@0
   561
		IMPORT_C TInt HashSize(void);
sl@0
   562
		IMPORT_C void Reset(void);
sl@0
   563
		IMPORT_C void Update(const TDesC8& aMessage);
sl@0
   564
		IMPORT_C TPtrC8 Final(const TDesC8& aMessage);
sl@0
   565
		IMPORT_C TPtrC8 Final();
sl@0
   566
	public:
sl@0
   567
		void RestoreState();
sl@0
   568
		void StoreState();
sl@0
   569
	private:
sl@0
   570
		CHMAC(void);
sl@0
   571
		CHMAC(CMessageDigest* aDigest);
sl@0
   572
		CHMAC(const CHMAC& aHMAC);
sl@0
   573
		void InitialiseL(const TDesC8& aKey);
sl@0
   574
		void InitBlockSizeL();
sl@0
   575
		
sl@0
   576
	private:
sl@0
   577
		CMessageDigest* iDigest;
sl@0
   578
		TBuf8<KMaxBlockSize> iInnerPad;
sl@0
   579
		TBuf8<KMaxBlockSize> iOuterPad;
sl@0
   580
		TBuf8<KMaxBlockSize> iInnerPadCopy;
sl@0
   581
		TBuf8<KMaxBlockSize> iOuterPadCopy;		
sl@0
   582
		TInt iBlockSize;
sl@0
   583
	};
sl@0
   584
	
sl@0
   585
/** 
sl@0
   586
 * The MD4 block size 
sl@0
   587
 */
sl@0
   588
 const TUint MD4_LBLOCK=16;
sl@0
   589
sl@0
   590
/** The size (in bytes) of the MD4 message digest */
sl@0
   591
 const TUint MD4_HASH=16;
sl@0
   592
sl@0
   593
sl@0
   594
/**
sl@0
   595
 * An MD4 message digest Algorithm.
sl@0
   596
 *
sl@0
   597
 * Takes a message of arbitrary length as input and produces a 128-bit message digest. 
sl@0
   598
 *
sl@0
   599
 * The total input length of data should not be longer than 2^32 in bits(2^31 in bytes)
sl@0
   600
 * which is roughly half a gig.
sl@0
   601
 *
sl@0
   602
 */
sl@0
   603
class CMD4:public CMessageDigest
sl@0
   604
	{
sl@0
   605
	public:
sl@0
   606
		/**
sl@0
   607
		 * Creates a new MD4 object.
sl@0
   608
		 *
sl@0
   609
		 * @return	A pointer to the new CMD4 object
sl@0
   610
		 */
sl@0
   611
		IMPORT_C static CMD4* NewL(void);
sl@0
   612
		IMPORT_C CMessageDigest* ReplicateL(void);
sl@0
   613
		IMPORT_C TPtrC8 Hash(const TDesC8& aMessage);
sl@0
   614
		/** Destructor */
sl@0
   615
		IMPORT_C ~CMD4(void);
sl@0
   616
		IMPORT_C CMessageDigest* CopyL(void);
sl@0
   617
		IMPORT_C TInt BlockSize(void);
sl@0
   618
		IMPORT_C TInt HashSize(void);
sl@0
   619
		IMPORT_C void Reset(void);
sl@0
   620
		IMPORT_C void Update(const TDesC8& aMessage);
sl@0
   621
		IMPORT_C TPtrC8 Final(const TDesC8& aMessage);
sl@0
   622
		IMPORT_C TPtrC8 Final();
sl@0
   623
	public:
sl@0
   624
		virtual void RestoreState();
sl@0
   625
		virtual void StoreState();
sl@0
   626
	private:
sl@0
   627
		CMD4(void);
sl@0
   628
		CMD4(const CMD4& aMD4);
sl@0
   629
	private:
sl@0
   630
	   /**
sl@0
   631
		* Divides the message into blocks of 512 bits and performs the
sl@0
   632
		* Block operation on them.
sl@0
   633
		*/
sl@0
   634
		void DoUpdate(const TUint8* aData,TUint aLength);
sl@0
   635
	   /**
sl@0
   636
		* Performs the Block operation on the last 512 bit block.
sl@0
   637
		* This function does the padding on the last 512 bit block
sl@0
   638
		* and also appends the length of the message to the last 64-bits
sl@0
   639
		* of the block.
sl@0
   640
		*/
sl@0
   641
		void DoFinal(void);
sl@0
   642
	   /**
sl@0
   643
		* Performs the Block operation on the 512 bit blocks
sl@0
   644
		*/
sl@0
   645
		void Block();
sl@0
   646
	private:
sl@0
   647
		/*Holds the generated 128-bit Message Digest*/
sl@0
   648
		TBuf8<MD4_HASH> iHash;
sl@0
   649
	private:
sl@0
   650
		TUint iA;
sl@0
   651
		TUint iB;
sl@0
   652
		TUint iC;
sl@0
   653
		TUint iD;
sl@0
   654
		TUint iNl;
sl@0
   655
		TUint iNh;
sl@0
   656
		TUint iData[MD4_LBLOCK];
sl@0
   657
	private:
sl@0
   658
		TUint iACopy;
sl@0
   659
		TUint iBCopy;
sl@0
   660
		TUint iCCopy;
sl@0
   661
		TUint iDCopy;
sl@0
   662
		TUint iNlCopy;
sl@0
   663
		TUint iNhCopy;
sl@0
   664
		TUint iDataCopy[MD4_LBLOCK];
sl@0
   665
	};
sl@0
   666
sl@0
   667
sl@0
   668
/**
sl@0
   669
 *	Factory to create a CMessageDigest derived object according to the identity of the hash algorithm.
sl@0
   670
 */
sl@0
   671
class CMessageDigestFactory : public CBase
sl@0
   672
{
sl@0
   673
public:
sl@0
   674
	/**
sl@0
   675
	 * Creates a CMessageDigest derived object according to the specified type of hash algorithm.
sl@0
   676
	 *
sl@0
   677
	 * @param aHashId	The identity of the hash algorithm
sl@0
   678
	 * @return			A pointer to a CMessageDigest object
sl@0
   679
	 */
sl@0
   680
	IMPORT_C static CMessageDigest* NewDigestL(CMessageDigest::THashId aHashId);
sl@0
   681
sl@0
   682
	/**
sl@0
   683
	 * Creates a CMessageDigest derived object according to the specified type of hash algorithm.
sl@0
   684
	 * 
sl@0
   685
	 * The returned pointer is put onto the cleanup stack.
sl@0
   686
	 *
sl@0
   687
	 * @param aHashId	The identity of the hash algorithm
sl@0
   688
	 * @return			A pointer to a CMessageDigest object
sl@0
   689
	 */
sl@0
   690
	IMPORT_C static CMessageDigest* NewDigestLC(CMessageDigest::THashId aHashId);
sl@0
   691
sl@0
   692
	/**
sl@0
   693
	 * Creates a CMessageDigest derived object according to the specified type of hash algorithm
sl@0
   694
	 * and authentication key.
sl@0
   695
	 *
sl@0
   696
	 * @param aHashId	The identity of the hash algorithm
sl@0
   697
	 * @param aKey		The authentication key 
sl@0
   698
	 * @return			A pointer to a CMessageDigest object
sl@0
   699
	 */
sl@0
   700
	IMPORT_C static CMessageDigest* NewHMACL(CMessageDigest::THashId aHashId, const TDesC8& aKey);
sl@0
   701
sl@0
   702
	/**
sl@0
   703
	 * Creates a CMessageDigest derived object according to the specified type of hash algorithm
sl@0
   704
	 * and authentication key.
sl@0
   705
	 * 
sl@0
   706
	 * The returned pointer is put onto the cleanup stack.
sl@0
   707
	 *
sl@0
   708
	 * @param aHashId	The identity of the hash algorithm
sl@0
   709
	 * @param aKey		The authentication key 
sl@0
   710
	 * @return			A pointer to a CMessageDigest object
sl@0
   711
	 */
sl@0
   712
	IMPORT_C static CMessageDigest* NewHMACLC(CMessageDigest::THashId aHashId, const TDesC8& aKey);
sl@0
   713
};
sl@0
   714
sl@0
   715
#endif // __HASH_H__