diff -r 000000000000 -r bde4ae8d615e os/security/crypto/weakcrypto/source/symmetric/3des.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/security/crypto/weakcrypto/source/symmetric/3des.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,138 @@ +/* +* Copyright (c) 2002-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: +* +*/ + + +#include "3des.h" +#include "../common/inlines.h" +#include "des.inl" +#include + +const TInt K3DESBlockBytes = 8; +const TInt K3DESKeyBytes = 24; +const TInt KDESKeyBytes = 8; + +void C3DES::Transform(TDes8& aBlock) + { + assert(aBlock.Size() == K3DESBlockBytes); + + TUint32 l, r; +// Split the block into 2 word-sized big endian portions + GetBlockBigEndian((TUint8*)&aBlock[0], l, r); + + IPerm(l,r); + + DoTransform(l, r, iK1); + DoTransform(r, l, iK2); + DoTransform(l, r, iK3); + + FPerm(l,r); + +// Put the portions back into the block as little endian + PutBlockBigEndian((TUint8*)&aBlock[0], r, l); + } + +TInt C3DES::BlockSize() const + { + return K3DESBlockBytes; + } + +TInt C3DES::KeySize() const + { + return K3DESKeyBytes; + } + +C3DES::C3DES() + { + } + +void C3DES::ConstructL(const TDesC8& aKey) + { + assert(aKey.Size() == K3DESKeyBytes); + + iKey = aKey.AllocL(); + DoSetKey(*iKey); + } + +void C3DES::Reset() + { + DoSetKey(*iKey); + } + +/* C3DESEncryptor */ + +EXPORT_C C3DESEncryptor* C3DESEncryptor::NewL(const TDesC8& aKey) + { + C3DESEncryptor* me = C3DESEncryptor::NewLC(aKey); + CleanupStack::Pop(me); + return (me); + } + +EXPORT_C C3DESEncryptor* C3DESEncryptor::NewLC(const TDesC8& aKey) + { + C3DESEncryptor* me = new (ELeave) C3DESEncryptor(); + CleanupStack::PushL(me); + me->ConstructL(aKey); + // DES only used 7 bits out of every key byte + TCrypto::IsSymmetricWeakEnoughL(BytesToBits(aKey.Size()) - aKey.Size()); + return (me); + } + +void C3DESEncryptor::DoSetKey(const TDesC8& aKey) + { + // Encryptor key + SetKey(aKey.Mid(0, KDESKeyBytes), iK1); + // Decryptor key + SetKey(aKey.Mid(KDESKeyBytes, 2*KDESKeyBytes), iK2); + ReverseKeySchedule(iK2); // Reverse key schedule order + // Encryptor key + SetKey(aKey.Mid(2*KDESKeyBytes), iK3); + } + +/* C3DESDecryptor */ + +EXPORT_C C3DESDecryptor* C3DESDecryptor::NewL(const TDesC8& aKey) + { + C3DESDecryptor* me = C3DESDecryptor::NewLC(aKey); + CleanupStack::Pop(me); + return (me); + } + +EXPORT_C C3DESDecryptor* C3DESDecryptor::NewLC(const TDesC8& aKey) + { + C3DESDecryptor* me = new (ELeave) C3DESDecryptor(); + CleanupStack::PushL(me); + me->ConstructL(aKey); + // DES only used 7 bits out of every key byte + TCrypto::IsSymmetricWeakEnoughL(BytesToBits(aKey.Size()) - aKey.Size()); + return (me); + } + +void C3DESDecryptor::DoSetKey(const TDesC8& aKey) + { + // 3DES decryption, reverse through key + // Decryptor key + CDES::SetKey(aKey.Mid(2*KDESKeyBytes), iK1); + ReverseKeySchedule(iK1); // Reverse key schedule order + + // Encryptor key + CDES::SetKey(aKey.Mid(KDESKeyBytes, 2*KDESKeyBytes), iK2); + + // Decryptor key + CDES::SetKey(aKey.Mid(0, KDESKeyBytes), iK3); + ReverseKeySchedule(iK3); // Reverse key schedule order + } +