1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/security/crypto/weakcryptospi/test/tplugins/src/md2impl.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,307 @@
1.4 +/*
1.5 +* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
1.6 +* All rights reserved.
1.7 +* This component and the accompanying materials are made available
1.8 +* under the terms of the License "Eclipse Public License v1.0"
1.9 +* which accompanies this distribution, and is available
1.10 +* at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.11 +*
1.12 +* Initial Contributors:
1.13 +* Nokia Corporation - initial contribution.
1.14 +*
1.15 +* Contributors:
1.16 +*
1.17 +* Description:
1.18 +* software md2 implementation
1.19 +* software md2 implementation
1.20 +*
1.21 +*/
1.22 +
1.23 +
1.24 +/**
1.25 + @file
1.26 +*/
1.27 +
1.28 +#include "md2impl.h"
1.29 +
1.30 +#include <cryptospi/hashplugin.h>
1.31 +#include "pluginconfig.h"
1.32 +
1.33 +using namespace SoftwareCrypto;
1.34 +
1.35 +CMD2Impl* CMD2Impl::NewL(TUid aImplementationUid)
1.36 + {
1.37 + CMD2Impl* self=new (ELeave) CMD2Impl(aImplementationUid);
1.38 + return self;
1.39 + }
1.40 +
1.41 +CMD2Impl* CMD2Impl::NewLC(TUid aImplementationUid)
1.42 + {
1.43 + CMD2Impl* self=NewL(aImplementationUid);
1.44 + CleanupStack::PushL(self);
1.45 + return self;
1.46 + }
1.47 +
1.48 +CMD2Impl::CMD2Impl(TUid aImplementationUid) : iImplementationUid(aImplementationUid), iHash(KMD2HashSize)
1.49 + {
1.50 + }
1.51 +
1.52 +CMD2Impl::CMD2Impl(const CMD2Impl& aCMD2Impl)
1.53 +: iHash(aCMD2Impl.iHash),iNum(aCMD2Impl.iNum)
1.54 + {
1.55 + (void)Mem::Copy(iData, aCMD2Impl.iData, sizeof(iData));
1.56 + (void)Mem::Copy(iChecksum, aCMD2Impl.iChecksum, sizeof(iChecksum));
1.57 + (void)Mem::Copy(iState, aCMD2Impl.iState, sizeof(iState));
1.58 + }
1.59 +
1.60 +CMD2Impl::~CMD2Impl()
1.61 + {
1.62 + }
1.63 +
1.64 +void CMD2Impl::Reset()
1.65 + {
1.66 + Mem::FillZ(iData,sizeof(iData));
1.67 + Mem::FillZ(iChecksum,sizeof(iChecksum));
1.68 + Mem::FillZ(iState,sizeof(iState));
1.69 + iNum=0;
1.70 + }
1.71 +
1.72 +void CMD2Impl::Close()
1.73 + {
1.74 + delete this;
1.75 + }
1.76 +
1.77 +void CMD2Impl::GetCharacteristicsL(const TCharacteristics*& aPluginCharacteristics)
1.78 + {
1.79 + aPluginCharacteristics=NULL;
1.80 + TInt hashNum=sizeof(KHashCharacteristics)/sizeof(THashCharacteristics*);
1.81 + for (TInt i=0;i<hashNum;i++)
1.82 + {
1.83 + if (KHashCharacteristics[i]->cmn.iImplementationUID==ImplementationUid().iUid)
1.84 + {
1.85 + aPluginCharacteristics = KHashCharacteristics[i];
1.86 + break;
1.87 + }
1.88 + }
1.89 + }
1.90 +
1.91 +CExtendedCharacteristics* CMD2Impl::CreateExtendedCharacteristicsL()
1.92 + {
1.93 + // All Symbian software plug-ins have unlimited concurrency, cannot be reserved
1.94 + // for exclusive use and are not CERTIFIED to be standards compliant.
1.95 + return CExtendedCharacteristics::NewL(KMaxTInt, EFalse);
1.96 + }
1.97 +
1.98 +const CExtendedCharacteristics* CMD2Impl::GetExtendedCharacteristicsL()
1.99 + {
1.100 + return CMD2Impl::CreateExtendedCharacteristicsL();
1.101 + }
1.102 +
1.103 +TAny* CMD2Impl::GetExtension(TUid /*aExtensionId*/)
1.104 + {
1.105 + return NULL;
1.106 + }
1.107 +
1.108 +TPtrC8 CMD2Impl::Hash(const TDesC8& aMessage)
1.109 + {
1.110 + TPtrC8 ptr(KNullDesC8());
1.111 + DoUpdate(aMessage.Ptr(),aMessage.Size());
1.112 + StoreState();
1.113 + DoFinal();
1.114 + ptr.Set(iHash);
1.115 + RestoreState();
1.116 + return ptr;
1.117 + }
1.118 +
1.119 +void CMD2Impl::Update(const TDesC8& aMessage)
1.120 + {
1.121 + DoUpdate(aMessage.Ptr(),aMessage.Size());
1.122 + }
1.123 +
1.124 +TPtrC8 CMD2Impl::Final(const TDesC8& aMessage)
1.125 + {
1.126 + TPtrC8 ptr(KNullDesC8());
1.127 + if (aMessage!=KNullDesC8())
1.128 + {
1.129 + DoUpdate(aMessage.Ptr(),aMessage.Size());
1.130 + }
1.131 + DoFinal();
1.132 + ptr.Set(iHash);
1.133 + Reset();
1.134 + return ptr;
1.135 + }
1.136 +
1.137 +MHash* CMD2Impl::ReplicateL()
1.138 + {
1.139 + return NewL(iImplementationUid);
1.140 + }
1.141 +
1.142 +MHash* CMD2Impl::CopyL()
1.143 + {
1.144 + return new(ELeave) CMD2Impl(*this);
1.145 + }
1.146 +
1.147 +void CMD2Impl::RestoreState()
1.148 + {
1.149 + Mem::Copy(&iData[0], &iDataTemp[0], KMD2BlockSize);
1.150 + Mem::Copy(&iChecksum[0], &iChecksumTemp[0], KMD2BlockSize*sizeof(TUint));
1.151 + Mem::Copy(&iState[0], &iStateTemp[0], KMD2BlockSize*sizeof(TUint));
1.152 + }
1.153 +
1.154 +void CMD2Impl::StoreState()
1.155 + {
1.156 + Mem::Copy(&iDataTemp[0], &iData[0], KMD2BlockSize);
1.157 + Mem::Copy(&iChecksumTemp[0], &iChecksum[0], KMD2BlockSize*sizeof(TUint));
1.158 + Mem::Copy(&iStateTemp[0], &iState[0], KMD2BlockSize*sizeof(TUint));
1.159 + }
1.160 +
1.161 +
1.162 +TUid CMD2Impl::ImplementationUid()
1.163 + {
1.164 + return iImplementationUid;
1.165 + }
1.166 +
1.167 +static inline TUint CMD2_S(TUint& elt,TUint8 val)
1.168 + {
1.169 + return elt^=val;
1.170 + }
1.171 +
1.172 +void CMD2Impl::DoUpdate(const TUint8* aData,TUint aLength)
1.173 + {
1.174 + TBool carryOn=ETrue;
1.175 + if (iNum)
1.176 + {
1.177 + if (iNum+aLength>=(TUint)KMD2BlockSize)
1.178 + {
1.179 + const TUint temp=KMD2BlockSize-iNum;
1.180 + (void)Mem::Copy(iData+iNum,aData,temp);
1.181 + Block(iData);
1.182 + aData+=temp;
1.183 + aLength-=temp;
1.184 + iNum=0;
1.185 + }
1.186 + else
1.187 + {
1.188 + (void)Mem::Copy(iData+iNum,aData,aLength);
1.189 + iNum+=aLength;
1.190 + carryOn=EFalse;
1.191 + }
1.192 + }
1.193 + // processing by block of KMD2BlockSize
1.194 + if (carryOn)
1.195 + {
1.196 + while (aLength>=(TUint)KMD2BlockSize)
1.197 + {
1.198 + Block(aData);
1.199 + aData+=KMD2BlockSize;
1.200 + aLength-=KMD2BlockSize;
1.201 + }
1.202 + (void)Mem::Copy(iData,aData,aLength);
1.203 + iNum=aLength;
1.204 + }
1.205 + }
1.206 +
1.207 +void CMD2Impl::DoFinal()
1.208 + {
1.209 + const TUint pad=KMD2BlockSize-iNum;
1.210 + if (pad>0)
1.211 + Mem::Fill(iData+iNum,(TUint8)pad,pad);
1.212 + Block(iData);
1.213 +
1.214 + TUint8* pData=iData;
1.215 + const TUint8* pEnd=iData+KMD2BlockSize;
1.216 + const TUint* pChecksum=iChecksum;
1.217 + while (pData<pEnd)
1.218 + {
1.219 + *pData=(TUint8)*pChecksum;//checksum is always less than 255
1.220 + pData++;
1.221 + pChecksum++;
1.222 + }
1.223 + Block(iData);
1.224 +
1.225 + TUint* pState=iState;
1.226 + for (TUint i=0;i<(TUint)KMD2BlockSize;i++,pState++) //safe: iState and iHash have got same size
1.227 + iHash[i]=(TUint8)(*pState&0xff);
1.228 + }
1.229 +
1.230 +void CMD2Impl::Block(const TUint8* aData)
1.231 + {
1.232 + TUint8 S[256]={
1.233 + 0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01,
1.234 + 0x3D, 0x36, 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13,
1.235 + 0x62, 0xA7, 0x05, 0xF3, 0xC0, 0xC7, 0x73, 0x8C,
1.236 + 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C, 0x82, 0xCA,
1.237 + 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16,
1.238 + 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12,
1.239 + 0xBE, 0x4E, 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49,
1.240 + 0xA0, 0xFB, 0xF5, 0x8E, 0xBB, 0x2F, 0xEE, 0x7A,
1.241 + 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2, 0x07, 0x3F,
1.242 + 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21,
1.243 + 0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27,
1.244 + 0x35, 0x3E, 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03,
1.245 + 0xFF, 0x19, 0x30, 0xB3, 0x48, 0xA5, 0xB5, 0xD1,
1.246 + 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56, 0xAA, 0xC6,
1.247 + 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6,
1.248 + 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1,
1.249 + 0x45, 0x9D, 0x70, 0x59, 0x64, 0x71, 0x87, 0x20,
1.250 + 0x86, 0x5B, 0xCF, 0x65, 0xE6, 0x2D, 0xA8, 0x02,
1.251 + 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0, 0xB9, 0xF6,
1.252 + 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F,
1.253 + 0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A,
1.254 + 0xC3, 0x5C, 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26,
1.255 + 0x2C, 0x53, 0x0D, 0x6E, 0x85, 0x28, 0x84, 0x09,
1.256 + 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81, 0x4D, 0x52,
1.257 + 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA,
1.258 + 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A,
1.259 + 0x78, 0x88, 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D,
1.260 + 0xE9, 0xCB, 0xD5, 0xFE, 0x3B, 0x00, 0x1D, 0x39,
1.261 + 0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58, 0xD0, 0xE4,
1.262 + 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A,
1.263 + 0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A,
1.264 + 0xDB, 0x99, 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14,
1.265 + };
1.266 + TUint state[KMD2BlockSize*3];
1.267 + TUint j=iChecksum[KMD2BlockSize-1];
1.268 + TUint i=0,temp=0;
1.269 + while (i<(TUint)KMD2BlockSize)
1.270 + {
1.271 + const TUint tempState=iState[i];
1.272 + temp=aData[i];
1.273 + state[i]=tempState;
1.274 + state[i+16]=temp;
1.275 + state[i+32]=temp^tempState;
1.276 + j=CMD2_S(iChecksum[i++],S[temp^j]);
1.277 + }
1.278 + temp=0;
1.279 + TUint* pstate=state;
1.280 + const TUint *pend=state+(KMD2BlockSize*3);
1.281 + for (i=0; i<18; i++)
1.282 + {
1.283 + while (pstate<pend)
1.284 + {
1.285 + temp=CMD2_S(*pstate,S[temp]);pstate++;
1.286 + temp=CMD2_S(*pstate,S[temp]);pstate++;
1.287 + temp=CMD2_S(*pstate,S[temp]);pstate++;
1.288 + temp=CMD2_S(*pstate,S[temp]);pstate++;
1.289 + temp=CMD2_S(*pstate,S[temp]);pstate++;
1.290 + temp=CMD2_S(*pstate,S[temp]);pstate++;
1.291 + temp=CMD2_S(*pstate,S[temp]);pstate++;
1.292 + temp=CMD2_S(*pstate,S[temp]);pstate++;
1.293 + }
1.294 + pstate=state;
1.295 + temp=(temp+i)&0xff;
1.296 + }
1.297 + (void)Mem::Copy(iState,state,KMD2BlockSize*sizeof(TUint));
1.298 + }
1.299 +
1.300 +
1.301 +void CMD2Impl::SetOperationModeL(TUid /*aOperationMode*/)
1.302 + {
1.303 + User::Leave(KErrNotSupported);
1.304 + }
1.305 +
1.306 +void CMD2Impl::SetKeyL(const CKey& /*aKey*/)
1.307 + {
1.308 + User::Leave(KErrNotSupported);
1.309 + }
1.310 +