📄 gf2n_8cpp-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.cpp 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.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// gf2n.cpp - written and placed in the public domain by Wei Dai</span>00002 00003 <span class="preprocessor">#include "pch.h"</span>00004 00005 <span class="preprocessor">#ifndef CRYPTOPP_IMPORTS</span>00006 <span class="preprocessor"></span>00007 <span class="preprocessor">#include "<a class="code" href="gf2n_8h.html">gf2n.h</a>"</span>00008 <span class="preprocessor">#include "algebra.h"</span>00009 <span class="preprocessor">#include "words.h"</span>00010 <span class="preprocessor">#include "randpool.h"</span>00011 <span class="preprocessor">#include "asn.h"</span>00012 <span class="preprocessor">#include "oids.h"</span>00013 00014 <span class="preprocessor">#include <iostream></span>00015 00016 NAMESPACE_BEGIN(CryptoPP)00017 <a name="l00018"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_0">00018</a> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_0">PolynomialMod2::PolynomialMod2</a>()00019 {00020 }00021 <a name="l00022"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_2">00022</a> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_0">PolynomialMod2::PolynomialMod2</a>(word value, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bitLength)00023 : reg(BitsToWords(bitLength))00024 {00025 assert(value==0 || reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>()>0);00026 00027 <span class="keywordflow">if</span> (reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>() > 0)00028 {00029 reg[0] = value;00030 SetWords(reg+1, 0, reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>()-1);00031 }00032 }00033 <a name="l00034"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_1">00034</a> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_0">PolynomialMod2::PolynomialMod2</a>(<span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a>& t)00035 : reg(t.reg.size())00036 {00037 CopyWords(reg, t.reg, reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>());00038 }00039 00040 <span class="keywordtype">void</span> PolynomialMod2::Randomize(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nbits)00041 {00042 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nbytes = nbits/8 + 1;00043 <a class="code" href="class_sec_block.html">SecByteBlock</a> buf(nbytes);00044 rng.<a class="code" href="class_random_number_generator.html#_x917_r_n_ga4">GenerateBlock</a>(buf, nbytes);00045 buf[0] = (byte)Crop(buf[0], nbits % 8);00046 Decode(buf, nbytes);00047 }00048 00049 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_9">PolynomialMod2::AllOnes</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bitLength)00050 {00051 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> result((word)0, bitLength);00052 SetWords(result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>, ~(word)0, result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>());00053 <span class="keywordflow">if</span> (bitLength%WORD_BITS)00054 result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>[result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>()-1] = (word)Crop(result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>[result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>()-1], bitLength%WORD_BITS);00055 <span class="keywordflow">return</span> result;00056 }00057 00058 <span class="keywordtype">void</span> PolynomialMod2::SetBit(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n, <span class="keywordtype">int</span> value)00059 {00060 <span class="keywordflow">if</span> (value)00061 {00062 reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta22">CleanGrow</a>(n/WORD_BITS + 1);00063 reg[n/WORD_BITS] |= (word(1) << (n%WORD_BITS));00064 }00065 <span class="keywordflow">else</span>00066 {00067 <span class="keywordflow">if</span> (n/WORD_BITS < reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>())00068 reg[n/WORD_BITS] &= ~(word(1) << (n%WORD_BITS));00069 }00070 }00071 <a name="l00072"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_4">00072</a> byte <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_4">PolynomialMod2::GetByte</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n)<span class="keyword"> const</span>00073 <span class="keyword"></span>{00074 <span class="keywordflow">if</span> (n/WORD_SIZE >= reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>())00075 <span class="keywordflow">return</span> 0;00076 <span class="keywordflow">else</span>00077 <span class="keywordflow">return</span> byte(reg[n/WORD_SIZE] >> ((n%WORD_SIZE)*8));00078 }00079 <a name="l00080"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_12">00080</a> <span class="keywordtype">void</span> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_12">PolynomialMod2::SetByte</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n, byte value)00081 {00082 reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta22">CleanGrow</a>(BytesToWords(n+1));00083 reg[n/WORD_SIZE] &= ~(word(0xff) << 8*(n%WORD_SIZE));00084 reg[n/WORD_SIZE] |= (word(value) << 8*(n%WORD_SIZE));00085 }00086 <a name="l00087"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_6">00087</a> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_6">PolynomialMod2::Monomial</a>(<span class="keywordtype">unsigned</span> i) 00088 {00089 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> r((word)0, i+1); 00090 r.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_11">SetBit</a>(i); 00091 <span class="keywordflow">return</span> r;00092 }00093 <a name="l00094"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_7">00094</a> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_7">PolynomialMod2::Trinomial</a>(<span class="keywordtype">unsigned</span> t0, <span class="keywordtype">unsigned</span> t1, <span class="keywordtype">unsigned</span> t2) 00095 {00096 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> r((word)0, t0+1);00097 r.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_11">SetBit</a>(t0);00098 r.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_11">SetBit</a>(t1);00099 r.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_11">SetBit</a>(t2);00100 <span class="keywordflow">return</span> r;00101 }00102 <a name="l00103"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_8">00103</a> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_8">PolynomialMod2::Pentanomial</a>(<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)00104 {00105 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> r((word)0, t0+1);00106 r.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_11">SetBit</a>(t0);00107 r.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_11">SetBit</a>(t1);00108 r.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_11">SetBit</a>(t2);00109 r.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_11">SetBit</a>(t3);00110 r.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_11">SetBit</a>(t4);00111 <span class="keywordflow">return</span> r;00112 }00113 00114 <span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &PolynomialMod2::Zero()00115 {00116 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> zero;00117 <span class="keywordflow">return</span> zero;00118 }00119 00120 <span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &PolynomialMod2::One()00121 {00122 <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> one = 1;00123 <span class="keywordflow">return</span> one;00124 }00125 00126 <span class="keywordtype">void</span> PolynomialMod2::Decode(<span class="keyword">const</span> byte *input, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inputLen)00127 {00128 <a class="code" href="class_string_store.html">StringStore</a> store(input, inputLen);00129 Decode(store, inputLen);00130 }00131 <a name="l00132"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_1">00132</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_1">PolynomialMod2::Encode</a>(byte *output, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputLen)<span class="keyword"> const</span>00133 <span class="keyword"></span>{00134 <a class="code" href="class_array_sink.html">ArraySink</a> sink(output, outputLen);00135 <span class="keywordflow">return</span> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_1">Encode</a>(sink, outputLen);00136 }00137 00138 <span class="keywordtype">void</span> PolynomialMod2::Decode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inputLen)00139 {00140 reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta20">CleanNew</a>(BytesToWords(inputLen));00141 00142 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=inputLen; i > 0; i--)00143 {00144 byte b;00145 bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(b);00146 reg[(i-1)/WORD_SIZE] |= b << ((i-1)%WORD_SIZE)*8;00147 }00148 }00149 00150 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_1">PolynomialMod2::Encode</a>(<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>00151 <span class="keyword"></span>{00152 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=outputLen; i > 0; i--)00153 bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_4">GetByte</a>(i-1));00154 <span class="keywordflow">return</span> outputLen;00155 }00156 <a name="l00157"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_5">00157</a> <span class="keywordtype">void</span> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_5">PolynomialMod2::DEREncodeAsOctetString</a>(<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>00158 <span class="keyword"></span>{00159 <a class="code" href="class_d_e_r_general_encoder.html">DERGeneralEncoder</a> enc(bt, OCTET_STRING);00160 <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_1">Encode</a>(enc, length);00161 enc.<a class="code" href="class_d_e_r_general_encoder.html#_d_e_r_set_encodera2">MessageEnd</a>();00162 }00163 <a name="l00164"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_6">00164</a> <span class="keywordtype">void</span> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_6">PolynomialMod2::BERDecodeAsOctetString</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00165 {00166 <a class="code" href="class_b_e_r_general_decoder.html">BERGeneralDecoder</a> dec(bt, OCTET_STRING);00167 <span class="keywordflow">if</span> (!dec.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera2">IsDefiniteLength</a>() || dec.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera3">RemainingLength</a>() != length)00168 BERDecodeError();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -