--- /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 <asn1enc.h>
+
+#include <bigint.h>
+
+
+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);
+ }