sl@0: /* sl@0: * Copyright (c) 2005-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 "x509constraintext.h" sl@0: #include "x509bitstring.h" sl@0: sl@0: // Integer list methods sl@0: EXPORT_C CX509IntListExt* CX509IntListExt::NewL(const TDesC8& aBinaryData) sl@0: { sl@0: CX509IntListExt* self = CX509IntListExt::NewLC(aBinaryData); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C CX509IntListExt* CX509IntListExt::NewLC(const TDesC8& aBinaryData) sl@0: { sl@0: CX509IntListExt* self = new(ELeave) CX509IntListExt; sl@0: CleanupStack::PushL(self); sl@0: sl@0: TInt pos = 0; sl@0: self->ConstructL(aBinaryData, pos); sl@0: return self; sl@0: } sl@0: sl@0: CX509IntListExt::~CX509IntListExt() sl@0: { sl@0: iIntArray.Close(); sl@0: } sl@0: sl@0: EXPORT_C const RArray& CX509IntListExt::IntArray() const sl@0: { sl@0: return iIntArray; sl@0: } sl@0: sl@0: void CX509IntListExt::ConstructL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: CX509ExtensionBase::ConstructL(aBinaryData, aPos); sl@0: } sl@0: sl@0: void CX509IntListExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: TASN1DecSequence encSeq; sl@0: CArrayPtrFlat* seq = encSeq.DecodeDERLC(aBinaryData, aPos); sl@0: TInt count = seq->Count(); sl@0: sl@0: TASN1DecInteger encInt; sl@0: for (TInt i = 0; i < count; i++) sl@0: { sl@0: TASN1DecGeneric* curr = seq->At(i); sl@0: sl@0: if (curr->Tag() == EASN1Integer) sl@0: { sl@0: User::LeaveIfError(iIntArray.Append(encInt.DecodeDERShortL(*curr))); sl@0: } sl@0: else sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: } sl@0: CleanupStack::PopAndDestroy(seq); sl@0: } sl@0: sl@0: //CX509IntListExt::CX509IntListExt() sl@0: // { sl@0: // } sl@0: sl@0: // UTF-8 String list methods sl@0: EXPORT_C CX509Utf8StringListExt* CX509Utf8StringListExt::NewL(const TDesC8& aBinaryData) sl@0: { sl@0: CX509Utf8StringListExt* self = CX509Utf8StringListExt::NewLC(aBinaryData); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C CX509Utf8StringListExt* CX509Utf8StringListExt::NewLC(const TDesC8& aBinaryData) sl@0: { sl@0: CX509Utf8StringListExt* self = new(ELeave) CX509Utf8StringListExt; sl@0: CleanupStack::PushL(self); sl@0: sl@0: TInt pos = 0; sl@0: self->ConstructL(aBinaryData, pos); sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C const RPointerArray& CX509Utf8StringListExt::StringArray() const sl@0: { sl@0: return iStringArray; sl@0: } sl@0: sl@0: void CX509Utf8StringListExt::ConstructL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: CX509ExtensionBase::ConstructL(aBinaryData, aPos); sl@0: } sl@0: sl@0: void CX509Utf8StringListExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: TASN1DecSequence encSeq; sl@0: CArrayPtrFlat* seq = encSeq.DecodeDERLC(aBinaryData, aPos); sl@0: TInt count = seq->Count(); sl@0: sl@0: TASN1DecUTF8String encStr; sl@0: for (TInt i = 0; i < count; i++) sl@0: { sl@0: TASN1DecGeneric* curr = seq->At(i); sl@0: if (curr->Tag() == EASN1UTF8String) sl@0: { sl@0: HBufC *str = encStr.DecodeDERL(*curr); sl@0: CleanupStack::PushL(str); sl@0: User::LeaveIfError(iStringArray.Append(str)); sl@0: CleanupStack::Pop(str); sl@0: } sl@0: else sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: } sl@0: CleanupStack::PopAndDestroy(seq); sl@0: } sl@0: sl@0: CX509Utf8StringListExt::~CX509Utf8StringListExt() sl@0: { sl@0: iStringArray.ResetAndDestroy(); sl@0: } sl@0: sl@0: // Capability set methods sl@0: EXPORT_C CX509CapabilitySetExt* CX509CapabilitySetExt::NewL(const TDesC8& aBinaryData) sl@0: { sl@0: CX509CapabilitySetExt* self = CX509CapabilitySetExt::NewLC(aBinaryData); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C CX509CapabilitySetExt* CX509CapabilitySetExt::NewLC(const TDesC8& aBinaryData) sl@0: { sl@0: CX509CapabilitySetExt* self = new (ELeave) CX509CapabilitySetExt; sl@0: CleanupStack::PushL(self); sl@0: sl@0: TInt pos = 0; sl@0: self->ConstructL(aBinaryData, pos); sl@0: return self; sl@0: } sl@0: sl@0: CX509CapabilitySetExt::~CX509CapabilitySetExt() sl@0: { sl@0: } sl@0: sl@0: EXPORT_C const TCapabilitySet& CX509CapabilitySetExt::CapabilitySet() const sl@0: { sl@0: return iCapabilitySet; sl@0: } sl@0: sl@0: void CX509CapabilitySetExt::ConstructL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: CX509ExtensionBase::ConstructL(aBinaryData, aPos); sl@0: } sl@0: sl@0: void CX509CapabilitySetExt::DoConstructL(const TDesC8& aBinaryData, TInt& aPos) sl@0: { sl@0: TASN1DecBitString encBit; sl@0: sl@0: // Decode the padding bits sl@0: HBufC8* bitBuffer = encBit.ExtractOctetStringL(aBinaryData, aPos); sl@0: CleanupStack::PushL(bitBuffer); sl@0: sl@0: // Create bitString for easy access of individual bits. sl@0: // This transfers ownership of bitBuffer sl@0: CX509BitString* bitString = new (ELeave) CX509BitString(bitBuffer, bitBuffer->Length() * 8); sl@0: CleanupStack::Pop(bitBuffer); sl@0: sl@0: // Start off with an empty capability set and attempt to add each capability in turn sl@0: // making sure we don't go past the limit of the supported capabilities. sl@0: iCapabilitySet.SetEmpty(); sl@0: for (TInt i = 0; i < ECapability_Limit; i++) sl@0: { sl@0: if (bitString->IsSet(i)) sl@0: { sl@0: iCapabilitySet.AddCapability(static_cast(i)); sl@0: } sl@0: } sl@0: delete bitString; sl@0: }