📄 gf2n_8cpp-source.html
字号:
00694 temp ^= ((temp >> j) & 1) << (t1 + j);00695 <span class="keywordflow">else</span>00696 b[t1/WORD_BITS-1] ^= temp << t1%WORD_BITS;00697 00698 <span class="keywordflow">if</span> (t1 % WORD_BITS)00699 b[t1/WORD_BITS] ^= temp >> (WORD_BITS - t1%WORD_BITS);00700 00701 <span class="keywordflow">if</span> (t0%WORD_BITS)00702 {00703 b[t0/WORD_BITS-1] ^= temp << t0%WORD_BITS;00704 b[t0/WORD_BITS] ^= temp >> (WORD_BITS - t0%WORD_BITS);00705 }00706 <span class="keywordflow">else</span>00707 b[t0/WORD_BITS-1] ^= temp;00708 }00709 00710 CopyWords(result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>(), b, 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>());00711 <span class="keywordflow">return</span> result;00712 }00713 00714 <span class="keyword">const</span> GF2NT::Element& GF2NT::Multiply(<span class="keyword">const</span> Element &a, <span class="keyword">const</span> Element &b)<span class="keyword"> const</span>00715 <span class="keyword"></span>{00716 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> aSize = STDMIN(a.reg.size(), 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>());00717 Element r((word)0, m);00718 00719 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=m-1; i>=0; i--)00720 {00721 <span class="keywordflow">if</span> (r[m-1])00722 {00723 ShiftWordsLeftByBits(r.reg.begin(), r.reg.size(), 1);00724 XorWords(r.reg.begin(), m_modulus.reg, r.reg.size());00725 }00726 <span class="keywordflow">else</span>00727 ShiftWordsLeftByBits(r.reg.begin(), r.reg.size(), 1);00728 00729 <span class="keywordflow">if</span> (b[i])00730 XorWords(r.reg.begin(), a.reg, aSize);00731 }00732 00733 <span class="keywordflow">if</span> (m%WORD_BITS)00734 r.reg.begin()[r.reg.size()-1] = (word)Crop(r.reg[r.reg.size()-1], m%WORD_BITS);00735 00736 CopyWords(result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>(), r.reg.begin(), 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>());00737 <span class="keywordflow">return</span> result;00738 }00739 00740 <span class="keyword">const</span> GF2NT::Element& GF2NT::Reduced(<span class="keyword">const</span> Element &a)<span class="keyword"> const</span>00741 <span class="keyword"></span>{00742 <span class="keywordflow">if</span> (t0-t1 < WORD_BITS)00743 <span class="keywordflow">return</span> m_domain.Mod(a, m_modulus);00744 00745 <a class="code" href="class_sec_block.html">SecWordBlock</a> b(a.reg);00746 00747 <span class="keywordtype">unsigned</span> i;00748 <span class="keywordflow">for</span> (i=b.size()-1; i>=BitsToWords(t0); i--)00749 {00750 word temp = b[i];00751 00752 <span class="keywordflow">if</span> (t0%WORD_BITS)00753 {00754 b[i-t0/WORD_BITS] ^= temp >> t0%WORD_BITS;00755 b[i-t0/WORD_BITS-1] ^= temp << (WORD_BITS - t0%WORD_BITS);00756 }00757 <span class="keywordflow">else</span>00758 b[i-t0/WORD_BITS] ^= temp;00759 00760 <span class="keywordflow">if</span> ((t0-t1)%WORD_BITS)00761 {00762 b[i-(t0-t1)/WORD_BITS] ^= temp >> (t0-t1)%WORD_BITS;00763 b[i-(t0-t1)/WORD_BITS-1] ^= temp << (WORD_BITS - (t0-t1)%WORD_BITS);00764 }00765 <span class="keywordflow">else</span>00766 b[i-(t0-t1)/WORD_BITS] ^= temp;00767 }00768 00769 <span class="keywordflow">if</span> (i==BitsToWords(t0)-1 && t0%WORD_BITS)00770 {00771 word mask = ((word)1<<(t0%WORD_BITS))-1;00772 word temp = b[i] & ~mask;00773 b[i] &= mask;00774 00775 b[i-t0/WORD_BITS] ^= temp >> t0%WORD_BITS;00776 00777 <span class="keywordflow">if</span> ((t0-t1)%WORD_BITS)00778 {00779 b[i-(t0-t1)/WORD_BITS] ^= temp >> (t0-t1)%WORD_BITS;00780 <span class="keywordflow">if</span> ((t0-t1)%WORD_BITS > t0%WORD_BITS)00781 b[i-(t0-t1)/WORD_BITS-1] ^= temp << (WORD_BITS - (t0-t1)%WORD_BITS);00782 <span class="keywordflow">else</span>00783 assert(temp << (WORD_BITS - (t0-t1)%WORD_BITS) == 0);00784 }00785 <span class="keywordflow">else</span>00786 b[i-(t0-t1)/WORD_BITS] ^= temp;00787 }00788 00789 SetWords(result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>(), 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>());00790 CopyWords(result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>(), b, STDMIN(b.size(), 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>()));00791 <span class="keywordflow">return</span> result;00792 }00793 00794 <span class="keywordtype">void</span> GF2NP::DEREncodeElement(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &out, <span class="keyword">const</span> Element &a)<span class="keyword"> const</span>00795 <span class="keyword"></span>{00796 a.DEREncodeAsOctetString(out, MaxElementByteLength());00797 }00798 00799 <span class="keywordtype">void</span> GF2NP::BERDecodeElement(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &in, Element &a)<span class="keyword"> const</span>00800 <span class="keyword"></span>{00801 a.BERDecodeAsOctetString(in, MaxElementByteLength());00802 }00803 00804 <span class="keywordtype">void</span> GF2NT::DEREncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt)<span class="keyword"> const</span>00805 <span class="keyword"></span>{00806 <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> seq(bt);00807 ASN1::characteristic_two_field().DEREncode(seq);00808 <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> parameters(seq);00809 DEREncodeUnsigned(parameters, m);00810 ASN1::tpBasis().DEREncode(parameters);00811 DEREncodeUnsigned(parameters, t1);00812 parameters.<a class="code" href="class_d_e_r_general_encoder.html#_d_e_r_set_encodera2">MessageEnd</a>();00813 seq.<a class="code" href="class_d_e_r_general_encoder.html#_d_e_r_set_encodera2">MessageEnd</a>();00814 }00815 00816 <span class="keywordtype">void</span> GF2NPP::DEREncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt)<span class="keyword"> const</span>00817 <span class="keyword"></span>{00818 <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> seq(bt);00819 ASN1::characteristic_two_field().DEREncode(seq);00820 <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> parameters(seq);00821 DEREncodeUnsigned(parameters, m);00822 ASN1::ppBasis().DEREncode(parameters);00823 <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> pentanomial(parameters);00824 DEREncodeUnsigned(pentanomial, t3);00825 DEREncodeUnsigned(pentanomial, t2);00826 DEREncodeUnsigned(pentanomial, t1);00827 pentanomial.<a class="code" href="class_d_e_r_general_encoder.html#_d_e_r_set_encodera2">MessageEnd</a>();00828 parameters.<a class="code" href="class_d_e_r_general_encoder.html#_d_e_r_set_encodera2">MessageEnd</a>();00829 seq.<a class="code" href="class_d_e_r_general_encoder.html#_d_e_r_set_encodera2">MessageEnd</a>();00830 }00831 00832 <a class="code" href="class_g_f2_n_p.html">GF2NP</a> * BERDecodeGF2NP(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt)00833 {00834 <span class="comment">// VC60 workaround: auto_ptr lacks reset()</span>00835 member_ptr<GF2NP> result;00836 00837 <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> seq(bt);00838 <span class="keywordflow">if</span> (<a class="code" href="class_o_i_d.html">OID</a>(seq) != ASN1::characteristic_two_field())00839 BERDecodeError();00840 <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> parameters(seq);00841 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m;00842 BERDecodeUnsigned(parameters, m);00843 <a class="code" href="class_o_i_d.html">OID</a> oid(parameters);00844 <span class="keywordflow">if</span> (oid == ASN1::tpBasis())00845 {00846 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t1;00847 BERDecodeUnsigned(parameters, t1);00848 result.reset(<span class="keyword">new</span> <a class="code" href="class_g_f2_n_t.html">GF2NT</a>(m, t1, 0));00849 }00850 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (oid == ASN1::ppBasis())00851 {00852 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t1, t2, t3;00853 <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> pentanomial(parameters);00854 BERDecodeUnsigned(pentanomial, t3);00855 BERDecodeUnsigned(pentanomial, t2);00856 BERDecodeUnsigned(pentanomial, t1);00857 pentanomial.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera9">MessageEnd</a>();00858 result.reset(<span class="keyword">new</span> <a class="code" href="class_g_f2_n_p_p.html">GF2NPP</a>(m, t3, t2, t1, 0));00859 }00860 <span class="keywordflow">else</span>00861 {00862 BERDecodeError();00863 <span class="keywordflow">return</span> NULL;00864 }00865
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -