crypto/weakcrypto/source/pbe/pbe.cpp
author hgs
Thu, 24 Jun 2010 15:39:07 +0530
changeset 72 de46a57f75fb
permissions -rw-r--r--
201023_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
72
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     1
/*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     2
* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     3
* All rights reserved.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     5
* under the terms of the License "Eclipse Public License v1.0"
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     8
*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
     9
* Initial Contributors:
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    11
*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    12
* Contributors:
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    13
*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    14
* Description: 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    15
*
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    16
*/
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    17
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    18
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    19
#include <e32std.h>
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    20
#include <random.h>
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    21
#include <cryptostrength.h>
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    22
#include <securityerr.h>
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    23
#include <pbedata.h>
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    24
#include "pkcs5kdf.h"
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    25
#include "pbe.h"
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    26
#include "pbencryptor.h"
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    27
#include "pbesymmetricfactory.h"
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    28
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    29
EXPORT_C CPBEncryptElement* CPBEncryptElement::NewL(const TPBPassword& aPassword)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    30
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    31
	CPBEncryptElement* self = NewLC(aPassword);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    32
	CleanupStack::Pop();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    33
	return self;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    34
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    35
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    36
EXPORT_C CPBEncryptElement* CPBEncryptElement::NewLC(const TPBPassword& aPassword)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    37
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    38
	CPBEncryptElement* self = new(ELeave) CPBEncryptElement;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    39
	CleanupStack::PushL(self);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    40
	self->ConstructL(aPassword.Password());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    41
	return self;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    42
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    43
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    44
EXPORT_C CPBEncryptElement* CPBEncryptElement::NewL(const TPBPassword& aPassword, 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    45
	const TPBECipher aCipher)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    46
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    47
	CPBEncryptElement* self = NewLC(aPassword, aCipher);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    48
	CleanupStack::Pop();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    49
	return self;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    50
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    51
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    52
EXPORT_C CPBEncryptElement* CPBEncryptElement::NewLC(const TPBPassword& aPassword, 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    53
	const TPBECipher aCipher)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    54
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    55
	CPBEncryptElement* self = new(ELeave) CPBEncryptElement;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    56
	CleanupStack::PushL(self);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    57
	self->ConstructL(aPassword.Password(), aCipher);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    58
	return self;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    59
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    60
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    61
EXPORT_C CPBEncryptElement* CPBEncryptElement::NewL(const TPBPassword& aPassword, 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    62
	const CPBEncryptParms& aParms)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    63
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    64
	CPBEncryptElement* self = NewLC(aPassword, aParms);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    65
	CleanupStack::Pop();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    66
	return self;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    67
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    68
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    69
EXPORT_C CPBEncryptElement* CPBEncryptElement::NewLC(const TPBPassword& aPassword, 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    70
	const CPBEncryptParms& aParms)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    71
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    72
	CPBEncryptElement* self = new(ELeave) CPBEncryptElement;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    73
	CleanupStack::PushL(self);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    74
	self->ConstructL(aPassword.Password(), aParms);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    75
	return self;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    76
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    77
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    78
EXPORT_C CPBEncryptElement* CPBEncryptElement::NewL(
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    79
	const CPBEncryptionData& aData, const TPBPassword& aPassword)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    80
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    81
	CPBEncryptElement* self = CPBEncryptElement::NewLC(aData, aPassword);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    82
	CleanupStack::Pop();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    83
	return self;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    84
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    85
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    86
EXPORT_C CPBEncryptElement* CPBEncryptElement::NewLC(
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    87
	const CPBEncryptionData& aData, const TPBPassword& aPassword)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    88
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    89
	CPBEncryptElement* self = new(ELeave) CPBEncryptElement;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    90
	CleanupStack::PushL(self);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    91
	self->ConstructL(aData, aPassword);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    92
	return self;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    93
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    94
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    95
CPBEncryptElement::CPBEncryptElement(void) 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    96
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    97
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    98
de46a57f75fb 201023_02
hgs
parents:
diff changeset
    99
