os/security/cryptoservices/certificateandkeymgmt/x509/x509CertExt_v2.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
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
* X509CERTEXT.CPP
sl@0
    16
*
sl@0
    17
*/
sl@0
    18
sl@0
    19
sl@0
    20
#include <s32strm.h>
sl@0
    21
#include <x509certext.h>
sl@0
    22
#include <asn1dec.h>
sl@0
    23
#include "x509bitstring.h"
sl@0
    24
sl@0
    25
void CX509ExtensionBase::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
    26
	{
sl@0
    27
	TASN1DecGeneric dec(aBinaryData.Right(aBinaryData.Length() - aPos));
sl@0
    28
	dec.InitL();
sl@0
    29
	if (dec.Tag() != EASN1OctetString)
sl@0
    30
		{
sl@0
    31
		User::Leave(KErrArgument);
sl@0
    32
		}
sl@0
    33
	TInt end = aPos + dec.LengthDER();
sl@0
    34
	aPos += dec.LengthDERHeader();//add on header for octet string here
sl@0
    35
//pass in binary data with aPos set to start of contents octets of octet string
sl@0
    36
//we cheat a little here; since we know an octet string is just the contents octets, 
sl@0
    37
//we just pass in a reference to the contents octets, and save alloc'ing the whole thang
sl@0
    38
	DoConstructL(aBinaryData, aPos);	
sl@0
    39
	if (aPos != end)
sl@0
    40
		{
sl@0
    41
		User::Leave(KErrArgument);
sl@0
    42
		}
sl@0
    43
	}
sl@0
    44
sl@0
    45
//1) basic constraints...
sl@0
    46
EXPORT_C CX509BasicConstraintsExt* CX509BasicConstraintsExt::NewL(const TDesC8& aBinaryData)
sl@0
    47
	{
sl@0
    48
	TInt pos = 0;
sl@0
    49
	return CX509BasicConstraintsExt::NewL(aBinaryData, pos);
sl@0
    50
	}
sl@0
    51
sl@0
    52
EXPORT_C CX509BasicConstraintsExt* CX509BasicConstraintsExt::NewLC(const TDesC8& aBinaryData)
sl@0
    53
	{
sl@0
    54
	TInt pos = 0;
sl@0
    55
	return CX509BasicConstraintsExt::NewLC(aBinaryData, pos);
sl@0
    56
	}
sl@0
    57
sl@0
    58
EXPORT_C CX509BasicConstraintsExt* CX509BasicConstraintsExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
    59
	{
sl@0
    60
	CX509BasicConstraintsExt* self = CX509BasicConstraintsExt::NewLC(aBinaryData, aPos);
sl@0
    61
	CleanupStack::Pop();
sl@0
    62
	return self;
sl@0
    63
	}
sl@0
    64
sl@0
    65
EXPORT_C CX509BasicConstraintsExt* CX509BasicConstraintsExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
sl@0
    66
	{
sl@0
    67
	CX509BasicConstraintsExt* self = new(ELeave) CX509BasicConstraintsExt;
sl@0
    68
	CleanupStack::PushL(self);
sl@0
    69
	self->ConstructL(aBinaryData, aPos);
sl@0
    70
	return self;
sl@0
    71
	}
sl@0
    72
sl@0
    73
void CX509BasicConstraintsExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
    74
	{
sl@0
    75
//sequence of 2 optional components, a bool and an int
sl@0
    76
	TASN1DecSequence encSeq;
sl@0
    77
	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos);
sl@0
    78
	TInt count = seq->Count();
sl@0
    79
	TInt pos = 0;
sl@0
    80
	if (pos < count)
sl@0
    81
		{
sl@0
    82
		TBool doneInt = EFalse;
sl@0
    83
		TASN1DecGeneric* curr = seq->At(pos);
sl@0
    84
		pos++;
sl@0
    85
		if (curr->Tag() == EASN1Boolean)
sl@0
    86
			{
sl@0
    87
			TASN1DecBoolean encBool;
sl@0
    88
			iIsCA = encBool.DecodeDERL(*curr);
sl@0
    89
			}
sl@0
    90
		else
sl@0
    91
			{
sl@0
    92
			TASN1DecInteger encInt;
sl@0
    93
			iMaxChainLen = encInt.DecodeDERShortL(*curr);
sl@0
    94
			doneInt = ETrue;
sl@0
    95
			}
sl@0
    96
		if (pos < count)
sl@0
    97
			{
sl@0
    98
			if (doneInt)
sl@0
    99
				{
sl@0
   100
				User::Leave(KErrArgument);
sl@0
   101
				}
sl@0
   102
			curr = seq->At(pos);
sl@0
   103
			pos++;
sl@0
   104
			TASN1DecInteger encInt;
sl@0
   105
			iMaxChainLen = encInt.DecodeDERShortL(*curr);
sl@0
   106
			if (iMaxChainLen < 0)
sl@0
   107
				{
sl@0
   108
				User::Leave(KErrArgument);
sl@0
   109
				}
sl@0
   110
			}
sl@0
   111
		}
sl@0
   112
	if (pos != count)
sl@0
   113
		{
sl@0
   114
		User::Leave(KErrArgument);
sl@0
   115
		}
sl@0
   116
	CleanupStack::PopAndDestroy();//seq
sl@0
   117
	}
sl@0
   118
sl@0
   119
CX509BasicConstraintsExt::CX509BasicConstraintsExt()
sl@0
   120
	:iIsCA(EFalse), iMaxChainLen(KMaxTInt)
sl@0
   121
	{
sl@0
   122
	}
sl@0
   123
sl@0
   124
CX509BasicConstraintsExt::~CX509BasicConstraintsExt()
sl@0
   125
	{
sl@0
   126
	}
sl@0
   127
sl@0
   128
EXPORT_C TBool CX509BasicConstraintsExt::IsCA() const
sl@0
   129
	{
sl@0
   130
	return iIsCA;
sl@0
   131
	}
sl@0
   132
sl@0
   133
EXPORT_C TInt CX509BasicConstraintsExt::MaxChainLength() const
sl@0
   134
	{
sl@0
   135
	return iMaxChainLen;
sl@0
   136
	}
sl@0
   137
	
sl@0
   138
//2) alt name
sl@0
   139
//#pragma message ("creating empty CX509AltNameExt and destroying it kills process")
sl@0
   140
EXPORT_C CX509AltNameExt* CX509AltNameExt::NewL(const TDesC8& aBinaryData)
sl@0
   141
	{
sl@0
   142
	TInt pos = 0;
sl@0
   143
	return CX509AltNameExt::NewL(aBinaryData, pos);
sl@0
   144
	}
sl@0
   145
sl@0
   146
EXPORT_C CX509AltNameExt* CX509AltNameExt::NewLC(const TDesC8& aBinaryData)
sl@0
   147
	{
sl@0
   148
	TInt pos = 0;
sl@0
   149
	return CX509AltNameExt::NewLC(aBinaryData, pos);
sl@0
   150
	}
sl@0
   151
sl@0
   152
EXPORT_C CX509AltNameExt* CX509AltNameExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   153
	{
sl@0
   154
	CX509AltNameExt* self = CX509AltNameExt::NewLC(aBinaryData, aPos);
sl@0
   155
	CleanupStack::Pop();
sl@0
   156
	return self;
sl@0
   157
	}
sl@0
   158
sl@0
   159
EXPORT_C CX509AltNameExt* CX509AltNameExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   160
	{
sl@0
   161
	CX509AltNameExt* self = new(ELeave) CX509AltNameExt;
sl@0
   162
	CleanupStack::PushL(self);
sl@0
   163
	self->ConstructL(aBinaryData, aPos);
sl@0
   164
	return self;
sl@0
   165
	}
sl@0
   166
sl@0
   167
void CX509AltNameExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   168
	{
sl@0
   169
	// The sequence should have at least 1 name here, previously this was checked
sl@0
   170
	// but now zero lengths sequences are tolerated.
sl@0
   171
	//
sl@0
   172
	// RFC 3280 requires that CAs ensure that the SubjectAltName is not empty if it exists. The 
sl@0
   173
	// behaviour of the client is undefined if this condition occurs. Since this code will 
sl@0
   174
	// normally be used as a client (i.e. not the CA) and there should be no need to validate 
sl@0
   175
	// the SubjectAltName we do not enfore a minimum sequence length.
sl@0
   176
	// This avoids TLS connections being dropped unecessarily.
sl@0
   177
sl@0
   178
	TASN1DecSequence encSeq;
sl@0
   179
	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos, 0, KMaxTInt);
sl@0
   180
	TInt count = seq->Count();
sl@0
   181
	iAuthorityName = new(ELeave) CArrayPtrFlat<CX509GeneralName> (1);
sl@0
   182
	TASN1DecGeneric* gen;
sl@0
   183
	for (TInt i = 0; i < count; i++)
sl@0
   184
		{
sl@0
   185
		gen = seq->At(i);
sl@0
   186
		CX509GeneralName* gn = CX509GeneralName::NewLC(gen->Encoding());
sl@0
   187
		iAuthorityName->AppendL(gn);
sl@0
   188
		CleanupStack::Pop();//gn
sl@0
   189
		}
sl@0
   190
	CleanupStack::PopAndDestroy();
sl@0
   191
	}
sl@0
   192
sl@0
   193
CX509AltNameExt::~CX509AltNameExt()
sl@0
   194
	{
sl@0
   195
	if (iAuthorityName != NULL)
sl@0
   196
		{
sl@0
   197
		iAuthorityName->ResetAndDestroy();
sl@0
   198
		delete iAuthorityName;
sl@0
   199
		}
sl@0
   200
	}
sl@0
   201
sl@0
   202
EXPORT_C const CArrayPtrFlat<CX509GeneralName>& CX509AltNameExt::AltName() const
sl@0
   203
	{
sl@0
   204
	return *iAuthorityName;
sl@0
   205
	}
sl@0
   206
sl@0
   207
EXPORT_C TBool CX509AltNameExt::Match(const CX509AltNameExt& aExt) const
sl@0
   208
	{
sl@0
   209
	TBool res = EFalse;
sl@0
   210
	const CArrayPtrFlat<CX509GeneralName>& otherGNs = aExt.AltName();
sl@0
   211
	TInt otherGNCount = otherGNs.Count();
sl@0
   212
	TInt thisGNCount = iAuthorityName->Count();
sl@0
   213
	if (otherGNCount != thisGNCount)
sl@0
   214
		{
sl@0
   215
		}
sl@0
   216
	else
sl@0
   217
		{
sl@0
   218
		res = ETrue;
sl@0
   219
		for (TInt j = 0; j < otherGNCount; j++)
sl@0
   220
				{
sl@0
   221
				const CX509GeneralName* otherGN = otherGNs.At(j);
sl@0
   222
				const CX509GeneralName* thisGN = iAuthorityName->At(j);
sl@0
   223
				if (!thisGN->ExactMatch(*otherGN))
sl@0
   224
					{
sl@0
   225
					res = EFalse;
sl@0
   226
					}
sl@0
   227
				}
sl@0
   228
		}
sl@0
   229
	return res;
sl@0
   230
	}
sl@0
   231
sl@0
   232
CX509AltNameExt::CX509AltNameExt()
sl@0
   233
	{
sl@0
   234
	}
sl@0
   235
sl@0
   236
//3) key usage
sl@0
   237
CX509BitString::~CX509BitString()
sl@0
   238
	{
sl@0
   239
	delete iData;
sl@0
   240
	}
sl@0
   241
sl@0
   242
TBool CX509BitString::IsSet(TInt aBit) const
sl@0
   243
	{
sl@0
   244
	if (aBit < iLength)//offset from zero
sl@0
   245
		{
sl@0
   246
		TPtrC8 d(iData->Des());
sl@0
   247
		TUint8 oct = d[(aBit/8)];
sl@0
   248
		TUint mask = (1 << (7-(aBit % 8)));
sl@0
   249
		return (oct & mask);
sl@0
   250
		}
sl@0
   251
	return EFalse;
sl@0
   252
	}
sl@0
   253
sl@0
   254
CX509BitString::CX509BitString(HBufC8* aData, TInt aLength)
sl@0
   255
	:iData(aData), iLength(aLength)
sl@0
   256
	{
sl@0
   257
	}
sl@0
   258
sl@0
   259
EXPORT_C CX509KeyUsageExt* CX509KeyUsageExt::NewL(const TDesC8& aBinaryData)
sl@0
   260
	{
sl@0
   261
	TInt pos = 0;
sl@0
   262
	return CX509KeyUsageExt::NewL(aBinaryData, pos);
sl@0
   263
	}
sl@0
   264
sl@0
   265
EXPORT_C CX509KeyUsageExt* CX509KeyUsageExt::NewLC(const TDesC8& aBinaryData)
sl@0
   266
	{
sl@0
   267
	TInt pos = 0;
sl@0
   268
	return CX509KeyUsageExt::NewLC(aBinaryData, pos);
sl@0
   269
	}
sl@0
   270
sl@0
   271
EXPORT_C CX509KeyUsageExt* CX509KeyUsageExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   272
	{
sl@0
   273
	CX509KeyUsageExt* self = CX509KeyUsageExt::NewLC(aBinaryData, aPos);
sl@0
   274
	CleanupStack::Pop();
sl@0
   275
	return self;
sl@0
   276
	}
sl@0
   277
sl@0
   278
EXPORT_C CX509KeyUsageExt* CX509KeyUsageExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   279
	{
sl@0
   280
	CX509KeyUsageExt* self = new(ELeave) CX509KeyUsageExt;
sl@0
   281
	CleanupStack::PushL(self);
sl@0
   282
	self->ConstructL(aBinaryData, aPos);
sl@0
   283
	return self;
sl@0
   284
	}
sl@0
   285
sl@0
   286
void CX509KeyUsageExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   287
	{
sl@0
   288
	TASN1DecGeneric gen(aBinaryData.Right(aBinaryData.Length() - aPos));
sl@0
   289
	gen.InitL();
sl@0
   290
	if (gen.Tag() != EASN1BitString)
sl@0
   291
		{
sl@0
   292
		User::Leave(KErrArgument);
sl@0
   293
		}
sl@0
   294
	TPtrC8 p(gen.GetContentDER());
sl@0
   295
	if (p.Length() < 2)
sl@0
   296
		{
sl@0
   297
		User::Leave(KErrArgument);
sl@0
   298
		}
sl@0
   299
	TPtrC8 pData(p.Right(p.Length() - 1));
sl@0
   300
	TInt paddingLength = p[0];
sl@0
   301
	TInt bitStringLength = (pData.Length() * 8) - paddingLength;
sl@0
   302
	HBufC8* bitString = pData.AllocL();
sl@0
   303
	CleanupStack::PushL(bitString);
sl@0
   304
	iData = new(ELeave) CX509BitString(bitString, bitStringLength);
sl@0
   305
	CleanupStack::Pop();//bitstring
sl@0
   306
	aPos += gen.LengthDER();
sl@0
   307
	}
sl@0
   308
sl@0
   309
CX509KeyUsageExt::CX509KeyUsageExt()
sl@0
   310
	{
sl@0
   311
	}
sl@0
   312
sl@0
   313
CX509KeyUsageExt::~CX509KeyUsageExt()
sl@0
   314
	{
sl@0
   315
	delete iData;
sl@0
   316
	}
sl@0
   317
sl@0
   318
EXPORT_C TBool CX509KeyUsageExt::IsSet(TX509KeyUsage aUsage) const
sl@0
   319
	{
sl@0
   320
	return iData->IsSet(aUsage);
sl@0
   321
	}
sl@0
   322
sl@0
   323
//4) name constraints
sl@0
   324
CX509GeneralSubtree* CX509GeneralSubtree::NewL(const TDesC8& aBinaryData)
sl@0
   325
	{
sl@0
   326
	TInt pos = 0;
sl@0
   327
	return CX509GeneralSubtree::NewL(aBinaryData, pos);
sl@0
   328
	}
sl@0
   329
sl@0
   330
CX509GeneralSubtree* CX509GeneralSubtree::NewLC(const TDesC8& aBinaryData)
sl@0
   331
	{
sl@0
   332
	TInt pos = 0;
sl@0
   333
	return CX509GeneralSubtree::NewLC(aBinaryData, pos);
sl@0
   334
	}
sl@0
   335
sl@0
   336
CX509GeneralSubtree* CX509GeneralSubtree::NewL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   337
	{
sl@0
   338
	CX509GeneralSubtree* self = CX509GeneralSubtree::NewLC(aBinaryData, aPos);
sl@0
   339
	CleanupStack::Pop();
sl@0
   340
	return self;
sl@0
   341
	}
sl@0
   342
sl@0
   343
CX509GeneralSubtree* CX509GeneralSubtree::NewLC(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   344
	{
sl@0
   345
	CX509GeneralSubtree* self = new(ELeave) CX509GeneralSubtree;
sl@0
   346
	CleanupStack::PushL(self);
sl@0
   347
	self->ConstructL(aBinaryData, aPos);
sl@0
   348
	return self;
sl@0
   349
	}
sl@0
   350
sl@0
   351
void CX509GeneralSubtree::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   352
	{
sl@0
   353
	TASN1DecSequence encSeq;
sl@0
   354
	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos, 1, KMaxTInt);//(seq here must have at least 1 name)
sl@0
   355
	TInt count = seq->Count();
sl@0
   356
	TInt pos = 0;
sl@0
   357
	TASN1DecGeneric* curr = seq->At(pos);
sl@0
   358
	pos++;
sl@0
   359
	iName = CX509GeneralName::NewL(curr->Encoding());
sl@0
   360
	if (pos < count)
sl@0
   361
		{
sl@0
   362
		TBool doneMax = EFalse;
sl@0
   363
		curr = seq->At(pos);
sl@0
   364
		pos++;
sl@0
   365
		if (curr->Class() != EContextSpecific)
sl@0
   366
				{
sl@0
   367
				User::Leave(KErrArgument);
sl@0
   368
				}
sl@0
   369
			switch(curr->Tag())
sl@0
   370
				{
sl@0
   371
				case 0:
sl@0
   372
					{
sl@0
   373
					TASN1DecInteger encInt;
sl@0
   374
					iMinDist = encInt.DecodeDERShortL(*curr);
sl@0
   375
					break;
sl@0
   376
					}
sl@0
   377
				case 1:
sl@0
   378
					{
sl@0
   379
					TASN1DecInteger encInt;
sl@0
   380
					iMaxDist = encInt.DecodeDERShortL(*curr);
sl@0
   381
					doneMax = ETrue;
sl@0
   382
					break;
sl@0
   383
					}
sl@0
   384
				}
sl@0
   385
			if (pos < count)
sl@0
   386
				{
sl@0
   387
				curr = seq->At(pos);
sl@0
   388
				if ((doneMax) || (curr->Class() != EContextSpecific) || (curr->Tag() != 1))
sl@0
   389
					{
sl@0
   390
					User::Leave(KErrArgument);
sl@0
   391
					}
sl@0
   392
				TASN1DecInteger encInt;
sl@0
   393
				iMaxDist = encInt.DecodeDERShortL(*curr);
sl@0
   394
				}
sl@0
   395
		}
sl@0
   396
	if (pos != count)
sl@0
   397
		{
sl@0
   398
		User::Leave(KErrArgument);
sl@0
   399
		}
sl@0
   400
	CleanupStack::PopAndDestroy();
sl@0
   401
	}
sl@0
   402
sl@0
   403
CX509GeneralSubtree::~CX509GeneralSubtree()
sl@0
   404
	{
sl@0
   405
	delete iName;
sl@0
   406
	}
sl@0
   407
sl@0
   408
EXPORT_C const CX509GeneralName& CX509GeneralSubtree::Name() const
sl@0
   409
	{
sl@0
   410
	return *iName;
sl@0
   411
	}
sl@0
   412
sl@0
   413
EXPORT_C TInt CX509GeneralSubtree::MinDistance() const
sl@0
   414
	{
sl@0
   415
	return iMinDist;
sl@0
   416
	}
sl@0
   417
sl@0
   418
EXPORT_C TInt CX509GeneralSubtree::MaxDistance() const
sl@0
   419
	{
sl@0
   420
	return iMaxDist;
sl@0
   421
	}
sl@0
   422
sl@0
   423
CX509GeneralSubtree::CX509GeneralSubtree()
sl@0
   424
	:iMaxDist(KMaxTInt), iMinDist(0)
sl@0
   425
	{
sl@0
   426
	}
sl@0
   427
sl@0
   428
//
sl@0
   429
EXPORT_C CX509NameConstraintsExt* CX509NameConstraintsExt::NewL(const TDesC8& aBinaryData)
sl@0
   430
	{
sl@0
   431
	TInt pos = 0;
sl@0
   432
	return CX509NameConstraintsExt::NewL(aBinaryData, pos);
sl@0
   433
	}
sl@0
   434
sl@0
   435
EXPORT_C CX509NameConstraintsExt* CX509NameConstraintsExt::NewLC(const TDesC8& aBinaryData)
sl@0
   436
	{
sl@0
   437
	TInt pos = 0;
sl@0
   438
	return CX509NameConstraintsExt::NewLC(aBinaryData, pos);
sl@0
   439
	}
sl@0
   440
sl@0
   441
EXPORT_C CX509NameConstraintsExt* CX509NameConstraintsExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   442
	{
sl@0
   443
	CX509NameConstraintsExt* self = CX509NameConstraintsExt::NewLC(aBinaryData, aPos);
sl@0
   444
	CleanupStack::Pop();
sl@0
   445
	return self;
sl@0
   446
	}
sl@0
   447
sl@0
   448
EXPORT_C CX509NameConstraintsExt* CX509NameConstraintsExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   449
	{
sl@0
   450
	CX509NameConstraintsExt* self = new(ELeave) CX509NameConstraintsExt;
sl@0
   451
	CleanupStack::PushL(self);
sl@0
   452
	self->ConstructL(aBinaryData, aPos);
sl@0
   453
	return self;
sl@0
   454
	}
sl@0
   455
sl@0
   456
void CX509NameConstraintsExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   457
	{
sl@0
   458
	TASN1DecSequence encSeq;
sl@0
   459
	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos);
sl@0
   460
	TInt count = seq->Count();
sl@0
   461
	TInt pos = 0;
sl@0
   462
sl@0
   463
	iExcludedSubtrees = new(ELeave) CArrayPtrFlat<CX509GeneralSubtree> (1);
sl@0
   464
	iPermittedSubtrees = new(ELeave) CArrayPtrFlat<CX509GeneralSubtree> (1);
sl@0
   465
	TBool doneExcluded = EFalse;
sl@0
   466
	
sl@0
   467
	if (pos < count)
sl@0
   468
		{
sl@0
   469
		TASN1DecGeneric* curr = seq->At(pos);
sl@0
   470
		pos++;
sl@0
   471
		if (curr->Class() != EContextSpecific)
sl@0
   472
			{
sl@0
   473
			User::Leave(KErrArgument);
sl@0
   474
			}
sl@0
   475
		switch (curr->Tag())
sl@0
   476
			{
sl@0
   477
			case 0:
sl@0
   478
				{
sl@0
   479
				AddSubtreesL(*iPermittedSubtrees, curr->Encoding());
sl@0
   480
				break;
sl@0
   481
				}
sl@0
   482
			case 1:
sl@0
   483
				{
sl@0
   484
				AddSubtreesL(*iExcludedSubtrees, curr->Encoding());
sl@0
   485
				doneExcluded = ETrue;
sl@0
   486
				break;
sl@0
   487
				}
sl@0
   488
			default:
sl@0
   489
				{
sl@0
   490
				User::Leave(KErrArgument);
sl@0
   491
				}
sl@0
   492
			}
sl@0
   493
		if (pos < count)
sl@0
   494
			{
sl@0
   495
			curr = seq->At(pos);
sl@0
   496
			pos++;
sl@0
   497
			if ((curr->Class() != EContextSpecific) || (curr->Tag() != 1) || (doneExcluded))
sl@0
   498
				{
sl@0
   499
				User::Leave(KErrArgument);
sl@0
   500
				}
sl@0
   501
			AddSubtreesL(*iExcludedSubtrees, curr->Encoding());
sl@0
   502
			}
sl@0
   503
		}
sl@0
   504
	CleanupStack::PopAndDestroy();//seq
sl@0
   505
	}
sl@0
   506
sl@0
   507
void CX509NameConstraintsExt::AddSubtreesL(	CArrayPtrFlat<CX509GeneralSubtree>& aSubtrees,
sl@0
   508
											const TDesC8& aBinaryData)
sl@0
   509
	{
sl@0
   510
	TASN1DecSequence encSeq;
sl@0
   511
	TInt pos = 0;
sl@0
   512
	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, pos, 1, KMaxTInt);
sl@0
   513
	TInt count = seq->Count();
sl@0
   514
	TASN1DecGeneric* gen;
sl@0
   515
	for(TInt i = 0; i < count; i++)
sl@0
   516
		{
sl@0
   517
		gen = seq->At(i);
sl@0
   518
		CX509GeneralSubtree* subtree = CX509GeneralSubtree::NewLC(gen->Encoding());
sl@0
   519
		aSubtrees.AppendL(subtree);
sl@0
   520
		CleanupStack::Pop();
sl@0
   521
		}
sl@0
   522
	CleanupStack::PopAndDestroy();
sl@0
   523
	}
sl@0
   524
sl@0
   525
EXPORT_C CX509NameConstraintsExt::~CX509NameConstraintsExt()
sl@0
   526
	{
sl@0
   527
	if (iExcludedSubtrees != NULL)
sl@0
   528
		{
sl@0
   529
		iExcludedSubtrees->ResetAndDestroy();
sl@0
   530
		delete iExcludedSubtrees;
sl@0
   531
		}
sl@0
   532
	if (iPermittedSubtrees != NULL)
sl@0
   533
		{
sl@0
   534
		iPermittedSubtrees->ResetAndDestroy();
sl@0
   535
		delete iPermittedSubtrees;
sl@0
   536
		}
sl@0
   537
	}
sl@0
   538
sl@0
   539
EXPORT_C const CArrayPtrFlat<CX509GeneralSubtree>& CX509NameConstraintsExt::ExcludedSubtrees() const
sl@0
   540
	{
sl@0
   541
	return *iExcludedSubtrees;
sl@0
   542
	}
sl@0
   543
sl@0
   544
EXPORT_C const CArrayPtrFlat<CX509GeneralSubtree>& CX509NameConstraintsExt::PermittedSubtrees() const
sl@0
   545
	{
sl@0
   546
	return *iPermittedSubtrees;
sl@0
   547
	}
sl@0
   548
sl@0
   549
CX509NameConstraintsExt::CX509NameConstraintsExt()
sl@0
   550
	{
sl@0
   551
	}
sl@0
   552
sl@0
   553
//5) policy constraints
sl@0
   554
TX509PolicyConstraint::TX509PolicyConstraint(TBool aRequired, TInt aCountdown)
sl@0
   555
	:iRequired(aRequired), iCountdown(aCountdown)
sl@0
   556
	{
sl@0
   557
	}
sl@0
   558
sl@0
   559
TX509PolicyConstraint::TX509PolicyConstraint()
sl@0
   560
	:iRequired(EFalse), iCountdown(0)
sl@0
   561
	{
sl@0
   562
	}
sl@0
   563
sl@0
   564
//
sl@0
   565
EXPORT_C CX509PolicyConstraintsExt* CX509PolicyConstraintsExt::NewL(const TDesC8& aBinaryData)
sl@0
   566
	{
sl@0
   567
	TInt pos = 0;
sl@0
   568
	return CX509PolicyConstraintsExt::NewL(aBinaryData, pos);
sl@0
   569
	}
sl@0
   570
sl@0
   571
EXPORT_C CX509PolicyConstraintsExt* CX509PolicyConstraintsExt::NewLC(const TDesC8& aBinaryData)
sl@0
   572
	{
sl@0
   573
	TInt pos = 0;
sl@0
   574
	return CX509PolicyConstraintsExt::NewLC(aBinaryData, pos);
sl@0
   575
	}
sl@0
   576
sl@0
   577
EXPORT_C CX509PolicyConstraintsExt* CX509PolicyConstraintsExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   578
	{
sl@0
   579
	CX509PolicyConstraintsExt* self = CX509PolicyConstraintsExt::NewLC(aBinaryData, aPos);
sl@0
   580
	CleanupStack::Pop();
sl@0
   581
	return self;
sl@0
   582
	}
sl@0
   583
sl@0
   584
EXPORT_C CX509PolicyConstraintsExt* CX509PolicyConstraintsExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   585
	{
sl@0
   586
	CX509PolicyConstraintsExt* self = new(ELeave) CX509PolicyConstraintsExt;
sl@0
   587
	CleanupStack::PushL(self);
sl@0
   588
	self->ConstructL(aBinaryData, aPos);
sl@0
   589
	return self;
sl@0
   590
	}
sl@0
   591
sl@0
   592
void CX509PolicyConstraintsExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   593
	{
sl@0
   594
	TASN1DecSequence encSeq;
sl@0
   595
	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos);
sl@0
   596
	TInt count = seq->Count();
sl@0
   597
	TInt pos = 0;
sl@0
   598
	TASN1DecGeneric* curr;
sl@0
   599
	if (pos < count)
sl@0
   600
		{
sl@0
   601
		curr = seq->At(pos);
sl@0
   602
		pos++;
sl@0
   603
		if (curr->Class() != EContextSpecific)
sl@0
   604
			{
sl@0
   605
			User::Leave(KErrArgument);
sl@0
   606
			}
sl@0
   607
		switch (curr->Tag())
sl@0
   608
			{
sl@0
   609
			case 0:
sl@0
   610
				{
sl@0
   611
				iRequirePolicy.iRequired = ETrue;
sl@0
   612
				TASN1DecInteger encInt;
sl@0
   613
				iRequirePolicy.iCountdown = encInt.DecodeDERShortL(*curr);
sl@0
   614
				break;
sl@0
   615
				}
sl@0
   616
			case 1:
sl@0
   617
				{
sl@0
   618
				iInhibitPolicyMapping.iRequired = ETrue;
sl@0
   619
				TASN1DecInteger encInt;
sl@0
   620
				iInhibitPolicyMapping.iCountdown = encInt.DecodeDERShortL(*curr);
sl@0
   621
				break;
sl@0
   622
				}
sl@0
   623
			default:
sl@0
   624
				{
sl@0
   625
				User::Leave(KErrArgument);
sl@0
   626
				}
sl@0
   627
			}
sl@0
   628
		if(pos < count)
sl@0
   629
			{
sl@0
   630
			curr = seq->At(pos);
sl@0
   631
			pos++;
sl@0
   632
			if ((iInhibitPolicyMapping.iRequired) || (curr->Class() != EContextSpecific) || (curr->Tag() != 1))
sl@0
   633
				{
sl@0
   634
				User::Leave(KErrArgument);
sl@0
   635
				}
sl@0
   636
			iInhibitPolicyMapping.iRequired = ETrue;
sl@0
   637
			TASN1DecInteger encInt;
sl@0
   638
			iInhibitPolicyMapping.iCountdown = encInt.DecodeDERShortL(*curr);
sl@0
   639
			}
sl@0
   640
		}
sl@0
   641
	if (pos != count)
sl@0
   642
		{
sl@0
   643
		User::Leave(KErrArgument);
sl@0
   644
		}
sl@0
   645
	CleanupStack::PopAndDestroy();
sl@0
   646
	}
sl@0
   647
sl@0
   648
CX509PolicyConstraintsExt::CX509PolicyConstraintsExt()
sl@0
   649
	{
sl@0
   650
	}
sl@0
   651
sl@0
   652
EXPORT_C CX509PolicyConstraintsExt::~CX509PolicyConstraintsExt()
sl@0
   653
	{
sl@0
   654
	}
sl@0
   655
sl@0
   656
EXPORT_C TX509PolicyConstraint CX509PolicyConstraintsExt::ExplicitPolicyRequired() const
sl@0
   657
	{
sl@0
   658
	return iRequirePolicy;
sl@0
   659
	}
sl@0
   660
sl@0
   661
EXPORT_C TX509PolicyConstraint CX509PolicyConstraintsExt::InhibitPolicyMapping() const
sl@0
   662
	{
sl@0
   663
	return iInhibitPolicyMapping;
sl@0
   664
	}
sl@0
   665
sl@0
   666
//6) policies
sl@0
   667
CX509PolicyQualifierInfo* CX509PolicyQualifierInfo::NewL(const TDesC8& aBinaryData)
sl@0
   668
	{
sl@0
   669
	TInt pos = 0;
sl@0
   670
	return CX509PolicyQualifierInfo::NewL(aBinaryData, pos);
sl@0
   671
	}
sl@0
   672
sl@0
   673
CX509PolicyQualifierInfo* CX509PolicyQualifierInfo::NewLC(const TDesC8& aBinaryData)
sl@0
   674
	{
sl@0
   675
	TInt pos = 0;
sl@0
   676
	return CX509PolicyQualifierInfo::NewLC(aBinaryData, pos);
sl@0
   677
	}
sl@0
   678
sl@0
   679
CX509PolicyQualifierInfo* CX509PolicyQualifierInfo::NewL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   680
	{
sl@0
   681
	CX509PolicyQualifierInfo* self = CX509PolicyQualifierInfo::NewLC(aBinaryData, aPos);
sl@0
   682
	CleanupStack::Pop();
sl@0
   683
	return self;
sl@0
   684
	}
sl@0
   685
sl@0
   686
CX509PolicyQualifierInfo* CX509PolicyQualifierInfo::NewLC(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   687
	{
sl@0
   688
	CX509PolicyQualifierInfo* self = new(ELeave) CX509PolicyQualifierInfo;
sl@0
   689
	CleanupStack::PushL(self);
sl@0
   690
	self->ConstructL(aBinaryData, aPos);
sl@0
   691
	return self;
sl@0
   692
	}
sl@0
   693
sl@0
   694
CX509PolicyQualifierInfo* CX509PolicyQualifierInfo::NewL(const CX509PolicyQualifierInfo& aQualifier)
sl@0
   695
	{
sl@0
   696
	CX509PolicyQualifierInfo* self = CX509PolicyQualifierInfo::NewLC(aQualifier);
sl@0
   697
	CleanupStack::Pop();//self
sl@0
   698
	return self;
sl@0
   699
	}
sl@0
   700
sl@0
   701
CX509PolicyQualifierInfo* CX509PolicyQualifierInfo::NewLC(const CX509PolicyQualifierInfo& aQualifier)
sl@0
   702
	{
sl@0
   703
	CX509PolicyQualifierInfo* self = new(ELeave) CX509PolicyQualifierInfo;
sl@0
   704
	CleanupStack::PushL(self);
sl@0
   705
	self->ConstructL(aQualifier);
sl@0
   706
	return self;
sl@0
   707
	}
sl@0
   708
sl@0
   709
CX509PolicyQualifierInfo* CX509PolicyQualifierInfo::NewL(RReadStream& aStream)
sl@0
   710
	{
sl@0
   711
	CX509PolicyQualifierInfo* self = CX509PolicyQualifierInfo::NewLC(aStream);
sl@0
   712
	CleanupStack::Pop();
sl@0
   713
	return self;
sl@0
   714
	}
sl@0
   715
sl@0
   716
CX509PolicyQualifierInfo* CX509PolicyQualifierInfo::NewLC(RReadStream& aStream)
sl@0
   717
	{
sl@0
   718
	CX509PolicyQualifierInfo* self = new(ELeave) CX509PolicyQualifierInfo();
sl@0
   719
	CleanupStack::PushL(self);
sl@0
   720
	self->ConstructL(aStream);
sl@0
   721
	return self;
sl@0
   722
	}
sl@0
   723
sl@0
   724
void CX509PolicyQualifierInfo::ConstructL(RReadStream& aStream)
sl@0
   725
	{
sl@0
   726
	InternalizeL(aStream);
sl@0
   727
	}
sl@0
   728
sl@0
   729
void CX509PolicyQualifierInfo::ConstructL(const CX509PolicyQualifierInfo& aQualifier)
sl@0
   730
	{
sl@0
   731
	iPolicyQualifierId = aQualifier.iPolicyQualifierId->Des().AllocL();//must be a better way to do this!!
sl@0
   732
	iData = aQualifier.iData->Des().AllocL();//must be a better way to do this!!
sl@0
   733
	}
sl@0
   734
sl@0
   735
void CX509PolicyQualifierInfo::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   736
	{
sl@0
   737
	TASN1DecSequence encSeq;
sl@0
   738
	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos, 1, KMaxTInt);
sl@0
   739
	TInt count = seq->Count();
sl@0
   740
	TInt pos = 0;
sl@0
   741
	TASN1DecGeneric* curr = seq->At(pos);
sl@0
   742
	pos++;
sl@0
   743
	TASN1DecObjectIdentifier encOID;
sl@0
   744
	iPolicyQualifierId = encOID.DecodeDERL(*curr);
sl@0
   745
	if (pos < count)
sl@0
   746
		{
sl@0
   747
		iData = curr->Encoding().AllocL();
sl@0
   748
		pos++;
sl@0
   749
		}
sl@0
   750
	else
sl@0
   751
		{
sl@0
   752
		iData = HBufC8::NewL(1);
sl@0
   753
		*iData = KNullDesC8;
sl@0
   754
		}
sl@0
   755
	if (pos != count)
sl@0
   756
		{
sl@0
   757
		User::Leave(KErrArgument);
sl@0
   758
		}
sl@0
   759
	CleanupStack::PopAndDestroy();
sl@0
   760
	}
sl@0
   761
sl@0
   762
CX509PolicyQualifierInfo::CX509PolicyQualifierInfo()
sl@0
   763
	{
sl@0
   764
	}
sl@0
   765
sl@0
   766
CX509PolicyQualifierInfo::~CX509PolicyQualifierInfo()
sl@0
   767
	{
sl@0
   768
	delete iPolicyQualifierId;
sl@0
   769
	delete iData;
sl@0
   770
	}
sl@0
   771
sl@0
   772
EXPORT_C TPtrC CX509PolicyQualifierInfo::Id() const
sl@0
   773
	{
sl@0
   774
	return iPolicyQualifierId->Des();
sl@0
   775
	}
sl@0
   776
sl@0
   777
EXPORT_C TPtrC8 CX509PolicyQualifierInfo::Data() const
sl@0
   778
	{
sl@0
   779
	return iData->Des();
sl@0
   780
	}
sl@0
   781
sl@0
   782
void CX509PolicyQualifierInfo::ExternalizeL(RWriteStream& aStream) const
sl@0
   783
	{
sl@0
   784
	//iPolicyQualifierId
sl@0
   785
	aStream << *iPolicyQualifierId;
sl@0
   786
sl@0
   787
	//iData
sl@0
   788
	aStream << *iData;
sl@0
   789
	}
sl@0
   790
sl@0
   791
void CX509PolicyQualifierInfo::InternalizeL(RReadStream& aStream)
sl@0
   792
	{
sl@0
   793
	//iPolicyQualifierId
sl@0
   794
	delete iPolicyQualifierId;
sl@0
   795
	iPolicyQualifierId=0;
sl@0
   796
	iPolicyQualifierId=HBufC::NewL(aStream, KMaxTInt);
sl@0
   797
sl@0
   798
	//iData
sl@0
   799
	delete iData;
sl@0
   800
	iData=0;
sl@0
   801
	iData=HBufC8::NewL(aStream, KMaxTInt);
sl@0
   802
	}
sl@0
   803
sl@0
   804
sl@0
   805
CX509CertPolicyInfo* CX509CertPolicyInfo::NewL(const TDesC8& aBinaryData)
sl@0
   806
	{
sl@0
   807
	TInt pos = 0;
sl@0
   808
	return CX509CertPolicyInfo::NewL(aBinaryData, pos);
sl@0
   809
	}
sl@0
   810
sl@0
   811
CX509CertPolicyInfo* CX509CertPolicyInfo::NewLC(const TDesC8& aBinaryData)
sl@0
   812
	{
sl@0
   813
	TInt pos = 0;
sl@0
   814
	return CX509CertPolicyInfo::NewLC(aBinaryData, pos);
sl@0
   815
	}
sl@0
   816
sl@0
   817
CX509CertPolicyInfo* CX509CertPolicyInfo::NewL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   818
	{
sl@0
   819
	CX509CertPolicyInfo* self = CX509CertPolicyInfo::NewLC(aBinaryData, aPos);
sl@0
   820
	CleanupStack::Pop();
sl@0
   821
	return self;
sl@0
   822
	}
sl@0
   823
sl@0
   824
