persistentstorage/store/UCRYPT/UE_FLTR.CPP
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/store/UCRYPT/UE_FLTR.CPP	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,247 @@
+// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "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:
+//
+
+#include "UE_STD.H"
+
+#include <pbe.h>
+
+#define UNUSED_VAR(a) a = a
+
+TSecureFilter::TSecureFilter()
+	{}
+
+void TSecureFilter::Set(MStreamBuf* aHost,TInt aMode)
+//
+// Set this filter up for encryption.
+//
+	{
+	TStreamFilter::Set(aHost,aMode);
+	iIn.Zero();
+//	Make sure any header added by the en/de-cryption goes
+//	straight into the output buffer 
+    TPtr8 buf(iBuf,sizeof(iBuf));
+    TRAPD(r, CryptL(buf,iIn));
+    UNUSED_VAR(r);
+    iOut.Set(buf);
+	}
+
+EXPORT_C TInt TSecureFilter::Capacity(TInt aMaxLength)
+//
+// Return the maximum guaranteed input used for aMaxLength output.
+// If we can fulfil the request from the output buffer, consume nothing,
+// otherwise return the space left in the input buffer
+//
+	{
+	return aMaxLength<=iOut.Length() ? 0 : KEncryptionFilterBufSize-iIn.Length();
+	}
+
+LOCAL_C TInt transfer(TDes8& aTarg,TPtrC8& aSrc)
+	{
+	TInt avail=aTarg.MaxLength()-aTarg.Length();
+	TInt len=Min(aSrc.Length(),avail);
+	if (len)
+		{
+		aTarg.Append(aSrc.Left(len));
+		aSrc.Set(aSrc.Mid(len));
+		}
+	return avail-len;
+	}
+
+EXPORT_C TInt TSecureFilter::FilterL(TAny* aPtr,TInt aMaxLength,const TUint8*& aFrom,const TUint8* anEnd)
+//
+// Encrypt the input buffer.
+//
+// This must consume all its input - when called during reading, it's asserted
+// that aFrom == anEnd after calling this
+//
+	{
+	TPtr8 dest((TUint8*)aPtr,aMaxLength);
+	TPtrC8 src(aFrom,anEnd-aFrom);
+
+    // Copy as much as possible from the output buffer to the destination
+	TInt req=transfer(dest,iOut);
+
+    // If there's input in src, copy as much as possible to the input buffer
+    // iIn.  If the input buffer is full, the output buffer is empty, and there
+    // is space in the destination buffer, process data
+	if ((src.Length()==0 || transfer(iIn,src)==0) && req)
+		{	// process input buffer to generate more output
+		do
+			{
+            TPtr8 buf(iBuf,sizeof(iBuf));
+			CryptL(buf,iIn);
+			iOut.Set(buf);
+            iIn.Zero();
+
+            // Copy as much data as possible from the output buffer to the final
+            // destination (updating iOut to point to the remainder), and as
+            // much as possible from the source to the input buffer.  If we have
+            // completely emptied the output buffer and filled the input buffer,
+            // and there is space in the destination buffer, go round again.
+			} while (transfer(dest,iOut) && transfer(iIn,src)==0);
+		}
+
+    // Update client's src pointer to reflect what we've consumed
+	aFrom=src.Ptr();
+
+    // Return the number of bytes output
+	return dest.Length();	
+}
+
+TInt TSecureFilter::EmitL(const TDesC8& aDes)
+	{
+	TInt len=aDes.Length();
+	if (len)
+		TStreamFilter::EmitL(aDes.Ptr(),len);
+	return len;
+	}
+
+EXPORT_C void TSecureFilter::DoSynchL()
+//
+// Pad out remaining input if necessary, encrypt and emit.
+//
+	{
+	if (IsCommitted())
+		return;
+//
+	EmitL(iOut);
+	iOut.Set(NULL,0);
+	TPtr8 buf(iBuf,sizeof(iBuf));
+	CompleteL(buf,iIn);
+	TStreamFilter::DoSynchL();
+	Committed();
+	}
+
+
+EXPORT_C TEncryptFilter::TEncryptFilter():
+	iKey(NULL)
+/** Constructs an empty encrypting filter object.
+
+The encrypting filter must be set up before use.
+
+@see Set() */
+	{}
+
+
+EXPORT_C void TEncryptFilter::SetL(MStreamBuf* aHost,CPBEncryptor* aKey,TInt aMode)
+/*
+Set this filter up for encryption using a Password Based Encryption object.
+@publishedPartner
+@leave KErrNoMemory. If a leave occurs, ownership of aKey is retained by the caller, 
+which should thus keep aKey on the cleanup stack when calling this function.
+@param aHost The stream buffer that is the target for encrypted data.
+@param aKey A Password Based Encryption handling object. 
+Ownership is transferred from the caller to this object as long as no allocation leave occurs.
+@param aMode The mode in which the stream buffer is to be used. 
+By default, this is write mode as represented by EWrite.
+*/
+	{
+    __ASSERT_ALWAYS(aKey!=NULL,Panic(ECryptNoKey));
+    iKey=aKey;
+	TSecureFilter::Set(aHost,aMode);
+	}
+
+EXPORT_C TInt TEncryptFilter::CryptL(TDes8& aTarget,const TDesC8& aSource)
+	{
+    iKey->Process(aSource,aTarget);
+    return aSource.Length();
+	}
+
+EXPORT_C void TEncryptFilter::CompleteL(TDes8& aTarget,const TDesC8& aSource)
+	{
+// Encrypt and send remaining input buffer
+    if (aSource.Length() > 0)
+        {
+        CryptL(aTarget, aSource);
+        EmitL(aTarget);
+        aTarget.Zero();
+        }
+
+	TPtrC8 ptr;
+	ptr.Set(NULL,0);
+    iKey->ProcessFinalL(ptr, aTarget);
+	EmitL(aTarget);	
+}
+
+EXPORT_C void TEncryptFilter::DoRelease()
+	{
+	delete iKey;
+	iKey=NULL;
+	TSecureFilter::DoRelease();
+	}
+
+EXPORT_C TDecryptFilter::TDecryptFilter():
+	iKey(NULL)
+/** Constructs an empty decrypting filter object.
+
+The decrypting filter must be set up before use.
+
+@see Set() */
+	{}
+
+
+EXPORT_C void TDecryptFilter::SetL(MStreamBuf* aHost,CPBDecryptor* aKey,TInt aMode)
+/*
+Set this filter up for decryption using a Password Based Encryption object.
+@publishedPartner
+@leave KErrNoMemory. If a leave occurs, ownership of aKey is retained by the caller, 
+which should thus keep aKey on the cleanup stack when calling this function.
+@param aHost The stream buffer that is the source of encrypted data.
+@param aKey A Password Based Encryption decryption object. 
+Ownership is transferred from the caller to this object as long as no allocation leave occurs.
+@param aMode The mode in which the stream buffer is to be used. 
+By default, this is write mode as represented by ERead.
+*/
+	{
+	__ASSERT_ALWAYS(aKey!=NULL,Panic(ECryptNoKey));
+	iKey=aKey;
+	TSecureFilter::Set(aHost,aMode);
+	}
+
+EXPORT_C TInt TDecryptFilter::CryptL(TDes8& aTarget,const TDesC8& aSource)
+	{
+    iKey->Process(aSource,aTarget);
+    return aSource.Length();
+	}
+
+EXPORT_C void TDecryptFilter::CompleteL(TDes8& /*aTarget*/,const TDesC8& aSource)
+	{
+	if (aSource.Length()!=0)
+		User::Leave(KErrCorrupt);
+	}
+
+EXPORT_C void TDecryptFilter::DoRelease()
+	{
+	delete iKey;
+	iKey=NULL;
+	TSecureFilter::DoRelease();
+	}
+
+void HEncryptFilter::DoRelease()
+//
+// Finished with this filter.
+//
+	{
+	delete this;
+	}
+
+void HDecryptFilter::DoRelease()
+//
+// Finished with this filter.
+//
+	{
+	delete this;
+	}
+