cryptoservices/certificateandkeymgmt/x509/x509constraintext.cpp
changeset 0 2c201484c85f
child 8 35751d3474b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cryptoservices/certificateandkeymgmt/x509/x509constraintext.cpp	Wed Jul 08 11:25:26 2009 +0100
@@ -0,0 +1,196 @@
+/*
+* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+#include <asn1dec.h>
+#include <x509constraintext.h>
+
+// Integer list methods
+EXPORT_C CX509IntListExt* CX509IntListExt::NewL(const TDesC8& aBinaryData)
+	{	
+	CX509IntListExt* self = CX509IntListExt::NewLC(aBinaryData);
+	CleanupStack::Pop(self);
+	return self;
+	}
+	
+EXPORT_C CX509IntListExt* CX509IntListExt::NewLC(const TDesC8& aBinaryData)
+	{
+	CX509IntListExt* self = new(ELeave) CX509IntListExt;
+	CleanupStack::PushL(self);
+	
+	TInt pos = 0;
+	self->ConstructL(aBinaryData, pos);
+	return self;
+	}
+
+CX509IntListExt::~CX509IntListExt() 
+	{
+	iIntArray.Close();
+	}
+	
+EXPORT_C const RArray<TInt>& CX509IntListExt::IntArray() const 
+	{
+	return iIntArray;	
+	}		
+
+void CX509IntListExt::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
+	{
+	CX509ExtensionBase::ConstructL(aBinaryData, aPos);
+	}
+
+void CX509IntListExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
+	{
+	TASN1DecSequence encSeq;	
+	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos);
+	TInt count = seq->Count();
+	
+	TASN1DecInteger encInt;
+	for (TInt i = 0; i < count; i++) 
+		{
+		TASN1DecGeneric* curr = seq->At(i);
+		
+		if (curr->Tag() == EASN1Integer)		
+			{
+			User::LeaveIfError(iIntArray.Append(encInt.DecodeDERShortL(*curr)));
+			}		
+		else
+			{
+			User::Leave(KErrArgument);		
+			}
+		}		
+	CleanupStack::PopAndDestroy(seq);
+	}
+	
+//CX509IntListExt::CX509IntListExt() 
+//	{
+//	}
+	
+// UTF-8 String list methods	
+EXPORT_C CX509Utf8StringListExt* CX509Utf8StringListExt::NewL(const TDesC8& aBinaryData)
+	{	
+	CX509Utf8StringListExt* self = CX509Utf8StringListExt::NewLC(aBinaryData);
+	CleanupStack::Pop(self);
+	return self;
+	}
+	
+EXPORT_C CX509Utf8StringListExt* CX509Utf8StringListExt::NewLC(const TDesC8& aBinaryData)
+	{
+	CX509Utf8StringListExt* self = new(ELeave) CX509Utf8StringListExt;
+	CleanupStack::PushL(self);
+	
+	TInt pos = 0;
+	self->ConstructL(aBinaryData, pos);
+	return self;
+	}
+
+EXPORT_C const RPointerArray<HBufC>& CX509Utf8StringListExt::StringArray() const
+	{
+	return iStringArray;
+	}	
+
+void CX509Utf8StringListExt::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
+	{
+	CX509ExtensionBase::ConstructL(aBinaryData, aPos);
+	}
+	
+void CX509Utf8StringListExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos)
+	{
+	TASN1DecSequence encSeq;	
+	CArrayPtrFlat<TASN1DecGeneric>* seq = encSeq.DecodeDERLC(aBinaryData, aPos);
+	TInt count = seq->Count();
+	
+	TASN1DecUTF8String encStr;
+	for (TInt i = 0; i < count; i++) 
+		{
+		TASN1DecGeneric* curr = seq->At(i);
+		if (curr->Tag() == EASN1UTF8String)		
+			{
+			HBufC *str = encStr.DecodeDERL(*curr);
+			CleanupStack::PushL(str);
+			User::LeaveIfError(iStringArray.Append(str));
+			CleanupStack::Pop(str);
+			}		
+		else
+			{
+			User::Leave(KErrArgument);		
+			}
+		}		
+	CleanupStack::PopAndDestroy(seq);
+	}
+
+CX509Utf8StringListExt::~CX509Utf8StringListExt() 
+	{
+	iStringArray.ResetAndDestroy();
+	}
+	
+// Capability set methods
+EXPORT_C CX509CapabilitySetExt* CX509CapabilitySetExt::NewL(const TDesC8& aBinaryData) 
+	{
+	CX509CapabilitySetExt* self = CX509CapabilitySetExt::NewLC(aBinaryData);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+EXPORT_C CX509CapabilitySetExt* CX509CapabilitySetExt::NewLC(const TDesC8& aBinaryData) 
+	{
+	CX509CapabilitySetExt* self = new (ELeave) CX509CapabilitySetExt;
+	CleanupStack::PushL(self);
+	
+	TInt pos = 0;
+	self->ConstructL(aBinaryData, pos);
+	return self;
+	}
+
+CX509CapabilitySetExt::~CX509CapabilitySetExt() 
+	{	
+	}
+
+EXPORT_C const TCapabilitySet& CX509CapabilitySetExt::CapabilitySet() const
+	{
+	return iCapabilitySet;
+	}
+
+void CX509CapabilitySetExt::ConstructL(const TDesC8& aBinaryData, TInt& aPos)
+	{
+	CX509ExtensionBase::ConstructL(aBinaryData, aPos);
+	}
+			
+void CX509CapabilitySetExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos) 
+	{
+	TASN1DecBitString encBit;	
+	
+	// Decode the padding bits
+	HBufC8* bitBuffer = encBit.ExtractOctetStringL(aBinaryData, aPos);
+	CleanupStack::PushL(bitBuffer);
+	
+	// Create bitString for easy access of individual bits.
+	// This transfers ownership of bitBuffer
+	CX509BitString* bitString = new (ELeave) CX509BitString(bitBuffer, bitBuffer->Length() * 8);	
+	CleanupStack::Pop(bitBuffer);
+	
+	// Start off with an empty capability set and attempt to add each capability in turn
+	// making sure we don't go past the limit of the supported capabilities.
+	iCapabilitySet.SetEmpty();
+	for (TInt i = 0; i < ECapability_Limit; i++) 
+		{
+		if (bitString->IsSet(i))		
+			{
+			iCapabilitySet.AddCapability(static_cast<TCapability>(i));		
+			}
+		}	
+	delete bitString;
+	}