diff -r 000000000000 -r 2c201484c85f cryptoservices/certificateandkeymgmt/x509/x509constraintext.cpp --- /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 +#include + +// 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& 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* 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& 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* 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(i)); + } + } + delete bitString; + }