CPBEncryptElement::~CPBEncryptElement(void)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   100
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   101
	delete iData;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   102
	delete iEncryptKey;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   103
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   104
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   105
void CPBEncryptElement::ConstructL(const TDesC8& aPassword)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   106
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   107
	// Construct based on cryptography strength
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   108
	if (TCrypto::Strength() == TCrypto::EStrong)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   109
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   110
		ConstructL(aPassword, KPBEDefaultStrongCipher);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   111
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   112
	else
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   113
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   114
		ConstructL(aPassword, KPBEDefaultWeakCipher);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   115
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   116
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   117
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   118
void CPBEncryptElement::ConstructL(const TDesC8& aPassword, TPBECipher aCipher)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   119
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   120
	TBuf8<KPBEMaxCipherIVBytes> iv(KPBEMaxCipherIVBytes);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   121
	iv.SetLength(PBE::GetBlockBytes(aCipher));
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   122
	TRandom::RandomL(iv);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   123
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   124
	TBuf8<KPBEDefaultSaltBytes> encryptSalt(KPBEDefaultSaltBytes);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   125
	TRandom::RandomL(encryptSalt);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   126
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   127
	TBuf8<KPBEDefaultSaltBytes> authSalt(KPBEDefaultSaltBytes);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   128
	TRandom::RandomL(authSalt);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   129
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   130
	iData = CPBEncryptionData::NewL(aPassword, aCipher, authSalt, encryptSalt,
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   131
		iv, KDefaultIterations);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   132
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   133
	MakeEncryptKeyL(PBE::GetKeyBytes(aCipher), aPassword);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   134
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   135
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   136
void CPBEncryptElement::ConstructL(const CPBEncryptionData& aData, 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   137
	const TPBPassword& aPassword)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   138
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   139
	iData = CPBEncryptionData::NewL(aData);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   140
	if(!AuthenticateL(aPassword))
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   141
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   142
		User::Leave(KErrBadPassphrase);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   143
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   144
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   145
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   146
void CPBEncryptElement::ConstructL(const TDesC8& aPassword,
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   147
	const CPBEncryptParms& aParms)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   148
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   149
	TUint keySize = PBE::GetKeyBytes(aParms.Cipher());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   150
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   151
	TBuf8<KPBEDefaultSaltBytes> authSalt(KPBEDefaultSaltBytes);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   152
	TRandom::RandomL(authSalt);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   153
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   154
	//Recreate parms with given data and create a totally new auth
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   155
	iData = CPBEncryptionData::NewL(aPassword, authSalt, aParms);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   156
	MakeEncryptKeyL(keySize, aPassword);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   157
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   158
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   159
const CPBEncryptionData& CPBEncryptElement::EncryptionData(void) const
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   160
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   161
	return *iData;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   162
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   163
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   164
CPBEncryptor* CPBEncryptElement::NewEncryptL() const 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   165
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   166
	CPBEncryptor* encryptor = NewEncryptLC();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   167
	CleanupStack::Pop();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   168
	return encryptor;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   169
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   170
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   171
CPBEncryptor* CPBEncryptElement::NewEncryptLC() const
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   172
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   173
	CPBEncryptor* encryptor = CPBEncryptorElement::NewLC( 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   174
		iData->EncryptParms().Cipher(), *iEncryptKey, 
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   175
		iData->EncryptParms().IV());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   176
	return encryptor;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   177
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   178
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   179
TBool CPBEncryptElement::AuthenticateL(const TPBPassword& aPassword)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   180
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   181
	TBool retval = EFalse;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   182
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   183
	//create a new auth to test against the existing one
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   184
	//therefore we use the same key size, and salt as the current one
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   185
	CPBAuthData* auth = CPBAuthData::NewLC(aPassword.Password(),
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   186
		iData->AuthData().Salt(), iData->AuthData().Key().Size(),
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   187
		iData->AuthData().Iterations());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   188
	if(*auth==iData->AuthData())
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   189
		{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   190
		//We've got a valid password, regenerate the key so they can decrypt
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   191
		//stuff.  We don't the change the length of iEncryptKey as we assume the
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   192
		//previous key size is appropriate for the new one
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   193
		MakeEncryptKeyL(PBE::GetKeyBytes(iData->EncryptParms().Cipher()),
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   194
			aPassword.Password());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   195
		retval = ETrue;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   196
		}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   197
	CleanupStack::PopAndDestroy(auth);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   198
	return retval;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   199
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   200
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   201
CPBDecryptor* CPBEncryptElement::NewDecryptL() const
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   202
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   203
	CPBDecryptor* decryptor = NewDecryptLC();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   204
	CleanupStack::Pop();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   205
	return decryptor;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   206
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   207
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   208
CPBDecryptor* CPBEncryptElement::NewDecryptLC() const
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   209
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   210
	CPBDecryptor* decryptor = CPBDecryptorElement::NewLC(
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   211
		iData->EncryptParms().Cipher(), *iEncryptKey,
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   212
		iData->EncryptParms().IV());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   213
	return decryptor;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   214
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   215
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   216
// Warning: This function is only valid BEFORE you call NewEncryptL
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   217
// After creating the cipher, ask it about itself, not me!
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   218
// This is _very_ dodgy as I assume all sorts of things about the encryptor.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   219
// 1) That it uses SSLv3 or similar style padding
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   220
// 2) That it stores the IV for that stream at the front.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   221
// This is here for specific application that requires this and aren't able to
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   222
// actually construct the cipher and ask it.  In almost all other cases you
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   223
// should construct the cipher and ask it.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   224
TInt CPBEncryptElement::MaxCiphertextLength(TInt aPlaintextLength) const
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   225
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   226
	TUint blocksize = PBE::GetBlockBytes(iData->EncryptParms().Cipher());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   227
	TUint padding = blocksize - aPlaintextLength % blocksize;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   228
	//len = inputLength + padding
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   229
	return aPlaintextLength + padding;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   230
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   231
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   232
// Warning: This function is only valid BEFORE you call NewDecryptL
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   233
// After creating the cipher, ask it about itself, not me!
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   234
TInt CPBEncryptElement::MaxPlaintextLength(TInt aCiphertextLength) const
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   235
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   236
	/*It's impossible to determine anything about how much padding will be
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   237
	 * removed.  So we'll return a max length that is longer than will
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   238
	 * ever happen by at most a blocksize - 1.
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   239
	 */
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   240
	//totallength = inputlength - 1 byte of padding min
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   241
	return aCiphertextLength - 1;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   242
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   243
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   244
void CPBEncryptElement::MakeEncryptKeyL(TUint aKeySize, const TDesC8& aPassword)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   245
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   246
	iEncryptKey = HBufC8::NewMaxL(aKeySize);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   247
	TPtr8 encryptKeyBuf = iEncryptKey->Des();
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   248
	iData->EncryptParms().DeriveKeyL(aPassword, encryptKeyBuf);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   249
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   250
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   251
EXPORT_C TPBPassword::TPBPassword(const TDesC8& aPassword)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   252
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   253
	iPassword.Set(aPassword);
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   254
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   255
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   256
EXPORT_C TPBPassword::TPBPassword(const TDesC16& aPassword)
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   257
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   258
	iPassword.Set(reinterpret_cast<const TUint8*>(aPassword.Ptr()), aPassword.Size());
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   259
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   260
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   261
EXPORT_C const TDesC8& TPBPassword::Password(void) const
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   262
	{
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   263
	return iPassword;
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   264
	}
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   265
de46a57f75fb 201023_02
hgs
parents:
diff changeset
   266