/** Copyright (c) 2002-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: * ** IMPORTANT ** PublishedPartner API's in this file are published to 3rd party developers via the * Symbian website. Changes to these API's should be treated as PublishedAll API changes and the Security TA should be consulted.**//** @file @publishedPartner @released*/#ifndef __PKCS5KDF_H__#define __PKCS5KDF_H__#include <hash.h>/** The number of times the hashing algorithm is run. */const TUint KDefaultIterations = 1000;/** * A PKCS#5 compliant Key Derivation Function (KDF). * * This class allows the derivation of deterministic arbitrary length byte * streams from an input string. The output byte stream is generated using * multiple iterations of a CSHA1 message digest and is suitable for use * as a cryptographic symmetric key. * * @since v7.0s */class TPKCS5KDF {public: /** * Derives deterministic arbitrary length byte streams (aKey) from an input * string (aPasswd) and a randomly chosen salt (aSalt) for use as a * symmetric key. * * Attention -- Improperly chosen values for these parameters will seriously * impact the security of the derived key and as a result the security of * your application. * * See the Cryptography api-guide documentation for more information and * recommended usage patterns. * * @param aKey Output Value. The key resulting from the operation. * The length of the key will be equal to the length of * the input descriptor. All data, from the first byte * to the set length, will be overwritten with the resulting * byte stream. * @param aPasswd Input Value. The password you wish to derive a key from. * @param aSalt Input Value. A <B><I>randomly</I></B> selected second * input to the key derivation function to discourage certain * attacks. PKCS5 recommends a minimum of 8 randomly chosen bytes. * @param aIterations Input Value. The number of times the internal hashing * function should be run over the password and salt. * Minimum recommendation is KDefaultIterations. */ IMPORT_C static void DeriveKeyL(TDes8& aKey, const TDesC8& aPasswd, const TDesC8& aSalt, TUint aIterations = KDefaultIterations);private: /** * Internal iterative function that performs the actual hashing. */ static void F(CMessageDigest& aDigest, TUint32* aAccumulator, TUint32* S, TUint32* Ui, TUint aHashBytes, const TUint32* aSalt, TUint aSaltBytes, TUint c, TUint i); /** * XOR's the values of two equal length descriptors. Internally, it * operates on a word by word basis. Data stored beyond the end of the * descriptor, but before the end of the final word, will be xored as well. */ static inline void XORString(const TUint32* aOp1, TUint32* aOp2, TUint aLength); };#endif