diff -r 000000000000 -r bde4ae8d615e os/security/cryptoplugins/cryptospiplugins/test/h4drv/crypto_h4/cryptoldd.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/security/cryptoplugins/cryptospiplugins/test/h4drv/crypto_h4/cryptoldd.h Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,232 @@ +/* +* Copyright (c) 2007-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: +* +*/ + + +/** + @file + @internalComponent + @released +*/ +#ifndef __CRYPTOLDD__ +#define __CRYPTOLDD__ +#include +#include +#include +#include "cryptojobs.h" + + +class DCryptoLddChannelFactory : public DLogicalDevice + { +public: + DCryptoLddChannelFactory(); + ~DCryptoLddChannelFactory(); + virtual TInt Install(); + virtual void GetCaps(TDes8& aDes) const; + virtual TInt Create(DLogicalChannelBase*& aChannel); + + // The job scheduler for the Random h/w + DCryptoJobScheduler iJSRandom; + + // The job scheduler for the AES h/w + DCryptoJobScheduler iJSAes; + }; + +class DCryptoPddChannel; +/** + Logical Channel classes for 'Crypto' +*/ + +/** + DLddChanRandom + + This class just exists to keep all the LDD Chan variables for + dealing with Random requests in one place. +*/ +class DCryptoLddChannel; +class DLddChanRandom : public DBase, public MCryptoJobCallbacks + { +public: + DLddChanRandom(DCryptoLddChannel &aParent); + // Cleanup must be done by DCryptoLddChannel destructor because + // by the time our destructor gets called the DCryptoLddChannel + // has already been destroyed. + + // Functions are virtual so PDD can call them via a vtable instead + // of linking directly to them. + + virtual TInt Random(TRequestStatus* aStatus,TDes8* aBuffer); + + // Callbacks for PDD + virtual TInt DataRequired(); + virtual TInt DataAvailable(); + virtual void JobComplete(TInt aResult); + + /** + Cancel a user request + */ + virtual void RandomCancel(); +private: + DCryptoLddChannel &iParent; + // Members used for processing a Random request + + TRequestStatus* iRandomStatus; // User request + TDes8* iRandomDescriptor; // User descriptor + TInt iRequestLength; + TInt iCurrentIndex; + + CryptoJobRandom *iJob; // Ptr to PDD Random job (not owned by us) + }; + +/** + DLddChanAes + + This class just exists to keep all the LDD Chan variables for + dealing with Aes requests in one place. +*/ +class DCryptoLddChannel; +class DLddChanAes : public DBase, public MCryptoJobCallbacks + { +public: + DLddChanAes(DCryptoLddChannel &aParent); + // Cleanup must be done by DCryptoLddChannel destructor because + // by the time our destructor gets called the DCryptoLddChannel + // has already been destroyed. + + // Functions are virtual so PDD can call them via a vtable instead + // of linking directly to them. + + virtual TInt SetAesConfig(const TDesC8 *aConfigBuf); + virtual TInt AesWrite(TRequestStatus *aStatus, TDesC8 *aBuffer); + virtual TInt AesRead(TRequestStatus *aStatus, TDes8 *aBuffer, TUint32 aLength); + + // Callbacks for PDD + virtual TInt DataRequired(); + virtual TInt DataAvailable(); + virtual void JobComplete(TInt aResult); + + /** + Cancel a user request + */ + virtual void CancelRead(); + virtual void CancelWrite(); +private: + DCryptoLddChannel &iParent; + // Members used for processing a Aes request + + TRequestStatus *iAesWriteStatus; // User request + TDesC8 *iAesWriteDescriptor; // User descriptor + TInt iWriteRequestLength; + TInt iCurrentUserWriteIndex; + + TRequestStatus *iAesReadStatus; // User request + TDes8 *iAesReadDescriptor; // User descriptor + TInt iReadRequestLength; + TInt iOriginalUserReadDescLength; + TInt iCurrentUserReadIndex; + + TBool iEncrypt; + RCryptoDriver::TChainingMode iMode; + TInt iKeyLengthBytes; + + CryptoJobAes *iJob; // Ptr to PDD AES job (not owned by us) + }; + + +class DCryptoLddChannel : public DLogicalChannel + { +public: + DCryptoLddChannel(); + virtual ~DCryptoLddChannel(); + // Inherited from DObject + virtual TInt RequestUserHandle(DThread* aThread, TOwnerType aType); + // Inherited from DLogicalChannelBase + virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer); + // Inherited from DLogicalChannel + virtual void HandleMsg(TMessageBase* aMsg); + + // Accessor for the LDD Factory + inline DCryptoLddChannelFactory *LddFactory() const; + + DLddChanRandom iLddChanRandom; + DLddChanAes iLddChanAes; + +private: + friend class DLddChanRandom; + friend class DLddChanAes; + + // Panic reasons + enum TPanic + { + ERequestAlreadyPending = 1 + }; + // Implementation for the differnt kinds of requests send through RBusLogicalChannel + TInt DoControl(TInt aFunction, TAny* a1, TAny* a2); + TInt DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2); + void DoCancel(TUint aMask); + + // Accessor for the PDD + inline DCryptoPddChannel* PddChan() const; + + // Query h/w versions + TInt GetHwVersions(TDes8* aHwVersionsBuf) const; + + // Methods for configuration + TInt GetConfig(TDes8* aConfigBuf) const; + TInt SetConfig(const TDesC8* aConfigBuf); + void CurrentConfig(RCryptoDriver::TConfig& aConfig) const; + +private: + DThread* iClient; + }; +inline DCryptoLddChannelFactory *DCryptoLddChannel::LddFactory() const + { + return static_cast(iDevice); + } + + +class DCryptoPddChannel : public DBase + { +public: + virtual TDfcQue* DfcQue() = 0; + + virtual void GetHwVersions(RCryptoDriver::THwVersions& aHwVersions) const = 0; + virtual TInt FakeDriverSetting() const = 0; + virtual TInt SetFakeDriverSetting(TInt aFakeDriverSetting) = 0; + + virtual CryptoJobRandom *GetJobRandom(TBool aAutoCreate = ETrue) = 0; + virtual CryptoJobAes *GetJobAes(TBool aAutoCreate = ETrue) = 0; + + // The LDD chan needs to be able to set this, and the Job + // implementation classes need to be able to read it, so there is + // no point in having accessor functions for it... + DCryptoLddChannel *iCryptoLddChannel; + }; + + + + + + +inline DCryptoPddChannel* DCryptoLddChannel::PddChan() const + { + return static_cast(iPdd); + } + + + + +#endif