<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>Crypto++: integer.h Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.3.7 --> <div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="globals.html">File Members</a></div> <h1>integer.h</h1><a href="integer_8h.html">Go to the documentation of this file.</a><pre class="fragment"><div>00001 <span class="preprocessor">#ifndef CRYPTOPP_INTEGER_H</span> 00002 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_INTEGER_H</span> 00003 <span class="preprocessor"></span><span class="comment"></span> 00004 <span class="comment">/** \file */</span> 00005 00006 <span class="preprocessor">#include "<a class="code" href="cryptlib_8h.html">cryptlib.h</a>"</span> 00007 <span class="preprocessor">#include "secblock.h"</span> 00008 00009 <span class="preprocessor">#include <iosfwd></span> 00010 <span class="preprocessor">#include <algorithm></span> 00011 00012 <span class="preprocessor">#ifdef CRYPTOPP_X86ASM_AVAILABLE</span> 00013 <span class="preprocessor"></span> 00014 <span class="preprocessor">#ifdef _M_IX86</span> 00015 <span class="preprocessor"></span><span class="preprocessor"> #if (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 500)) || (defined(__ICL) && (__ICL >= 500))</span> 00016 <span class="preprocessor"></span><span class="preprocessor"> #define SSE2_INTRINSICS_AVAILABLE</span> 00017 <span class="preprocessor"></span><span class="preprocessor"> #define CRYPTOPP_MM_MALLOC_AVAILABLE</span> 00018 <span class="preprocessor"></span><span class="preprocessor"> #elif defined(_MSC_VER)</span> 00019 <span class="preprocessor"></span> <span class="comment">// _mm_free seems to be the only way to tell if the Processor Pack is installed or not</span> 00020 <span class="preprocessor"> #include <malloc.h></span> 00021 <span class="preprocessor"> #if defined(_mm_free)</span> 00022 <span class="preprocessor"></span><span class="preprocessor"> #define SSE2_INTRINSICS_AVAILABLE</span> 00023 <span class="preprocessor"></span><span class="preprocessor"> #define CRYPTOPP_MM_MALLOC_AVAILABLE</span> 00024 <span class="preprocessor"></span><span class="preprocessor"> #endif</span> 00025 <span class="preprocessor"></span><span class="preprocessor"> #endif</span> 00026 <span class="preprocessor"></span><span class="preprocessor">#endif</span> 00027 <span class="preprocessor"></span> 00028 <span class="comment">// SSE2 intrinsics work in GCC 3.3 or later</span> 00029 <span class="preprocessor">#if defined(__SSE2__) && (__GNUC_MAJOR__ > 3 || __GNUC_MINOR__ > 2)</span> 00030 <span class="preprocessor"></span><span class="preprocessor"> #define SSE2_INTRINSICS_AVAILABLE</span> 00031 <span class="preprocessor"></span><span class="preprocessor">#endif</span> 00032 <span class="preprocessor"></span> 00033 <span class="preprocessor">#endif</span> 00034 <span class="preprocessor"></span> 00035 NAMESPACE_BEGIN(CryptoPP) 00036 00037 #<span class="keywordflow">if</span> defined(SSE2_INTRINSICS_AVAILABLE) 00038 template <class T> 00039 class AlignedAllocator : public AllocatorBase<T> 00040 { 00041 <span class="keyword">public</span>: 00042 CRYPTOPP_INHERIT_ALLOCATOR_TYPES 00043 00044 pointer allocate(size_type n, <span class="keyword">const</span> <span class="keywordtype">void</span> *); 00045 <span class="keywordtype">void</span> deallocate(<span class="keywordtype">void</span> *p, size_type n); 00046 pointer reallocate(T *p, size_type oldSize, size_type newSize, <span class="keywordtype">bool</span> preserve) 00047 { 00048 <span class="keywordflow">return</span> StandardReallocate(*<span class="keyword">this</span>, p, oldSize, newSize, preserve); 00049 } 00050 00051 <span class="preprocessor"> #if !(defined(CRYPTOPP_MALLOC_ALIGNMENT_IS_16) || defined(CRYPTOPP_MEMALIGN_AVAILABLE) || defined(CRYPTOPP_MM_MALLOC_AVAILABLE))</span> 00052 <span class="preprocessor"></span><span class="preprocessor"> #define CRYPTOPP_NO_ALIGNED_ALLOC</span> 00053 <span class="preprocessor"></span> AlignedAllocator() : m_pBlock(NULL) {} 00054 <span class="keyword">protected</span>: 00055 <span class="keywordtype">void</span> *m_pBlock; 00056 <span class="preprocessor"> #endif</span> 00057 <span class="preprocessor"></span> }; 00058 00059 <span class="keyword">template</span> <span class="keyword">class </span>CRYPTOPP_DLL AlignedAllocator<word>; 00060 <span class="keyword">typedef</span> <a class="code" href="class_sec_block.html">SecBlock<word, AlignedAllocator<word></a> > <a class="code" href="class_sec_block.html">SecAlignedWordBlock</a>; 00061 <span class="preprocessor">#else</span> 00062 <span class="preprocessor"></span> <span class="keyword">typedef</span> <a class="code" href="class_sec_block.html">SecWordBlock</a> SecAlignedWordBlock; 00063 <span class="preprocessor">#endif</span> 00064 <span class="preprocessor"></span> 00065 <span class="keywordtype">void</span> CRYPTOPP_DLL DisableSSE2(); 00066 <span class="comment"></span> 00067 <span class="comment">//! multiple precision integer and basic arithmetics</span> 00068 <span class="comment"></span><span class="comment">/*! This class can represent positive and negative integers</span> 00069 <span class="comment"> with absolute value less than (256**sizeof(word)) ** (256**sizeof(int)).</span> 00070 <span class="comment"> \nosubgrouping</span> 00071 <span class="comment">*/</span> <a name="l00072"></a><a class="code" href="class_integer.html">00072</a> <span class="keyword">class </span>CRYPTOPP_DLL Integer : <span class="keyword">public</span> <a class="code" href="class_a_s_n1_object.html">ASN1Object</a> 00073 { 00074 <span class="keyword">public</span>:<span class="comment"></span> 00075 <span class="comment"> //! \name ENUMS, EXCEPTIONS, and TYPEDEFS</span> 00076 <span class="comment"></span><span class="comment"> //@{</span> 00077 <span class="comment"></span><span class="comment"> //! division by zero exception</span> <a name="l00078"></a><a class="code" href="class_integer_1_1_divide_by_zero.html">00078</a> <span class="comment"></span> <span class="keyword">class </span><a class="code" href="class_integer_1_1_divide_by_zero.html">DivideByZero</a> : <span class="keyword">public</span> <a class="code" href="class_exception.html">Exception</a> 00079 { 00080 <span class="keyword">public</span>: 00081 <a class="code" href="class_integer_1_1_divide_by_zero.html">DivideByZero</a>() : <a class="code" href="class_exception.html">Exception</a>(OTHER_ERROR, <span class="stringliteral">"Integer: division by zero"</span>) {} 00082 }; 00083 <span class="comment"></span> 00084 <span class="comment"> //!</span> 00085 <span class="comment"></span> <span class="keyword">class </span>RandomNumberNotFound : <span class="keyword">public</span> <a class="code" href="class_exception.html">Exception</a> 00086 { 00087 <span class="keyword">public</span>: 00088 RandomNumberNotFound() : <a class="code" href="class_exception.html">Exception</a>(OTHER_ERROR, "Integer: no integer satisfies the given parameters") {} 00089 }; 00090 <span class="comment"></span> 00091 <span class="comment"> //!</span> 00092 <span class="comment"></span> <span class="keyword">enum</span> Sign {POSITIVE=0, NEGATIVE=1}; 00093 <span class="comment"></span> 00094 <span class="comment"> //!</span> 00095 <span class="comment"></span> <span class="keyword">enum</span> Signedness {<span class="comment"></span> 00096 <span class="comment"> //!</span> 00097 <span class="comment"></span> UNSIGNED,<span class="comment"></span> 00098 <span class="comment"> //!</span> 00099 <span class="comment"></span> SIGNED}; 00100 <span class="comment"></span> 00101 <span class="comment"> //!</span> 00102 <span class="comment"></span> <span class="keyword">enum</span> RandomNumberType {<span class="comment"></span> 00103 <span class="comment"> //!</span> 00104 <span class="comment"></span> ANY,<span class="comment"></span> 00105 <span class="comment"> //!</span> 00106 <span class="comment"></span> PRIME};<span class="comment"></span> 00107 <span class="comment"> //@}</span> 00108 <span class="comment"></span><span class="comment"></span> 00109 <span class="comment"> //! \name CREATORS</span> 00110 <span class="comment"></span><span class="comment"> //@{</span> 00111 <span class="comment"></span><span class="comment"> //! creates the zero integer</span> 00112 <span class="comment"></span> Integer(); 00113 <span class="comment"></span> 00114 <span class="comment"> //! copy constructor</span> 00115 <span class="comment"></span> Integer(<span class="keyword">const</span> Integer& t); 00116 <span class="comment"></span> 00117 <span class="comment"> //! convert from signed long</span> 00118 <span class="comment"></span> Integer(<span class="keywordtype">signed</span> <span class="keywordtype">long</span> value); 00119 <span class="comment"></span> 00120 <span class="comment"> //! convert from lword</span> 00121 <span class="comment"></span> Integer(Sign s, lword value); 00122 <span class="comment"></span> 00123 <span class="comment"> //! convert from two words</span> 00124 <span class="comment"></span> Integer(Sign s, word highWord, word lowWord); 00125 <span class="comment"></span> 00126 <span class="comment"> //! convert from string</span> 00127 <span class="comment"></span><span class="comment"> /*! str can be in base 2, 8, 10, or 16. Base is determined by a</span> 00128 <span class="comment"> case insensitive suffix of 'h', 'o', or 'b'. No suffix means base 10.</span> 00129 <span class="comment"> */</span> 00130 <span class="keyword">explicit</span> Integer(<span class="keyword">const</span> <span class="keywordtype">char</span> *str); 00131 <span class="keyword">explicit</span> Integer(<span class="keyword">const</span> <span class="keywordtype">wchar_t</span> *str); 00132 <span class="comment"></span> 00133 <span class="comment"> //! convert from big-endian byte array</span> 00134 <span class="comment"></span> Integer(<span class="keyword">const</span> byte *encodedInteger, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> byteCount, Signedness s=UNSIGNED); 00135 <span class="comment"></span> 00136 <span class="comment"> //! convert from big-endian form stored in a BufferedTransformation</span> 00137 <span class="comment"></span> Integer(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> byteCount, Signedness s=UNSIGNED); 00138 <span class="comment"></span> 00139 <span class="comment"> //! convert from BER encoded byte array stored in a BufferedTransformation object</span> 00140 <span class="comment"></span> <span class="keyword">explicit</span> Integer(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt); 00141 <span class="comment"></span> 00142 <span class="comment"> //! create a random integer</span> 00143 <span class="comment"></span><span class="comment"> /*! The random integer created is uniformly distributed over [0, 2**bitcount). */</span> 00144 Integer(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bitcount); 00145 <span class="comment"></span> 00146 <span class="comment"> //! avoid calling constructors for these frequently used integers</span> 00147 <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> Integer &Zero();<span class="comment"></span> 00148 <span class="comment"> //! avoid calling constructors for these frequently used integers</span> 00149 <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> Integer &One();<span class="comment"></span> 00150 <span class="comment"> //! avoid calling constructors for these frequently used integers</span> 00151 <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> Integer &Two(); 00152 <span class="comment"></span> 00153 <span class="comment"> //! create a random integer of special type</span> 00154 <span class="comment"></span><span class="comment"> /*! Ideally, the random integer created should be uniformly distributed</span> 00155 <span class="comment"> over {x | min <= x <= max and x is of rnType and x % mod == equiv}.</span> 00156 <span class="comment"> However the actual distribution may not be uniform because sequential</span> 00157 <span class="comment"> search is used to find an appropriate number from a random starting</span> 00158 <span class="comment"> point.</span> 00159 <span class="comment"> May return (with very small probability) a pseudoprime when a prime</span> 00160 <span class="comment"> is requested and max > lastSmallPrime*lastSmallPrime (lastSmallPrime</span> 00161 <span class="comment"> is declared in nbtheory.h).</span> 00162 <span class="comment"> \throw RandomNumberNotFound if the set is empty.</span> 00163 <span class="comment"> */</span> 00164 Integer(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keyword">const</span> Integer &min, <span class="keyword">const</span> Integer &max, RandomNumberType rnType=ANY, <span class="keyword">const</span> Integer &equiv=Zero(), <span class="keyword">const</span> Integer &mod=One()); 00165 <span class="comment"></span> 00166 <span class="comment"> //! return the integer 2**e</span> 00167 <span class="comment"></span> <span class="keyword">static</span> Integer Power2(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> e);<span class="comment"></span> 00168 <span class="comment"> //@}</span> 00169 <span class="comment"></span><span class="comment"></span> 00170 <span class="comment"> //! \name ENCODE/DECODE</span> 00171 <span class="comment"></span><span class="comment"> //@{</span> 00172 <span class="comment"></span><span class="comment"> //! minimum number of bytes to encode this integer</span> 00173 <span class="comment"></span><span class="comment"> /*! MinEncodedSize of 0 is 1 */</span> 00174 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> MinEncodedSize(Signedness=UNSIGNED) <span class="keyword">const</span>;<span class="comment"></span> 00175 <span class="comment"> //! encode in big-endian format</span> 00176 <span class="comment"></span><span class="comment"> /*! unsigned means encode absolute value, signed means encode two's complement if negative.</span> 00177 <span class="comment"> if outputLen < MinEncodedSize, the most significant bytes will be dropped</span> 00178 <span class="comment"> if outputLen > MinEncodedSize, the most significant bytes will be padded</span> 00179 <span class="comment"> */</span> 00180 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Encode(byte *output, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputLen, Signedness=UNSIGNED) <span class="keyword">const</span>;<span class="comment"></span> 00181 <span class="comment"> //!</span> 00182 <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Encode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputLen, Signedness=UNSIGNED) <span class="keyword">const</span>; 00183 <span class="comment"></span> 00184 <span class="comment"> //! encode using Distinguished Encoding Rules, put result into a BufferedTransformation object</span> 00185 <span class="comment"></span> <span class="keywordtype">void</span> DEREncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt) <span class="keyword">const</span>; 00186 <span class="comment"></span> 00187 <span class="comment"> //! encode absolute value as big-endian octet string</span> 00188 <span class="comment"></span> <span class="keywordtype">void</span> DEREncodeAsOctetString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length) <span class="keyword">const</span>; 00189 <span class="comment"></span> 00190 <span class="comment"> //! encode absolute value in OpenPGP format, return length of output</span> 00191 <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> OpenPGPEncode(byte *output, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufferSize) <span class="keyword">const</span>;<span class="comment"></span> 00192 <span class="comment"> //! encode absolute value in OpenPGP format, put result into a BufferedTransformation object</span> 00193 <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> OpenPGPEncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt) <span class="keyword">const</span>; 00194 <span class="comment"></span> 00195 <span class="comment"> //!</span> 00196 <span class="comment"></span> <span class="keywordtype">void</span> Decode(<span class="keyword">const</span> byte *input, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inputLen, Signedness=UNSIGNED);<span class="comment"></span> 00197 <span class="comment"> //! </span> 00198 <span class="comment"></span> <span class="comment">//* Precondition: bt.MaxRetrievable() >= inputLen</span> 00199 <span class="keywordtype">void</span> Decode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inputLen, Signedness=UNSIGNED); 00200 <span class="comment"></span> 00201 <span class="comment"> //!</span> 00202 <span class="comment"></span> <span class="keywordtype">void</span> BERDecode(<span class="keyword">const</span> byte *input, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inputLen);<span class="comment"></span> 00203 <span class="comment"> //!</span> 00204 <span class="comment"></span> <span class="keywordtype">void</span> BERDecode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt); 00205 <span class="comment"></span> 00206 <span class="comment"> //! decode nonnegative value as big-endian octet string</span> 00207 <span class="comment"></span> <span class="keywordtype">void</span> BERDecodeAsOctetString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length); 00208 00209 <span class="keyword">class </span>OpenPGPDecodeErr : <span class="keyword">public</span> <a class="code" href="class_exception.html">Exception</a> 00210 { 00211 <span class="keyword">public</span>: 00212 OpenPGPDecodeErr() : <a class="code" href="class_exception.html">Exception</a>(INVALID_DATA_FORMAT, "OpenPGP decode error") {} 00213 }; 00214 <span class="comment"></span> 00215 <span class="comment"> //!</span> 00216 <span class="comment"></span> <span class="keywordtype">void</span> OpenPGPDecode(<span class="keyword">const</span> byte *input, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inputLen);<span class="comment"></span> 00217 <span class="comment"> //!</span> 00218 <span class="comment"></span> <span class="keywordtype">void</span> OpenPGPDecode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt);<span class="comment"></span> 00219 <span class="comment"> //@}</span> 00220 <span class="comment"></span><span class="comment"></span> 00221 <span class="comment"> //! \name ACCESSORS</span> 00222 <span class="comment"></span><span class="comment"> //@{</span> 00223 <span class="comment"></span><span class="comment"> //! return true if *this can be represented as a signed long</span> 00224 <span class="comment"></span> <span class="keywordtype">bool</span> IsConvertableToLong() const;<span class="comment"></span> 00225 <span class="comment"> //! return equivalent signed long if possible, otherwise undefined</span> 00226 <span class="comment"></span> <span class="keywordtype">signed</span> <span class="keywordtype">long</span> ConvertToLong() const; 00227 <span class="comment"></span> 00228 <span class="comment"> //! number of significant bits = floor(log2(abs(*this))) + 1</span> 00229 <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BitCount() const;<span class="comment"></span> 00230 <span class="comment"> //! number of significant bytes = ceiling(BitCount()/8)</span> 00231 <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ByteCount() const;<span class="comment"></span> 00232 <span class="comment"> //! number of significant words = ceiling(ByteCount()/sizeof(word))</span> 00233 <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> WordCount() const; 00234 <span class="comment"></span> 00235 <span class="comment"> //! return the i-th bit, i=0 being the least significant bit</span> 00236 <span class="comment"></span> <span class="keywordtype">bool</span> GetBit(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i) const;<span class="comment"></span> 00237 <span class="comment"> //! return the i-th byte</span> 00238 <span class="comment"></span> byte GetByte(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i) const;<span class="comment"></span> 00239 <span class="comment"> //! return n lowest bits of *this >> i</span> 00240 <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> GetBits(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n) const; 00241 <span class="comment"></span> 00242 <span class="comment"> //!</span> 00243 <span class="comment"></span> <span class="keywordtype">bool</span> IsZero()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !*<span class="keyword">this</span>;}<span class="comment"></span> 00244 <span class="comment"> //!</span> 00245 <span class="comment"></span> <span class="keywordtype">bool</span> NotZero()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !IsZero();}<span class="comment"></span> 00246 <span class="comment"> //!</span> 00247 <span class="comment"></span> <span class="keywordtype">bool</span> IsNegative()<span class="keyword"> const </span>{<span class="keywordflow">return</span> sign == NEGATIVE;}<span class="comment"></span> 00248 <span class="comment"> //!</span> 00249 <span class="comment"></span> <span class="keywordtype">bool</span> NotNegative()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !IsNegative();}<span class="comment"></span> 00250 <span class="comment"> //!</span> 00251 <span class="comment"></span> <span class="keywordtype">bool</span> IsPositive()<span class="keyword"> const </span>{<span class="keywordflow">return</span> NotNegative() && NotZero();}<span class="comment"></span> 00252 <span class="comment"> //!</span> 00253 <span class="comment"></span> <span class="keywordtype">bool</span> NotPositive()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !IsPositive();}<span class="comment"></span> 00254 <span class="comment"> //!</span> 00255 <span class="comment"></span> <span class="keywordtype">bool</span> IsEven()<span class="keyword"> const </span>{<span class="keywordflow">return</span> GetBit(0) == 0;}<span class="comment"></span> 00256 <span class="comment"> //!</span> 00257 <span class="comment"></span> <span class="keywordtype">bool</span> IsOdd()<span class="keyword"> const </span>{<span class="keywordflow">return</span> GetBit(0) == 1;}<span class="comment"></span> 00258 <span class="comment"> //@}</span> 00259 <span class="comment"></span><span class="comment"></span> 00260 <span class="comment"> //! \name MANIPULATORS</span> 00261 <span class="comment"></span><span class="comment"> //@{</span> 00262 <span class="comment"></span><span class="comment"> //!</span> 00263 <span class="comment"></span> Integer& operator=(<span class="keyword">const</span> Integer& t); 00264 <span class="comment"></span> 00265 <span class="comment"> //!</span> 00266 <span class="comment"></span> Integer& operator+=(<span class="keyword">const</span> Integer& t);<span class="comment"></span> 00267 <span class="comment"> //!</span> 00268 <span class="comment"></span> Integer& operator-=(<span class="keyword">const</span> Integer& t);<span class="comment"></span> 00269 <span class="comment"> //!</span> 00270 <span class="comment"></span> Integer& operator*=(<span class="keyword">const</span> Integer& t) {<span class="keywordflow">return</span> *<span class="keyword">this</span> = Times(t);}<span class="comment"></span> 00271 <span class="comment"> //!</span> 00272 <span class="comment"></span> Integer& operator/=(<span class="keyword">const</span> Integer& t) {<span class="keywordflow">return</span> *<span class="keyword">this</span> = DividedBy(t);}<span class="comment"></span> 00273 <span class="comment"> //!</span> 00274 <span class="comment"></span> Integer& operator%=(<span class="keyword">const</span> Integer& t) {<span class="keywordflow">return</span> *<span class="keyword">this</span> = Modulo(t);}<span class="comment"></span> 00275 <span class="comment"> //!</span> 00276 <span class="comment"></span> Integer& operator/=(word t) {<span class="keywordflow">return</span> *<span class="keyword">this</span> = DividedBy(t);}<span class="comment"></span> 00277 <span class="comment"> //!</span> 00278 <span class="comment"></span> Integer& operator%=(word t) {<span class="keywordflow">return</span> *<span class="keyword">this</span> = Modulo(t);} 00279 <span class="comment"></span> 00280 <span class="comment"> //!</span> 00281 <span class="comment"></span> Integer& operator<<=(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>);<span class="comment"></span> 00282 <span class="comment"> //!</span> 00283 <span class="comment"></span> Integer& operator>>=(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>); 00284 <span class="comment"></span> 00285 <span class="comment"> //!</span> 00286 <span class="comment"></span> <span class="keywordtype">void</span> Randomize(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bitcount);<span class="comment"></span> 00287 <span class="comment"> //!</span> 00288 <span class="comment"></span> <span class="keywordtype">void</span> Randomize(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keyword">const</span> Integer &min, <span class="keyword">const</span> Integer &max);<span class="comment"></span> 00289 <span class="comment"> //! set this Integer to a random element of {x | min <= x <= max and x is of rnType and x % mod == equiv}</span> 00290 <span class="comment"></span><span class="comment"> /*! returns false if the set is empty */</span> 00291 <span class="keywordtype">bool</span> Randomize(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keyword">const</span> Integer &min, <span class="keyword">const</span> Integer &max, RandomNumberType rnType, <span class="keyword">const</span> Integer &equiv=Zero(), <span class="keyword">const</span> Integer &mod=One()); 00292 00293 <span class="keywordtype">bool</span> GenerateRandomNoThrow(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &params = g_nullNameValuePairs); 00294 <span class="keywordtype">void</span> GenerateRandom(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &params = g_nullNameValuePairs) 00295 { 00296 <span class="keywordflow">if</span> (!GenerateRandomNoThrow(rng, params)) 00297 <span class="keywordflow">throw</span> RandomNumberNotFound(); 00298 } 00299 <span class="comment"></span> 00300 <span class="comment"> //! set the n-th bit to value</span> 00301 <span class="comment"></span> <span class="keywordtype">void</span> SetBit(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n, <span class="keywordtype">bool</span> value=1);<span class="comment"></span> 00302 <span class="comment"> //! set the n-th byte to value</span> 00303 <span class="comment"></span> <span class="keywordtype">void</span> SetByte(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n, byte value); 00304 <span class="comment"></span> 00305 <span class="comment"> //!</span> 00306 <span class="comment"></span> <span class="keywordtype">void</span> Negate();<span class="comment"></span> 00307 <span class="comment"> //!</span> 00308 <span class="comment"></span> <span class="keywordtype">void</span> SetPositive() {sign = POSITIVE;}<span class="comment"></span> 00309 <span class="comment"> //!</span> 00310 <span class="comment"></span> <span class="keywordtype">void</span> SetNegative() {<span class="keywordflow">if</span> (!!(*this)) sign = NEGATIVE;} 00311 <span class="comment"></span> 00312 <span class="comment"> //!</span> 00313 <span class="comment"></span> <span class="keywordtype">void</span> swap(Integer &a);<span class="comment"></span> 00314 <span class="comment"> //@}</span> 00315 <span class="comment"></span><span class="comment"></span> 00316 <span class="comment"> //! \name UNARY OPERATORS</span> 00317 <span class="comment"></span><span class="comment"> //@{</span> 00318 <span class="comment"></span><span class="comment"> //!</span> 00319 <span class="comment"></span> <span class="keywordtype">bool</span> operator!() const;<span class="comment"></span> 00320 <span class="comment"> //!</span> 00321 <span class="comment"></span> Integer operator+()<span class="keyword"> const </span>{<span class="keywordflow">return</span> *<span class="keyword">this</span>;}<span class="comment"></span> 00322 <span class="comment"> //!</span> 00323 <span class="comment"></span> Integer operator-() const;<span class="comment"></span> 00324 <span class="comment"> //!</span> 00325 <span class="comment"></span> Integer& operator++();<span class="comment"></span> 00326 <span class="comment"> //!</span> 00327 <span class="comment"></span> Integer& operator--();<span class="comment"></span> 00328 <span class="comment"> //!</span> 00329 <span class="comment"></span> Integer operator++(<span class="keywordtype">int</span>) {Integer temp = *<span class="keyword">this</span>; ++*<span class="keyword">this</span>; <span class="keywordflow">return</span> temp;}<span class="comment"></span> 00330 <span class="comment"> //!</span> 00331 <span class="comment"></span> Integer operator--(<span class="keywordtype">int</span>) {Integer temp = *<span class="keyword">this</span>; --*<span class="keyword">this</span>; <span class="keywordflow">return</span> temp;}<span class="comment"></span> 00332 <span class="comment"> //@}</span> 00333 <span class="comment"></span><span class="comment"></span> 00334 <span class="comment"> //! \name BINARY OPERATORS</span> 00335 <span class="comment"></span><span class="comment"> //@{</span> 00336 <span class="comment"></span><span class="comment"> //! signed comparison</span> 00337 <span class="comment"></span><span class="comment"> /*! \retval -1 if *this < a</span> 00338 <span class="comment"> \retval 0 if *this = a</span> 00339 <span class="comment"> \retval 1 if *this > a</span> 00340 <span class="comment"> */</span> 00341 <span class="keywordtype">int</span> Compare(<span class="keyword">const</span> Integer& a) <span class="keyword">const</span>; 00342 <span class="comment"></span> 00343 <span class="comment"> //!</span> 00344 <span class="comment"></span> Integer Plus(<span class="keyword">const</span> Integer &b) <span class="keyword">const</span>;<span class="comment"></span> 00345 <span class="comment"> //!</span> 00346 <span class="comment"></span> Integer Minus(<span class="keyword">const</span> Integer &b) <span class="keyword">const</span>;<span class="comment"></span> 00347 <span class="comment"> //!</span> 00348 <span class="comment"></span> Integer Times(<span class="keyword">const</span> Integer &b) <span class="keyword">const</span>;<span class="comment"></span> 00349 <span class="comment"> //!</span> 00350 <span class="comment"></span> Integer DividedBy(<span class="keyword">const</span> Integer &b) <span class="keyword">const</span>;<span class="comment"></span> 00351 <span class="comment"> //!</span> 00352 <span class="comment"></span> Integer Modulo(<span class="keyword">const</span> Integer &b) <span class="keyword">const</span>;<span class="comment"></span> 00353 <span class="comment"> //!</span> 00354 <span class="comment"></span> Integer DividedBy(word b) <span class="keyword">const</span>;<span class="comment"></span> 00355 <span class="comment"> //!</span> 00356 <span class="comment"></span> word Modulo(word b) <span class="keyword">const</span>; 00357 <span class="comment"></span> 00358 <span class="comment"> //!</span> 00359 <span class="comment"></span> Integer operator>>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n)<span class="keyword"> const </span>{<span class="keywordflow">return</span> Integer(*<span class="keyword">this</span>)>>=n;}<span class="comment"></span> 00360 <span class="comment"> //!</span> 00361 <span class="comment"></span> Integer operator<<(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n)<span class="keyword"> const </span>{<span class="keywordflow">return</span> Integer(*<span class="keyword">this</span>)<<=n;}<span class="comment"></span> 00362 <span class="comment"> //@}</span> 00363 <span class="comment"></span><span class="comment"></span> 00364 <span class="comment"> //! \name OTHER ARITHMETIC FUNCTIONS</span> 00365 <span class="comment"></span><span class="comment"> //@{</span> 00366 <span class="comment"></span><span class="comment"> //!</span> 00367 <span class="comment"></span> Integer AbsoluteValue() const;<span class="comment"></span> 00368 <span class="comment"> //!</span> 00369 <span class="comment"></span> Integer Doubled()<span class="keyword"> const </span>{<span class="keywordflow">return</span> Plus(*<span class="keyword">this</span>);}<span class="comment"></span> 00370 <span class="comment"> //!</span> 00371 <span class="comment"></span> Integer Squared()<span class="keyword"> const </span>{<span class="keywordflow">return</span> Times(*<span class="keyword">this</span>);}<span class="comment"></span> 00372 <span class="comment"> //! extract square root, if negative return 0, else return floor of square root</span> 00373 <span class="comment"></span> Integer SquareRoot() const;<span class="comment"></span> 00374 <span class="comment"> //! return whether this integer is a perfect square</span> 00375 <span class="comment"></span> <span class="keywordtype">bool</span> IsSquare() const; 00376 <span class="comment"></span> 00377 <span class="comment"> //! is 1 or -1</span> 00378 <span class="comment"></span> <span class="keywordtype">bool</span> IsUnit() const;<span class="comment"></span> 00379 <span class="comment"> //! return inverse if 1 or -1, otherwise return 0</span> 00380 <span class="comment"></span> Integer MultiplicativeInverse() const; 00381 <span class="comment"></span> 00382 <span class="comment"> //! modular multiplication</span> 00383 <span class="comment"></span> CRYPTOPP_DLL friend Integer a_times_b_mod_c(const Integer &x, const Integer& y, const Integer& m);<span class="comment"></span> 00384 <span class="comment"> //! modular exponentiation</span> 00385 <span class="comment"></span> CRYPTOPP_DLL friend Integer a_exp_b_mod_c(const Integer &x, const Integer& e, const Integer& m); 00386 <span class="comment"></span> 00387 <span class="comment"> //! calculate r and q such that (a == d*q + r) && (0 <= r < abs(d))</span> 00388 <span class="comment"></span> static <span class="keywordtype">void</span> Divide(Integer &r, Integer &q, const Integer &a, const Integer &d);<span class="comment"></span> 00389 <span class="comment"> //! use a faster division algorithm when divisor is short</span> 00390 <span class="comment"></span> static <span class="keywordtype">void</span> Divide(word &r, Integer &q, const Integer &a, word d); 00391 <span class="comment"></span> 00392 <span class="comment"> //! returns same result as Divide(r, q, a, Power2(n)), but faster</span> 00393 <span class="comment"></span> static <span class="keywordtype">void</span> DivideByPowerOf2(Integer &r, Integer &q, const Integer &a, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n); 00394 <span class="comment"></span> 00395 <span class="comment"> //! greatest common divisor</span> 00396 <span class="comment"></span> static Integer Gcd(const Integer &a, const Integer &n);<span class="comment"></span> 00397 <span class="comment"> //! calculate multiplicative inverse of *this mod n</span> 00398 <span class="comment"></span> Integer InverseMod(const Integer &n) const;<span class="comment"></span> 00399 <span class="comment"> //!</span> 00400 <span class="comment"></span> word InverseMod(word n) const;<span class="comment"></span> 00401 <span class="comment"> //@}</span> 00402 <span class="comment"></span><span class="comment"></span> 00403 <span class="comment"> //! \name INPUT/OUTPUT</span> 00404 <span class="comment"></span><span class="comment"> //@{</span> 00405 <span class="comment"></span><span class="comment"> //!</span> 00406 <span class="comment"></span> friend CRYPTOPP_DLL std::istream& operator>>(std::istream& in, Integer &a);<span class="comment"></span> 00407 <span class="comment"> //!</span> 00408 <span class="comment"></span> friend CRYPTOPP_DLL std::ostream& operator<<(std::ostream& out, const Integer &a);<span class="comment"></span> 00409 <span class="comment"> //@}</span> 00410 <span class="comment"></span> 00411 private: 00412 friend class <a class="code" href="class_modular_arithmetic.html">ModularArithmetic</a>; 00413 friend class <a class="code" href="class_montgomery_representation.html">MontgomeryRepresentation</a>; 00414 friend class HalfMontgomeryRepresentation; 00415 00416 Integer(word value, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length); 00417 00418 <span class="keywordtype">int</span> PositiveCompare(const Integer &t) const; 00419 friend <span class="keywordtype">void</span> PositiveAdd(Integer &sum, const Integer &a, const Integer &b); 00420 friend <span class="keywordtype">void</span> PositiveSubtract(Integer &diff, const Integer &a, const Integer &b); 00421 friend <span class="keywordtype">void</span> PositiveMultiply(Integer &product, const Integer &a, const Integer &b); 00422 friend <span class="keywordtype">void</span> PositiveDivide(Integer &remainder, Integer &quotient, const Integer &dividend, const Integer &divisor); 00423 00424 SecAlignedWordBlock reg; 00425 Sign sign; 00426 }; 00427 <span class="comment"></span> 00428 <span class="comment">//!</span> 00429 <span class="comment"></span>inline <span class="keywordtype">bool</span> operator==(const CryptoPP::Integer& a, const CryptoPP::Integer& b) {<span class="keywordflow">return</span> a.Compare(b)==0;}<span class="comment"></span> 00430 <span class="comment">//!</span> 00431 <span class="comment"></span><span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> CryptoPP::Integer& a, <span class="keyword">const</span> CryptoPP::Integer& b) {<span class="keywordflow">return</span> a.Compare(b)!=0;}<span class="comment"></span> 00432 <span class="comment">//!</span> 00433 <span class="comment"></span><span class="keyword">inline</span> <span class="keywordtype">bool</span> operator> (<span class="keyword">const</span> CryptoPP::Integer& a, <span class="keyword">const</span> CryptoPP::Integer& b) {<span class="keywordflow">return</span> a.Compare(b)> 0;}<span class="comment"></span> 00434 <span class="comment">//!</span> 00435 <span class="comment"></span><span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="gf2n_8h.html#a3">operator>=</a>(<span class="keyword">const</span> CryptoPP::Integer& a, <span class="keyword">const</span> CryptoPP::Integer& b) {<span class="keywordflow">return</span> a.Compare(b)>=0;}<span class="comment"></span> 00436 <span class="comment">//!</span> 00437 <span class="comment"></span><span class="keyword">inline</span> <span class="keywordtype">bool</span> operator< (<span class="keyword">const</span> CryptoPP::Integer& a, <span class="keyword">const</span> CryptoPP::Integer& b) {<span class="keywordflow">return</span> a.Compare(b)< 0;}<span class="comment"></span> 00438 <span class="comment">//!</span> 00439 <span class="comment"></span><span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="gf2n_8h.html#a5">operator<=</a>(<span class="keyword">const</span> CryptoPP::Integer& a, <span class="keyword">const</span> CryptoPP::Integer& b) {<span class="keywordflow">return</span> a.Compare(b)<=0;}<span class="comment"></span> 00440 <span class="comment">//!</span> 00441 <span class="comment"></span><span class="keyword">inline</span> CryptoPP::Integer operator+(<span class="keyword">const</span> CryptoPP::Integer &a, <span class="keyword">const</span> CryptoPP::Integer &b) {<span class="keywordflow">return</span> a.Plus(b);}<span class="comment"></span> 00442 <span class="comment">//!</span> 00443 <span class="comment"></span><span class="keyword">inline</span> CryptoPP::Integer operator-(<span class="keyword">const</span> CryptoPP::Integer &a, <span class="keyword">const</span> CryptoPP::Integer &b) {<span class="keywordflow">return</span> a.Minus(b);}<span class="comment"></span> 00444 <span class="comment">//!</span> 00445 <span class="comment"></span><span class="keyword">inline</span> CryptoPP::Integer operator*(<span class="keyword">const</span> CryptoPP::Integer &a, <span class="keyword">const</span> CryptoPP::Integer &b) {<span class="keywordflow">return</span> a.Times(b);}<span class="comment"></span> 00446 <span class="comment">//!</span> 00447 <span class="comment"></span><span class="keyword">inline</span> CryptoPP::Integer operator/(<span class="keyword">const</span> CryptoPP::Integer &a, <span class="keyword">const</span> CryptoPP::Integer &b) {<span class="keywordflow">return</span> a.DividedBy(b);}<span class="comment"></span> 00448 <span class="comment">//!</span> 00449 <span class="comment"></span><span class="keyword">inline</span> CryptoPP::Integer operator%(<span class="keyword">const</span> CryptoPP::Integer &a, <span class="keyword">const</span> CryptoPP::Integer &b) {<span class="keywordflow">return</span> a.Modulo(b);}<span class="comment"></span> 00450 <span class="comment">//!</span> 00451 <span class="comment"></span><span class="keyword">inline</span> CryptoPP::Integer operator/(<span class="keyword">const</span> CryptoPP::Integer &a, CryptoPP::word b) {<span class="keywordflow">return</span> a.DividedBy(b);}<span class="comment"></span> 00452 <span class="comment">//!</span> 00453 <span class="comment"></span><span class="keyword">inline</span> CryptoPP::word operator%(<span class="keyword">const</span> CryptoPP::Integer &a, CryptoPP::word b) {<span class="keywordflow">return</span> a.Modulo(b);} 00454 00455 NAMESPACE_END 00456 00457 NAMESPACE_BEGIN(std) 00458 template<> inline <span class="keywordtype">void</span> swap(CryptoPP::Integer &a, CryptoPP::Integer &b) 00459 { 00460 a.swap(b); 00461 } 00462 NAMESPACE_END 00463 00464 <span class="preprocessor">#endif</span> </div></pre><hr size="1"><address style="align: right;"><small>Generated on Sun Nov 7 08:23:58 2004 for Crypto++ by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0 ></a> 1.3.7 </small></address> </body> </html>