--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/crypto/weakcryptospi/inc/pbedata.h Thu Sep 10 14:01:51 2009 +0300
@@ -0,0 +1,494 @@
+/*
+* 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 __PBEDATA_H__
+#define __PBEDATA_H__
+
+#include <s32strm.h>
+#include <pbe.h>
+
+/**
+ * Contains the Password Based Encryption parameters.
+ * An object of this class can be input for CPBEncryptElement or CPBEncryptSet objects.
+ *
+ * @since v7.0s
+ */
+class CPBEncryptParms : public CBase
+ {
+public:
+ enum TKdf
+ /**
+ Key derivation function.
+ This does not affect the authentication key,
+ which always uses PKCS#5.
+ */
+ {
+ EKdfPkcs5,
+ EKdfPkcs12
+ };
+
+ /**
+ * Creates a new CPBEncryptParms object.
+ *
+ * @param aCipher The cipher to use
+ * @param aSalt The salt
+ * @param aIV The Initialization Vector
+ * @param aIterations The number of iterations of the PBE algorithm
+ * @return A pointer to the new CPBEncryptParms object
+ */
+ IMPORT_C static CPBEncryptParms* NewL(TPBECipher aCipher,
+ const TDesC8& aSalt, const TDesC8& aIV, TUint aIterations);
+
+ /**
+ * Creates a new CPBEncryptParms object and puts a pointer to it onto the cleanup stack.
+ *
+ * @param aCipher The cipher to use
+ * @param aSalt The salt
+ * @param aIV The Initialization Vector
+ * @param aIterations The number of iterations of the PBE algorithm
+ * @return A pointer to the new CPBEncryptParms object
+ */
+ IMPORT_C static CPBEncryptParms* NewLC(TPBECipher aCipher,
+ const TDesC8& aSalt, const TDesC8& aIV, TUint aIterations);
+
+ /**
+ * Creates a new CPBEncryptParms object from an existing object.
+ *
+ * @param aParms The existing encryption parameters object
+ * @return A pointer to the new CPBEncryptParms object
+ */
+ IMPORT_C static CPBEncryptParms* NewL(const CPBEncryptParms& aParms);
+
+ /**
+ * Creates a new CPBEncryptParms object from an existing object
+ * and puts a pointer to it onto the cleanup stack.
+ *
+ * @param aParms The existing encryption parameters object
+ * @return A pointer to the new CPBEncryptParms object
+ */
+ IMPORT_C static CPBEncryptParms* NewLC(const CPBEncryptParms& aParms);
+
+ /**
+ * Internalizes encryption parameter data from a read stream.
+ *
+ * @param aStream The read stream to be internalized
+ * @return A pointer to the new CPBEncryptParms object
+ *
+ */
+ IMPORT_C static CPBEncryptParms* NewL(RReadStream& aStream);
+
+ /**
+ * Internalizes encryption parameter data from a read stream, and
+ * puts a pointer to the new object onto the cleanup stack.
+ *
+ * @param aStream The read stream to be internalized
+ * @return A pointer to the new CPBEncryptParms object
+ */
+ IMPORT_C static CPBEncryptParms* NewLC(RReadStream& aStream);
+
+ /**
+ * Gets the PBE cipher
+ *
+ * @return The cipher to use
+ */
+ IMPORT_C TPBECipher Cipher() const;
+ /**
+ Gets the key derivation function (KDF.)
+
+ @return The key derivation function (KDF) which
+ transforms the password into an encryption key.
+ */
+ IMPORT_C TKdf Kdf() const;
+
+ /**
+ * Gets the PBE salt
+ *
+ * @return The salt
+ */
+ IMPORT_C TPtrC8 Salt() const;
+
+ /**
+ * Gets the number of iterations for the PKCS#5 algorithm.
+ *
+ * @return The number of iterations
+ */
+ IMPORT_C TInt Iterations() const;
+
+ /**
+ * Gets the PBE Initialization Vector
+ *
+ * @return The IV
+ */
+ IMPORT_C TPtrC8 IV() const;
+
+ IMPORT_C void SetIV(const TDesC8& aNewIv);
+
+ /**
+ * Externalizes the encryption parameters into a write stream.
+ *
+ * @param aStream The stream to write to
+ */
+ IMPORT_C void ExternalizeL(RWriteStream& aStream) const;
+ IMPORT_C static CPBEncryptParms* NewL();
+ IMPORT_C static CPBEncryptParms* NewLC();
+
+ IMPORT_C void SetCipher(TPBECipher aCipher);
+
+ /**
+ * Replace the current cipher. This function resizes the
+ * IV and replaces its existing contents.
+ *
+ * @param aCipher New cipher.
+ * @leave System wide error code.
+ */
+ inline void SetCipherL(TPBECipher aCipher)
+ {
+ SetCipher(aCipher);
+ }
+
+ IMPORT_C void SetKdf(TKdf aKdf);
+ IMPORT_C void ResizeSaltL(TInt aNewLen);
+ IMPORT_C void SetIterations(TInt aIterCount);
+
+ /** Destructor */
+ virtual ~CPBEncryptParms(void);
+ /** @internalAll */
+ void DeriveKeyL(const TDesC8& aPassword, TDes8& aKeyBuf) const;
+
+
+protected:
+#ifdef PBEDATA_NO_EXPORTED_CONSTRUCTORS
+ /** @internalAll */
+ CPBEncryptParms(void);
+#else
+ /** Constructor */
+ IMPORT_C CPBEncryptParms(void);
+#endif
+
+ /** @internalAll */
+ void ConstructL();
+
+ /** @internalAll*/
+ void ConstructL(TPBECipher aCipher, const TDesC8& aSalt,
+ const TDesC8& aIV, TUint aIterations);
+ /** @internalAll*/
+ void ConstructL(const CPBEncryptParms& aParms);
+ /** @internalAll*/
+ void ConstructL(RReadStream& aStream);
+private:
+ CPBEncryptParms(const CPBEncryptParms&);
+ CPBEncryptParms& operator= (const CPBEncryptParms&);
+private:
+ class TParamsData
+ /**
+ This class contains multiple objects. Its
+ pointer is stored in CPBEncryptParms to preserve
+ BC, because CPBEncryptParms has an exported,
+ protected constructor.
+ */
+ {
+ public:
+ TPBECipher iCipher;
+ /**
+ The password is processed with this function
+ to generate the encryption key.
+ */
+ TKdf iKdf;
+ };
+ TParamsData* iData;
+
+ HBufC8* iSalt;
+ HBufC8* iIV;
+ TUint iIterations;
+ };
+
+/**
+ * Contains the password based authentication data.
+ * Used to check the passphrase when decrypting.
+ *
+ * @since v7.0s
+ */
+class CPBAuthData : public CBase
+ {
+public:
+ /**
+ * Derives an authentication key.
+ *
+ * @param aPassword The user's initial password
+ * @param aSalt The salt
+ * @param aKeySize The key size
+ * @param aIterations The number of iterations of the PBE algorithm
+ * @return A pointer to the new CPBAuthData object
+ */
+ IMPORT_C static CPBAuthData* NewL(const TDesC8& aPassword,
+ const TDesC8& aSalt, TUint aKeySize, TUint aIterations);
+
+ /**
+ * Derives an authentication key.
+ *
+ * The returned pointer is put onto the cleanup stack.
+ *
+ * @param aPassword The user's initial password
+ * @param aSalt The salt
+ * @param aKeySize The key size
+ * @param aIterations The number of iterations of the PBE algorithm
+ * @return A pointer to the new CPBAuthData object
+ */
+ IMPORT_C static CPBAuthData* NewLC(const TDesC8& aPassword,
+ const TDesC8& aSalt, TUint aKeySize, TUint aIterations);
+
+ /**
+ * Creates a new CPBAuthData object from an existing authentication key.
+ *
+ * @param aData The existing CPBAuthData object
+ * @return A pointer to the new CPBAuthData object
+ */
+ IMPORT_C static CPBAuthData* NewL(const CPBAuthData& aData);
+
+ /**
+ * Creates a new CPBAuthData object from an existing authentication key.
+ *
+ * The returned pointer is put onto the cleanup stack.
+ *
+ * @param aData The existing CPBAuthData object
+ * @return A pointer to the new CPBAuthData object
+ */
+ IMPORT_C static CPBAuthData* NewLC(const CPBAuthData& aData);
+
+ /**
+ * Creates a new CPBAuthData object from an existing authentication key
+ * by internalizing the authentication data from a read stream.
+ *
+ * @param aStream The stream to read from
+ * @return A pointer to the new CPBAuthData object
+ */
+ IMPORT_C static CPBAuthData* NewL(RReadStream& aStream);
+
+ /**
+ * Creates a new CPBAuthData object from an existing authentication key
+ * by internalizing the authentication data from a read stream.
+ *
+ * The returned pointer is put onto the cleanup stack.
+ *
+ * @param aStream The stream to read from
+ * @return A pointer to the new CPBAuthData object
+ */
+ IMPORT_C static CPBAuthData* NewLC(RReadStream& aStream);
+
+ /**
+ * Gets the authentication key
+ *
+ * @return The key
+ */
+ IMPORT_C TPtrC8 Key() const;
+
+ /**
+ * Gets the salt used for the authentication
+ *
+ * @return The salt
+ */
+ IMPORT_C TPtrC8 Salt() const;
+
+ /**
+ * Gets the number of iterations of the hashing algorithm.
+ *
+ * @return The number of iterations
+ */
+ IMPORT_C TInt Iterations() const;
+
+ /**
+ * Tests whether two authentication keys are identical
+ *
+ * @param aAuth The authentication data object which holds the key to be tested
+ * @return ETrue, if they are identical; EFalse, otherwise
+ */
+ IMPORT_C TBool operator==(const CPBAuthData& aAuth) const;
+
+ /**
+ * Externalizes the encryption parameters into a write stream.
+ *
+ * @param aStream The stream to write to
+ */
+ IMPORT_C void ExternalizeL(RWriteStream& aStream) const;
+
+ /** Destructor */
+ virtual ~CPBAuthData(void);
+protected:
+#ifdef PBEDATA_NO_EXPORTED_CONSTRUCTORS
+ CPBAuthData(void);
+#else
+ /** Constructor */
+ IMPORT_C CPBAuthData(void);
+#endif
+ /** @internalAll */
+ void ConstructL(const TDesC8& aPassword, const TDesC8& aSalt,
+ TUint aKeySize, TUint aIterations);
+ /** @internalAll */
+ void ConstructL(const CPBAuthData& aData);
+ /** @internalAll */
+ void ConstructL(RReadStream& aStream);
+private:
+ CPBAuthData(const CPBAuthData&);
+ CPBAuthData& operator= (const CPBAuthData&);
+private:
+ HBufC8* iAuthKey;
+ HBufC8* iSalt;
+ TUint iIterations;
+ };
+
+/**
+ * Represents the information needed to decrypt encrypted data given the correct password.
+ * Contains the authentication key, and the parameters used to derive the encryption key.
+ * A CPBEncryptionData object needs to be stored to recover any data for later use.
+ *
+ * @see CPBEncryptParms
+ * @see CPBAuthData
+ *
+ * @since v7.0s
+ */
+class CPBEncryptionData : public CBase
+ {
+public:
+ /**
+ * Creates a new CPBEncryptionData object
+ *
+ * @param aPassword The user's initial password
+ * @param aCipher The cipher to use
+ * @param aAuthSalt The salt used for the authentication
+ * @param aEncryptSalt The salt used for the encryption
+ * @param aIV The Initialization Vector
+ * @param aIterations The number of iterations of the PBE algorithm
+ * @return A pointer to the new CPBEncryptionData object
+ */
+ IMPORT_C static CPBEncryptionData* NewL(const TDesC8& aPassword,
+ TPBECipher aCipher, const TDesC8& aAuthSalt,
+ const TDesC8& aEncryptSalt, const TDesC8& aIV, TUint aIterations);
+
+ /**
+ * Creates a new CPBEncryptionData object
+ * and puts a pointer to it onto the cleanup stack.
+ *
+ * @param aPassword The user's initial password
+ * @param aCipher The cipher to use
+ * @param aAuthSalt The salt used for the authentication
+ * @param aEncryptSalt The salt used for the encryption
+ * @param aIV The Initialization Vector
+ * @param aIterations The number of iterations of the PBE algorithm
+ * @return A pointer to the new CPBEncryptionData object
+ */
+ IMPORT_C static CPBEncryptionData* NewLC(const TDesC8& aPassword,
+ TPBECipher aCipher, const TDesC8& aAuthSalt,
+ const TDesC8& aEncryptSalt, const TDesC8& aIV, TUint aIterations);
+
+ /**
+ * Creates a new CPBEncryptionData from an existing one.
+ *
+ * @param aData The existing CPBEncryptionData object
+ * @return A pointer to the new CPBEncryptionData object
+ */
+ IMPORT_C static CPBEncryptionData* NewL(const CPBEncryptionData& aData);
+
+ /**
+ * Creates a new CPBEncryptionData from an existing one,
+ * and puts a pointer to it onto the cleanup stack.
+ *
+ * @param aData The existing CPBEncryptionData object
+ * @return A pointer to the new CPBEncryptionData object
+ */
+ IMPORT_C static CPBEncryptionData* NewLC(const CPBEncryptionData& aData);
+
+ /**
+ * Internalizes the encryption data from a read stream.
+ *
+ * @param aStream The stream to read from
+ * @return A pointer to the new CPBEncryptionData object
+ */
+ IMPORT_C static CPBEncryptionData* NewL(RReadStream& aStream);
+
+ /**
+ * Internalizes the encryption data from a read stream,
+ * and puts a pointer to it onto the cleanup stack.
+ *
+ * @param aStream The stream to read from
+ * @return A pointer to the new CPBEncryptionData object
+ */
+ IMPORT_C static CPBEncryptionData* NewLC(RReadStream& aStream);
+ IMPORT_C static CPBEncryptionData* NewL(
+ const TDesC8& aPassword, const TDesC8& aAuthSalt,
+ const CPBEncryptParms& aParms);
+
+
+ /**
+ * Returns the encryption parameter object.
+ *
+ * @return The CPBEncryptParms object
+ */
+ IMPORT_C const CPBEncryptParms& EncryptParms() const;
+
+ /**
+ * Returns the authentication data object.
+ *
+ * @return The CPBAuthData object
+ */
+ IMPORT_C const CPBAuthData& AuthData() const;
+
+ /**
+ * Externalizes the encryption data into a write stream.
+ *
+ * @param aStream The stream to write to
+ */
+ IMPORT_C void ExternalizeL(RWriteStream& aStream) const;
+
+ /** Destructor */
+ virtual ~CPBEncryptionData(void);
+protected:
+#ifdef PBEDATA_NO_EXPORTED_CONSTRUCTORS
+ CPBEncryptionData(void);
+#else
+ /** Constructor */
+ IMPORT_C CPBEncryptionData(void);
+#endif
+ /** @internalAll */
+ void ConstructL(const TDesC8& aPassword, TPBECipher aCipher,
+ const TDesC8& aAuthSalt, const TDesC8& aEncryptSalt, const TDesC8& aIV,
+ TUint aIterations);
+ /** @internalAll */
+ void ConstructL(const CPBEncryptionData& aData);
+ /** @internalAll */
+ void ConstructL(
+ const TDesC8& aPassword, const TDesC8& aAuthSalt,
+ const CPBEncryptParms& aParms);
+ /** @internalAll */
+ void ConstructL(RReadStream& aStream);
+private:
+ CPBEncryptionData(const CPBEncryptionData&);
+ CPBEncryptionData& operator= (const CPBEncryptionData&);
+private:
+ CPBEncryptParms* iParms;
+ CPBAuthData* iAuth;
+ };
+
+#endif