📄 gf2n_8h-source.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>Crypto++: gf2n.h Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.3.2 --><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">Compound 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">Compound Members</a> | <a class="qindex" href="globals.html">File Members</a></div><h1>gf2n.h</h1><a href="gf2n_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <span class="preprocessor">#ifndef CRYPTOPP_GF2N_H</span>00002 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_GF2N_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 <span class="preprocessor">#include "misc.h"</span>00009 <span class="preprocessor">#include "algebra.h"</span>00010 00011 <span class="preprocessor">#include <iosfwd></span>00012 00013 NAMESPACE_BEGIN(CryptoPP)00014 00015 <span class="comment">//! Polynomial with Coefficients in GF(2)</span>00016 <span class="comment"></span><span class="comment">/*! \nosubgrouping */</span><a name="l00017"></a><a class="code" href="class_polynomial_mod2.html">00017</a> <span class="keyword">class </span>CRYPTOPP_DLL PolynomialMod200018 {00019 <span class="keyword">public</span>:<span class="comment"></span>00020 <span class="comment"> //! \name ENUMS, EXCEPTIONS, and TYPEDEFS</span>00021 <span class="comment"></span><span class="comment"> //@{</span>00022 <span class="comment"></span><span class="comment"> //! divide by zero exception</span><a name="l00023"></a><a class="code" href="class_polynomial_mod2_1_1_divide_by_zero.html">00023</a> <span class="comment"></span> <span class="keyword">class </span><a class="code" href="class_polynomial_mod2_1_1_divide_by_zero.html">DivideByZero</a> : <span class="keyword">public</span> <a class="code" href="class_exception.html">Exception</a>00024 {00025 <span class="keyword">public</span>:00026 <a class="code" href="class_polynomial_mod2_1_1_divide_by_zero.html">DivideByZero</a>() : <a class="code" href="class_exception.html">Exception</a>(OTHER_ERROR, <span class="stringliteral">"PolynomialMod2: division by zero"</span>) {}00027 };00028 00029 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> RandomizationParameter;<span class="comment"></span>00030 <span class="comment"> //@}</span>00031 <span class="comment"></span><span class="comment"></span>00032 <span class="comment"> //! \name CREATORS</span>00033 <span class="comment"></span><span class="comment"> //@{</span>00034 <span class="comment"></span><span class="comment"> //! creates the zero polynomial</span>00035 <span class="comment"></span> PolynomialMod2();<span class="comment"></span>00036 <span class="comment"> //! copy constructor</span>00037 <span class="comment"></span> PolynomialMod2(<span class="keyword">const</span> PolynomialMod2& t);00038 <span class="comment"></span>00039 <span class="comment"> //! convert from word</span>00040 <span class="comment"></span><span class="comment"> /*! value should be encoded with the least significant bit as coefficient to x^0</span>00041 <span class="comment"> and most significant bit as coefficient to x^(WORD_BITS-1)</span>00042 <span class="comment"> bitLength denotes how much memory to allocate initially</span>00043 <span class="comment"> */</span>00044 PolynomialMod2(word value, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bitLength=WORD_BITS);00045 <span class="comment"></span>00046 <span class="comment"> //! convert from big-endian byte array</span><a name="l00047"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_3">00047</a> <span class="comment"></span> PolynomialMod2(<span class="keyword">const</span> byte *encodedPoly, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> byteCount)00048 {Decode(encodedPoly, byteCount);}00049 <span class="comment"></span>00050 <span class="comment"> //! convert from big-endian form stored in a BufferedTransformation</span><a name="l00051"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_4">00051</a> <span class="comment"></span> PolynomialMod2(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &encodedPoly, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> byteCount)00052 {Decode(encodedPoly, byteCount);}00053 <span class="comment"></span>00054 <span class="comment"> //! create a random polynomial uniformly distributed over all polynomials with degree less than bitcount</span><a name="l00055"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_5">00055</a> <span class="comment"></span> PolynomialMod2(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bitcount)00056 {Randomize(rng, bitcount);}00057 <span class="comment"></span>00058 <span class="comment"> //! return x^i</span>00059 <span class="comment"></span> <span class="keyword">static</span> PolynomialMod2 Monomial(<span class="keywordtype">unsigned</span> i);<span class="comment"></span>00060 <span class="comment"> //! return x^t0 + x^t1 + x^t2</span>00061 <span class="comment"></span> <span class="keyword">static</span> PolynomialMod2 Trinomial(<span class="keywordtype">unsigned</span> t0, <span class="keywordtype">unsigned</span> t1, <span class="keywordtype">unsigned</span> t2);<span class="comment"></span>00062 <span class="comment"> //! return x^t0 + x^t1 + x^t2 + x^t3 + x^t4</span>00063 <span class="comment"></span> <span class="keyword">static</span> PolynomialMod2 Pentanomial(<span class="keywordtype">unsigned</span> t0, <span class="keywordtype">unsigned</span> t1, <span class="keywordtype">unsigned</span> t2, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t3, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t4);<span class="comment"></span>00064 <span class="comment"> //! return x^(n-1) + ... + x + 1</span>00065 <span class="comment"></span> <span class="keyword">static</span> PolynomialMod2 AllOnes(<span class="keywordtype">unsigned</span> n);00066 <span class="comment"></span>00067 <span class="comment"> //!</span>00068 <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> PolynomialMod2 & Zero();<span class="comment"></span>00069 <span class="comment"> //!</span>00070 <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> PolynomialMod2 & One();<span class="comment"></span>00071 <span class="comment"> //@}</span>00072 <span class="comment"></span><span class="comment"></span>00073 <span class="comment"> //! \name ENCODE/DECODE</span>00074 <span class="comment"></span><span class="comment"> //@{</span>00075 <span class="comment"></span><span class="comment"> //! minimum number of bytes to encode this polynomial</span>00076 <span class="comment"></span><span class="comment"> /*! MinEncodedSize of 0 is 1 */</span><a name="l00077"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_0">00077</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> MinEncodedSize()<span class="keyword"> const </span>{<span class="keywordflow">return</span> STDMAX(1U, ByteCount());}00078 <span class="comment"></span>00079 <span class="comment"> //! encode in big-endian format</span>00080 <span class="comment"></span><span class="comment"> /*! if outputLen < MinEncodedSize, the most significant bytes will be dropped</span>00081 <span class="comment"> if outputLen > MinEncodedSize, the most significant bytes will be padded</span>00082 <span class="comment"> */</span>00083 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Encode(byte *output, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputLen) <span class="keyword">const</span>;<span class="comment"></span>00084 <span class="comment"> //!</span>00085 <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) <span class="keyword">const</span>;00086 <span class="comment"></span>00087 <span class="comment"> //!</span>00088 <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);<span class="comment"></span>00089 <span class="comment"> //! </span>00090 <span class="comment"></span> <span class="comment">//* Precondition: bt.MaxRetrievable() >= inputLen</span>00091 <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);00092 <span class="comment"></span>00093 <span class="comment"> //! encode value as big-endian octet string</span>00094 <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>;<span class="comment"></span>00095 <span class="comment"> //! decode value as big-endian octet string</span>00096 <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);<span class="comment"></span>00097 <span class="comment"> //@}</span>00098 <span class="comment"></span><span class="comment"></span>00099 <span class="comment"> //! \name ACCESSORS</span>00100 <span class="comment"></span><span class="comment"> //@{</span>00101 <span class="comment"></span><span class="comment"> //! number of significant bits = Degree() + 1</span>00102 <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BitCount() <span class="keyword">const</span>;<span class="comment"></span>00103 <span class="comment"> //! number of significant bytes = ceiling(BitCount()/8)</span>00104 <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ByteCount() <span class="keyword">const</span>;<span class="comment"></span>00105 <span class="comment"> //! number of significant words = ceiling(ByteCount()/sizeof(word))</span>00106 <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> WordCount() <span class="keyword">const</span>;00107 <span class="comment"></span>00108 <span class="comment"> //! return the n-th bit, n=0 being the least significant bit</span><a name="l00109"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_3">00109</a> <span class="comment"></span> <span class="keywordtype">bool</span> GetBit(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n)<span class="keyword"> const </span>{<span class="keywordflow">return</span> GetCoefficient(n)!=0;}<span class="comment"></span>00110 <span class="comment"> //! return the n-th byte</span>00111 <span class="comment"></span> byte GetByte(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n) <span class="keyword">const</span>;00112 <span class="comment"></span>00113 <span class="comment"> //! the zero polynomial will return a degree of -1</span><a name="l00114"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_5">00114</a> <span class="comment"></span> <span class="keywordtype">signed</span> <span class="keywordtype">int</span> Degree()<span class="keyword"> const </span>{<span class="keywordflow">return</span> BitCount()-1;}<span class="comment"></span>00115 <span class="comment"> //! degree + 1</span><a name="l00116"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_6">00116</a> <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> CoefficientCount()<span class="keyword"> const </span>{<span class="keywordflow">return</span> BitCount();}<span class="comment"></span>00117 <span class="comment"> //! return coefficient for x^i</span><a name="l00118"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_7">00118</a> <span class="comment"></span> <span class="keywordtype">int</span> GetCoefficient(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i)<span class="keyword"> const</span>00119 <span class="keyword"> </span>{<span class="keywordflow">return</span> (i/WORD_BITS < reg.size()) ? int(reg[i/WORD_BITS] >> (i % WORD_BITS)) & 1 : 0;}<span class="comment"></span>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -