os/security/cryptoservices/filebasedcertificateandkeystores/source/keystore/Server/CKeyDataManager.h
First public contribution.
2 * Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
4 * This component and the accompanying materials are made available
5 * under the terms of the License "Eclipse Public License v1.0"
6 * which accompanies this distribution, and is available
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
9 * Initial Contributors:
10 * Nokia Corporation - initial contribution.
15 * Implements CFileKeyData and CFileKeyDataManager
25 #ifndef __CKEYDATAMANAGER_H__
26 #define __CKEYDATAMANAGER_H__
29 #include <ct/tcttokenobjecthandle.h>
33 class CPassphraseManager;
36 #ifdef SYMBIAN_KEYSTORE_USE_AUTH_SERVER
37 #include <authserver/authtypes.h>
38 #include <e32property.h>
39 #endif // SYMBIAN_KEYSTORE_USE_AUTH_SERVER
42 #include <authserver/authtypes.h>
43 #include <e32property.h>
47 * Server side in-memory representation of a key for file key store management
48 * purposes. Objects of this type are stored in an in-memory array for quick
51 class CFileKeyData : public CBase
54 /// Create a new key data object
55 static CFileKeyData* NewLC(TInt aObjectId, const TDesC& aLabel, TStreamId aInfoData,
56 TStreamId aPassphraseId, TStreamId aPublicData, TStreamId aPrivateData);
57 /// Read a key data object from a stream
58 static CFileKeyData* NewL(RStoreReadStream& aReadStream);
60 #ifdef SYMBIAN_KEYSTORE_USE_AUTH_SERVER
61 static CFileKeyData* NewLC( TInt aObjectId, const TDesC& aLabel,
62 TStreamId aInfoData, TStreamId aPublicData,
63 TStreamId aPrivateData, AuthServer::TIdentityId aIdentityId);
64 #endif // SYMBIAN_KEYSTORE_USE_AUTH_SERVER
67 static CFileKeyData* CreateOldKeyL(RStoreReadStream& aReadStream);
72 /// Write out the key data to a stream
73 void ExternalizeL(RWriteStream&) const;
75 void ExternalizeWithAuthL(RWriteStream& aWriteStream) ;
78 inline const TDesC& Label() const;
79 inline TInt32 Handle() const;
80 inline TStreamId InfoDataStreamId() const;
81 inline TStreamId PassphraseStreamId() const;
82 inline TStreamId PublicDataStreamId() const;
83 inline TStreamId PrivateDataStreamId() const;
84 #ifdef SYMBIAN_KEYSTORE_USE_AUTH_SERVER
85 inline AuthServer::TIdentityId Identity() const;
86 #endif // SYMBIAN_KEYSTORE_USE_AUTH_SERVER
88 inline void SetInfoDataStreamId( TStreamId& aInfoDataStreamId );
89 inline void SetPublicDataStreamId( TStreamId& aPublicDataStreamId );
90 inline void SetPrivateDataStreamId( TStreamId& aPrivateDataStreamId );
91 inline AuthServer::TIdentityId Identity() const;
94 CFileKeyData(TInt aObjectId, TStreamId aInfoData, TStreamId aPassphraseId,
95 TStreamId aPublicData, TStreamId aPrivateData);
97 #ifdef SYMBIAN_KEYSTORE_USE_AUTH_SERVER
98 CFileKeyData( TInt aObjectId, TStreamId aInfoData,
99 TStreamId aPublicData, TStreamId aPrivateData,
100 AuthServer::TIdentityId aIdentityId);
101 #endif // SYMBIAN_KEYSTORE_USE_AUTH_SERVER
104 CFileKeyData( TInt aObjectId, TStreamId aInfoData,
105 TStreamId aPublicData, TStreamId aPrivateData,
106 AuthServer::TIdentityId aIdentityId);
110 void ConstructL(const TDesC& aLabel);
111 void InternalizeL(RReadStream&);
113 void InternalizeOldKeyL(RReadStream& aReadStream);
117 TInt iObjectId; ///< Data to identify the key
118 TStreamId iInfoData; ///< ID of stream holding publicly available data for key
119 TStreamId iPassphraseId; ///< ID of stream holding passphrase data (not currently used)
120 TStreamId iPublicKeyData; ///< ID of stream holding public key data
121 TStreamId iPrivateKeyData; ///< ID of stream holding private key data
122 HBufC* iLabel; ///< Key label data
123 #ifdef SYMBIAN_KEYSTORE_USE_AUTH_SERVER
124 AuthServer::TIdentityId iIdentityId;
125 #endif // SYMBIAN_KEYSTORE_USE_AUTH_SERVER
127 AuthServer::TIdentityId iIdentityId;
131 inline const TDesC& CFileKeyData::Label() const
136 inline TInt32 CFileKeyData::Handle() const
141 inline TStreamId CFileKeyData::InfoDataStreamId() const
146 inline TStreamId CFileKeyData::PassphraseStreamId() const
148 return iPassphraseId;
151 inline TStreamId CFileKeyData::PublicDataStreamId() const
153 return iPublicKeyData;
156 inline TStreamId CFileKeyData::PrivateDataStreamId() const
158 return iPrivateKeyData;
161 #ifdef SYMBIAN_KEYSTORE_USE_AUTH_SERVER
162 inline AuthServer::TIdentityId CFileKeyData::Identity() const
166 #endif // SYMBIAN_KEYSTORE_USE_AUTH_SERVER
169 inline void CFileKeyData::SetInfoDataStreamId( TStreamId& aInfoDataStreamId )
171 iInfoData = aInfoDataStreamId;
174 inline void CFileKeyData::SetPublicDataStreamId( TStreamId& aPublicDataStreamId )
176 iPublicKeyData = aPublicDataStreamId;
179 inline void CFileKeyData::SetPrivateDataStreamId( TStreamId& aPrivateDataStreamId )
181 iPrivateKeyData = aPrivateDataStreamId;
186 * Access the server file store of all keys and key data. The only class to
187 * access the store, which maintains store integrity When a new key is created,
188 * it is represented by a CFileKeyData object and added to the array.
190 class CFileKeyDataManager : public CBase
193 static CFileKeyDataManager* NewL();
194 ~CFileKeyDataManager();
196 CPassphraseManager* CreatePassphraseManagerLC();
197 void AddL(const CFileKeyData*);
198 void RemoveL(TInt aObjectId);
199 #ifdef SYMBIAN_KEYSTORE_USE_AUTH_SERVER
200 TBool IsKeyAlreadyInStore(const TDesC& aKeyLabel, AuthServer::TIdentityId aIdentity) const;
202 TBool IsKeyAlreadyInStore(const TDesC& aKeyLabel) const;
203 #endif // SYMBIAN_KEYSTORE_USE_AUTH_SERVER
205 /// Get the id of the default passphrase, or KNullStreamId if it doesn't exist yet.
206 TStreamId DefaultPassphraseId() const;
207 /// Create a new key data object for a key create/import and leave it one the cleanup stack
208 const CFileKeyData* CreateKeyDataLC(const TDesC& aLabel, TStreamId aPassphrase);
210 #ifdef SYMBIAN_KEYSTORE_USE_AUTH_SERVER
211 const CFileKeyData* CreateKeyDataLC(const TDesC& aLabel, AuthServer::TIdentityId aIdentity);
212 TUint32 CachedIdentity();
213 #endif // SYMBIAN_KEYSTORE_USE_AUTH_SERVER
215 /// Reads the info data for a given key, returning a new CKeyInfo that's on the cleanup stack
216 CKeyInfo* ReadKeyInfoLC(const CFileKeyData& aKeyData) const;
218 /// Writes key info data for a key
219 void WriteKeyInfoL(const CFileKeyData& aKeyData, const CKeyInfo& aKeyInfo);
220 /// Writes key info data and reverts changes to the store if if leaves
221 void SafeWriteKeyInfoL(const CFileKeyData& aKeyData, const CKeyInfo& aKeyInfo);
222 // Methods for opening data streams for a key
223 void OpenPublicDataStreamLC(const CFileKeyData& aKeyData, RStoreWriteStream& aStream);
224 void OpenPublicDataStreamLC(const CFileKeyData& aKeyData, RStoreReadStream& aStream) const;
225 void OpenPrivateDataStreamLC(const CFileKeyData& aKeyData, CPassphrase& aPassphrase, RStoreReadStream& aStream);
227 #ifdef SYMBIAN_KEYSTORE_USE_AUTH_SERVER
228 void OpenPrivateDataStreamLC(const CFileKeyData& aKeyData, RStoreWriteStream& aStream);
229 void OpenPrivateDataStreamLC(const CFileKeyData& aKeyData, RStoreReadStream& aStream) const;
231 void OpenPrivateDataStreamLC(const CFileKeyData& aKeyData, CPassphrase& aPassphrase, RStoreWriteStream& aStream);
233 #endif // SYMBIAN_KEYSTORE_USE_AUTH_SERVER
236 * not currently implemented, but might be someday
237 /// Create a new passphrase by prompting the user and pass back its id.
238 void CreatePassphrase(CPassphraseManager& aPassMan, TStreamId& aIdOut, TRequestStatus& aStatus);
239 /// Remove an existing passphrase. Leaves if the passphrase is used by any key.
240 void RemovePassphraseL(TStreamId aId);
245 const CFileKeyData* operator[](TInt aIndex) const;
246 const CFileKeyData* Lookup(TInt aObjectId) const;
249 * Get the passphrase timeout. A timeout of zero indicates
250 * that passphrases are never cached. A timeout of -1 means cache until an
251 * explicit close operation occurs.
253 TInt GetPassphraseTimeout() const;
254 void SetPassphraseTimeoutL(TInt aTimeout);
256 CFileKeyDataManager();
258 private: // Manages access to store
260 void OpenStoreInFileL(const TDesC& aFile);
261 void CreateStoreInFileL(const TDesC& aFile);
263 void OpenInfoDataStreamLC(const CFileKeyData& aKeyData, RStoreWriteStream&);
264 static void RevertStore(TAny* aStore); // Cleanupitem
265 void WriteKeysToStoreL();
267 TStreamId CreateWriteStreamL();
268 void ReadPassphraseTimeoutL();
269 void WritePassphraseTimeoutL();
271 #ifdef SYMBIAN_KEYSTORE_USE_AUTH_SERVER
272 const HBufC8* DecryptKey(const TDesC8& aEncryptedKey);
273 void WriteAuthDetailsL( RStoreWriteStream& aInfoStream, const CKeyInfo& aKeyInfo );
274 void ReadAuthDetailsL( RStoreReadStream& aInfoStream, CKeyInfo& aKeyInfo ) const;
275 #endif // SYMBIAN_KEYSTORE_USE_AUTH_SERVER
280 CPermanentFileStore* iFileStore;
281 TStreamId iRootStreamId; ///< Root of the store
282 TStreamId iInfoStreamId; ///< Stream that contains list of key data
284 #ifdef SYMBIAN_KEYSTORE_USE_AUTH_SERVER
285 RProperty iIdentityId;
287 TStreamId iPassStreamId; ///< Stream for the default passphrase
288 TStreamId iTimeoutStreamId; ///< Stream for timeout data
289 #endif // SYMBIAN_KEYSTORE_USE_AUTH_SERVER
293 RPointerArray<const CFileKeyData> iKeys; ///< In memory representation of keys in the store
294 TInt iTimeout; ///< The passphrase timeout