sl@0: /* sl@0: * Copyright (c) 1998-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 "asn1dec.h" sl@0: sl@0: EXPORT_C TASN1DecGeneric::TASN1DecGeneric(const TDesC8& aSource): sl@0: iEncoding(aSource) sl@0: { sl@0: } sl@0: sl@0: EXPORT_C void TASN1DecGeneric::InitL() sl@0: sl@0: // x209 6.2, 6.3 sl@0: { sl@0: if(iEncoding.Length() < KASN1ObjectMinLength) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: sl@0: TInt i=iEncoding[0]; sl@0: TInt b=i>>6; sl@0: iClass=(TASN1Class)b; sl@0: sl@0: TInt Length=0; sl@0: TInt LengthOfLength=1; sl@0: TInt Pos=0; sl@0: TInt T=0; sl@0: TInt encodingLength = iEncoding.Length(); sl@0: // work out tag sl@0: if ((iEncoding[Pos]&0x1f)==0x1f) sl@0: { sl@0: // tag greater than 30 sl@0: Pos++; sl@0: if (encodingLength <= Pos+1) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: while (iEncoding[Pos]>=128) sl@0: { sl@0: T<<=7; sl@0: T+=(TUint8)(iEncoding[Pos]&127); // this raises warning if TTagType is TUint8 sl@0: Pos++; sl@0: if (encodingLength <= Pos+1) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: } sl@0: T<<=7; sl@0: T+=(TUint8)iEncoding[Pos]; sl@0: } sl@0: else sl@0: { sl@0: T=(TUint8)(iEncoding[Pos]&0x1f); sl@0: } sl@0: iExplicitTag = T; sl@0: Pos++; sl@0: sl@0: TUint8 l = iEncoding[Pos]; sl@0: if (l > 128) sl@0: { sl@0: // this is a length of length sl@0: if (encodingLength <= Pos+1) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: LengthOfLength=iEncoding[Pos++]&127; sl@0: Length=0; sl@0: while (LengthOfLength) sl@0: { sl@0: if (encodingLength <= Pos+1) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: Length<<=8; sl@0: Length+=iEncoding[Pos++]; sl@0: LengthOfLength--; sl@0: } sl@0: } sl@0: if (l == 128) sl@0: { sl@0: //this is constructed, indefinite length: we don't support this sl@0: User::Leave(KErrNotSupported); sl@0: } sl@0: if (l < 128) sl@0: { sl@0: //this is a straight length sl@0: Length = iEncoding[Pos++]; sl@0: } sl@0: if (((Length+Pos)>encodingLength) || (Length < 0)) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: iStartOfContents = Pos; sl@0: iLength = Length; sl@0: } sl@0: sl@0: EXPORT_C TPtrC8 TASN1DecGeneric::GetContentDER(void) const sl@0: { sl@0: return iEncoding.Mid(iStartOfContents, iLength); sl@0: } sl@0: sl@0: EXPORT_C TInt TASN1DecGeneric::LengthDER(void) const sl@0: { sl@0: return iLength+iStartOfContents; sl@0: } sl@0: sl@0: EXPORT_C TInt TASN1DecGeneric::LengthDERContent(void) const sl@0: { sl@0: return iLength; sl@0: } sl@0: sl@0: EXPORT_C TInt TASN1DecGeneric::LengthDERHeader() const sl@0: { sl@0: return LengthDER() - LengthDERContent(); sl@0: } sl@0: sl@0: EXPORT_C TPtrC8 TASN1DecGeneric::Encoding() const sl@0: { sl@0: return iEncoding.Left(LengthDER()); sl@0: } sl@0: sl@0: EXPORT_C TTagType TASN1DecGeneric::Tag() const sl@0: // we can inline this sl@0: { sl@0: return iExplicitTag; sl@0: } sl@0: sl@0: EXPORT_C TASN1Class TASN1DecGeneric::Class() const sl@0: // we can inline this sl@0: { sl@0: return iClass; sl@0: } sl@0: