Sophie

Sophie

distrib > Mandriva > 10.2 > i586 > media > contrib > by-pkgid > 7457b841ac8136d3a1a9d3d960c5252e > files > 1222

libcryptopp-doc-5.2.1-2mdk.i586.rpm

<!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&nbsp;Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;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> &amp;x, <span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &amp;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 &amp;t)<span class="keyword"> const</span>
00019 <span class="keyword">                </span>{<span class="keywordflow">return</span> (identity &amp;&amp; t.identity) || (!identity &amp;&amp; !t.identity &amp;&amp; x==t.x &amp;&amp; y==t.y);}
00020         <span class="keywordtype">bool</span> operator&lt; (<span class="keyword">const</span> EC2NPoint &amp;t)<span class="keyword"> const</span>
00021 <span class="keyword">                </span>{<span class="keywordflow">return</span> identity ? !t.identity : (!t.identity &amp;&amp; (x&lt;t.x || (x==t.x &amp;&amp; y&lt;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&lt;EC2NPoint&gt;</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>&lt;EC2NPoint&gt;
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> &amp;field, <span class="keyword">const</span> Field::Element &amp;a, <span class="keyword">const</span> Field::Element &amp;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> &amp;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> &amp;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> &amp;P, <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &amp;Q) <span class="keyword">const</span>;
00048         <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a>&amp; Identity() <span class="keyword">const</span>;
00049         <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a>&amp; Inverse(<span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &amp;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>&amp; Add(<span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &amp;P, <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &amp;Q) <span class="keyword">const</span>;
00052         <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a>&amp; Double(<span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &amp;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> &amp;k, <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &amp;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> &amp;k1, <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &amp;P, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;k2, <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &amp;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> &amp;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> &amp;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-&gt;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> &amp;P, <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;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> &amp;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> &amp;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> &amp;bt, <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &amp;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> &amp;bt) <span class="keyword">const</span>;
00071         <span class="keywordtype">void</span> DEREncodePoint(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <span class="keyword">const</span> <a class="code" href="struct_e_c2_n_point.html">Point</a> &amp;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-&gt;MaxElementBitLength());}
00074         <span class="keyword">const</span> <a class="code" href="class_g_f2_n_p.html">Field</a> &amp; GetField()<span class="keyword"> const </span>{<span class="keywordflow">return</span> *m_field;}
00075         <span class="keyword">const</span> FieldElement &amp; GetA()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_a;}
00076         <span class="keyword">const</span> FieldElement &amp; 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 &amp;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>() &amp;&amp; m_a == rhs.<a class="code" href="class_e_c2_n.html#_e_c2_nr1">m_a</a> &amp;&amp; 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&lt;Field&gt; 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&lt;EC2N::Point&gt;;
00088 CRYPTOPP_DLL_TEMPLATE_CLASS DL_GroupPrecomputation&lt;EC2N::Point&gt;;
00089 
00090 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <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>&lt;&gt; <span class="keyword">class </span>EcPrecomputation&lt;EC2N&gt; : <span class="keyword">public</span> DL_GroupPrecomputation&lt;EC2N::Point&gt;
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&lt;Element&gt;</a> &amp; 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> &amp;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> &amp;bt, <span class="keyword">const</span> Element &amp;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 &amp;ec) {m_ec = ec;}
00105         <span class="keyword">const</span> EC2N &amp; 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>