Sophie

Sophie

distrib > Mandriva > 10.2 > i586 > media > contrib > by-pkgid > 7457b841ac8136d3a1a9d3d960c5252e > files > 1292

libcryptopp-doc-5.2.1-2mdk.i586.rpm

<!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&nbsp;Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;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 &lt;iosfwd&gt;</span>
00010 <span class="preprocessor">#include &lt;algorithm&gt;</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) &amp;&amp; (__INTEL_COMPILER &gt;= 500)) || (defined(__ICL) &amp;&amp; (__ICL &gt;= 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 &lt;malloc.h&gt;</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__) &amp;&amp; (__GNUC_MAJOR__ &gt; 3 || __GNUC_MINOR__ &gt; 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 &lt;class T&gt;
00039         class AlignedAllocator : public AllocatorBase&lt;T&gt;
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&lt;word&gt;;
00060         <span class="keyword">typedef</span> <a class="code" href="class_sec_block.html">SecBlock&lt;word, AlignedAllocator&lt;word&gt;</a> &gt; <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&amp; 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> &amp;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> &amp;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> &amp;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 &amp;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 &amp;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 &amp;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 &lt;= x &lt;= 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 &gt; 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> &amp;rng, <span class="keyword">const</span> Integer &amp;min, <span class="keyword">const</span> Integer &amp;max, RandomNumberType rnType=ANY, <span class="keyword">const</span> Integer &amp;equiv=Zero(), <span class="keyword">const</span> Integer &amp;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 &lt; MinEncodedSize, the most significant bytes will be dropped</span>
00178 <span class="comment">                        if outputLen &gt; 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> &amp;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> &amp;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> &amp;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> &amp;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() &gt;= inputLen</span>
00199                 <span class="keywordtype">void</span> Decode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;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> &amp;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> &amp;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> &amp;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 &gt;&gt; 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() &amp;&amp; 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&amp;  operator=(<span class="keyword">const</span> Integer&amp; t);
00264 <span class="comment"></span>
00265 <span class="comment">                //!</span>
00266 <span class="comment"></span>                Integer&amp;  operator+=(<span class="keyword">const</span> Integer&amp; t);<span class="comment"></span>
00267 <span class="comment">                //!</span>
00268 <span class="comment"></span>                Integer&amp;  operator-=(<span class="keyword">const</span> Integer&amp; t);<span class="comment"></span>
00269 <span class="comment">                //!</span>
00270 <span class="comment"></span>                Integer&amp;  operator*=(<span class="keyword">const</span> Integer&amp; 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&amp;  operator/=(<span class="keyword">const</span> Integer&amp; 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&amp;  operator%=(<span class="keyword">const</span> Integer&amp; 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&amp;  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&amp;  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&amp;  operator&lt;&lt;=(<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&amp;  operator&gt;&gt;=(<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> &amp;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> &amp;rng, <span class="keyword">const</span> Integer &amp;min, <span class="keyword">const</span> Integer &amp;max);<span class="comment"></span>
00289 <span class="comment">                //! set this Integer to a random element of {x | min &lt;= x &lt;= 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> &amp;rng, <span class="keyword">const</span> Integer &amp;min, <span class="keyword">const</span> Integer &amp;max, RandomNumberType rnType, <span class="keyword">const</span> Integer &amp;equiv=Zero(), <span class="keyword">const</span> Integer &amp;mod=One());
00292 
00293                 <span class="keywordtype">bool</span> GenerateRandomNoThrow(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &amp;rng, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &amp;params = g_nullNameValuePairs);
00294                 <span class="keywordtype">void</span> GenerateRandom(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &amp;rng, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &amp;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 &amp;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&amp;        operator++();<span class="comment"></span>
00326 <span class="comment">                //!</span>
00327 <span class="comment"></span>                Integer&amp;        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 &lt; a</span>
00338 <span class="comment">                        \retval  0 if *this = a</span>
00339 <span class="comment">                        \retval  1 if *this &gt; a</span>
00340 <span class="comment">                */</span>
00341                 <span class="keywordtype">int</span> Compare(<span class="keyword">const</span> Integer&amp; 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 &amp;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 &amp;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 &amp;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 &amp;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 &amp;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&gt;&gt;(<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>)&gt;&gt;=n;}<span class="comment"></span>
00360 <span class="comment">                //!</span>
00361 <span class="comment"></span>                Integer operator&lt;&lt;(<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>)&lt;&lt;=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 &amp;x, const Integer&amp; y, const Integer&amp; 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 &amp;x, const Integer&amp; e, const Integer&amp; m);
00386 <span class="comment"></span>
00387 <span class="comment">                //! calculate r and q such that (a == d*q + r) &amp;&amp; (0 &lt;= r &lt; abs(d))</span>
00388 <span class="comment"></span>                static <span class="keywordtype">void</span> Divide(Integer &amp;r, Integer &amp;q, const Integer &amp;a, const Integer &amp;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 &amp;r, Integer &amp;q, const Integer &amp;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 &amp;r, Integer &amp;q, const Integer &amp;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 &amp;a, const Integer &amp;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 &amp;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&amp; operator&gt;&gt;(std::istream&amp; in, Integer &amp;a);<span class="comment"></span>
00407 <span class="comment">                //!</span>
00408 <span class="comment"></span>                friend CRYPTOPP_DLL std::ostream&amp; operator&lt;&lt;(std::ostream&amp; out, const Integer &amp;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 &amp;t) const;
00419         friend <span class="keywordtype">void</span> PositiveAdd(Integer &amp;sum, const Integer &amp;a, const Integer &amp;b);
00420         friend <span class="keywordtype">void</span> PositiveSubtract(Integer &amp;diff, const Integer &amp;a, const Integer &amp;b);
00421         friend <span class="keywordtype">void</span> PositiveMultiply(Integer &amp;product, const Integer &amp;a, const Integer &amp;b);
00422         friend <span class="keywordtype">void</span> PositiveDivide(Integer &amp;remainder, Integer &amp;quotient, const Integer &amp;dividend, const Integer &amp;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&amp; a, const CryptoPP::Integer&amp; 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&amp; a, <span class="keyword">const</span> CryptoPP::Integer&amp; 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&gt; (<span class="keyword">const</span> CryptoPP::Integer&amp; a, <span class="keyword">const</span> CryptoPP::Integer&amp; b) {<span class="keywordflow">return</span> a.Compare(b)&gt; 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&gt;=</a>(<span class="keyword">const</span> CryptoPP::Integer&amp; a, <span class="keyword">const</span> CryptoPP::Integer&amp; b) {<span class="keywordflow">return</span> a.Compare(b)&gt;=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&lt; (<span class="keyword">const</span> CryptoPP::Integer&amp; a, <span class="keyword">const</span> CryptoPP::Integer&amp; b) {<span class="keywordflow">return</span> a.Compare(b)&lt; 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&lt;=</a>(<span class="keyword">const</span> CryptoPP::Integer&amp; a, <span class="keyword">const</span> CryptoPP::Integer&amp; b) {<span class="keywordflow">return</span> a.Compare(b)&lt;=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 &amp;a, <span class="keyword">const</span> CryptoPP::Integer &amp;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 &amp;a, <span class="keyword">const</span> CryptoPP::Integer &amp;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 &amp;a, <span class="keyword">const</span> CryptoPP::Integer &amp;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 &amp;a, <span class="keyword">const</span> CryptoPP::Integer &amp;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 &amp;a, <span class="keyword">const</span> CryptoPP::Integer &amp;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 &amp;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 &amp;a, CryptoPP::word b) {<span class="keywordflow">return</span> a.Modulo(b);}
00454 
00455 NAMESPACE_END
00456 
00457 NAMESPACE_BEGIN(std)
00458 template&lt;&gt; inline <span class="keywordtype">void</span> swap(CryptoPP::Integer &amp;a, CryptoPP::Integer &amp;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>