<!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++: ec2n.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 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">Class 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">Class Members</a> | <a class="qindex" href="globals.html">File Members</a></div> <h1>ec2n.h</h1><pre class="fragment"><div>00001 <span class="preprocessor">#ifndef CRYPTOPP_EC2N_H</span> 00002 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_EC2N_H</span> 00003 <span class="preprocessor"></span> 00004 <span class="preprocessor">#include "<a class="code" href="gf2n_8h.html">gf2n.h</a>"</span> 00005 <span class="preprocessor">#include "eprecomp.h"</span> 00006 <span class="preprocessor">#include "smartptr.h"</span> 00007 <span class="preprocessor">#include "<a class="code" href="pubkey_8h.html">pubkey.h</a>"</span> 00008 00009 NAMESPACE_BEGIN(CryptoPP) 00010 00011 <span class="comment">//! Elliptic Curve Point</span> <a name="l00012"></a><a class="code" href="struct_e_c2_n_point.html">00012</a> <span class="comment"></span>struct CRYPTOPP_DLL <a class="code" href="struct_e_c2_n_point.html">EC2NPoint</a> 00013 { 00014 EC2NPoint() : identity(<span class="keyword">true</span>) {} 00015 EC2NPoint(<span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &x, <span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &y) 00016 : identity(<span class="keyword">false</span>), x(x), y(y) {} 00017 00018 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> EC2NPoint &t)<span class="keyword"> const</span> 00019 <span class="keyword"> </span>{<span class="keywordflow">return</span> (identity && t.identity) || (!identity && !t.identity && x==t.x && y==t.y);} 00020 <span class="keywordtype">bool</span> operator< (<span class="keyword">const</span> EC2NPoint &t)<span class="keyword"> const</span> 00021 <span class="keyword"> </span>{<span class="keywordflow">return</span> identity ? !t.identity : (!t.identity && (x<t.x || (x==t.x && y<t.y)));} 00022 00023 <span class="keywordtype">bool</span> identity; 00024 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> x, y; 00025 }; 00026 00027 CRYPTOPP_DLL_TEMPLATE_CLASS <a class="code" href="class_abstract_group.html">AbstractGroup<EC2NPoint></a>; 00028 <span class="comment"></span> 00029 <span class="comment">//! Elliptic Curve over GF(2^n)</span> <a name="l00030"></a><a class="code" href="class_e_c2_n.html">00030</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL EC2N : <span class="keyword">public</span> <a class="code" href="class_abstract_group.html">AbstractGroup</a><EC2NPoint> 00031 { 00032 <span class="keyword">public</span>: 00033 <span class="keyword">typedef</span> <a class="code" href="class_g_f2_n_p.html">GF2NP</a> <a class="code" href="class_g_f2_n_p.html">Field</a>; 00034 <span class="keyword">typedef</span> Field::Element FieldElement; 00035 <span class="keyword">typedef</span> <a class="code" href="struct_e_c2_n_point.html">EC2NPoint</a> <a class="code" href="struct_e_c2_n_point.html">Point</a>; 00036 00037 EC2N() {} 00038 EC2N(<span class="keyword">const</span> <a class="code" href="class_g_f2_n_p.html">Field</a> &field, <span class="keyword">const</span> Field::Element &a, <span class="keyword">const</span> Field::Element &b) 00039 : m_field(field), m_a(a), m_b(b) {} 00040 <span class="comment">// construct from BER encoded parameters</span> 00041 <span class="comment">// this constructor will decode and extract the the fields fieldID and curve of the sequence ECParameters</span> 00042 EC2N(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt); 00043 00044 <span class="comment">// encode the fields fieldID and curve of the sequence ECParameters</span> 00045 <span class="keywordtype">void</span> DEREncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt) <span class="keyword">const</span>; 00046 00047 <span class="keywordtype">bool</span> Equal(<span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &P, <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &Q) <span class="keyword">const</span>; 00048 <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a>& Identity() <span class="keyword">const</span>; 00049 <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a>& Inverse(<span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &P) <span class="keyword">const</span>; 00050 <span class="keywordtype">bool</span> InversionIsFast()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">true</span>;} 00051 <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a>& Add(<span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &P, <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &Q) <span class="keyword">const</span>; 00052 <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a>& Double(<span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &P) <span class="keyword">const</span>; 00053 00054 <a class="code" href="struct_e_c2_n_point.html">Point</a> Multiply(<span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &k, <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &P)<span class="keyword"> const</span> 00055 <span class="keyword"> </span>{<span class="keywordflow">return</span> ScalarMultiply(P, k);} 00056 <a class="code" href="struct_e_c2_n_point.html">Point</a> CascadeMultiply(<span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &k1, <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &P, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &k2, <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &Q)<span class="keyword"> const</span> 00057 <span class="keyword"> </span>{<span class="keywordflow">return</span> CascadeScalarMultiply(P, k1, Q, k2);} 00058 00059 <span class="keywordtype">bool</span> ValidateParameters(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> level=3) <span class="keyword">const</span>; 00060 <span class="keywordtype">bool</span> VerifyPoint(<span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &P) <span class="keyword">const</span>; 00061 00062 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> EncodedPointSize(<span class="keywordtype">bool</span> compressed = <span class="keyword">false</span>)<span class="keyword"> const</span> 00063 <span class="keyword"> </span>{<span class="keywordflow">return</span> 1 + (compressed?1:2)*m_field->MaxElementByteLength();} 00064 <span class="comment">// returns false if point is compressed and not valid (doesn't check if uncompressed)</span> 00065 <span class="keywordtype">bool</span> DecodePoint(<a class="code" href="struct_e_c2_n_point.html">Point</a> &P, <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len) <span class="keyword">const</span>; 00066 <span class="keywordtype">bool</span> DecodePoint(<a class="code" href="struct_e_c2_n_point.html">Point</a> &P, <span class="keyword">const</span> byte *encodedPoint, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len) <span class="keyword">const</span>; 00067 <span class="keywordtype">void</span> EncodePoint(byte *encodedPoint, <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &P, <span class="keywordtype">bool</span> compressed) <span class="keyword">const</span>; 00068 <span class="keywordtype">void</span> EncodePoint(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &P, <span class="keywordtype">bool</span> compressed) <span class="keyword">const</span>; 00069 00070 <a class="code" href="struct_e_c2_n_point.html">Point</a> BERDecodePoint(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt) <span class="keyword">const</span>; 00071 <span class="keywordtype">void</span> DEREncodePoint(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &P, <span class="keywordtype">bool</span> compressed) <span class="keyword">const</span>; 00072 00073 <a class="code" href="class_integer.html">Integer</a> FieldSize()<span class="keyword"> const </span>{<span class="keywordflow">return</span> Integer::Power2(m_field->MaxElementBitLength());} 00074 <span class="keyword">const</span> <a class="code" href="class_g_f2_n_p.html">Field</a> & GetField()<span class="keyword"> const </span>{<span class="keywordflow">return</span> *m_field;} 00075 <span class="keyword">const</span> FieldElement & GetA()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_a;} 00076 <span class="keyword">const</span> FieldElement & GetB()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_b;} 00077 00078 <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> EC2N &rhs)<span class="keyword"> const</span> 00079 <span class="keyword"> </span>{<span class="keywordflow">return</span> GetField() == rhs.<a class="code" href="class_e_c2_n.html#_e_c2_na22">GetField</a>() && m_a == rhs.<a class="code" href="class_e_c2_n.html#_e_c2_nr1">m_a</a> && m_b == rhs.<a class="code" href="class_e_c2_n.html#_e_c2_nr2">m_b</a>;} 00080 00081 <span class="keyword">private</span>: 00082 clonable_ptr<Field> m_field; 00083 FieldElement m_a, m_b; 00084 <span class="keyword">mutable</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> m_R; 00085 }; 00086 00087 CRYPTOPP_DLL_TEMPLATE_CLASS DL_FixedBasePrecomputationImpl<EC2N::Point>; 00088 CRYPTOPP_DLL_TEMPLATE_CLASS DL_GroupPrecomputation<EC2N::Point>; 00089 00090 <span class="keyword">template</span> <<span class="keyword">class</span> T> <span class="keyword">class </span>EcPrecomputation; 00091 <span class="comment"></span> 00092 <span class="comment">//! EC2N precomputation</span> <a name="l00093"></a><a class="code" href="class_ec_precomputation_3_01_e_c2_n_01_4.html">00093</a> <span class="comment"></span><span class="keyword">template</span><> <span class="keyword">class </span>EcPrecomputation<EC2N> : <span class="keyword">public</span> DL_GroupPrecomputation<EC2N::Point> 00094 { 00095 <span class="keyword">public</span>: 00096 <span class="keyword">typedef</span> EC2N <a class="code" href="class_e_c2_n.html">EllipticCurve</a>; 00097 00098 <span class="comment">// DL_GroupPrecomputation</span> 00099 <span class="keyword">const</span> <a class="code" href="class_abstract_group.html">AbstractGroup<Element></a> & GetGroup()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_ec;} 00100 Element BERDecodeElement(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt)<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_ec.BERDecodePoint(bt);} 00101 <span class="keywordtype">void</span> DEREncodeElement(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keyword">const</span> Element &v)<span class="keyword"> const </span>{m_ec.DEREncodePoint(bt, v, <span class="keyword">false</span>);} 00102 00103 <span class="comment">// non-inherited</span> 00104 <span class="keywordtype">void</span> SetCurve(<span class="keyword">const</span> EC2N &ec) {m_ec = ec;} 00105 <span class="keyword">const</span> EC2N & GetCurve()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_ec;} 00106 00107 <span class="keyword">private</span>: 00108 EC2N m_ec; 00109 }; 00110 00111 NAMESPACE_END 00112 00113 <span class="preprocessor">#endif</span> </div></pre><hr size="1"><address style="align: right;"><small>Generated on Sun Nov 7 08:23:57 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>