os/security/cryptoservices/certificateandkeymgmt/x509/x509keysDH.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of the License "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description: 
sl@0
    15
*
sl@0
    16
*/
sl@0
    17
sl@0
    18
sl@0
    19
#include <x509keys.h>
sl@0
    20
#include <asn1dec.h>
sl@0
    21
#include <asn1enc.h>
sl@0
    22
#include <x509cert.h>
sl@0
    23
sl@0
    24
EXPORT_C CX509DHPublicKey* CX509DHPublicKey::NewL(const TDesC8& aParamsData, const TDesC8& aKeyData)
sl@0
    25
	{
sl@0
    26
	CX509DHPublicKey* me = CX509DHPublicKey::NewLC(aParamsData, aKeyData);
sl@0
    27
	CleanupStack::Pop(me);
sl@0
    28
	return (me);
sl@0
    29
	}
sl@0
    30
sl@0
    31
EXPORT_C CX509DHPublicKey* CX509DHPublicKey::NewLC(const TDesC8& aParamsData, const TDesC8& aKeyData)
sl@0
    32
	{
sl@0
    33
		CX509DHPublicKey* me = new (ELeave) CX509DHPublicKey();
sl@0
    34
		CleanupStack::PushL(me);
sl@0
    35
		me->ConstructL(aParamsData, aKeyData);
sl@0
    36
		return (me);	
sl@0
    37
	}
sl@0
    38
sl@0
    39
EXPORT_C CX509DHPublicKey::~CX509DHPublicKey()
sl@0
    40
	{
sl@0
    41
	}
sl@0
    42
sl@0
    43
CX509DHPublicKey::CX509DHPublicKey()
sl@0
    44
	{
sl@0
    45
	}
sl@0
    46
sl@0
    47
void CX509DHPublicKey::ConstructL(const TDesC8& aParamsData, const TDesC8& aKeyData)
sl@0
    48
	{
sl@0
    49
	CX509DHDomainParams* params=CX509DHDomainParams::NewLC(aParamsData);
sl@0
    50
	iN = RInteger::NewL(params->P());	
sl@0
    51
	iG = RInteger::NewL(params->G());	
sl@0
    52
	iX = RInteger::NewL(aKeyData);	
sl@0
    53
	CleanupStack::PopAndDestroy(params);	
sl@0
    54
	}
sl@0
    55
sl@0
    56
//DH params
sl@0
    57
//DH validation params
sl@0
    58
EXPORT_C CX509DHValidationParams* CX509DHValidationParams::NewL(const TDesC8& aBinaryData)
sl@0
    59
	{
sl@0
    60
	TInt pos = 0;
sl@0
    61
	return CX509DHValidationParams::NewL(aBinaryData, pos);
sl@0
    62
	}
sl@0
    63
sl@0
    64
EXPORT_C CX509DHValidationParams* CX509DHValidationParams::NewLC(const TDesC8& aBinaryData)
sl@0
    65
	{
sl@0
    66
	TInt pos = 0;
sl@0
    67
	return CX509DHValidationParams::NewLC(aBinaryData, pos);
sl@0
    68
	}
sl@0
    69
sl@0
    70
EXPORT_C CX509DHValidationParams* CX509DHValidationParams::NewL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
    71
	{
sl@0
    72
	CX509DHValidationParams* self = CX509DHValidationParams::NewLC(aBinaryData, aPos);
sl@0
    73
	CleanupStack::Pop();
sl@0
    74
	return self;
sl@0
    75
	}
sl@0
    76
sl@0
    77
EXPORT_C CX509DHValidationParams* CX509DHValidationParams::NewLC(const TDesC8& aBinaryData, TInt& aPos)
sl@0
    78
	{
sl@0
    79
	CX509DHValidationParams* self = new(ELeave) CX509DHValidationParams;
sl@0
    80
	CleanupStack::PushL(self);
sl@0
    81
	self->ConstructL(aBinaryData, aPos);
sl@0
    82
	return self;
sl@0
    83
	}
sl@0
    84
sl@0
    85
void CX509DHValidationParams::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
    86
	{
sl@0
    87
	TASN1DecGeneric dec(aBinaryData.Right(aBinaryData.Length() - aPos));
sl@0
    88
	dec.InitL();
sl@0
    89
	if (dec.Tag() != EASN1Sequence)
sl@0
    90
		{
sl@0
    91
		User::Leave(KErrArgument);
sl@0
    92
		}
sl@0
    93
	TInt end = aPos + dec.LengthDER();
sl@0
    94
	aPos += dec.LengthDERHeader();//add header length to aPos
sl@0
    95
sl@0
    96
	TASN1DecBitString encBS;
sl@0
    97
	iSeed = encBS.ExtractOctetStringL(aBinaryData, aPos);
sl@0
    98
	TASN1DecInteger encInt;
sl@0
    99
	iPGenCounter = encInt.DecodeDERLongL(aBinaryData, aPos);
sl@0
   100
sl@0
   101
	if (aPos != end)
sl@0
   102
		{
sl@0
   103
		User::Leave(KErrArgument);
sl@0
   104
		}	
sl@0
   105
	}
sl@0
   106
sl@0
   107
EXPORT_C const TPtrC8 CX509DHValidationParams::Seed() const
sl@0
   108
	{
sl@0
   109
	return *iSeed;
sl@0
   110
	}
sl@0
   111
sl@0
   112
EXPORT_C const TInteger& CX509DHValidationParams::PGenCounter() const
sl@0
   113
	{
sl@0
   114
	return iPGenCounter;
sl@0
   115
	}
sl@0
   116
sl@0
   117
CX509DHValidationParams::~CX509DHValidationParams()
sl@0
   118
	{
sl@0
   119
	delete iSeed;
sl@0
   120
	iPGenCounter.Close();
sl@0
   121
	}
sl@0
   122
sl@0
   123
CX509DHValidationParams::CX509DHValidationParams()
sl@0
   124
	{
sl@0
   125
	}
sl@0
   126
sl@0
   127
//DH domain params
sl@0
   128
EXPORT_C CX509DHDomainParams* CX509DHDomainParams::NewL(const TDesC8& aBinaryData)
sl@0
   129
	{
sl@0
   130
	TInt pos = 0;
sl@0
   131
	return CX509DHDomainParams::NewL(aBinaryData, pos);
sl@0
   132
	}
sl@0
   133
sl@0
   134
EXPORT_C CX509DHDomainParams* CX509DHDomainParams::NewLC(const TDesC8& aBinaryData)
sl@0
   135
	{
sl@0
   136
	TInt pos = 0;
sl@0
   137
	return CX509DHDomainParams::NewLC(aBinaryData, pos);
sl@0
   138
	}
sl@0
   139
sl@0
   140
EXPORT_C CX509DHDomainParams* CX509DHDomainParams::NewL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   141
	{
sl@0
   142
	CX509DHDomainParams* self = CX509DHDomainParams::NewLC(aBinaryData, aPos);
sl@0
   143
	CleanupStack::Pop();
sl@0
   144
	return self;
sl@0
   145
	}
sl@0
   146
sl@0
   147
