diff -r 000000000000 -r bde4ae8d615e os/security/crypto/weakcryptospi/test/tasymmetric/tvectorutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/security/crypto/weakcryptospi/test/tasymmetric/tvectorutils.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,243 @@ +/* +* 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 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 "tvectorutils.h" +#include "t_input.h" + +// RSA +_LIT8(KModStart, ""); +_LIT8(KModEnd, ""); +_LIT8(KPubExpStart, ""); +_LIT8(KPubExpEnd, ""); +_LIT8(KPrivExpStart, ""); +_LIT8(KPrivExpEnd, ""); +_LIT8(KPStart, "

"); +_LIT8(KPEnd, "

"); +_LIT8(KQStart, ""); +_LIT8(KQEnd, ""); +_LIT8(KdPStart, ""); +_LIT8(KdPEnd, ""); +_LIT8(KdQStart, ""); +_LIT8(KdQEnd, ""); +_LIT8(KqInvStart, ""); +_LIT8(KqInvEnd, ""); + +_LIT8(KTrueVal, "ETrue"); +_LIT8(KFalseVal, "EFalse"); + +RInteger VectorUtils::ParseIntegerL(const TDesC8& aDes) + { + HBufC8* buf = ParseBinaryL(aDes); + CleanupStack::PushL(buf); + RInteger result = RInteger::NewL(*buf); + CleanupStack::PopAndDestroy(buf); + + return result; + } + +HBufC8* VectorUtils::ParseBinaryL(const TDesC8& aDes) +{ + __ASSERT_ALWAYS(aDes.Length() % 2 == 0, User::Panic(_L("ParseBinaryL"), KErrArgument)); + int length = aDes.Length() / 2; + HBufC8* buf = HBufC8::NewL(length); + TPtr8 ptr = buf->Des(); + ptr.SetLength(length); + + for (TInt i = 0 ; i < aDes.Length() ; i += 2) + { + TUint8 tmp; + tmp=(TUint8)(aDes[i]-(aDes[i]>'9'?('A'-10):'0')); + tmp*=16; + tmp|=(TUint8)(aDes[i+1]-(aDes[i+1]>'9'?('A'-10):'0')); + ptr[i / 2] = tmp; + } + + return buf; +} + +// Print an Integer into hex, only works for positive integers +TDesC* VectorUtils::PrintIntegerL(const TInteger& aInt) +{ + HBufC8* binary = aInt.BufferLC(); + TDesC* result = PrintBinaryL(*binary); + CleanupStack::PopAndDestroy(binary); + + return result; +} + +// Print a binary string into hex +TDesC* VectorUtils::PrintBinaryL(const TDesC8& aData) +{ + int length = aData.Length() * 2; + HBufC* buf = HBufC::NewL(length); + TPtr ptr = buf->Des(); + ptr.SetLength(length); + + for (int i = 0 ; i < aData.Length() ; ++i) + { + TUint8 val = aData[i]; + TUint8 n = (TUint8) ((val & 0xf0) >> 4); + ptr[i * 2] = (TUint8) (n < 10 ? ('0' + n) : ('A' + n - 10)); + n = (TUint8) (val & 0x0f); + ptr[i * 2 + 1] = (TUint8) (n < 10 ? ('0' + n) : ('A' + n - 10)); + } + + return buf; +} + +TBool VectorUtils::ParseBoolL(const TDesC8& aDes) + { + TBool result = EFalse; + + if (aDes == KTrueVal) + result = ETrue; + else if (aDes != KFalseVal) + User::Leave(KErrArgument); + + return result; + } + +CRSAPublicKey* VectorUtils::ReadRSAPublicKeyL(const TDesC8& aData) + { + TPtrC8 modIn = Input::ParseElement(aData, KModStart, KModEnd); + RInteger mod = ParseIntegerL(modIn); + CleanupStack::PushL(mod); + + TPtrC8 pubExpIn = Input::ParseElement(aData, KPubExpStart, KPubExpEnd); + RInteger pubExp = ParseIntegerL(pubExpIn); + CleanupStack::PushL(pubExp); + + CRSAPublicKey* result = CRSAPublicKey::NewL(mod, pubExp); + CleanupStack::Pop(2, &mod); + + return result; + } + +CRSAPrivateKeyStandard* VectorUtils::ReadRSAPrivateKeyL(const TDesC8& aData) + { + TPtrC8 modIn = Input::ParseElement(aData, KModStart, KModEnd); + RInteger mod = ParseIntegerL(modIn); + CleanupStack::PushL(mod); + + TPtrC8 privExpIn = Input::ParseElement(aData, KPrivExpStart, KPrivExpEnd); + RInteger privExp = ParseIntegerL(privExpIn); + CleanupStack::PushL(privExp); + + CRSAPrivateKeyStandard* result = CRSAPrivateKeyStandard::NewL(mod, privExp); + CleanupStack::Pop(2, &mod); + + return result; + } + +CRSAPrivateKeyCRT* VectorUtils::ReadRSAPrivateKeyCRTL(const TDesC8& aData) + { + TPtrC8 modIn = Input::ParseElement(aData, KModStart, KModEnd); + RInteger mod = ParseIntegerL(modIn); + CleanupStack::PushL(mod); + + TPtrC8 pIn = Input::ParseElement(aData, KPStart, KPEnd); + RInteger P = ParseIntegerL(pIn); + CleanupStack::PushL(P); + + TPtrC8 qIn = Input::ParseElement(aData, KQStart, KQEnd); + RInteger Q = ParseIntegerL(qIn); + CleanupStack::PushL(Q); + + TPtrC8 dpIn = Input::ParseElement(aData, KdPStart, KdPEnd); + RInteger dP = ParseIntegerL(dpIn); + CleanupStack::PushL(dP); + + TPtrC8 dqIn = Input::ParseElement(aData, KdQStart, KdQEnd); + RInteger dQ = ParseIntegerL(dqIn); + CleanupStack::PushL(dQ); + + TPtrC8 qInvIn = Input::ParseElement(aData, KqInvStart, KqInvEnd); + RInteger qInv = ParseIntegerL(qInvIn); + CleanupStack::PushL(qInv); + + CRSAPrivateKeyCRT* privKey = CRSAPrivateKeyCRT::NewL(mod, P, Q, dP, dQ, qInv); + CleanupStack::Pop(6, &mod); + + return (privKey); + } + +CDSAPublicKey* VectorUtils::ReadDSAPublicKeyL(const TDesC8& aData) + { + TPtrC8 pIn = Input::ParseElement(aData, _L8("

")); + RInteger p = ParseIntegerL(pIn); + CleanupStack::PushL(p); + + TPtrC8 qIn = Input::ParseElement(aData, _L8("")); + RInteger q = ParseIntegerL(qIn); + CleanupStack::PushL(q); + + TPtrC8 gIn = Input::ParseElement(aData, _L8("")); + RInteger g = ParseIntegerL(gIn); + CleanupStack::PushL(g); + + TPtrC8 yIn = Input::ParseElement(aData, _L8("")); + RInteger y = ParseIntegerL(yIn); + CleanupStack::PushL(y); + + CDSAPublicKey* result = CDSAPublicKey::NewLC(p, q, g, y); + CleanupStack::Pop(5, &p); + + return result; + } + +CDSAPrivateKey* VectorUtils::ReadDSAPrivateKeyL(const TDesC8& aData) + { + TPtrC8 pIn = Input::ParseElement(aData, _L8("

")); + RInteger p = ParseIntegerL(pIn); + CleanupStack::PushL(p); + + TPtrC8 qIn = Input::ParseElement(aData, _L8("")); + RInteger q = ParseIntegerL(qIn); + CleanupStack::PushL(q); + + TPtrC8 gIn = Input::ParseElement(aData, _L8("")); + RInteger g = ParseIntegerL(gIn); + CleanupStack::PushL(g); + + TPtrC8 xIn = Input::ParseElement(aData, _L8("")); + RInteger x = ParseIntegerL(xIn); + CleanupStack::PushL(x); + + CDSAPrivateKey* result = CDSAPrivateKey::NewLC(p, q, g, x); + CleanupStack::Pop(result); + + CleanupStack::Pop(4, &p); + + return result; + } + +CDSASignature* VectorUtils::ReadDSASignatureL(const TDesC8& aData) + { + TPtrC8 rIn = Input::ParseElement(aData, _L8("")); + RInteger r = ParseIntegerL(rIn); + CleanupStack::PushL(r); + + TPtrC8 sIn = Input::ParseElement(aData, _L8("")); + RInteger s = ParseIntegerL(sIn); + CleanupStack::PushL(s); + + CDSASignature* result = CDSASignature::NewLC(r, s); + CleanupStack::Pop(3, &r); + + return result; + }