/**
@page secure_stream_example_code Secure stream example code
This example covers:
-# @ref stream_example_1 "Encrypting some data with a password and writing it to a file"
-# @ref stream_example_2 "Reading the data back from the file and decrypting it with the same password".
Also, see:
- @ref pbe_example_code
- @ref secure_store_example_code
<hr>
@ref secure_stream_example_code_support "Supporting code for this example"
@anchor stream_example_1
@code
/*
* Encrypt data with password and write it to a file.
*/
void CSecureStreamExample::WriteEncryptedDataL(const TDesC8& aInput, const TDesC& aFilename, const TDesC& aPassword)
{
// Open a stream to the output file
RFileWriteStream writeStream;
User::LeaveIfError(writeStream.Replace(iFs, aFilename, EFileShareExclusive | EFileWrite));
CleanupClosePushL(writeStream);
// Create a CPBEncryptElement object, passing details of the encryption we
// are using and the user's password
CPBEncryptElement* encryption = CPBEncryptElement::NewLC(aPassword, ECipherDES_CBC);
// Store encryption data as the first thing in the stream
writeStream << encryption->EncryptionData();
// Create an REncryptStream - this wraps the write stream and encrypts
// everything written to it
REncryptStream encStream;
encStream.OpenL(writeStream, *encryption);
CleanupClosePushL(encStream);
// Now we can simply write the plaintext to the encrypt stream - it gets
// encrypted automatically
encStream << aInput;
// Commit the stream
encStream.CommitL();
// Free memory (writeStream, encryption, encStream)
CleanupStack::PopAndDestroy(3, &writeStream);
}
@endcode
@anchor stream_example_2
@code
/*
* Read data from file and decrypt it.
*/
HBufC8* CSecureStreamExample::ReadEncryptedDataLC(const TDesC& aFilename, const TDesC& aPassword)
{
// Open a stream to the input file
RFileReadStream readStream;
User::LeaveIfError(readStream.Open(iFs, aFilename, EFileRead));
CleanupClosePushL(readStream);
// Read the encryption data from the stream
CPBEncryptionData* encryptionData = CPBEncryptionData::NewLC(readStream);
// Recreate the CPBEncryptElement object, using the encryption data from the
// file and the user's password
CPBEncryptElement* encryption = CPBEncryptElement::NewLC(*encryptionData, aPassword);
// Create an RDecryptStream based on the read stream - this decrypts
// everything we read from it
RDecryptStream decStream;
decStream.OpenL(readStream, *encryption);
CleanupClosePushL(decStream);
// Now we can read the plaintext straight from the stream
HBufC8* plaintext = HBufC8::NewL(decStream, KMaxTInt);
// Free memory (readStream, encryptionData, encryption, decStream)
CleanupStack::PopAndDestroy(4, &readStream);
CleanupStack::PushL(plaintext);
// Return plaintext to the caller
return plaintext;
}
@endcode
*/