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 sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: EXPORT_C CX509DHPublicKey* CX509DHPublicKey::NewL(const TDesC8& aParamsData, const TDesC8& aKeyData) sl@0: { sl@0: CX509DHPublicKey* me = CX509DHPublicKey::NewLC(aParamsData, aKeyData); sl@0: CleanupStack::Pop(me); sl@0: return (me); sl@0: } sl@0: sl@0: EXPORT_C CX509DHPublicKey* CX509DHPublicKey::NewLC(const TDesC8& aParamsData, const TDesC8& aKeyData) sl@0: { sl@0: CX509DHPublicKey* me = new (ELeave) CX509DHPublicKey(); sl@0: CleanupStack::PushL(me); sl@0: me->ConstructL(aParamsData, aKeyData); sl@0: return (me); sl@0: } sl@0: sl@0: EXPORT_C CX509DHPublicKey::~CX509DHPublicKey() sl@0: { sl@0: } sl@0: sl@0: CX509DHPublicKey::CX509DHPublicKey() sl@0: { sl@0: } sl@0: sl@0: void CX509DHPublicKey::ConstructL(const TDesC8& aParamsData, const TDesC8& aKeyData) sl@0: { sl@0: CX509DHDomainParams* params=CX509DHDomainParams::NewLC(aParamsData); sl@0: iN = RInteger::NewL(params->P()); sl@0: iG = RInteger::NewL(params->G()); sl@0: iX = RInteger::NewL(aKeyData); sl@0: CleanupStack::PopAndDestroy(params); sl@0: } sl@0: sl@0: //DH params sl@0: //DH validation params sl@0: EXPORT_C CX509DHValidationParams* CX509DHValidationParams::NewL(const TDesC8& aBinaryData) sl@0: { sl@0: TInt pos = 0; sl@0: return CX509DHValidationParams::NewL(aBinaryData, pos); sl@0: } sl@0: sl@0: EXPORT_C CX509DHValidationParams* CX509DHValidationParams::NewLC(const TDesC8& aBinaryData) sl@0: { sl@0: TInt pos = 0; sl@0: return CX509DHValidationParams::NewLC(aBinaryData, pos); sl@0: } sl@0: sl@0: EXPORT_C CX509DHValidationParams* CX509DHValidationParams::NewL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: CX509DHValidationParams* self = CX509DHValidationParams::NewLC(aBinaryData, aPos); sl@0: CleanupStack::Pop(); sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C CX509DHValidationParams* CX509DHValidationParams::NewLC(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: CX509DHValidationParams* self = new(ELeave) CX509DHValidationParams; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aBinaryData, aPos); sl@0: return self; sl@0: } sl@0: sl@0: void CX509DHValidationParams::ConstructL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: TASN1DecGeneric dec(aBinaryData.Right(aBinaryData.Length() - aPos)); sl@0: dec.InitL(); sl@0: if (dec.Tag() != EASN1Sequence) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: TInt end = aPos + dec.LengthDER(); sl@0: aPos += dec.LengthDERHeader();//add header length to aPos sl@0: sl@0: TASN1DecBitString encBS; sl@0: iSeed = encBS.ExtractOctetStringL(aBinaryData, aPos); sl@0: TASN1DecInteger encInt; sl@0: iPGenCounter = encInt.DecodeDERLongL(aBinaryData, aPos); sl@0: sl@0: if (aPos != end) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: } sl@0: sl@0: EXPORT_C const TPtrC8 CX509DHValidationParams::Seed() const sl@0: { sl@0: return *iSeed; sl@0: } sl@0: sl@0: EXPORT_C const TInteger& CX509DHValidationParams::PGenCounter() const sl@0: { sl@0: return iPGenCounter; sl@0: } sl@0: sl@0: CX509DHValidationParams::~CX509DHValidationParams() sl@0: { sl@0: delete iSeed; sl@0: iPGenCounter.Close(); sl@0: } sl@0: sl@0: CX509DHValidationParams::CX509DHValidationParams() sl@0: { sl@0: } sl@0: sl@0: //DH domain params sl@0: EXPORT_C CX509DHDomainParams* CX509DHDomainParams::NewL(const TDesC8& aBinaryData) sl@0: { sl@0: TInt pos = 0; sl@0: return CX509DHDomainParams::NewL(aBinaryData, pos); sl@0: } sl@0: sl@0: EXPORT_C CX509DHDomainParams* CX509DHDomainParams::NewLC(const TDesC8& aBinaryData) sl@0: { sl@0: TInt pos = 0; sl@0: return CX509DHDomainParams::NewLC(aBinaryData, pos); sl@0: } sl@0: sl@0: EXPORT_C CX509DHDomainParams* CX509DHDomainParams::NewL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: CX509DHDomainParams* self = CX509DHDomainParams::NewLC(aBinaryData, aPos); sl@0: CleanupStack::Pop(); sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C CX509DHDomainParams* CX509DHDomainParams::NewLC(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: CX509DHDomainParams* self = new(ELeave) CX509DHDomainParams; sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aBinaryData, aPos); sl@0: return self; sl@0: } sl@0: sl@0: void CX509DHDomainParams::ConstructL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: TASN1DecGeneric dec(aBinaryData.Right(aBinaryData.Length() - aPos)); sl@0: dec.InitL(); sl@0: if (dec.Tag() != EASN1Sequence) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: TInt end = aPos + dec.LengthDER(); sl@0: aPos += dec.LengthDERHeader();//add header length to aPos sl@0: sl@0: TASN1DecInteger encInt; sl@0: iP = encInt.DecodeDERLongL(aBinaryData, aPos); sl@0: iG = encInt.DecodeDERLongL(aBinaryData, aPos); sl@0: if (aPos < end) sl@0: { sl@0: iQ = encInt.DecodeDERLongL(aBinaryData, aPos); sl@0: } sl@0: sl@0: if (aPos < end) sl@0: { sl@0: TASN1DecGeneric gen1(aBinaryData.Right(aBinaryData.Length() - aPos)); sl@0: gen1.InitL(); sl@0: TBool doneVal = EFalse; sl@0: if (gen1.Tag() == EASN1Integer) sl@0: { sl@0: iJ = encInt.DecodeDERLongL(aBinaryData, aPos); sl@0: } sl@0: else sl@0: { sl@0: iValidationParams = CX509DHValidationParams::NewL(aBinaryData, aPos); sl@0: doneVal = EFalse; sl@0: } sl@0: if ((aPos < end) && (!doneVal)) sl@0: { sl@0: iValidationParams = CX509DHValidationParams::NewL(aBinaryData, aPos); sl@0: } sl@0: } sl@0: sl@0: if (aPos != end) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: } sl@0: sl@0: EXPORT_C const TInteger& CX509DHDomainParams::P() const sl@0: { sl@0: return iP; sl@0: } sl@0: sl@0: EXPORT_C const TInteger& CX509DHDomainParams::G() const sl@0: { sl@0: return iG; sl@0: } sl@0: sl@0: EXPORT_C const TInteger& CX509DHDomainParams::Q() const sl@0: { sl@0: return iQ; sl@0: } sl@0: sl@0: EXPORT_C const TInteger& CX509DHDomainParams::J() const sl@0: { sl@0: return iJ; sl@0: } sl@0: sl@0: EXPORT_C const CX509DHValidationParams* CX509DHDomainParams::ValidationParams() const sl@0: { sl@0: return iValidationParams; sl@0: } sl@0: sl@0: CX509DHDomainParams::~CX509DHDomainParams() sl@0: { sl@0: iP.Close(); sl@0: iG.Close(); sl@0: iQ.Close(); sl@0: iJ.Close(); sl@0: delete iValidationParams; sl@0: } sl@0: sl@0: CX509DHDomainParams::CX509DHDomainParams() sl@0: { sl@0: } sl@0: sl@0: // CX509DHKeyPair sl@0: sl@0: sl@0: EXPORT_C CX509DHKeyPair* CX509DHKeyPair::NewL(const TDesC8& aParamsData) sl@0: { sl@0: CX509DHKeyPair* me = CX509DHKeyPair::NewLC(aParamsData); sl@0: CleanupStack::Pop(me); sl@0: return (me); sl@0: } sl@0: sl@0: EXPORT_C CX509DHKeyPair* CX509DHKeyPair::NewLC(const TDesC8& aParamsData) sl@0: { sl@0: CX509DHKeyPair* me = new (ELeave) CX509DHKeyPair(); sl@0: CleanupStack::PushL(me); sl@0: me->ConstructL(aParamsData); sl@0: return (me); sl@0: } sl@0: sl@0: EXPORT_C CX509DHKeyPair::~CX509DHKeyPair() sl@0: {} sl@0: sl@0: CX509DHKeyPair::CX509DHKeyPair() sl@0: {} sl@0: sl@0: void CX509DHKeyPair::ConstructL(const TDesC8& aParamsData) sl@0: { sl@0: CX509DHDomainParams* params=CX509DHDomainParams::NewLC(aParamsData); sl@0: RInteger n = RInteger::NewL(params->P()); sl@0: CleanupStack::PushL(n); sl@0: RInteger g = RInteger::NewL(params->G()); sl@0: CleanupStack::PushL(g); sl@0: sl@0: CDHKeyPair::ConstructL(n, g); sl@0: CleanupStack::Pop(2, &n); // n, g owned by this now sl@0: CleanupStack::PopAndDestroy(params); sl@0: }