crypto/weakcryptospi/source/bigint/rinteger.cpp
changeset 19 cd501b96611d
equal deleted inserted replaced
15:da2ae96f639b 19:cd501b96611d
       
     1 /*
       
     2 * Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the License "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include <bigint.h>
       
    20 #include <e32std.h>
       
    21 #include <random.h>
       
    22 #include "../common/inlines.h"
       
    23 
       
    24 
       
    25 /** 
       
    26  * Copy constructor
       
    27  *
       
    28  * This function performs a shallow copy, 
       
    29  * i.e. the memory holding the integer is not copied.
       
    30  */
       
    31 EXPORT_C RInteger::RInteger(const RInteger& aInteger)
       
    32 	{
       
    33 	*this = aInteger;
       
    34 	}
       
    35 
       
    36 /** 
       
    37  * Assignment operator
       
    38  * 
       
    39  * This function performs a shallow copy, 
       
    40  * i.e. the memory holding the integer is not copied.
       
    41  */
       
    42 EXPORT_C RInteger& RInteger::operator=(const RInteger& aInteger)
       
    43 	{
       
    44 	iSize = aInteger.iSize;
       
    45 	iPtr = aInteger.iPtr;
       
    46 	return *this;
       
    47 	}
       
    48 
       
    49 
       
    50 /** 
       
    51  * Creates a new integer representing 0.
       
    52  * 
       
    53  * @return	An RInteger by value.
       
    54  */
       
    55 EXPORT_C RInteger RInteger::NewL(void)
       
    56 	{
       
    57 	return NewL(TInteger::Zero());
       
    58 	}
       
    59 
       
    60 /** 
       
    61  * Creates a new integer object representing a specified value.
       
    62  * 
       
    63  * @param aValue	A descriptor containing the big-endian binary
       
    64  * 					representation of the value.
       
    65  * @return			An RInteger object representing the value.
       
    66  */
       
    67 EXPORT_C RInteger RInteger::NewL(const TDesC8& aValue)
       
    68 	{
       
    69 	RInteger self;
       
    70 	//Construct zero's memory beyond the size of aValue after construction
       
    71 	self.CreateNewL(BytesToWords(aValue.Size()));
       
    72 	self.Construct(aValue);
       
    73 	return self;
       
    74 	}
       
    75 
       
    76 /** 
       
    77  * Creates an exact copy of an \c aInteger object.
       
    78  * 
       
    79  * @param aInteger	The integer you wish to copy
       
    80  * @return			An RInteger object representing an exact copy of 
       
    81  *					aInteger by value.
       
    82  */
       
    83 EXPORT_C RInteger RInteger::NewL(const TInteger& aInteger)
       
    84 	{
       
    85 	RInteger self;
       
    86 	//don't need to CleanNewL as we'll copy straight from aInteger
       
    87 	self.CreateNewL(aInteger.Size());
       
    88 	self.Construct(aInteger);
       
    89 	return self;
       
    90 	}
       
    91 
       
    92 /** 
       
    93  * Creates a random integer uniformly distributed over [0, 2^aBits].
       
    94  * 
       
    95  * @param aBits	The number of bits you wish to randomly select.
       
    96  * @param aAttr	Enum specifying whether specific bits in the random number should
       
    97  *				be set.  See TRandomAttribute for more information.
       
    98  * @return		A random RInteger object in the range specified.
       
    99  */
       
   100 EXPORT_C RInteger RInteger::NewRandomL(TUint aBits, TRandomAttribute aAttr)
       
   101 	{
       
   102 	RInteger self;
       
   103 	self.CleanNewL(BitsToWords(aBits));
       
   104 	CleanupStack::PushL(self);
       
   105 	self.RandomizeL(aBits, aAttr);
       
   106 	CleanupStack::Pop(&self); 
       
   107 	return self;
       
   108 	}
       
   109 
       
   110 /** 
       
   111  * Creates a random integer uniformly distributed over [x | min <= x <= max].
       
   112  * 
       
   113  * @param aMin	The smallest possible value for the random integer (inclusive).
       
   114  * @param aMax	The largest possible value for the random integer (inclusive).
       
   115  * @return		A random RInteger object in the range specified.
       
   116  */
       
   117 EXPORT_C RInteger RInteger::NewRandomL(const TInteger& aMin,
       
   118 	const TInteger& aMax)
       
   119 	{
       
   120 	RInteger self;
       
   121 	self.CleanNewL(aMax.Size());
       
   122 	CleanupStack::PushL(self);
       
   123 	self.RandomizeL(aMin, aMax);
       
   124 	CleanupStack::Pop(&self);
       
   125 	return self;
       
   126 	}
       
   127 
       
   128 /** 
       
   129  * Finds a random prime integer in the range of [2, 2^aBits].
       
   130  *
       
   131  * This is done by picking a random integer and using that as a starting point
       
   132  * for a sequential search for a prime.  To verify the primality of number, 
       
   133  * this algorithm uses a probablistic primality test.  This means that it is
       
   134  * possible, although extremely improbable, that the number returned is a pseudoprime.
       
   135  *
       
   136  * @param aBits	The number of bits you wish to randomly select your prime from.
       
   137  * @param aAttr	Enum specifying whether specific bits in the random number should
       
   138  *				be set.  See TRandomAttribute for more information.
       
   139  * @return		A random RInteger representing a probable prime (with very high
       
   140  *				probablity) in the range specified.
       
   141  */
       
   142 EXPORT_C RInteger RInteger::NewPrimeL(TUint aBits, TRandomAttribute aAttr)
       
   143 	{
       
   144 	RInteger self;
       
   145 	self.CleanNewL(BitsToWords(aBits));
       
   146 	CleanupStack::PushL(self);
       
   147 	self.PrimeRandomizeL(aBits, aAttr);
       
   148 	CleanupStack::Pop(&self);
       
   149 	return self;
       
   150 	}
       
   151 
       
   152 /** 
       
   153  * Creates a new integer from the value represented by \c aInteger.
       
   154  * 
       
   155  * @param aInteger	A signed word sized integer.
       
   156  * @return			An RInteger representation of aInteger by value.
       
   157  */
       
   158 EXPORT_C RInteger RInteger::NewL(TInt aInteger)
       
   159 	{
       
   160 	RInteger self;
       
   161 	self.CreateNewL(2);
       
   162 	self.Construct(aInteger);
       
   163 	return self;
       
   164 	}
       
   165 
       
   166 /** 
       
   167  * Creates a new integer with a preallocated internal storage of \c aNumWords all
       
   168  * initialised to zero.
       
   169  *
       
   170  * The resulting RInteger object is logically equivalent to RInteger::NewL(0).
       
   171  * The only difference is that the internal storage requirements have been 
       
   172  * specified to be larger than the default. This is useful if you are about 
       
   173  * to perform an operation on this integer, that you know the resulting size
       
   174  * requirements of, and wish to avoid a heap resize.
       
   175  *
       
   176  * @param aNumWords	The number of words for to preallocated and zero fill.
       
   177  * @return			An RInteger object representing 0 with a preallocated 
       
   178  *					zero-filled internal storage of aNumWords.
       
   179  */
       
   180 EXPORT_C RInteger RInteger::NewEmptyL(TUint aNumWords)
       
   181 	{
       
   182 	RInteger self;
       
   183 	self.CleanNewL(aNumWords);
       
   184 	//There's no construct as there isn't anything to do
       
   185 	return self;
       
   186 	}
       
   187 
       
   188 /**
       
   189  * Creates an RInteger object with no associated internal (heap) storage.
       
   190  * 
       
   191  * All data members are initialised to zero.  It is safe (although not strictly necessary)
       
   192  * to push such an RInteger object onto the CleanupStack.  This is useful, for example, if
       
   193  * you want to pass an RInteger object by reference into a function and have it create
       
   194  * the representation of the actual integer for you.  
       
   195  *
       
   196  * Note that performing any operation on such an RInteger object other than the default
       
   197  * assignment operator or copy constructor will panic your code.
       
   198  * 
       
   199  * @return	A stack based class that has no associated internal storage and thus
       
   200  *			does not represent any number.
       
   201  */
       
   202 EXPORT_C RInteger::RInteger(void)  
       
   203 	{
       
   204 	}
       
   205 
       
   206 /** 
       
   207  * An overloaded TCleanupItem() allowing the RIntegers to be pushed,
       
   208  * popped, and destroyed via the CleanupStack like any other CBase derived object.
       
   209  */
       
   210 EXPORT_C RInteger::operator TCleanupItem(void)
       
   211 	{
       
   212 	return TCleanupItem(&RInteger::CallClose, this);
       
   213 	}
       
   214 
       
   215 /** 
       
   216  * Helper function registered with the cleanup stack that just calls Close() for
       
   217  * this RInteger object.
       
   218  * 
       
   219  * @param aPtr	A pointer to the object for which clean-up is to be performed. 
       
   220  */
       
   221 EXPORT_C void RInteger::CallClose(TAny* aPtr)
       
   222 	{
       
   223 	((RInteger*)aPtr)->Close();	
       
   224 	}
       
   225 
       
   226 /** 
       
   227  * Zeros and then frees any memory owned by this RInteger object.
       
   228  *  
       
   229  * An RInteger object that has been closed can safely fall off the stack.
       
   230  */
       
   231 EXPORT_C void RInteger::Close(void)
       
   232 	{
       
   233 	if (iPtr)
       
   234 		{
       
   235 		Mem::FillZ(Ptr(), Size()*4);
       
   236 		User::Free(Ptr());
       
   237 		iSize = 0;
       
   238 		iPtr = NULL;
       
   239 		}
       
   240 	}
       
   241 
       
   242 // Method is excluded from coverage due to the problem with BullsEye on ONB.
       
   243 // Manually verified that this method is functionally covered.
       
   244 #ifdef _BullseyeCoverage
       
   245 #pragma suppress_warnings on
       
   246 #pragma BullseyeCoverage off
       
   247 #pragma suppress_warnings off
       
   248 #endif
       
   249 
       
   250 /** 
       
   251  * Creates a new integer from the value represented by \c aInteger.
       
   252  *
       
   253  * @param aInteger	An unsigned word sized integer.
       
   254  * @return			An RInteger representation of aInteger by value.
       
   255  */
       
   256 EXPORT_C RInteger RInteger::NewL(TUint aInteger)
       
   257 	{
       
   258 	RInteger self;
       
   259 	self.CreateNewL(2);
       
   260 	self.Construct(aInteger);
       
   261 	return self;
       
   262 	}