📄 ec2n_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++: ec2n.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>ec2n.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// ec2n.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 "ec2n.h"</span>00008 <span class="preprocessor">#include "asn.h"</span>00009 00010 <span class="preprocessor">#include "algebra.cpp"</span>00011 <span class="preprocessor">#include "eprecomp.cpp"</span>00012 00013 NAMESPACE_BEGIN(CryptoPP)00014 00015 EC2N::EC2N(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt)00016 : m_field(BERDecodeGF2NP(bt))00017 {00018 <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> seq(bt);00019 m_field->BERDecodeElement(seq, m_a);00020 m_field->BERDecodeElement(seq, m_b);00021 <span class="comment">// skip optional seed</span>00022 <span class="keywordflow">if</span> (!seq.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera4">EndReached</a>())00023 BERDecodeOctetString(seq, TheBitBucket());00024 seq.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera9">MessageEnd</a>();00025 }00026 00027 <span class="keywordtype">void</span> EC2N::DEREncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt)<span class="keyword"> const</span>00028 <span class="keyword"></span>{00029 m_field->DEREncode(bt);00030 <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> seq(bt);00031 m_field->DEREncodeElement(seq, m_a);00032 m_field->DEREncodeElement(seq, m_b);00033 seq.<a class="code" href="class_d_e_r_general_encoder.html#_d_e_r_set_encodera2">MessageEnd</a>();00034 }00035 00036 <span class="keywordtype">bool</span> EC2N::DecodePoint(<a class="code" href="struct_e_c2_n_point.html">EC2N::Point</a> &P, <span class="keyword">const</span> byte *encodedPoint, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> encodedPointLen)<span class="keyword"> const</span>00037 <span class="keyword"></span>{00038 <a class="code" href="class_string_store.html">StringStore</a> store(encodedPoint, encodedPointLen);00039 <span class="keywordflow">return</span> DecodePoint(P, store, encodedPointLen);00040 }00041 00042 <span class="keywordtype">bool</span> EC2N::DecodePoint(<a class="code" href="struct_e_c2_n_point.html">EC2N::Point</a> &P, <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> encodedPointLen)<span class="keyword"> const</span>00043 <span class="keyword"></span>{00044 byte type;00045 <span class="keywordflow">if</span> (encodedPointLen < 1 || !bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(type))00046 <span class="keywordflow">return</span> <span class="keyword">false</span>;00047 00048 <span class="keywordflow">switch</span> (type)00049 {00050 <span class="keywordflow">case</span> 0:00051 P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo0">identity</a> = <span class="keyword">true</span>;00052 <span class="keywordflow">return</span> <span class="keyword">true</span>;00053 <span class="keywordflow">case</span> 2:00054 <span class="keywordflow">case</span> 3:00055 {00056 <span class="keywordflow">if</span> (encodedPointLen != EncodedPointSize(<span class="keyword">true</span>))00057 <span class="keywordflow">return</span> <span class="keyword">false</span>;00058 00059 P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo0">identity</a> = <span class="keyword">false</span>;00060 P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a>.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_3">Decode</a>(bt, m_field->MaxElementByteLength()); 00061 00062 <span class="keywordflow">if</span> (P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a>.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_9">IsZero</a>())00063 {00064 P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a> = m_field->SquareRoot(m_b);00065 <span class="keywordflow">return</span> <span class="keyword">true</span>;00066 }00067 00068 FieldElement z = m_field->Square(P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a>);00069 assert(P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a> == m_field->SquareRoot(z));00070 P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a> = m_field->Divide(m_field->Add(m_field->Multiply(z, m_field->Add(P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a>, m_a)), m_b), z);00071 assert(P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a> == m_field->Subtract(m_field->Divide(m_field->Subtract(m_field->Multiply(P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a>, z), m_b), z), m_a));00072 z = m_field->SolveQuadraticEquation(P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a>);00073 assert(m_field->Add(m_field->Square(z), z) == P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a>);00074 z.SetCoefficient(0, type & 1);00075 00076 P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a> = m_field->Multiply(z, P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a>);00077 <span class="keywordflow">return</span> <span class="keyword">true</span>;00078 }00079 <span class="keywordflow">case</span> 4:00080 {00081 <span class="keywordflow">if</span> (encodedPointLen != EncodedPointSize(<span class="keyword">false</span>))00082 <span class="keywordflow">return</span> <span class="keyword">false</span>;00083 00084 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = m_field->MaxElementByteLength();00085 P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo0">identity</a> = <span class="keyword">false</span>;00086 P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo1">x</a>.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_3">Decode</a>(bt, len);00087 P.<a class="code" href="struct_e_c2_n_point.html#_e_c2_n_pointo2">y</a>.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_3">Decode</a>(bt, len);00088 <span class="keywordflow">return</span> <span class="keyword">true</span>;00089 }00090 <span class="keywordflow">default</span>:00091 <span class="keywordflow">return</span> <span class="keyword">false</span>;00092 }00093 }00094 00095 <span class="keywordtype">void</span> EC2N::EncodePoint(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keyword">const</span> Point &P, <span class="keywordtype">bool</span> compressed)<span class="keyword"> const</span>00096 <span class="keyword"></span>{00097 <span class="keywordflow">if</span> (P.identity)00098 <a class="code" href="class_null_store.html">NullStore</a>().TransferTo(bt, EncodedPointSize(compressed));00099 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (compressed)00100 {00101 bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(2 + (!P.x ? 0 : m_field->Divide(P.y, P.x).GetBit(0)));00102 P.x.Encode(bt, m_field->MaxElementByteLength());00103 }00104 <span class="keywordflow">else</span>00105 {00106 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = m_field->MaxElementByteLength();00107 bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(4); <span class="comment">// uncompressed</span>00108 P.x.Encode(bt, len);00109 P.y.Encode(bt, len);00110 }00111 }00112 00113 <span class="keywordtype">void</span> EC2N::EncodePoint(byte *encodedPoint, <span class="keyword">const</span> Point &P, <span class="keywordtype">bool</span> compressed)<span class="keyword"> const</span>00114 <span class="keyword"></span>{00115 <a class="code" href="class_array_sink.html">ArraySink</a> sink(encodedPoint, EncodedPointSize(compressed));00116 EncodePoint(sink, P, compressed);00117 assert(sink.<a class="code" href="class_array_sink.html#_array_xor_sinka4">TotalPutLength</a>() == EncodedPointSize(compressed));00118 }00119 00120 <a class="code" href="struct_e_c2_n_point.html">EC2N::Point</a> EC2N::BERDecodePoint(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt)<span class="keyword"> const</span>00121 <span class="keyword"></span>{00122 <a class="code" href="class_sec_block.html">SecByteBlock</a> str;00123 BERDecodeOctetString(bt, str);00124 Point P;00125 <span class="keywordflow">if</span> (!DecodePoint(P, str, str.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>()))00126 BERDecodeError();00127 <span class="keywordflow">return</span> P;00128 }00129 00130 <span class="keywordtype">void</span> EC2N::DEREncodePoint(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keyword">const</span> Point &P, <span class="keywordtype">bool</span> compressed)<span class="keyword"> const</span>00131 <span class="keyword"></span>{00132 <a class="code" href="class_sec_block.html">SecByteBlock</a> str(EncodedPointSize(compressed));00133 EncodePoint(str, P, compressed);00134 DEREncodeOctetString(bt, str);00135 }00136 00137 <span class="keywordtype">bool</span> EC2N::ValidateParameters(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> level)<span class="keyword"> const</span>00138 <span class="keyword"></span>{00139 <span class="keywordtype">bool</span> pass = !!m_b;00140 pass = pass && m_a.CoefficientCount() <= m_field->MaxElementBitLength();00141 pass = pass && m_b.CoefficientCount() <= m_field->MaxElementBitLength();00142 00143 <span class="keywordflow">if</span> (level >= 1)00144 pass = pass && m_field->GetModulus().IsIrreducible();00145
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -