os/security/cryptoservices/certificateandkeymgmt/x509/x509constraintext.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) 2005-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 <asn1dec.h>
sl@0
    20
#include "x509constraintext.h"
sl@0
    21
#include "x509bitstring.h"
sl@0
    22
sl@0
    23
// Integer list methods
sl@0
    24
EXPORT_C CX509IntListExt* CX509IntListExt::NewL(const TDesC8& aBinaryData)
sl@0
    25
	{	
sl@0
    26
	CX509IntListExt* self = CX509IntListExt::NewLC(aBinaryData);
sl@0
    27
	CleanupStack::Pop(self);
sl@0
    28
	return self;
sl@0
    29
	}
sl@0
    30
	
sl@0
    31
EXPORT_C CX509IntListExt* CX509IntListExt::NewLC(const TDesC8& aBinaryData)
sl@0
    32
	{
sl@0
    33
	CX509IntListExt* self = new(ELeave) CX509IntListExt;
sl@0
    34
	CleanupStack::PushL(self);
sl@0
    35
	
sl@0
    36
	TInt pos = 0;
sl@0
    37
	self->ConstructL(aBinaryData, pos);
sl@0
    38
	return self;
sl@0
    39
	}
sl@0
    40
sl@0
    41
CX509IntListExt::~CX509IntListExt() 
sl@0
    42
	{
sl@0
    43
	iIntArray.Close();
sl@0
    44
	}
sl@0
    45
	
sl@0
    46
EXPORT_C const RArray<TInt>& CX509IntListExt::IntArray() const 
sl@0
    47
	{
sl@0
    48
	return iIntArray;	
sl@0
    49
	}		
sl@0
    50
sl@0
    51
void CX509IntListExt::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
    52
	{
sl@0
    53
	CX509ExtensionBase::ConstructL(aBinaryData, aPos);
sl@0
    54
	}
sl@0
    55
sl@0
    56
void CX509IntListExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
    57
	{
sl@0
    58
	TASN1DecSequence encSeq;	
sl@0
    59
	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos);
sl@0
    60
	TInt count = seq->Count();
sl@0
    61
	
sl@0
    62
	TASN1DecInteger encInt;
sl@0
    63
	for (TInt i = 0; i < count; i++) 
sl@0
    64
		{
sl@0
    65
		TASN1DecGeneric* curr = seq->At(i);
sl@0
    66
		
sl@0
    67
		if (curr->Tag() == EASN1Integer)		
sl@0
    68
			{
sl@0
    69
			User::LeaveIfError(iIntArray.Append(encInt.DecodeDERShortL(*curr)));
sl@0
    70
			}		
sl@0
    71
		else
sl@0
    72
			{
sl@0
    73
			User::Leave(KErrArgument);		
sl@0
    74
			}
sl@0
    75
		}		
sl@0
    76
	CleanupStack::PopAndDestroy(seq);
sl@0
    77
	}
sl@0
    78
	
sl@0
    79
//CX509IntListExt::CX509IntListExt() 
sl@0
    80
//	{
sl@0
    81
//	}
sl@0
    82
	
sl@0
    83
// UTF-8 String list methods	
sl@0
    84
EXPORT_C CX509Utf8StringListExt* CX509Utf8StringListExt::NewL(const TDesC8& aBinaryData)
sl@0
    85
	{	
sl@0
    86
	CX509Utf8StringListExt* self = CX509Utf8StringListExt::NewLC(aBinaryData);
sl@0
    87
	CleanupStack::Pop(self);
sl@0
    88
	return self;
sl@0
    89
	}
sl@0
    90
	
sl@0
    91
EXPORT_C CX509Utf8StringListExt* CX509Utf8StringListExt::NewLC(const TDesC8& aBinaryData)
sl@0
    92
	{
sl@0
    93
	CX509Utf8StringListExt* self = new(ELeave) CX509Utf8StringListExt;
sl@0
    94
	CleanupStack::PushL(self);
sl@0
    95
	
sl@0
    96
	TInt pos = 0;
sl@0
    97
	self->ConstructL(aBinaryData, pos);
sl@0
    98
	return self;
sl@0
    99
	}
sl@0
   100
sl@0
   101
EXPORT_C const RPointerArray<HBufC>& CX509Utf8StringListExt::StringArray() const
sl@0
   102
	{
sl@0
   103
	return iStringArray;
sl@0
   104
	}	
sl@0
   105
sl@0
   106
void CX509Utf8StringListExt::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   107
	{
sl@0
   108
	CX509ExtensionBase::ConstructL(aBinaryData, aPos);
sl@0
   109
	}
sl@0
   110
	
sl@0
   111
void CX509Utf8StringListExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   112
	{
sl@0
   113
	TASN1DecSequence encSeq;	
sl@0
   114
	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos);
sl@0
   115
	TInt count = seq->Count();
sl@0
   116
	
sl@0
   117
	TASN1DecUTF8String encStr;
sl@0
   118
	for (TInt i = 0; i < count; i++) 
sl@0
   119
		{
sl@0
   120
		TASN1DecGeneric* curr = seq->At(i);
sl@0
   121
		if (curr->Tag() == EASN1UTF8String)		
sl@0
   122
			{
sl@0
   123
			HBufC *str = encStr.DecodeDERL(*curr);
sl@0
   124
			CleanupStack::PushL(str);
sl@0
   125
			User::LeaveIfError(iStringArray.Append(str));
sl@0
   126
			CleanupStack::Pop(str);
sl@0
   127
			}		
sl@0
   128
		else
sl@0
   129
			{
sl@0
   130
			User::Leave(KErrArgument);		
sl@0
   131
			}
sl@0
   132
		}		
sl@0
   133
	CleanupStack::PopAndDestroy(seq);
sl@0
   134
	}
sl@0
   135
sl@0
   136
CX509Utf8StringListExt::~CX509Utf8StringListExt() 
sl@0
   137
	{
sl@0
   138
	iStringArray.ResetAndDestroy();
sl@0
   139
	}
sl@0
   140
	
sl@0
   141
// Capability set methods
sl@0
   142
EXPORT_C CX509CapabilitySetExt* CX509CapabilitySetExt::NewL(const TDesC8& aBinaryData) 
sl@0
   143
	{
sl@0
   144
	CX509CapabilitySetExt* self = CX509CapabilitySetExt::NewLC(aBinaryData);
sl@0
   145
	CleanupStack::Pop(self);
sl@0
   146
	return self;
sl@0
   147
	}
sl@0
   148
sl@0
   149
EXPORT_C CX509CapabilitySetExt* CX509CapabilitySetExt::NewLC(const TDesC8& aBinaryData) 
sl@0
   150
	{
sl@0
   151
	CX509CapabilitySetExt* self = new (ELeave) CX509CapabilitySetExt;
sl@0
   152
	CleanupStack::PushL(self);
sl@0
   153
	
sl@0
   154
	TInt pos = 0;
sl@0
   155
	self->ConstructL(aBinaryData, pos);
sl@0
   156
	return self;
sl@0
   157
	}
sl@0
   158
sl@0
   159
CX509CapabilitySetExt::~CX509CapabilitySetExt() 
sl@0
   160
	{	
sl@0
   161
	}
sl@0
   162
sl@0
   163
EXPORT_C const TCapabilitySet& CX509CapabilitySetExt::CapabilitySet() const
sl@0
   164
	{
sl@0
   165
	return iCapabilitySet;
sl@0
   166
	}
sl@0
   167
sl@0
   168
void CX509CapabilitySetExt::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
sl@0
   169
	{
sl@0
   170
	CX509ExtensionBase::ConstructL(aBinaryData, aPos);
sl@0
   171
	}
sl@0
   172
			
sl@0
   173
void CX509CapabilitySetExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos) 
sl@0
   174
	{
sl@0
   175
	TASN1DecBitString encBit;	
sl@0
   176
	
sl@0
   177
	// Decode the padding bits
sl@0
   178
	HBufC8* bitBuffer = encBit.ExtractOctetStringL(aBinaryData, aPos);
sl@0
   179
	CleanupStack::PushL(bitBuffer);
sl@0
   180
	
sl@0
   181
	// Create bitString for easy access of individual bits.
sl@0
   182
	// This transfers ownership of bitBuffer
sl@0
   183
	CX509BitString* bitString = new (ELeave) CX509BitString(bitBuffer, bitBuffer->Length() * 8);	
sl@0
   184
	CleanupStack::Pop(bitBuffer);
sl@0
   185
	
sl@0
   186
	// Start off with an empty capability set and attempt to add each capability in turn
sl@0
   187
	// making sure we don't go past the limit of the supported capabilities.
sl@0
   188
	iCapabilitySet.SetEmpty();
sl@0
   189
	for (TInt i = 0; i < ECapability_Limit; i++) 
sl@0
   190
		{
sl@0
   191
		if (bitString->IsSet(i))		
sl@0
   192
			{
sl@0
   193
			iCapabilitySet.AddCapability(static_cast<TCapability>(i));		
sl@0
   194
			}
sl@0
   195
		}	
sl@0
   196
	delete bitString;
sl@0
   197
	}