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: * This file contains the object implementing the Bitstring ASN1 object. sl@0: * There is no handling for constructed form of Bitstring right now. sl@0: * sl@0: */ sl@0: sl@0: sl@0: #include "asn1dec.h" sl@0: sl@0: EXPORT_C TASN1DecBitString::TASN1DecBitString(void) sl@0: { sl@0: } sl@0: sl@0: EXPORT_C HBufC8* TASN1DecBitString::DecodeDERL(const TDesC8& /*aSource*/,TInt& /*aPos*/) sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: return NULL; sl@0: } sl@0: sl@0: EXPORT_C HBufC8* TASN1DecBitString::DecodeDERL(const TASN1DecGeneric& /*aSource*/) sl@0: { sl@0: User::Leave(KErrNotSupported); sl@0: return NULL; sl@0: } sl@0: sl@0: EXPORT_C HBufC8* TASN1DecBitString::ExtractOctetStringL(const TDesC8& aSource,TInt& aPos) sl@0: { sl@0: TASN1DecGeneric gen(aSource.Right(aSource.Length() - aPos)); sl@0: gen.InitL(); sl@0: HBufC8* res = ExtractOctetStringL(gen); sl@0: aPos+=gen.LengthDER(); sl@0: return res; sl@0: } sl@0: sl@0: EXPORT_C HBufC8* TASN1DecBitString::ExtractOctetStringL(const TASN1DecGeneric& aSource) sl@0: { sl@0: TPtrC8 encoding = aSource.GetContentDER(); sl@0: sl@0: // Special case. The empty bit string. (No padding length octet) sl@0: if (encoding.Length() == 0 ) sl@0: { sl@0: return encoding.AllocL(); sl@0: } sl@0: sl@0: // Length must either be 0 for the empty string or >= 2 because sl@0: // of the padding length octet. sl@0: if (encoding.Length() == 1) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: sl@0: TUint8 paddingLength = encoding[0]; sl@0: if (paddingLength > 7) sl@0: { sl@0: User::Leave(KErrArgument); sl@0: } sl@0: TPtrC8 pEncoding = encoding.Right(encoding.Length()-1); sl@0: HBufC8* octetStr = pEncoding.AllocL(); sl@0: TPtr8 pEncKey = octetStr->Des(); sl@0: sl@0: //stop stupid compiler warning sl@0: TUint8 mask =(TUint8)(255 << paddingLength); sl@0: //stop stupid compiler warning sl@0: pEncKey[pEncKey.Length()-1] = (TUint8) ((pEncKey[pEncKey.Length()-1]) & mask); sl@0: return octetStr; sl@0: }