EXPORT_C CX509DHDomainParams* CX509DHDomainParams::NewLC(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   148
	{
sl@0
   149
	CX509DHDomainParams* self = new(ELeave) CX509DHDomainParams;
sl@0
   150
	CleanupStack::PushL(self);
sl@0
   151
	self->ConstructL(aBinaryData, aPos);
sl@0
   152
	return self;
sl@0
   153
	}
sl@0
   154
sl@0
   155
void CX509DHDomainParams::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   156
	{
sl@0
   157
	TASN1DecGeneric dec(aBinaryData.Right(aBinaryData.Length() - aPos));
sl@0
   158
	dec.InitL();
sl@0
   159
	if (dec.Tag() != EASN1Sequence)
sl@0
   160
		{
sl@0
   161
		User::Leave(KErrArgument);
sl@0
   162
		}
sl@0
   163
	TInt end = aPos + dec.LengthDER();
sl@0
   164
	aPos += dec.LengthDERHeader();//add header length to aPos
sl@0
   165
sl@0
   166
	TASN1DecInteger encInt;
sl@0
   167
	iP = encInt.DecodeDERLongL(aBinaryData, aPos);
sl@0
   168
	iG = encInt.DecodeDERLongL(aBinaryData, aPos);
sl@0
   169
	if (aPos < end)
sl@0
   170
		{
sl@0
   171
		iQ = encInt.DecodeDERLongL(aBinaryData, aPos);
sl@0
   172
		}
sl@0
   173
sl@0
   174
	if (aPos < end)
sl@0
   175
		{
sl@0
   176
		TASN1DecGeneric gen1(aBinaryData.Right(aBinaryData.Length() - aPos));
sl@0
   177
		gen1.InitL();
sl@0
   178
		TBool doneVal = EFalse;
sl@0
   179
		if (gen1.Tag() == EASN1Integer)
sl@0
   180
			{
sl@0
   181
			iJ = encInt.DecodeDERLongL(aBinaryData, aPos);
sl@0
   182
			}
sl@0
   183
		else
sl@0
   184
			{
sl@0
   185
			iValidationParams = CX509DHValidationParams::NewL(aBinaryData, aPos);
sl@0
   186
			doneVal = EFalse;
sl@0
   187
			}
sl@0
   188
		if ((aPos < end) && (!doneVal))
sl@0
   189
			{
sl@0
   190
			iValidationParams = CX509DHValidationParams::NewL(aBinaryData, aPos);
sl@0
   191
			}
sl@0
   192
		}
sl@0
   193
sl@0
   194
	if (aPos != end)
sl@0
   195
		{
sl@0
   196
		User::Leave(KErrArgument);
sl@0
   197
		}	
sl@0
   198
	}
sl@0
   199
sl@0
   200
EXPORT_C const TInteger& CX509DHDomainParams::P() const
sl@0
   201
	{
sl@0
   202
	return iP;
sl@0
   203
	}
sl@0
   204
sl@0
   205
EXPORT_C const TInteger& CX509DHDomainParams::G() const
sl@0
   206
	{
sl@0
   207
	return iG;
sl@0
   208
	}
sl@0
   209
sl@0
   210
EXPORT_C const TInteger& CX509DHDomainParams::Q() const
sl@0
   211
	{
sl@0
   212
	return iQ;
sl@0
   213
	}
sl@0
   214
sl@0
   215
EXPORT_C const TInteger& CX509DHDomainParams::J() const							
sl@0
   216
	{
sl@0
   217
	return iJ;
sl@0
   218
	}
sl@0
   219
sl@0
   220
EXPORT_C const CX509DHValidationParams* CX509DHDomainParams::ValidationParams() const
sl@0
   221
	{
sl@0
   222
	return iValidationParams;
sl@0
   223
	}
sl@0
   224
sl@0
   225
CX509DHDomainParams::~CX509DHDomainParams()
sl@0
   226
	{
sl@0
   227
	iP.Close();
sl@0
   228
	iG.Close();
sl@0
   229
	iQ.Close();
sl@0
   230
	iJ.Close();
sl@0
   231
	delete iValidationParams;
sl@0
   232
	}
sl@0
   233
sl@0
   234
CX509DHDomainParams::CX509DHDomainParams()
sl@0
   235
	{
sl@0
   236
	}
sl@0
   237
sl@0
   238
//	CX509DHKeyPair
sl@0
   239
sl@0
   240
sl@0
   241
EXPORT_C CX509DHKeyPair* CX509DHKeyPair::NewL(const TDesC8& aParamsData)
sl@0
   242
{
sl@0
   243
	CX509DHKeyPair* me = CX509DHKeyPair::NewLC(aParamsData);
sl@0
   244
	CleanupStack::Pop(me);
sl@0
   245
	return (me);
sl@0
   246
}
sl@0
   247
sl@0
   248
EXPORT_C CX509DHKeyPair* CX509DHKeyPair::NewLC(const TDesC8& aParamsData)
sl@0
   249
{
sl@0
   250
	CX509DHKeyPair* me = new (ELeave) CX509DHKeyPair();
sl@0
   251
	CleanupStack::PushL(me);
sl@0
   252
	me->ConstructL(aParamsData);
sl@0
   253
	return (me);
sl@0
   254
}
sl@0
   255
sl@0
   256
EXPORT_C CX509DHKeyPair::~CX509DHKeyPair()
sl@0
   257
{}
sl@0
   258
sl@0
   259
CX509DHKeyPair::CX509DHKeyPair()
sl@0
   260
{}
sl@0
   261
sl@0
   262
void CX509DHKeyPair::ConstructL(const TDesC8& aParamsData)
sl@0
   263
{
sl@0
   264
	CX509DHDomainParams* params=CX509DHDomainParams::NewLC(aParamsData);
sl@0
   265
	RInteger n = RInteger::NewL(params->P());
sl@0
   266
	CleanupStack::PushL(n);
sl@0
   267
	RInteger g = RInteger::NewL(params->G());
sl@0
   268
	CleanupStack::PushL(g);
sl@0
   269
	
sl@0
   270
	CDHKeyPair::ConstructL(n, g);
sl@0
   271
	CleanupStack::Pop(2, &n);	//	n, g owned by this now
sl@0
   272
	CleanupStack::PopAndDestroy(params);	
sl@0
   273
}