CX509CertPolicyInfo* CX509CertPolicyInfo::NewLC(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   825
	{
sl@0
   826
	CX509CertPolicyInfo* self = new(ELeave) CX509CertPolicyInfo;
sl@0
   827
	CleanupStack::PushL(self);
sl@0
   828
	self->ConstructL(aBinaryData, aPos);
sl@0
   829
	return self;
sl@0
   830
	}
sl@0
   831
sl@0
   832
sl@0
   833
EXPORT_C CX509CertPolicyInfo* CX509CertPolicyInfo::NewL(RReadStream& aStream)
sl@0
   834
	{
sl@0
   835
	CX509CertPolicyInfo* self = CX509CertPolicyInfo::NewLC(aStream);
sl@0
   836
	CleanupStack::Pop();
sl@0
   837
	return self;
sl@0
   838
	}
sl@0
   839
 
sl@0
   840
EXPORT_C CX509CertPolicyInfo* CX509CertPolicyInfo::NewLC(RReadStream& aStream)
sl@0
   841
	{
sl@0
   842
	CX509CertPolicyInfo* self = new(ELeave) CX509CertPolicyInfo();
sl@0
   843
	CleanupStack::PushL(self);
sl@0
   844
	self->ConstructL(aStream);
sl@0
   845
	return self;
sl@0
   846
	}
sl@0
   847
sl@0
   848
EXPORT_C CX509CertPolicyInfo* CX509CertPolicyInfo::NewL(const CX509CertPolicyInfo& aInfo)
sl@0
   849
	{
sl@0
   850
	CX509CertPolicyInfo* self = CX509CertPolicyInfo::NewLC(aInfo);
sl@0
   851
	CleanupStack::Pop();//self
sl@0
   852
	return self;
sl@0
   853
	}
sl@0
   854
sl@0
   855
EXPORT_C CX509CertPolicyInfo* CX509CertPolicyInfo::NewLC(const CX509CertPolicyInfo& aInfo)
sl@0
   856
	{
sl@0
   857
	CX509CertPolicyInfo* self = new(ELeave) CX509CertPolicyInfo;
sl@0
   858
	CleanupStack::PushL(self);
sl@0
   859
	self->ConstructL(aInfo);
sl@0
   860
	return self;
sl@0
   861
	}
sl@0
   862
sl@0
   863
void CX509CertPolicyInfo::ConstructL(RReadStream& aStream)
sl@0
   864
	{
sl@0
   865
	InternalizeL(aStream);
sl@0
   866
	}
sl@0
   867
sl@0
   868
void CX509CertPolicyInfo::ConstructL(const CX509CertPolicyInfo& aInfo)
sl@0
   869
	{
sl@0
   870
	iCertPolicyId = aInfo.iCertPolicyId->Des().AllocL();//must be a better way to do this!!
sl@0
   871
	iQualifiers = new(ELeave) CArrayPtrFlat<CX509PolicyQualifierInfo> (1);
sl@0
   872
	TInt count = aInfo.iQualifiers->Count();
sl@0
   873
	for (TInt i = 0; i < count; i++)
sl@0
   874
		{
sl@0
   875
		CX509PolicyQualifierInfo* q = CX509PolicyQualifierInfo::NewLC(*(aInfo.iQualifiers->At(i)));
sl@0
   876
		iQualifiers->AppendL(q);
sl@0
   877
		CleanupStack::Pop();//q
sl@0
   878
		}
sl@0
   879
	}
sl@0
   880
sl@0
   881
void CX509CertPolicyInfo::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   882
	{
sl@0
   883
	TASN1DecSequence encSeq;
sl@0
   884
	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos, 1, KMaxTInt);
sl@0
   885
	TInt count = seq->Count();
sl@0
   886
	TInt pos = 0;
sl@0
   887
	TASN1DecGeneric* curr = seq->At(pos);
sl@0
   888
	pos++;
sl@0
   889
sl@0
   890
	TASN1DecObjectIdentifier encOID;
sl@0
   891
	iCertPolicyId = encOID.DecodeDERL(*curr);
sl@0
   892
	iQualifiers = new(ELeave) CArrayPtrFlat<CX509PolicyQualifierInfo> (1);
sl@0
   893
	if (pos < count)
sl@0
   894
		{
sl@0
   895
		curr = seq->At(pos);
sl@0
   896
		pos++;
sl@0
   897
		TASN1DecSequence encSeqQualifier;
sl@0
   898
		CArrayPtrFlat<TASN1DecGeneric>* seqQualifier = encSeqQualifier.DecodeDERLC(*curr);
sl@0
   899
		TInt qCount = seqQualifier->Count();
sl@0
   900
		for(TInt i = 0; i < qCount; i++)
sl@0
   901
			{
sl@0
   902
			TASN1DecGeneric* qGen = seqQualifier->At(i);
sl@0
   903
			CX509PolicyQualifierInfo* qualifier = CX509PolicyQualifierInfo::NewLC(qGen->Encoding());
sl@0
   904
			iQualifiers->AppendL(qualifier);
sl@0
   905
			CleanupStack::Pop();//qualifier
sl@0
   906
			}
sl@0
   907
		CleanupStack::PopAndDestroy();
sl@0
   908
		}
sl@0
   909
	if (pos != count)
sl@0
   910
		{
sl@0
   911
		User::Leave(KErrArgument);
sl@0
   912
		}
sl@0
   913
	CleanupStack::PopAndDestroy();
sl@0
   914
	}
sl@0
   915
sl@0
   916
CX509CertPolicyInfo::~CX509CertPolicyInfo()
sl@0
   917
	{
sl@0
   918
	if (iQualifiers != NULL)
sl@0
   919
		{
sl@0
   920
		iQualifiers->ResetAndDestroy();
sl@0
   921
		delete iQualifiers;
sl@0
   922
		}
sl@0
   923
	delete iCertPolicyId;
sl@0
   924
	}
sl@0
   925
sl@0
   926
EXPORT_C const CArrayPtrFlat<CX509PolicyQualifierInfo>& CX509CertPolicyInfo::Qualifiers() const
sl@0
   927
	{
sl@0
   928
	return *iQualifiers;
sl@0
   929
	}
sl@0
   930
sl@0
   931
EXPORT_C TPtrC CX509CertPolicyInfo::Id() const
sl@0
   932
	{
sl@0
   933
	return iCertPolicyId->Des();
sl@0
   934
	}
sl@0
   935
sl@0
   936
CX509CertPolicyInfo::CX509CertPolicyInfo()
sl@0
   937
	{
sl@0
   938
	}
sl@0
   939
sl@0
   940
EXPORT_C void CX509CertPolicyInfo::ExternalizeL(RWriteStream& aStream) const
sl@0
   941
	{
sl@0
   942
	//iCertPolicyId
sl@0
   943
 	aStream << *iCertPolicyId;
sl@0
   944
sl@0
   945
 	// iQualifiers
sl@0
   946
	aStream.WriteInt32L(iQualifiers->Count());
sl@0
   947
	for (TInt32 i=0;i < iQualifiers->Count(); ++i)
sl@0
   948
		{
sl@0
   949
		(*iQualifiers)[i]->ExternalizeL(aStream);
sl@0
   950
		}
sl@0
   951
	}
sl@0
   952
sl@0
   953
EXPORT_C void CX509CertPolicyInfo::InternalizeL(RReadStream& aStream)
sl@0
   954
	{
sl@0
   955
	//iCertPolicyId
sl@0
   956
	delete iCertPolicyId;
sl@0
   957
	iCertPolicyId=0;
sl@0
   958
	iCertPolicyId=HBufC::NewL(aStream, KMaxTInt);
sl@0
   959
sl@0
   960
	// iQualifiers
sl@0
   961
	if (iQualifiers != NULL)
sl@0
   962
		{
sl@0
   963
		iQualifiers->ResetAndDestroy();
sl@0
   964
		}
sl@0
   965
	else
sl@0
   966
		{
sl@0
   967
		iQualifiers = new(ELeave) CArrayPtrFlat<CX509PolicyQualifierInfo> (1);
sl@0
   968
		}
sl@0
   969
sl@0
   970
	TInt32 count=aStream.ReadInt32L();
sl@0
   971
	for (TInt32 i=0;i < count; ++i)
sl@0
   972
		{
sl@0
   973
		CX509PolicyQualifierInfo* policyQualifierInfo=CX509PolicyQualifierInfo::NewLC(aStream);
sl@0
   974
		iQualifiers->AppendL(policyQualifierInfo);
sl@0
   975
		CleanupStack::Pop(policyQualifierInfo);
sl@0
   976
		}
sl@0
   977
	}
sl@0
   978
sl@0
   979
EXPORT_C CX509CertPoliciesExt* CX509CertPoliciesExt::NewL(const TDesC8& aBinaryData)
sl@0
   980
	{
sl@0
   981
	TInt pos = 0;
sl@0
   982
	return CX509CertPoliciesExt::NewL(aBinaryData, pos);
sl@0
   983
	}
sl@0
   984
sl@0
   985
EXPORT_C CX509CertPoliciesExt* CX509CertPoliciesExt::NewLC(const TDesC8& aBinaryData)
sl@0
   986
	{
sl@0
   987
	TInt pos = 0;
sl@0
   988
	return CX509CertPoliciesExt::NewLC(aBinaryData, pos);
sl@0
   989
	}
sl@0
   990
sl@0
   991
EXPORT_C CX509CertPoliciesExt* CX509CertPoliciesExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   992
	{
sl@0
   993
	CX509CertPoliciesExt* self = CX509CertPoliciesExt::NewLC(aBinaryData, aPos);
sl@0
   994
	CleanupStack::Pop();
sl@0
   995
	return self;
sl@0
   996
	}
sl@0
   997
sl@0
   998
EXPORT_C CX509CertPoliciesExt* CX509CertPoliciesExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   999
	{
sl@0
  1000
	CX509CertPoliciesExt* self = new(ELeave) CX509CertPoliciesExt;
sl@0
  1001
	CleanupStack::PushL(self);
sl@0
  1002
	self->ConstructL(aBinaryData, aPos);
sl@0
  1003
	return self;
sl@0
  1004
	}
sl@0
  1005
sl@0
  1006
void CX509CertPoliciesExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1007
	{
sl@0
  1008
	TASN1DecSequence encSeq;
sl@0
  1009
	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos, 1, KMaxTInt);
sl@0
  1010
	TInt count = seq->Count();
sl@0
  1011
	iPolicies = new(ELeave) CArrayPtrFlat<CX509CertPolicyInfo> (1);
sl@0
  1012
	TASN1DecGeneric* gen;
sl@0
  1013
	for (TInt i = 0; i < count; i++)
sl@0
  1014
		{
sl@0
  1015
		gen = seq->At(i);
sl@0
  1016
		CX509CertPolicyInfo* policy = CX509CertPolicyInfo::NewLC(gen->Encoding());
sl@0
  1017
		iPolicies->AppendL(policy);
sl@0
  1018
		CleanupStack::Pop();//policy
sl@0
  1019
		}
sl@0
  1020
	CleanupStack::PopAndDestroy();
sl@0
  1021
	}
sl@0
  1022
sl@0
  1023
