sl@0: /* sl@0: * Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of the License "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * sl@0: */ sl@0: sl@0: sl@0: #include "tvectorutils.h" sl@0: #include "t_input.h" sl@0: sl@0: // RSA sl@0: _LIT8(KModStart, ""); sl@0: _LIT8(KModEnd, ""); sl@0: _LIT8(KPubExpStart, ""); sl@0: _LIT8(KPubExpEnd, ""); sl@0: _LIT8(KPrivExpStart, ""); sl@0: _LIT8(KPrivExpEnd, ""); sl@0: _LIT8(KPStart, "

"); sl@0: _LIT8(KPEnd, "

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

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

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