diff -r 000000000000 -r 2c201484c85f cryptoservices/certificateandkeymgmt/asn1/bigintenc.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cryptoservices/certificateandkeymgmt/asn1/bigintenc.cpp Wed Jul 08 11:25:26 2009 +0100 @@ -0,0 +1,117 @@ +/* +* Copyright (c) 2001-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: +* Implementation for the class encoding Big Integers in ASN1 DER +* +*/ + + +#include + +#include + + +EXPORT_C CASN1EncBigInt* CASN1EncBigInt::NewLC(const TInteger& aInteger) + { + CASN1EncBigInt* self = new (ELeave) CASN1EncBigInt(); + CleanupStack::PushL(self); + self->ConstructL(aInteger); + return self; + } + +EXPORT_C CASN1EncBigInt* CASN1EncBigInt::NewL(const TInteger& aInteger) + { + CASN1EncBigInt* self = NewLC(aInteger); + CleanupStack::Pop(self); + return self; + } + + +EXPORT_C CASN1EncBigInt::~CASN1EncBigInt() + { + delete iContents; + } + + +CASN1EncBigInt::CASN1EncBigInt() +: CASN1EncPrimitive(EASN1Integer) + { + } + +void CASN1EncBigInt::ConstructL(const TInteger& aInteger) +{ + iContents = aInteger.BufferLC(); + + CleanupStack::Pop(); // We take ownership of the contents + + // May wish to skip leading byte(s) if they're unnecessary - use + // iWriteContents to point to the minimal part of Contents, that we'll actually use. + TInt last = iContents->Length() - 1; + TInt first = 0; +// if (aInteger >= 0) // Only signed integers now... +// { + while (first < last + && (*iContents)[first] == 0 + && !((*iContents)[first + 1] & 0x80)) + { + ++first; + } +// } +/* else + { + while (first < last + && (*iContents)[first] == 0xFF + && (*iContents)[first + 1] & 0x80) + { + ++first; + } + } +*/ + //to encode positive integers correctly add a leading zero byte + //if the first bit is set DEF038956 + if (iContents->Length() != 0) + { + if ((*iContents)[first] & 0x80) + { + _LIT8(KPadZero, "\0"); + TPtr8 ptr = iContents->Des(); + //check if the buffer does not have enough space to insert a byte + if (ptr.Length() == ptr.MaxLength()) + { + iContents = iContents->ReAllocL(iContents->Length() + 1); + TPtr8 reallocptr = iContents->Des(); + reallocptr.Insert(0, KPadZero); + } + else + ptr.Insert(0, KPadZero); + } + } + + + iWriteContents.Set(iContents->Mid(first)); + + CASN1EncPrimitive::ConstructL(); + } + + +void CASN1EncBigInt::CalculateContentsLengthDER() + { + iContentsLengthDER = iWriteContents.Length(); + } + + +void CASN1EncBigInt::WriteContentsDERL(TDes8& aBuf) const + { + aBuf.Copy(iWriteContents); + }