CX509CertPoliciesExt::~CX509CertPoliciesExt()
sl@0
  1024
	{
sl@0
  1025
	if (iPolicies != NULL)
sl@0
  1026
		{
sl@0
  1027
		iPolicies->ResetAndDestroy();
sl@0
  1028
		delete iPolicies;
sl@0
  1029
		}
sl@0
  1030
	}
sl@0
  1031
sl@0
  1032
EXPORT_C const CArrayPtrFlat<CX509CertPolicyInfo>& CX509CertPoliciesExt::Policies() const
sl@0
  1033
	{
sl@0
  1034
	return *iPolicies;
sl@0
  1035
	}
sl@0
  1036
sl@0
  1037
CX509CertPoliciesExt::CX509CertPoliciesExt()
sl@0
  1038
	{
sl@0
  1039
	}
sl@0
  1040
sl@0
  1041
//7) policy mapping
sl@0
  1042
CX509PolicyMapping* CX509PolicyMapping::NewL(const TDesC8& aBinaryData)
sl@0
  1043
	{
sl@0
  1044
	TInt pos = 0;
sl@0
  1045
	return CX509PolicyMapping::NewL(aBinaryData, pos);
sl@0
  1046
	}
sl@0
  1047
sl@0
  1048
CX509PolicyMapping* CX509PolicyMapping::NewLC(const TDesC8& aBinaryData)
sl@0
  1049
	{
sl@0
  1050
	TInt pos = 0;
sl@0
  1051
	return CX509PolicyMapping::NewLC(aBinaryData, pos);
sl@0
  1052
	}
sl@0
  1053
sl@0
  1054
CX509PolicyMapping* CX509PolicyMapping::NewL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1055
	{
sl@0
  1056
	CX509PolicyMapping* self = CX509PolicyMapping::NewLC(aBinaryData, aPos);
sl@0
  1057
	CleanupStack::Pop();
sl@0
  1058
	return self;
sl@0
  1059
	}
sl@0
  1060
sl@0
  1061
CX509PolicyMapping* CX509PolicyMapping::NewLC(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1062
	{
sl@0
  1063
	CX509PolicyMapping* self = new(ELeave) CX509PolicyMapping;
sl@0
  1064
	CleanupStack::PushL(self);
sl@0
  1065
	self->ConstructL(aBinaryData, aPos);
sl@0
  1066
	return self;
sl@0
  1067
	}
sl@0
  1068
sl@0
  1069
EXPORT_C CX509PolicyMapping* CX509PolicyMapping::NewL(const CX509PolicyMapping& aMapping)
sl@0
  1070
	{
sl@0
  1071
	CX509PolicyMapping* self = CX509PolicyMapping::NewLC(aMapping);
sl@0
  1072
	CleanupStack::Pop();
sl@0
  1073
	return self;
sl@0
  1074
	}
sl@0
  1075
sl@0
  1076
EXPORT_C CX509PolicyMapping* CX509PolicyMapping::NewLC(const CX509PolicyMapping& aMapping)
sl@0
  1077
	{
sl@0
  1078
	CX509PolicyMapping* self = new(ELeave) CX509PolicyMapping;
sl@0
  1079
	CleanupStack::PushL(self);
sl@0
  1080
	self->ConstructL(aMapping);
sl@0
  1081
	return self;
sl@0
  1082
	}
sl@0
  1083
sl@0
  1084
void CX509PolicyMapping::ConstructL(const CX509PolicyMapping& aMapping)
sl@0
  1085
	{
sl@0
  1086
	iIssuerPolicy = aMapping.iIssuerPolicy->AllocL();
sl@0
  1087
	iSubjectPolicy = aMapping.iSubjectPolicy->AllocL();
sl@0
  1088
	}
sl@0
  1089
sl@0
  1090
void CX509PolicyMapping::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1091
	{
sl@0
  1092
	TASN1DecSequence encSeq;
sl@0
  1093
	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos);
sl@0
  1094
	if (seq->Count() < 2)
sl@0
  1095
		{
sl@0
  1096
		User::Leave(KErrArgument);
sl@0
  1097
		}
sl@0
  1098
	TASN1DecObjectIdentifier encOID;
sl@0
  1099
	iIssuerPolicy = encOID.DecodeDERL(*(seq->At(0)));
sl@0
  1100
	iSubjectPolicy = encOID.DecodeDERL(*(seq->At(1)));
sl@0
  1101
	CleanupStack::PopAndDestroy();
sl@0
  1102
	}
sl@0
  1103
sl@0
  1104
CX509PolicyMapping::~CX509PolicyMapping()
sl@0
  1105
	{
sl@0
  1106
	delete iIssuerPolicy;
sl@0
  1107
	delete iSubjectPolicy;
sl@0
  1108
	}
sl@0
  1109
sl@0
  1110
EXPORT_C TPtrC CX509PolicyMapping::IssuerPolicy() const
sl@0
  1111
	{
sl@0
  1112
	return iIssuerPolicy->Des();
sl@0
  1113
	}
sl@0
  1114
sl@0
  1115
EXPORT_C TPtrC CX509PolicyMapping::SubjectPolicy() const
sl@0
  1116
	{
sl@0
  1117
	return iSubjectPolicy->Des();
sl@0
  1118
	}
sl@0
  1119
sl@0
  1120
CX509PolicyMapping::CX509PolicyMapping()
sl@0
  1121
	{
sl@0
  1122
	}
sl@0
  1123
sl@0
  1124
EXPORT_C CX509PolicyMappingExt* CX509PolicyMappingExt::NewL(const TDesC8& aBinaryData)
sl@0
  1125
	{
sl@0
  1126
	TInt pos = 0;
sl@0
  1127
	return CX509PolicyMappingExt::NewL(aBinaryData, pos);
sl@0
  1128
	}
sl@0
  1129
sl@0
  1130
EXPORT_C CX509PolicyMappingExt* CX509PolicyMappingExt::NewLC(const TDesC8& aBinaryData)
sl@0
  1131
	{
sl@0
  1132
	TInt pos = 0;
sl@0
  1133
	return CX509PolicyMappingExt::NewLC(aBinaryData, pos);
sl@0
  1134
	}
sl@0
  1135
sl@0
  1136
EXPORT_C CX509PolicyMappingExt* CX509PolicyMappingExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1137
	{
sl@0
  1138
	CX509PolicyMappingExt* self = CX509PolicyMappingExt::NewLC(aBinaryData, aPos);
sl@0
  1139
	CleanupStack::Pop();
sl@0
  1140
	return self;
sl@0
  1141
	}
sl@0
  1142
sl@0
  1143
EXPORT_C CX509PolicyMappingExt* CX509PolicyMappingExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1144
	{
sl@0
  1145
	CX509PolicyMappingExt* self = new(ELeave) CX509PolicyMappingExt;
sl@0
  1146
	CleanupStack::PushL(self);
sl@0
  1147
	self->ConstructL(aBinaryData, aPos);
sl@0
  1148
	return self;
sl@0
  1149
	}
sl@0
  1150
sl@0
  1151
void CX509PolicyMappingExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1152
	{
sl@0
  1153
	TASN1DecSequence encSeq;
sl@0
  1154
	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos, 1, KMaxTInt);
sl@0
  1155
	TInt count = seq->Count();
sl@0
  1156
sl@0
  1157
	iPolicies = new(ELeave) CArrayPtrFlat<CX509PolicyMapping> (1);
sl@0
  1158
	TASN1DecGeneric* gen;
sl@0
  1159
	for (TInt i = 0; i < count; i++)
sl@0
  1160
		{
sl@0
  1161
		gen = seq->At(i);
sl@0
  1162
		CX509PolicyMapping* policy = CX509PolicyMapping::NewLC(gen->Encoding());
sl@0
  1163
		iPolicies->AppendL(policy);
sl@0
  1164
		CleanupStack::Pop();//policy
sl@0
  1165
		}
sl@0
  1166
	CleanupStack::PopAndDestroy();
sl@0
  1167
	}
sl@0
  1168
sl@0
  1169
CX509PolicyMappingExt::~CX509PolicyMappingExt()
sl@0
  1170
	{
sl@0
  1171
	if (iPolicies != NULL)
sl@0
  1172
		{
sl@0
  1173
		iPolicies->ResetAndDestroy();
sl@0
  1174
		delete iPolicies;
sl@0
  1175
		}
sl@0
  1176
	}
sl@0
  1177
sl@0
  1178
EXPORT_C const CArrayPtrFlat<CX509PolicyMapping>& CX509PolicyMappingExt::Mappings() const
sl@0
  1179
	{
sl@0
  1180
	return *iPolicies;
sl@0
  1181
	}
sl@0
  1182
sl@0
  1183
CX509PolicyMappingExt::CX509PolicyMappingExt()
sl@0
  1184
	{
sl@0
  1185
	}
sl@0
  1186
sl@0
  1187
//8) authority key ID
sl@0
  1188
EXPORT_C CX509AuthorityKeyIdExt* CX509AuthorityKeyIdExt::NewL(const TDesC8& aBinaryData)
sl@0
  1189
	{
sl@0
  1190
	TInt pos = 0;
sl@0
  1191
	return CX509AuthorityKeyIdExt::NewL(aBinaryData, pos);
sl@0
  1192
	}
sl@0
  1193
sl@0
  1194
EXPORT_C CX509AuthorityKeyIdExt* CX509AuthorityKeyIdExt::NewLC(const TDesC8& aBinaryData)
sl@0
  1195
	{
sl@0
  1196
	TInt pos = 0;
sl@0
  1197
	return CX509AuthorityKeyIdExt::NewLC(aBinaryData, pos);
sl@0
  1198
	}
sl@0
  1199
sl@0
  1200
EXPORT_C CX509AuthorityKeyIdExt* CX509AuthorityKeyIdExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1201
	{
sl@0
  1202
	CX509AuthorityKeyIdExt* self = CX509AuthorityKeyIdExt::NewLC(aBinaryData, aPos);
sl@0
  1203
	CleanupStack::Pop();
sl@0
  1204
	return self;
sl@0
  1205
	}
sl@0
  1206
sl@0
  1207
EXPORT_C CX509AuthorityKeyIdExt* CX509AuthorityKeyIdExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1208
	{
sl@0
  1209
	CX509AuthorityKeyIdExt* self = new(ELeave) CX509AuthorityKeyIdExt;
sl@0
  1210
	CleanupStack::PushL(self);
sl@0
  1211
	self->ConstructL(aBinaryData, aPos);
sl@0
  1212
	return self;
sl@0
  1213
	}
sl@0
  1214
sl@0
  1215
void CX509AuthorityKeyIdExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1216
	{
sl@0
  1217
	TASN1DecSequence encSeq;
sl@0
  1218
	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos);
sl@0
  1219
	TInt count = seq->Count();
sl@0
  1220
	TInt pos = 0;
sl@0
  1221
sl@0
  1222
	iAuthorityName = new(ELeave) CArrayPtrFlat<CX509GeneralName> (1);
sl@0
  1223
	TASN1DecGeneric* curr;
sl@0
  1224
	if (pos < count)
sl@0
  1225
		{
sl@0
  1226
		curr = seq->At(pos);
sl@0
  1227
		pos++;
sl@0
  1228
		if (curr->Class() != EContextSpecific)
sl@0
  1229
			{
sl@0
  1230
			User::Leave(KErrArgument);
sl@0
  1231
			}
sl@0
  1232
		switch(curr->Tag())
sl@0
  1233
			{
sl@0
  1234
			case 0:
sl@0
  1235
				{
sl@0
  1236
				DecodeKeyIdL(curr->Encoding());
sl@0
  1237
				break;
sl@0
  1238
				}
sl@0
  1239
			case 1:
sl@0
  1240
				{
sl@0
  1241
				DecodeNameL(curr->Encoding());
sl@0
  1242
				break;
sl@0
  1243
				}
sl@0
  1244
			case 2:
sl@0
  1245
				{
sl@0
  1246
				DecodeSerialNoL(curr->Encoding());
sl@0
  1247
				break;
sl@0
  1248
				}
sl@0
  1249
			default:
sl@0
  1250
				{
sl@0
  1251
				User::Leave(KErrArgument);
sl@0
  1252
				}
sl@0
  1253
			}
sl@0
  1254
		if (pos < count)
sl@0
  1255
			{
sl@0
  1256
			curr = seq->At(pos);
sl@0
  1257
			pos++;
sl@0
  1258
			if (curr->Class() != EContextSpecific)
sl@0
  1259
				{
sl@0
  1260
				User::Leave(KErrArgument);
sl@0
  1261
				}
sl@0
  1262
			switch(curr->Tag())
sl@0
  1263
				{
sl@0
  1264
				case 1:
sl@0
  1265
					{
sl@0
  1266
					DecodeNameL(curr->Encoding());
sl@0
  1267
					break;
sl@0
  1268
					}
sl@0
  1269
				case 2:
sl@0
  1270
					{
sl@0
  1271
					DecodeSerialNoL(curr->Encoding());
sl@0
  1272
					break;
sl@0
  1273
					}
sl@0
  1274
				default:
sl@0
  1275
					{
sl@0
  1276
					User::Leave(KErrArgument);
sl@0
  1277
					}
sl@0
  1278
				}
sl@0
  1279
			if (pos < count)
sl@0
  1280
				{
sl@0
  1281
				curr = seq->At(pos);
sl@0
  1282
				pos++;
sl@0
  1283
				if ((curr->Class() != EContextSpecific) || (curr->Tag() != 2))
sl@0
  1284
					{
sl@0
  1285
					User::Leave(KErrArgument);
sl@0
  1286
					}
sl@0
  1287
				DecodeSerialNoL(curr->Encoding());
sl@0
  1288
				}
sl@0
  1289
			}
sl@0
  1290
		}
sl@0
  1291
	if (!iKeyIdentifier)
sl@0
  1292
		{
sl@0
  1293
		iKeyIdentifier = HBufC8::NewL(1);
sl@0
  1294
		*iKeyIdentifier = KNullDesC8;
sl@0
  1295
		}
sl@0
  1296
	if (!iAuthorityCertSerialNumber)
sl@0
  1297
		{
sl@0
  1298
		iAuthorityCertSerialNumber = HBufC8::NewL(1);
sl@0
  1299
		*iAuthorityCertSerialNumber = KNullDesC8;
sl@0
  1300
		}
sl@0
  1301
	CleanupStack::PopAndDestroy();
sl@0
  1302
	}
sl@0
  1303
sl@0
  1304
void CX509AuthorityKeyIdExt::DecodeNameL(const TDesC8& aBinaryData)
sl@0
  1305
	{
sl@0
  1306
	TASN1DecSequence encSeq;
sl@0
  1307
	TInt pos = 0;
sl@0
  1308
	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, pos, 1, KMaxTInt);
sl@0
  1309
	TInt count = seq->Count();
sl@0
  1310
	TASN1DecGeneric* gen;
sl@0
  1311
	for (TInt i = 0; i < count; i++)
sl@0
  1312
		{
sl@0
  1313
		gen = seq->At(i);
sl@0
  1314
		CX509GeneralName* gn = CX509GeneralName::NewLC(gen->Encoding());
sl@0
  1315
		iAuthorityName->AppendL(gn);
sl@0
  1316
		CleanupStack::Pop();//gn
sl@0
  1317
		}
sl@0
  1318
	CleanupStack::PopAndDestroy();
sl@0
  1319
	}
sl@0
  1320
sl@0
  1321
void CX509AuthorityKeyIdExt::DecodeKeyIdL(const TDesC8& aBinaryData)
sl@0
  1322
	{
sl@0
  1323
	TASN1DecGeneric gen(aBinaryData);
sl@0
  1324
	gen.InitL();
sl@0
  1325
	if (iKeyIdentifier != NULL)
sl@0
  1326
		{
sl@0
  1327
		User::Leave(KErrArgument);
sl@0
  1328
		}
sl@0
  1329
	iKeyIdentifier = gen.GetContentDER().AllocL();
sl@0
  1330
	}
sl@0
  1331
sl@0
  1332
void CX509AuthorityKeyIdExt::DecodeSerialNoL(const TDesC8& aBinaryData)
sl@0
  1333
	{
sl@0
  1334
	TASN1DecGeneric gen(aBinaryData);
sl@0
  1335
	gen.InitL();
sl@0
  1336
	if (iAuthorityCertSerialNumber != NULL)
sl@0
  1337
		{
sl@0
  1338
		User::Leave(KErrArgument);
sl@0
  1339
		}
sl@0
  1340
	iAuthorityCertSerialNumber = gen.GetContentDER().AllocL();
sl@0
  1341
	}
sl@0
  1342
sl@0
  1343
CX509AuthorityKeyIdExt::~CX509AuthorityKeyIdExt()
sl@0
  1344
	{
sl@0
  1345
	if (iAuthorityName != NULL)
sl@0
  1346
		{
sl@0
  1347
		iAuthorityName->ResetAndDestroy();
sl@0
  1348
		}
sl@0
  1349
	delete iAuthorityName;
sl@0
  1350
	delete iAuthorityCertSerialNumber;
sl@0
  1351
	delete iKeyIdentifier;
sl@0
  1352
	}
sl@0
  1353
sl@0
  1354
EXPORT_C const CArrayPtrFlat<CX509GeneralName>& CX509AuthorityKeyIdExt::AuthorityName() const
sl@0
  1355
	{
sl@0
  1356
	return *iAuthorityName;
sl@0
  1357
	}
sl@0
  1358
sl@0
  1359
EXPORT_C TPtrC8 CX509AuthorityKeyIdExt::AuthorityCertSerialNumber() const
sl@0
  1360
	{
sl@0
  1361
	return iAuthorityCertSerialNumber->Des();
sl@0
  1362
	}
sl@0
  1363
sl@0
  1364
EXPORT_C TPtrC8 CX509AuthorityKeyIdExt::KeyId() const
sl@0
  1365
	{
sl@0
  1366
	return iKeyIdentifier->Des();
sl@0
  1367
	}
sl@0
  1368
sl@0
  1369
CX509AuthorityKeyIdExt::CX509AuthorityKeyIdExt()
sl@0
  1370
	{
sl@0
  1371
	}
sl@0
  1372
sl@0
  1373
//9) subject key ID
sl@0
  1374
EXPORT_C CX509SubjectKeyIdExt* CX509SubjectKeyIdExt::NewL(const TDesC8& aBinaryData)
sl@0
  1375
	{
sl@0
  1376
	TInt pos = 0;
sl@0
  1377
	return CX509SubjectKeyIdExt::NewL(aBinaryData, pos);
sl@0
  1378
	}
sl@0
  1379
sl@0
  1380
EXPORT_C CX509SubjectKeyIdExt* CX509SubjectKeyIdExt::NewLC(const TDesC8& aBinaryData)
sl@0
  1381
	{
sl@0
  1382
	TInt pos = 0;
sl@0
  1383
	return CX509SubjectKeyIdExt::NewLC(aBinaryData, pos);
sl@0
  1384
	}
sl@0
  1385
sl@0
  1386
EXPORT_C CX509SubjectKeyIdExt* CX509SubjectKeyIdExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1387
	{
sl@0
  1388
	CX509SubjectKeyIdExt* self = CX509SubjectKeyIdExt::NewLC(aBinaryData, aPos);
sl@0
  1389
	CleanupStack::Pop();
sl@0
  1390
	return self;
sl@0
  1391
	}
sl@0
  1392
sl@0
  1393
EXPORT_C CX509SubjectKeyIdExt* CX509SubjectKeyIdExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1394
	{
sl@0
  1395
	CX509SubjectKeyIdExt* self = new(ELeave) CX509SubjectKeyIdExt;
sl@0
  1396
	CleanupStack::PushL(self);
sl@0
  1397
	self->ConstructL(aBinaryData, aPos);
sl@0
  1398
	return self;
sl@0
  1399
	}
sl@0
  1400
sl@0
  1401
void CX509SubjectKeyIdExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1402
	{
sl@0
  1403
	TASN1DecOctetString octetStr;
sl@0
  1404
	iKeyIdentifier = octetStr.DecodeDERL(aBinaryData, aPos);
sl@0
  1405
	}
sl@0
  1406
sl@0
  1407
EXPORT_C CX509SubjectKeyIdExt::~CX509SubjectKeyIdExt()
sl@0
  1408
	{
sl@0
  1409
	delete iKeyIdentifier;
sl@0
  1410
	}
sl@0
  1411
sl@0
  1412
EXPORT_C TPtrC8 CX509SubjectKeyIdExt::KeyId() const
sl@0
  1413
	{
sl@0
  1414
	return iKeyIdentifier->Des();
sl@0
  1415
	}
sl@0
  1416
sl@0
  1417
CX509SubjectKeyIdExt::CX509SubjectKeyIdExt()
sl@0
  1418
	{
sl@0
  1419
	}
sl@0
  1420
sl@0
  1421
//10) extended key usage
sl@0
  1422
EXPORT_C CX509ExtendedKeyUsageExt* CX509ExtendedKeyUsageExt::NewL(const TDesC8& aBinaryData)
sl@0
  1423
	{
sl@0
  1424
	TInt pos = 0;
sl@0
  1425
	return CX509ExtendedKeyUsageExt::NewL(aBinaryData, pos);
sl@0
  1426
	}
sl@0
  1427
sl@0
  1428
EXPORT_C CX509ExtendedKeyUsageExt* CX509ExtendedKeyUsageExt::NewLC(const TDesC8& aBinaryData)
sl@0
  1429
	{
sl@0
  1430
	TInt pos = 0;
sl@0
  1431
	return CX509ExtendedKeyUsageExt::NewLC(aBinaryData, pos);
sl@0
  1432
	}
sl@0
  1433
sl@0
  1434
EXPORT_C CX509ExtendedKeyUsageExt* CX509ExtendedKeyUsageExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1435
	{
sl@0
  1436
	CX509ExtendedKeyUsageExt* self = CX509ExtendedKeyUsageExt::NewLC(aBinaryData, aPos);
sl@0
  1437
	CleanupStack::Pop();
sl@0
  1438
	return self;
sl@0
  1439
	}
sl@0
  1440
sl@0
  1441
EXPORT_C CX509ExtendedKeyUsageExt* CX509ExtendedKeyUsageExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1442
	{
sl@0
  1443
	CX509ExtendedKeyUsageExt* self = new(ELeave) CX509ExtendedKeyUsageExt;
sl@0
  1444
	CleanupStack::PushL(self);
sl@0
  1445
	self->ConstructL(aBinaryData, aPos);
sl@0
  1446
	return self;
sl@0
  1447
	}
sl@0
  1448
sl@0
  1449
void CX509ExtendedKeyUsageExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1450
	{
sl@0
  1451
	TASN1DecSequence encSeq;
sl@0
  1452
	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos, 1, KMaxTInt);
sl@0
  1453
	TInt count = seq->Count();
sl@0
  1454
sl@0
  1455
	iKeyUsages = new(ELeave) CArrayPtrFlat<HBufC> (1);
sl@0
  1456
	TASN1DecGeneric* gen;
sl@0
  1457
	for (TInt i = 0; i < count; i++)
sl@0
  1458
		{
sl@0
  1459
		gen = seq->At(i);
sl@0
  1460
		TASN1DecObjectIdentifier encOID;
sl@0
  1461
		HBufC* usage = encOID.DecodeDERL(*gen);
sl@0
  1462
		CleanupStack::PushL(usage);
sl@0
  1463
		iKeyUsages->AppendL(usage);
sl@0
  1464
		CleanupStack::Pop();
sl@0
  1465
		}
sl@0
  1466
	CleanupStack::PopAndDestroy();
sl@0
  1467
	}
sl@0
  1468
sl@0
  1469
EXPORT_C CX509ExtendedKeyUsageExt::~CX509ExtendedKeyUsageExt()
sl@0
  1470
	{
sl@0
  1471
	if (iKeyUsages != NULL)
sl@0
  1472
		{
sl@0
  1473
		iKeyUsages->ResetAndDestroy();
sl@0
  1474
		delete iKeyUsages;
sl@0
  1475
		}
sl@0
  1476
	}
sl@0
  1477
sl@0
  1478
EXPORT_C const CArrayPtrFlat<HBufC>& CX509ExtendedKeyUsageExt::KeyUsages() const
sl@0
  1479
	{
sl@0
  1480
	return *iKeyUsages;
sl@0
  1481
	}
sl@0
  1482
sl@0
  1483
CX509ExtendedKeyUsageExt::CX509ExtendedKeyUsageExt()
sl@0
  1484
	{
sl@0
  1485
	}
sl@0
  1486
sl@0
  1487
//12) authority information access - CX509AccessDescription
sl@0
  1488
sl@0
  1489
CX509AccessDescription* CX509AccessDescription::NewL(const TDesC8& aBinaryData)
sl@0
  1490
	{
sl@0
  1491
	TInt pos = 0;
sl@0
  1492
	return NewL(aBinaryData, pos);
sl@0
  1493
	}
sl@0
  1494
sl@0
  1495
CX509AccessDescription* CX509AccessDescription::NewLC(const TDesC8& aBinaryData)
sl@0
  1496
	{
sl@0
  1497
	TInt pos = 0;
sl@0
  1498
	return NewLC(aBinaryData, pos);
sl@0
  1499
	}
sl@0
  1500
sl@0
  1501
CX509AccessDescription* CX509AccessDescription::NewL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1502
	{
sl@0
  1503
	CX509AccessDescription* self = NewLC(aBinaryData, aPos);
sl@0
  1504
	CleanupStack::Pop(self);
sl@0
  1505
	return self;
sl@0
  1506
	}
sl@0
  1507
sl@0
  1508
CX509AccessDescription* CX509AccessDescription::NewLC(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1509
	{
sl@0
  1510
	CX509AccessDescription* self = new (ELeave) CX509AccessDescription;
sl@0
  1511
	CleanupStack::PushL(self);
sl@0
  1512
	self->ConstructL(aBinaryData, aPos);
sl@0
  1513
	return self;
sl@0
  1514
	}
sl@0
  1515
sl@0
  1516
CX509AccessDescription::CX509AccessDescription()
sl@0
  1517
	{
sl@0
  1518
	// empty
sl@0
  1519
	}
sl@0
  1520
sl@0
  1521
void CX509AccessDescription::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1522
	{
sl@0
  1523
	TASN1DecSequence encSeq;
sl@0
  1524
	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos, 2, 2);
sl@0
  1525
sl@0
  1526
	TASN1DecGeneric* curr = seq->At(0);
sl@0
  1527
	TASN1DecObjectIdentifier encOID;
sl@0
  1528
	iMethodId = encOID.DecodeDERL(*curr);
sl@0
  1529
sl@0
  1530
	curr = seq->At(1);
sl@0
  1531
	iLocation = CX509GeneralName::NewL(curr->Encoding());	
sl@0
  1532
sl@0
  1533
	CleanupStack::PopAndDestroy(seq);
sl@0
  1534
	}
sl@0
  1535
sl@0
  1536
CX509AccessDescription::~CX509AccessDescription()
sl@0
  1537
	{
sl@0
  1538
	delete iMethodId;
sl@0
  1539
	delete iLocation;
sl@0
  1540
	}
sl@0
  1541
sl@0
  1542
EXPORT_C TPtrC CX509AccessDescription::Method() const
sl@0
  1543
	{
sl@0
  1544
	return *iMethodId;
sl@0
  1545
	}
sl@0
  1546
sl@0
  1547
EXPORT_C const CX509GeneralName& CX509AccessDescription::Location() const
sl@0
  1548
	{
sl@0
  1549
	return *iLocation;
sl@0
  1550
	}
sl@0
  1551
sl@0
  1552
//12) authority information access - CX509AuthInfoAccessExt
sl@0
  1553
sl@0
  1554
EXPORT_C CX509AuthInfoAccessExt* CX509AuthInfoAccessExt::NewL(const TDesC8& aBinaryData)
sl@0
  1555
	{
sl@0
  1556
	TInt pos = 0;
sl@0
  1557
	return NewL(aBinaryData, pos);
sl@0
  1558
	}
sl@0
  1559
sl@0
  1560
EXPORT_C CX509AuthInfoAccessExt* CX509AuthInfoAccessExt::NewLC(const TDesC8& aBinaryData)
sl@0
  1561
	{
sl@0
  1562
	TInt pos = 0;
sl@0
  1563
	return NewLC(aBinaryData, pos);
sl@0
  1564
	}
sl@0
  1565
sl@0
  1566
EXPORT_C CX509AuthInfoAccessExt* CX509AuthInfoAccessExt::NewL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1567
	{
sl@0
  1568
	CX509AuthInfoAccessExt* self = NewLC(aBinaryData, aPos);
sl@0
  1569
	CleanupStack::Pop(self);
sl@0
  1570
	return self;
sl@0
  1571
	}
sl@0
  1572
sl@0
  1573
EXPORT_C CX509AuthInfoAccessExt* CX509AuthInfoAccessExt::NewLC(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1574
	{
sl@0
  1575
	CX509AuthInfoAccessExt* self = new (ELeave) CX509AuthInfoAccessExt;
sl@0
  1576
	CleanupStack::PushL(self);
sl@0
  1577
	self->ConstructL(aBinaryData, aPos);
sl@0
  1578
	return self;
sl@0
  1579
	}
sl@0
  1580
sl@0
  1581
CX509AuthInfoAccessExt::CX509AuthInfoAccessExt()
sl@0
  1582
	{
sl@0
  1583
	// empty
sl@0
  1584
	}
sl@0
  1585
sl@0
  1586
void CX509AuthInfoAccessExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
  1587
 	{
sl@0
  1588
	TASN1DecSequence encSeq;
sl@0
  1589
	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos, 1, KMaxTInt);
sl@0
  1590
	TInt count = seq->Count();
sl@0
  1591
sl@0
  1592
	iAccessDescs = new (ELeave) CArrayPtrFlat<CX509AccessDescription>(1);
sl@0
  1593
sl@0
  1594
	for (TInt i = 0 ; i < count ; ++i)
sl@0
  1595
		{
sl@0
  1596
		TASN1DecGeneric* curr = seq->At(i);
sl@0
  1597
		CX509AccessDescription* desc = CX509AccessDescription::NewLC(curr->Encoding());
sl@0
  1598
		iAccessDescs->AppendL(desc);
sl@0
  1599
		CleanupStack::Pop(desc);
sl@0
  1600
		}
sl@0
  1601
sl@0
  1602
	CleanupStack::PopAndDestroy(seq);
sl@0
  1603
	}
sl@0
  1604
sl@0
  1605
EXPORT_C CX509AuthInfoAccessExt::~CX509AuthInfoAccessExt()
sl@0
  1606
	{
sl@0
  1607
	if (iAccessDescs)
sl@0
  1608
		{
sl@0
  1609
		iAccessDescs->ResetAndDestroy();
sl@0
  1610
		delete iAccessDescs;
sl@0
  1611
		}
sl@0
  1612
	}
sl@0
  1613
sl@0
  1614
EXPORT_C const CArrayPtrFlat<CX509AccessDescription>& CX509AuthInfoAccessExt::AccessDescriptions() const
sl@0
  1615
	{
sl@0
  1616
	return *iAccessDescs;
sl@0
  1617
	}