Sophie

Sophie

distrib > Fedora > 13 > i386 > media > os > by-pkgid > 07dfcfe50d66c9a48a3c5e6c1693f12a > files > 1706

cryptopp-doc-5.6.1-0.1.svn479.fc13.i686.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>Crypto++: eccrypto.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.6.1 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div class="tabs">
    <ul>
      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
    </ul>
  </div>
<h1>eccrypto.cpp</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// eccrypto.cpp - written and placed in the public domain by Wei Dai</span>
<a name="l00002"></a>00002 
<a name="l00003"></a>00003 <span class="preprocessor">#include &quot;pch.h&quot;</span>
<a name="l00004"></a>00004 
<a name="l00005"></a>00005 <span class="preprocessor">#ifndef CRYPTOPP_IMPORTS</span>
<a name="l00006"></a>00006 <span class="preprocessor"></span>
<a name="l00007"></a>00007 <span class="preprocessor">#include &quot;<a class="code" href="eccrypto_8h.html">eccrypto.h</a>&quot;</span>
<a name="l00008"></a>00008 <span class="preprocessor">#include &quot;nbtheory.h&quot;</span>
<a name="l00009"></a>00009 <span class="preprocessor">#include &quot;oids.h&quot;</span>
<a name="l00010"></a>00010 <span class="preprocessor">#include &quot;hex.h&quot;</span>
<a name="l00011"></a>00011 <span class="preprocessor">#include &quot;argnames.h&quot;</span>
<a name="l00012"></a>00012 <span class="preprocessor">#include &quot;ec2n.h&quot;</span>
<a name="l00013"></a>00013 
<a name="l00014"></a>00014 NAMESPACE_BEGIN(CryptoPP)
<a name="l00015"></a>00015 
<a name="l00016"></a>00016 <span class="preprocessor">#if 0</span>
<a name="l00017"></a>00017 <span class="preprocessor"></span><span class="keyword">static</span> <span class="keywordtype">void</span> ECDSA_TestInstantiations()
<a name="l00018"></a>00018 {
<a name="l00019"></a>00019         <a class="code" href="class_p_k___final_template.html" title="A template implementing constructors for public key algorithm classes.">ECDSA&lt;EC2N&gt;::Signer</a> t1;
<a name="l00020"></a>00020         <a class="code" href="class_p_k___final_template.html" title="A template implementing constructors for public key algorithm classes.">ECDSA&lt;EC2N&gt;::Verifier</a> t2(t1);
<a name="l00021"></a>00021         <a class="code" href="class_p_k___final_template.html" title="A template implementing constructors for public key algorithm classes.">ECNR&lt;ECP&gt;::Signer</a> t3;
<a name="l00022"></a>00022         <a class="code" href="class_p_k___final_template.html" title="A template implementing constructors for public key algorithm classes.">ECNR&lt;ECP&gt;::Verifier</a> t4(t3);
<a name="l00023"></a>00023         <a class="code" href="class_p_k___final_template.html" title="A template implementing constructors for public key algorithm classes.">ECIES&lt;ECP&gt;::Encryptor</a> t5;
<a name="l00024"></a>00024         <a class="code" href="class_p_k___final_template.html" title="A template implementing constructors for public key algorithm classes.">ECIES&lt;EC2N&gt;::Decryptor</a> t6;
<a name="l00025"></a>00025         <a class="code" href="class_d_h___domain.html" title=",">ECDH&lt;ECP&gt;::Domain</a> t7;
<a name="l00026"></a>00026         <a class="code" href="class_m_q_v___domain.html" title="_">ECMQV&lt;ECP&gt;::Domain</a> t8;
<a name="l00027"></a>00027 }
<a name="l00028"></a>00028 <span class="preprocessor">#endif</span>
<a name="l00029"></a>00029 <span class="preprocessor"></span>
<a name="l00030"></a>00030 <span class="comment">// VC60 workaround: complains when these functions are put into an anonymous namespace</span>
<a name="l00031"></a>00031 <span class="keyword">static</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> ConvertToInteger(<span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a> &amp;x)
<a name="l00032"></a>00032 {
<a name="l00033"></a>00033         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> l = x.<a class="code" href="class_polynomial_mod2.html#a928dd8ce9f76230479eb3bb6edc750e8" title="number of significant bytes = ceiling(BitCount()/8)">ByteCount</a>();
<a name="l00034"></a>00034         <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> temp(l);
<a name="l00035"></a>00035         x.<a class="code" href="class_polynomial_mod2.html#a5e50bea6c06c2acb63e257c0ab568e72" title="encode in big-endian format">Encode</a>(temp, l);
<a name="l00036"></a>00036         <span class="keywordflow">return</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a>(temp, l);
<a name="l00037"></a>00037 }
<a name="l00038"></a>00038 
<a name="l00039"></a>00039 <span class="keyword">static</span> <span class="keyword">inline</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> ConvertToInteger(<span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &amp;x)
<a name="l00040"></a>00040 {
<a name="l00041"></a>00041         <span class="keywordflow">return</span> x;
<a name="l00042"></a>00042 }
<a name="l00043"></a>00043 
<a name="l00044"></a>00044 <span class="keyword">static</span> <span class="keywordtype">bool</span> CheckMOVCondition(<span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &amp;q, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &amp;r)
<a name="l00045"></a>00045 {
<a name="l00046"></a>00046         <span class="comment">// see &quot;Updated standards for validating elliptic curves&quot;, http://eprint.iacr.org/2007/343</span>
<a name="l00047"></a>00047         <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> t = 1;
<a name="l00048"></a>00048         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n = q.IsEven() ? 1 : q.<a class="code" href="class_integer.html#a178398002ab175e788a3bc224e5e5a8d" title="number of significant bits = floor(log2(abs(*this))) + 1">BitCount</a>(), m = r.<a class="code" href="class_integer.html#a178398002ab175e788a3bc224e5e5a8d" title="number of significant bits = floor(log2(abs(*this))) + 1">BitCount</a>();
<a name="l00049"></a>00049 
<a name="l00050"></a>00050         <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=n; DiscreteLogWorkFactor(i)&lt;m/2; i+=n)
<a name="l00051"></a>00051         {
<a name="l00052"></a>00052                 <span class="keywordflow">if</span> (q.IsEven())
<a name="l00053"></a>00053                         t = (t+t)%r;
<a name="l00054"></a>00054                 <span class="keywordflow">else</span>
<a name="l00055"></a>00055                         t = (t*q)%r;
<a name="l00056"></a>00056                 <span class="keywordflow">if</span> (t == 1)
<a name="l00057"></a>00057                         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00058"></a>00058         }
<a name="l00059"></a>00059         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00060"></a>00060 }
<a name="l00061"></a>00061 
<a name="l00062"></a>00062 <span class="comment">// ******************************************************************</span>
<a name="l00063"></a>00063 
<a name="l00064"></a>00064 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt; <span class="keyword">struct </span>EcRecommendedParameters;
<a name="l00065"></a>00065 
<a name="l00066"></a><a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">00066</a> <span class="keyword">template</span>&lt;&gt; <span class="keyword">struct </span>EcRecommendedParameters&lt;<a class="code" href="class_e_c2_n.html" title="Elliptic Curve over GF(2^n).">EC2N</a>&gt;
<a name="l00067"></a>00067 {
<a name="l00068"></a>00068         EcRecommendedParameters(<span class="keyword">const</span> <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a> &amp;oid, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t2, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t3, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t4, <span class="keyword">const</span> <span class="keywordtype">char</span> *a, <span class="keyword">const</span> <span class="keywordtype">char</span> *b, <span class="keyword">const</span> <span class="keywordtype">char</span> *g, <span class="keyword">const</span> <span class="keywordtype">char</span> *n, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> h)
<a name="l00069"></a>00069                 : oid(oid), t0(0), t1(0), t2(t2), t3(t3), t4(t4), a(a), b(b), g(g), n(n), h(h) {}
<a name="l00070"></a>00070         EcRecommendedParameters(<span class="keyword">const</span> <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a> &amp;oid, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t0, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t1, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t2, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t3, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t4, <span class="keyword">const</span> <span class="keywordtype">char</span> *a, <span class="keyword">const</span> <span class="keywordtype">char</span> *b, <span class="keyword">const</span> <span class="keywordtype">char</span> *g, <span class="keyword">const</span> <span class="keywordtype">char</span> *n, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> h)
<a name="l00071"></a>00071                 : oid(oid), t0(t0), t1(t1), t2(t2), t3(t3), t4(t4), a(a), b(b), g(g), n(n), h(h) {}
<a name="l00072"></a>00072         <a class="code" href="class_e_c2_n.html" title="Elliptic Curve over GF(2^n).">EC2N</a> *NewEC()<span class="keyword"> const</span>
<a name="l00073"></a>00073 <span class="keyword">        </span>{
<a name="l00074"></a>00074                 <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a> ssA(a, <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html" title="Decode base 16 data back to bytes.">HexDecoder</a>);
<a name="l00075"></a>00075                 <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a> ssB(b, <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html" title="Decode base 16 data back to bytes.">HexDecoder</a>);
<a name="l00076"></a>00076                 <span class="keywordflow">if</span> (t0 == 0)
<a name="l00077"></a>00077                         <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code" href="class_e_c2_n.html" title="Elliptic Curve over GF(2^n).">EC2N</a>(<a class="code" href="class_g_f2_n_t.html" title="GF(2^n) with Trinomial Basis.">GF2NT</a>(t2, t3, t4), EC2N::FieldElement(ssA, (<span class="keywordtype">size_t</span>)ssA.<a class="code" href="class_buffered_transformation.html#a6ec48acd2d2bda08baa4baa1c9a8a99c" title="returns number of bytes that is currently ready for retrieval">MaxRetrievable</a>()), EC2N::FieldElement(ssB, (<span class="keywordtype">size_t</span>)ssB.<a class="code" href="class_buffered_transformation.html#a6ec48acd2d2bda08baa4baa1c9a8a99c" title="returns number of bytes that is currently ready for retrieval">MaxRetrievable</a>()));
<a name="l00078"></a>00078                 <span class="keywordflow">else</span>
<a name="l00079"></a>00079                         <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code" href="class_e_c2_n.html" title="Elliptic Curve over GF(2^n).">EC2N</a>(<a class="code" href="class_g_f2_n_p_p.html" title="GF(2^n) with Pentanomial Basis.">GF2NPP</a>(t0, t1, t2, t3, t4), EC2N::FieldElement(ssA, (<span class="keywordtype">size_t</span>)ssA.<a class="code" href="class_buffered_transformation.html#a6ec48acd2d2bda08baa4baa1c9a8a99c" title="returns number of bytes that is currently ready for retrieval">MaxRetrievable</a>()), EC2N::FieldElement(ssB, (<span class="keywordtype">size_t</span>)ssB.<a class="code" href="class_buffered_transformation.html#a6ec48acd2d2bda08baa4baa1c9a8a99c" title="returns number of bytes that is currently ready for retrieval">MaxRetrievable</a>()));
<a name="l00080"></a>00080         };
<a name="l00081"></a>00081 
<a name="l00082"></a>00082         <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a> oid;
<a name="l00083"></a>00083         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t0, t1, t2, t3, t4;
<a name="l00084"></a>00084         <span class="keyword">const</span> <span class="keywordtype">char</span> *a, *b, *g, *n;
<a name="l00085"></a>00085         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> h;
<a name="l00086"></a>00086 };
<a name="l00087"></a>00087 
<a name="l00088"></a><a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">00088</a> <span class="keyword">template</span>&lt;&gt; <span class="keyword">struct </span>EcRecommendedParameters&lt;<a class="code" href="class_e_c_p.html" title="Elliptic Curve over GF(p), where p is prime.">ECP</a>&gt;
<a name="l00089"></a>00089 {
<a name="l00090"></a>00090         EcRecommendedParameters(<span class="keyword">const</span> <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a> &amp;oid, <span class="keyword">const</span> <span class="keywordtype">char</span> *p, <span class="keyword">const</span> <span class="keywordtype">char</span> *a, <span class="keyword">const</span> <span class="keywordtype">char</span> *b, <span class="keyword">const</span> <span class="keywordtype">char</span> *g, <span class="keyword">const</span> <span class="keywordtype">char</span> *n, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> h)
<a name="l00091"></a>00091                 : oid(oid), p(p), a(a), b(b), g(g), n(n), h(h) {}
<a name="l00092"></a>00092         <a class="code" href="class_e_c_p.html" title="Elliptic Curve over GF(p), where p is prime.">ECP</a> *NewEC()<span class="keyword"> const</span>
<a name="l00093"></a>00093 <span class="keyword">        </span>{
<a name="l00094"></a>00094                 <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a> ssP(p, <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html" title="Decode base 16 data back to bytes.">HexDecoder</a>);
<a name="l00095"></a>00095                 <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a> ssA(a, <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html" title="Decode base 16 data back to bytes.">HexDecoder</a>);
<a name="l00096"></a>00096                 <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a> ssB(b, <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html" title="Decode base 16 data back to bytes.">HexDecoder</a>);
<a name="l00097"></a>00097                 <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code" href="class_e_c_p.html" title="Elliptic Curve over GF(p), where p is prime.">ECP</a>(<a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a>(ssP, (<span class="keywordtype">size_t</span>)ssP.<a class="code" href="class_buffered_transformation.html#a6ec48acd2d2bda08baa4baa1c9a8a99c" title="returns number of bytes that is currently ready for retrieval">MaxRetrievable</a>()), <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">ECP::FieldElement</a>(ssA, (<span class="keywordtype">size_t</span>)ssA.<a class="code" href="class_buffered_transformation.html#a6ec48acd2d2bda08baa4baa1c9a8a99c" title="returns number of bytes that is currently ready for retrieval">MaxRetrievable</a>()), <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">ECP::FieldElement</a>(ssB, (<span class="keywordtype">size_t</span>)ssB.<a class="code" href="class_buffered_transformation.html#a6ec48acd2d2bda08baa4baa1c9a8a99c" title="returns number of bytes that is currently ready for retrieval">MaxRetrievable</a>()));
<a name="l00098"></a>00098         };
<a name="l00099"></a>00099 
<a name="l00100"></a>00100         <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a> oid;
<a name="l00101"></a>00101         <span class="keyword">const</span> <span class="keywordtype">char</span> *p;
<a name="l00102"></a>00102         <span class="keyword">const</span> <span class="keywordtype">char</span> *a, *b, *g, *n;
<a name="l00103"></a>00103         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> h;
<a name="l00104"></a>00104 };
<a name="l00105"></a>00105 
<a name="l00106"></a><a class="code" href="struct_o_i_d_less_than.html">00106</a> <span class="keyword">struct </span><a class="code" href="struct_o_i_d_less_than.html">OIDLessThan</a>
<a name="l00107"></a>00107 {
<a name="l00108"></a>00108         <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00109"></a>00109         <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> EcRecommendedParameters&lt;T&gt;&amp; a, <span class="keyword">const</span> <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a>&amp; b) {<span class="keywordflow">return</span> a.oid &lt; b;}
<a name="l00110"></a>00110         <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00111"></a>00111         <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a>&amp; a, <span class="keyword">const</span> EcRecommendedParameters&lt;T&gt;&amp; b) {<span class="keywordflow">return</span> a &lt; b.oid;}
<a name="l00112"></a>00112         <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00113"></a>00113         <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> EcRecommendedParameters&lt;T&gt;&amp; a, <span class="keyword">const</span> EcRecommendedParameters&lt;T&gt;&amp; b) {<span class="keywordflow">return</span> a.oid &lt; b.oid;}
<a name="l00114"></a>00114 };
<a name="l00115"></a>00115 
<a name="l00116"></a>00116 <span class="keyword">static</span> <span class="keywordtype">void</span> GetRecommendedParameters(<span class="keyword">const</span> <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a> *&amp;begin, <span class="keyword">const</span> <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a> *&amp;end)
<a name="l00117"></a>00117 {
<a name="l00118"></a>00118         <span class="comment">// this array must be sorted by OID</span>
<a name="l00119"></a>00119         <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a> rec[] = {
<a name="l00120"></a>00120                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a>(ASN1::sect163k1(), 
<a name="l00121"></a>00121                         163, 7, 6, 3, 0,
<a name="l00122"></a>00122                         <span class="stringliteral">&quot;000000000000000000000000000000000000000001&quot;</span>,
<a name="l00123"></a>00123                         <span class="stringliteral">&quot;000000000000000000000000000000000000000001&quot;</span>,
<a name="l00124"></a>00124                         <span class="stringliteral">&quot;0402FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE80289070FB05D38FF58321F2E800536D538CCDAA3D9&quot;</span>,
<a name="l00125"></a>00125                         <span class="stringliteral">&quot;04000000000000000000020108A2E0CC0D99F8A5EF&quot;</span>,
<a name="l00126"></a>00126                         2),
<a name="l00127"></a>00127                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a>(ASN1::sect163r1(), 
<a name="l00128"></a>00128                         163, 7, 6, 3, 0,
<a name="l00129"></a>00129                         <span class="stringliteral">&quot;07B6882CAAEFA84F9554FF8428BD88E246D2782AE2&quot;</span>,
<a name="l00130"></a>00130                         <span class="stringliteral">&quot;0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9&quot;</span>,
<a name="l00131"></a>00131                         <span class="stringliteral">&quot;040369979697AB43897789566789567F787A7876A65400435EDB42EFAFB2989D51FEFCE3C80988F41FF883&quot;</span>,
<a name="l00132"></a>00132                         <span class="stringliteral">&quot;03FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B&quot;</span>,
<a name="l00133"></a>00133                         2),
<a name="l00134"></a>00134                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a>(ASN1::sect239k1(), 
<a name="l00135"></a>00135                         239, 158, 0,
<a name="l00136"></a>00136                         <span class="stringliteral">&quot;000000000000000000000000000000000000000000000000000000000000&quot;</span>,
<a name="l00137"></a>00137                         <span class="stringliteral">&quot;000000000000000000000000000000000000000000000000000000000001&quot;</span>,
<a name="l00138"></a>00138                         <span class="stringliteral">&quot;0429A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC76310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA&quot;</span>,
<a name="l00139"></a>00139                         <span class="stringliteral">&quot;2000000000000000000000000000005A79FEC67CB6E91F1C1DA800E478A5&quot;</span>,
<a name="l00140"></a>00140                         4),
<a name="l00141"></a>00141                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a>(ASN1::sect113r1(),
<a name="l00142"></a>00142                         113, 9, 0,
<a name="l00143"></a>00143                         <span class="stringliteral">&quot;003088250CA6E7C7FE649CE85820F7&quot;</span>,
<a name="l00144"></a>00144                         <span class="stringliteral">&quot;00E8BEE4D3E2260744188BE0E9C723&quot;</span>,
<a name="l00145"></a>00145                         <span class="stringliteral">&quot;04009D73616F35F4AB1407D73562C10F00A52830277958EE84D1315ED31886&quot;</span>,
<a name="l00146"></a>00146                         <span class="stringliteral">&quot;0100000000000000D9CCEC8A39E56F&quot;</span>,
<a name="l00147"></a>00147                         2),
<a name="l00148"></a>00148                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a>(ASN1::sect113r2(), 
<a name="l00149"></a>00149                         113, 9, 0,
<a name="l00150"></a>00150                         <span class="stringliteral">&quot;00689918DBEC7E5A0DD6DFC0AA55C7&quot;</span>,
<a name="l00151"></a>00151                         <span class="stringliteral">&quot;0095E9A9EC9B297BD4BF36E059184F&quot;</span>,
<a name="l00152"></a>00152                         <span class="stringliteral">&quot;0401A57A6A7B26CA5EF52FCDB816479700B3ADC94ED1FE674C06E695BABA1D&quot;</span>,
<a name="l00153"></a>00153                         <span class="stringliteral">&quot;010000000000000108789B2496AF93&quot;</span>,
<a name="l00154"></a>00154                         2),
<a name="l00155"></a>00155                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a>(ASN1::sect163r2(), 
<a name="l00156"></a>00156                         163, 7, 6, 3, 0,
<a name="l00157"></a>00157                         <span class="stringliteral">&quot;000000000000000000000000000000000000000001&quot;</span>,
<a name="l00158"></a>00158                         <span class="stringliteral">&quot;020A601907B8C953CA1481EB10512F78744A3205FD&quot;</span>,
<a name="l00159"></a>00159                         <span class="stringliteral">&quot;0403F0EBA16286A2D57EA0991168D4994637E8343E3600D51FBC6C71A0094FA2CDD545B11C5C0C797324F1&quot;</span>,
<a name="l00160"></a>00160                         <span class="stringliteral">&quot;040000000000000000000292FE77E70C12A4234C33&quot;</span>,
<a name="l00161"></a>00161                         2),
<a name="l00162"></a>00162                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a>(ASN1::sect283k1(), 
<a name="l00163"></a>00163                         283, 12, 7, 5, 0,
<a name="l00164"></a>00164                         <span class="stringliteral">&quot;000000000000000000000000000000000000000000000000000000000000000000000000&quot;</span>,
<a name="l00165"></a>00165                         <span class="stringliteral">&quot;000000000000000000000000000000000000000000000000000000000000000000000001&quot;</span>,
<a name="l00166"></a>00166                         <span class="stringliteral">&quot;040503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC245849283601CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2259&quot;</span>,
<a name="l00167"></a>00167                         <span class="stringliteral">&quot;01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163C61&quot;</span>,
<a name="l00168"></a>00168                         4),
<a name="l00169"></a>00169                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a>(ASN1::sect283r1(), 
<a name="l00170"></a>00170                         283, 12, 7, 5, 0,
<a name="l00171"></a>00171                         <span class="stringliteral">&quot;000000000000000000000000000000000000000000000000000000000000000000000001&quot;</span>,
<a name="l00172"></a>00172                         <span class="stringliteral">&quot;027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A2F5&quot;</span>,
<a name="l00173"></a>00173                         <span class="stringliteral">&quot;0405F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B1205303676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE8112F4&quot;</span>,
<a name="l00174"></a>00174                         <span class="stringliteral">&quot;03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB307&quot;</span>,
<a name="l00175"></a>00175                         2),
<a name="l00176"></a>00176                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a>(ASN1::sect131r1(), 
<a name="l00177"></a>00177                         131, 8, 3, 2, 0,
<a name="l00178"></a>00178                         <span class="stringliteral">&quot;07A11B09A76B562144418FF3FF8C2570B8&quot;</span>,
<a name="l00179"></a>00179                         <span class="stringliteral">&quot;0217C05610884B63B9C6C7291678F9D341&quot;</span>,
<a name="l00180"></a>00180                         <span class="stringliteral">&quot;040081BAF91FDF9833C40F9C181343638399078C6E7EA38C001F73C8134B1B4EF9E150&quot;</span>,
<a name="l00181"></a>00181                         <span class="stringliteral">&quot;0400000000000000023123953A9464B54D&quot;</span>,
<a name="l00182"></a>00182                         2),
<a name="l00183"></a>00183                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a>(ASN1::sect131r2(), 
<a name="l00184"></a>00184                         131, 8, 3, 2, 0,
<a name="l00185"></a>00185                         <span class="stringliteral">&quot;03E5A88919D7CAFCBF415F07C2176573B2&quot;</span>,
<a name="l00186"></a>00186                         <span class="stringliteral">&quot;04B8266A46C55657AC734CE38F018F2192&quot;</span>,
<a name="l00187"></a>00187                         <span class="stringliteral">&quot;040356DCD8F2F95031AD652D23951BB366A80648F06D867940A5366D9E265DE9EB240F&quot;</span>,
<a name="l00188"></a>00188                         <span class="stringliteral">&quot;0400000000000000016954A233049BA98F&quot;</span>,
<a name="l00189"></a>00189                         2),
<a name="l00190"></a>00190                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a>(ASN1::sect193r1(), 
<a name="l00191"></a>00191                         193, 15, 0,
<a name="l00192"></a>00192                         <span class="stringliteral">&quot;0017858FEB7A98975169E171F77B4087DE098AC8A911DF7B01&quot;</span>,
<a name="l00193"></a>00193                         <span class="stringliteral">&quot;00FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D831478814&quot;</span>,
<a name="l00194"></a>00194                         <span class="stringliteral">&quot;0401F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E10025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B05&quot;</span>,
<a name="l00195"></a>00195                         <span class="stringliteral">&quot;01000000000000000000000000C7F34A778F443ACC920EBA49&quot;</span>,
<a name="l00196"></a>00196                         2),
<a name="l00197"></a>00197                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a>(ASN1::sect193r2(), 
<a name="l00198"></a>00198                         193, 15, 0,
<a name="l00199"></a>00199                         <span class="stringliteral">&quot;0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709B&quot;</span>,
<a name="l00200"></a>00200                         <span class="stringliteral">&quot;00C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AE&quot;</span>,
<a name="l00201"></a>00201                         <span class="stringliteral">&quot;0400D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F01CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6C&quot;</span>,
<a name="l00202"></a>00202                         <span class="stringliteral">&quot;010000000000000000000000015AAB561B005413CCD4EE99D5&quot;</span>,
<a name="l00203"></a>00203                         2),
<a name="l00204"></a>00204                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a>(ASN1::sect233k1(), 
<a name="l00205"></a>00205                         233, 74, 0,
<a name="l00206"></a>00206                         <span class="stringliteral">&quot;000000000000000000000000000000000000000000000000000000000000&quot;</span>,
<a name="l00207"></a>00207                         <span class="stringliteral">&quot;000000000000000000000000000000000000000000000000000000000001&quot;</span>,
<a name="l00208"></a>00208                         <span class="stringliteral">&quot;04017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD612601DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3&quot;</span>,
<a name="l00209"></a>00209                         <span class="stringliteral">&quot;8000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF&quot;</span>,
<a name="l00210"></a>00210                         4),
<a name="l00211"></a>00211                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a>(ASN1::sect233r1(), 
<a name="l00212"></a>00212                         233, 74, 0,
<a name="l00213"></a>00213                         <span class="stringliteral">&quot;000000000000000000000000000000000000000000000000000000000001&quot;</span>,
<a name="l00214"></a>00214                         <span class="stringliteral">&quot;0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD&quot;</span>,
<a name="l00215"></a>00215                         <span class="stringliteral">&quot;0400FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052&quot;</span>,
<a name="l00216"></a>00216                         <span class="stringliteral">&quot;01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7&quot;</span>,
<a name="l00217"></a>00217                         2),
<a name="l00218"></a>00218                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a>(ASN1::sect409k1(), 
<a name="l00219"></a>00219                         409, 87, 0,
<a name="l00220"></a>00220                         <span class="stringliteral">&quot;00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000&quot;</span>,
<a name="l00221"></a>00221                         <span class="stringliteral">&quot;00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001&quot;</span>,
<a name="l00222"></a>00222                         <span class="stringliteral">&quot;040060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE902374601E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B&quot;</span>,
<a name="l00223"></a>00223                         <span class="stringliteral">&quot;7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF&quot;</span>,
<a name="l00224"></a>00224                         4),
<a name="l00225"></a>00225                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a>(ASN1::sect409r1(), 
<a name="l00226"></a>00226                         409, 87, 0,
<a name="l00227"></a>00227                         <span class="stringliteral">&quot;00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001&quot;</span>,
<a name="l00228"></a>00228                         <span class="stringliteral">&quot;0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9A197B272822F6CD57A55AA4F50AE317B13545F&quot;</span>,
<a name="l00229"></a>00229                         <span class="stringliteral">&quot;04015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A70061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F38514F1FDF4B4F40D2181B3681C364BA0273C706&quot;</span>,
<a name="l00230"></a>00230                         <span class="stringliteral">&quot;010000000000000000000000000000000000000000000000000001E2AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A21173&quot;</span>,
<a name="l00231"></a>00231                         2),
<a name="l00232"></a>00232                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a>(ASN1::sect571k1(), 
<a name="l00233"></a>00233                         571, 10, 5, 2, 0,
<a name="l00234"></a>00234                         <span class="stringliteral">&quot;000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000&quot;</span>,
<a name="l00235"></a>00235                         <span class="stringliteral">&quot;000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001&quot;</span>,
<a name="l00236"></a>00236                         <span class="stringliteral">&quot;04026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA44370958493B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C89720349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D4979C0AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143EF1C7A3&quot;</span>,
<a name="l00237"></a>00237                         <span class="stringliteral">&quot;020000000000000000000000000000000000000000000000000000000000000000000000131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C1001&quot;</span>,
<a name="l00238"></a>00238                         4),
<a name="l00239"></a>00239                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters&lt;EC2N&gt;</a>(ASN1::sect571r1(), 
<a name="l00240"></a>00240                         571, 10, 5, 2, 0,
<a name="l00241"></a>00241                         <span class="stringliteral">&quot;000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001&quot;</span>,
<a name="l00242"></a>00242                         <span class="stringliteral">&quot;02F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFABBD8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F2955727A&quot;</span>,
<a name="l00243"></a>00243                         <span class="stringliteral">&quot;040303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D19037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423E43BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B8AC15B&quot;</span>,
<a name="l00244"></a>00244                         <span class="stringliteral">&quot;03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47&quot;</span>,
<a name="l00245"></a>00245                         2),
<a name="l00246"></a>00246         };
<a name="l00247"></a>00247         begin = rec;
<a name="l00248"></a>00248         end = rec + <span class="keyword">sizeof</span>(rec)/<span class="keyword">sizeof</span>(rec[0]);
<a name="l00249"></a>00249 }
<a name="l00250"></a>00250 
<a name="l00251"></a>00251 <span class="keyword">static</span> <span class="keywordtype">void</span> GetRecommendedParameters(<span class="keyword">const</span> <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a> *&amp;begin, <span class="keyword">const</span> <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a> *&amp;end)
<a name="l00252"></a>00252 {
<a name="l00253"></a>00253         <span class="comment">// this array must be sorted by OID</span>
<a name="l00254"></a>00254         <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a> rec[] = {
<a name="l00255"></a>00255                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::secp192r1(),
<a name="l00256"></a>00256                         <span class="stringliteral">&quot;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF&quot;</span>,
<a name="l00257"></a>00257                         <span class="stringliteral">&quot;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC&quot;</span>,
<a name="l00258"></a>00258                         <span class="stringliteral">&quot;64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1&quot;</span>,
<a name="l00259"></a>00259                         <span class="stringliteral">&quot;04188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF101207192B95FFC8DA78631011ED6B24CDD573F977A11E794811&quot;</span>,
<a name="l00260"></a>00260                         <span class="stringliteral">&quot;FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831&quot;</span>,
<a name="l00261"></a>00261                         1),
<a name="l00262"></a>00262                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::secp256r1(),
<a name="l00263"></a>00263                         <span class="stringliteral">&quot;FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF&quot;</span>,
<a name="l00264"></a>00264                         <span class="stringliteral">&quot;FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC&quot;</span>,
<a name="l00265"></a>00265                         <span class="stringliteral">&quot;5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B&quot;</span>,
<a name="l00266"></a>00266                         <span class="stringliteral">&quot;046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5&quot;</span>,
<a name="l00267"></a>00267                         <span class="stringliteral">&quot;FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551&quot;</span>,
<a name="l00268"></a>00268                         1),
<a name="l00269"></a>00269                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::brainpoolP160r1(),
<a name="l00270"></a>00270                         <span class="stringliteral">&quot;E95E4A5F737059DC60DFC7AD95B3D8139515620F&quot;</span>,
<a name="l00271"></a>00271                         <span class="stringliteral">&quot;340E7BE2A280EB74E2BE61BADA745D97E8F7C300&quot;</span>,
<a name="l00272"></a>00272                         <span class="stringliteral">&quot;1E589A8595423412134FAA2DBDEC95C8D8675E58&quot;</span>,
<a name="l00273"></a>00273                         <span class="stringliteral">&quot;04BED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC31667CB477A1A8EC338F94741669C976316DA6321&quot;</span>,
<a name="l00274"></a>00274                         <span class="stringliteral">&quot;E95E4A5F737059DC60DF5991D45029409E60FC09&quot;</span>,
<a name="l00275"></a>00275                         1),
<a name="l00276"></a>00276                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::brainpoolP192r1(),
<a name="l00277"></a>00277                         <span class="stringliteral">&quot;C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297&quot;</span>,
<a name="l00278"></a>00278                         <span class="stringliteral">&quot;6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF&quot;</span>,
<a name="l00279"></a>00279                         <span class="stringliteral">&quot;469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9&quot;</span>,
<a name="l00280"></a>00280                         <span class="stringliteral">&quot;04C0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD614B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F&quot;</span>,
<a name="l00281"></a>00281                         <span class="stringliteral">&quot;C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1&quot;</span>,
<a name="l00282"></a>00282                         1),
<a name="l00283"></a>00283                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::brainpoolP224r1(),
<a name="l00284"></a>00284                         <span class="stringliteral">&quot;D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF&quot;</span>,
<a name="l00285"></a>00285                         <span class="stringliteral">&quot;68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43&quot;</span>,
<a name="l00286"></a>00286                         <span class="stringliteral">&quot;2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B&quot;</span>,
<a name="l00287"></a>00287                         <span class="stringliteral">&quot;040D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD&quot;</span>,
<a name="l00288"></a>00288                         <span class="stringliteral">&quot;D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F&quot;</span>,
<a name="l00289"></a>00289                         1),
<a name="l00290"></a>00290                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::brainpoolP256r1(),
<a name="l00291"></a>00291                         <span class="stringliteral">&quot;A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377&quot;</span>,
<a name="l00292"></a>00292                         <span class="stringliteral">&quot;7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9&quot;</span>,
<a name="l00293"></a>00293                         <span class="stringliteral">&quot;26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6&quot;</span>,
<a name="l00294"></a>00294                         <span class="stringliteral">&quot;048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997&quot;</span>,
<a name="l00295"></a>00295                         <span class="stringliteral">&quot;A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7&quot;</span>,
<a name="l00296"></a>00296                         1),
<a name="l00297"></a>00297                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::brainpoolP320r1(),
<a name="l00298"></a>00298                         <span class="stringliteral">&quot;D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E27&quot;</span>,
<a name="l00299"></a>00299                         <span class="stringliteral">&quot;3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F492F375A97D860EB4&quot;</span>,
<a name="l00300"></a>00300                         <span class="stringliteral">&quot;520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD884539816F5EB4AC8FB1F1A6&quot;</span>,
<a name="l00301"></a>00301                         <span class="stringliteral">&quot;0443BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C710AF8D0D39E2061114FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7D35245D1692E8EE1&quot;</span>,
<a name="l00302"></a>00302                         <span class="stringliteral">&quot;D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E98691555B44C59311&quot;</span>,
<a name="l00303"></a>00303                         1),
<a name="l00304"></a>00304                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::brainpoolP384r1(),
<a name="l00305"></a>00305                         <span class="stringliteral">&quot;8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53&quot;</span>,
<a name="l00306"></a>00306                         <span class="stringliteral">&quot;7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503AD4EB04A8C7DD22CE2826&quot;</span>,
<a name="l00307"></a>00307                         <span class="stringliteral">&quot;04A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D57CB4390295DBC9943AB78696FA504C11&quot;</span>,
<a name="l00308"></a>00308                         <span class="stringliteral">&quot;041D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315&quot;</span>,
<a name="l00309"></a>00309                         <span class="stringliteral">&quot;8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565&quot;</span>,
<a name="l00310"></a>00310                         1),
<a name="l00311"></a>00311                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::brainpoolP512r1(),
<a name="l00312"></a>00312                         <span class="stringliteral">&quot;AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3&quot;</span>,
<a name="l00313"></a>00313                         <span class="stringliteral">&quot;7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA&quot;</span>,
<a name="l00314"></a>00314                         <span class="stringliteral">&quot;3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723&quot;</span>,
<a name="l00315"></a>00315                         <span class="stringliteral">&quot;0481AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F8227DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892&quot;</span>,
<a name="l00316"></a>00316                         <span class="stringliteral">&quot;AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069&quot;</span>,
<a name="l00317"></a>00317                         1),
<a name="l00318"></a>00318                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::secp112r1(),
<a name="l00319"></a>00319                         <span class="stringliteral">&quot;DB7C2ABF62E35E668076BEAD208B&quot;</span>,
<a name="l00320"></a>00320                         <span class="stringliteral">&quot;DB7C2ABF62E35E668076BEAD2088&quot;</span>,
<a name="l00321"></a>00321                         <span class="stringliteral">&quot;659EF8BA043916EEDE8911702B22&quot;</span>,
<a name="l00322"></a>00322                         <span class="stringliteral">&quot;0409487239995A5EE76B55F9C2F098A89CE5AF8724C0A23E0E0FF77500&quot;</span>,
<a name="l00323"></a>00323                         <span class="stringliteral">&quot;DB7C2ABF62E35E7628DFAC6561C5&quot;</span>,
<a name="l00324"></a>00324                         1),
<a name="l00325"></a>00325                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::secp112r2(),
<a name="l00326"></a>00326                         <span class="stringliteral">&quot;DB7C2ABF62E35E668076BEAD208B&quot;</span>,
<a name="l00327"></a>00327                         <span class="stringliteral">&quot;6127C24C05F38A0AAAF65C0EF02C&quot;</span>,
<a name="l00328"></a>00328                         <span class="stringliteral">&quot;51DEF1815DB5ED74FCC34C85D709&quot;</span>,
<a name="l00329"></a>00329                         <span class="stringliteral">&quot;044BA30AB5E892B4E1649DD0928643ADCD46F5882E3747DEF36E956E97&quot;</span>,
<a name="l00330"></a>00330                         <span class="stringliteral">&quot;36DF0AAFD8B8D7597CA10520D04B&quot;</span>,
<a name="l00331"></a>00331                         4),
<a name="l00332"></a>00332                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::secp160r1(),
<a name="l00333"></a>00333                         <span class="stringliteral">&quot;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF&quot;</span>,
<a name="l00334"></a>00334                         <span class="stringliteral">&quot;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC&quot;</span>,
<a name="l00335"></a>00335                         <span class="stringliteral">&quot;1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45&quot;</span>,
<a name="l00336"></a>00336                         <span class="stringliteral">&quot;044A96B5688EF573284664698968C38BB913CBFC8223A628553168947D59DCC912042351377AC5FB32&quot;</span>,
<a name="l00337"></a>00337                         <span class="stringliteral">&quot;0100000000000000000001F4C8F927AED3CA752257&quot;</span>,
<a name="l00338"></a>00338                         1),
<a name="l00339"></a>00339                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::secp160k1(),
<a name="l00340"></a>00340                         <span class="stringliteral">&quot;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73&quot;</span>,
<a name="l00341"></a>00341                         <span class="stringliteral">&quot;0000000000000000000000000000000000000000&quot;</span>,
<a name="l00342"></a>00342                         <span class="stringliteral">&quot;0000000000000000000000000000000000000007&quot;</span>,
<a name="l00343"></a>00343                         <span class="stringliteral">&quot;043B4C382CE37AA192A4019E763036F4F5DD4D7EBB938CF935318FDCED6BC28286531733C3F03C4FEE&quot;</span>,
<a name="l00344"></a>00344                         <span class="stringliteral">&quot;0100000000000000000001B8FA16DFAB9ACA16B6B3&quot;</span>,
<a name="l00345"></a>00345                         1),
<a name="l00346"></a>00346                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::secp256k1(),
<a name="l00347"></a>00347                         <span class="stringliteral">&quot;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F&quot;</span>,
<a name="l00348"></a>00348                         <span class="stringliteral">&quot;0000000000000000000000000000000000000000000000000000000000000000&quot;</span>,
<a name="l00349"></a>00349                         <span class="stringliteral">&quot;0000000000000000000000000000000000000000000000000000000000000007&quot;</span>,
<a name="l00350"></a>00350                         <span class="stringliteral">&quot;0479BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8&quot;</span>,
<a name="l00351"></a>00351                         <span class="stringliteral">&quot;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141&quot;</span>,
<a name="l00352"></a>00352                         1),
<a name="l00353"></a>00353                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::secp128r1(),
<a name="l00354"></a>00354                         <span class="stringliteral">&quot;FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF&quot;</span>,
<a name="l00355"></a>00355                         <span class="stringliteral">&quot;FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC&quot;</span>,
<a name="l00356"></a>00356                         <span class="stringliteral">&quot;E87579C11079F43DD824993C2CEE5ED3&quot;</span>,
<a name="l00357"></a>00357                         <span class="stringliteral">&quot;04161FF7528B899B2D0C28607CA52C5B86CF5AC8395BAFEB13C02DA292DDED7A83&quot;</span>,
<a name="l00358"></a>00358                         <span class="stringliteral">&quot;FFFFFFFE0000000075A30D1B9038A115&quot;</span>,
<a name="l00359"></a>00359                         1),
<a name="l00360"></a>00360                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::secp128r2(),
<a name="l00361"></a>00361                         <span class="stringliteral">&quot;FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF&quot;</span>,
<a name="l00362"></a>00362                         <span class="stringliteral">&quot;D6031998D1B3BBFEBF59CC9BBFF9AEE1&quot;</span>,
<a name="l00363"></a>00363                         <span class="stringliteral">&quot;5EEEFCA380D02919DC2C6558BB6D8A5D&quot;</span>,
<a name="l00364"></a>00364                         <span class="stringliteral">&quot;047B6AA5D85E572983E6FB32A7CDEBC14027B6916A894D3AEE7106FE805FC34B44&quot;</span>,
<a name="l00365"></a>00365                         <span class="stringliteral">&quot;3FFFFFFF7FFFFFFFBE0024720613B5A3&quot;</span>,
<a name="l00366"></a>00366                         4),
<a name="l00367"></a>00367                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::secp160r2(),
<a name="l00368"></a>00368                         <span class="stringliteral">&quot;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73&quot;</span>,
<a name="l00369"></a>00369                         <span class="stringliteral">&quot;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70&quot;</span>,
<a name="l00370"></a>00370                         <span class="stringliteral">&quot;B4E134D3FB59EB8BAB57274904664D5AF50388BA&quot;</span>,
<a name="l00371"></a>00371                         <span class="stringliteral">&quot;0452DCB034293A117E1F4FF11B30F7199D3144CE6DFEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E&quot;</span>,
<a name="l00372"></a>00372                         <span class="stringliteral">&quot;0100000000000000000000351EE786A818F3A1A16B&quot;</span>,
<a name="l00373"></a>00373                         1),
<a name="l00374"></a>00374                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::secp192k1(),
<a name="l00375"></a>00375                         <span class="stringliteral">&quot;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37&quot;</span>,
<a name="l00376"></a>00376                         <span class="stringliteral">&quot;000000000000000000000000000000000000000000000000&quot;</span>,
<a name="l00377"></a>00377                         <span class="stringliteral">&quot;000000000000000000000000000000000000000000000003&quot;</span>,
<a name="l00378"></a>00378                         <span class="stringliteral">&quot;04DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D&quot;</span>,
<a name="l00379"></a>00379                         <span class="stringliteral">&quot;FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D&quot;</span>,
<a name="l00380"></a>00380                         1),
<a name="l00381"></a>00381                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::secp224k1(),
<a name="l00382"></a>00382                         <span class="stringliteral">&quot;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D&quot;</span>,
<a name="l00383"></a>00383                         <span class="stringliteral">&quot;00000000000000000000000000000000000000000000000000000000&quot;</span>,
<a name="l00384"></a>00384                         <span class="stringliteral">&quot;00000000000000000000000000000000000000000000000000000005&quot;</span>,
<a name="l00385"></a>00385                         <span class="stringliteral">&quot;04A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5&quot;</span>,
<a name="l00386"></a>00386                         <span class="stringliteral">&quot;010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7&quot;</span>,
<a name="l00387"></a>00387                         1),
<a name="l00388"></a>00388                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::secp224r1(),
<a name="l00389"></a>00389                         <span class="stringliteral">&quot;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001&quot;</span>,
<a name="l00390"></a>00390                         <span class="stringliteral">&quot;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE&quot;</span>,
<a name="l00391"></a>00391                         <span class="stringliteral">&quot;B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4&quot;</span>,
<a name="l00392"></a>00392                         <span class="stringliteral">&quot;04B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34&quot;</span>,
<a name="l00393"></a>00393                         <span class="stringliteral">&quot;FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D&quot;</span>,
<a name="l00394"></a>00394                         1),
<a name="l00395"></a>00395                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::secp384r1(),
<a name="l00396"></a>00396                         <span class="stringliteral">&quot;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF&quot;</span>,
<a name="l00397"></a>00397                         <span class="stringliteral">&quot;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC&quot;</span>,
<a name="l00398"></a>00398                         <span class="stringliteral">&quot;B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF&quot;</span>,
<a name="l00399"></a>00399                         <span class="stringliteral">&quot;04AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB73617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F&quot;</span>,
<a name="l00400"></a>00400                         <span class="stringliteral">&quot;FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973&quot;</span>,
<a name="l00401"></a>00401                         1),
<a name="l00402"></a>00402                 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters&lt;ECP&gt;</a>(ASN1::secp521r1(),
<a name="l00403"></a>00403                         <span class="stringliteral">&quot;01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF&quot;</span>,
<a name="l00404"></a>00404                         <span class="stringliteral">&quot;01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC&quot;</span>,
<a name="l00405"></a>00405                         <span class="stringliteral">&quot;0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00&quot;</span>,
<a name="l00406"></a>00406                         <span class="stringliteral">&quot;0400C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650&quot;</span>,
<a name="l00407"></a>00407                         <span class="stringliteral">&quot;01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409&quot;</span>,
<a name="l00408"></a>00408                         1),
<a name="l00409"></a>00409         };
<a name="l00410"></a>00410         begin = rec;
<a name="l00411"></a>00411         end = rec + <span class="keyword">sizeof</span>(rec)/<span class="keyword">sizeof</span>(rec[0]);
<a name="l00412"></a>00412 }
<a name="l00413"></a>00413 
<a name="l00414"></a>00414 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt; <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a> <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC&lt;EC&gt;::GetNextRecommendedParametersOID</a>(<span class="keyword">const</span> <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a> &amp;oid)
<a name="l00415"></a>00415 {
<a name="l00416"></a>00416         <span class="keyword">const</span> EcRecommendedParameters&lt;EllipticCurve&gt; *begin, *end;
<a name="l00417"></a>00417         GetRecommendedParameters(begin, end);
<a name="l00418"></a>00418         <span class="keyword">const</span> EcRecommendedParameters&lt;EllipticCurve&gt; *it = std::upper_bound(begin, end, oid, <a class="code" href="struct_o_i_d_less_than.html">OIDLessThan</a>());
<a name="l00419"></a>00419         <span class="keywordflow">return</span> (it == end ? <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a>() : it-&gt;oid);
<a name="l00420"></a>00420 }
<a name="l00421"></a>00421 
<a name="l00422"></a>00422 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt; <span class="keywordtype">void</span> <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC&lt;EC&gt;::Initialize</a>(<span class="keyword">const</span> <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a> &amp;oid)
<a name="l00423"></a>00423 {
<a name="l00424"></a>00424         <span class="keyword">const</span> EcRecommendedParameters&lt;EllipticCurve&gt; *begin, *end;
<a name="l00425"></a>00425         GetRecommendedParameters(begin, end);
<a name="l00426"></a>00426         <span class="keyword">const</span> EcRecommendedParameters&lt;EllipticCurve&gt; *it = std::lower_bound(begin, end, oid, <a class="code" href="struct_o_i_d_less_than.html">OIDLessThan</a>());
<a name="l00427"></a>00427         <span class="keywordflow">if</span> (it == end || it-&gt;oid != oid)
<a name="l00428"></a>00428                 <span class="keywordflow">throw</span> <a class="code" href="class_unknown_o_i_d.html">UnknownOID</a>();
<a name="l00429"></a>00429 
<a name="l00430"></a>00430         <span class="keyword">const</span> EcRecommendedParameters&lt;EllipticCurve&gt; &amp;param = *it;
<a name="l00431"></a>00431         m_oid = oid;
<a name="l00432"></a>00432         std::auto_ptr&lt;EllipticCurve&gt; ec(param.NewEC());
<a name="l00433"></a>00433         this-&gt;m_groupPrecomputation.SetCurve(*ec);
<a name="l00434"></a>00434 
<a name="l00435"></a>00435         <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a> ssG(param.g, <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html" title="Decode base 16 data back to bytes.">HexDecoder</a>);
<a name="l00436"></a>00436         Element G;
<a name="l00437"></a>00437         <span class="keywordtype">bool</span> result = GetCurve().DecodePoint(G, ssG, (<span class="keywordtype">size_t</span>)ssG.MaxRetrievable());
<a name="l00438"></a>00438         SetSubgroupGenerator(G);
<a name="l00439"></a>00439         assert(result);
<a name="l00440"></a>00440 
<a name="l00441"></a>00441         <a class="code" href="class_string_source.html" title="string-based implementation of Source interface">StringSource</a> ssN(param.n, <span class="keyword">true</span>, <span class="keyword">new</span> <a class="code" href="class_hex_decoder.html" title="Decode base 16 data back to bytes.">HexDecoder</a>);
<a name="l00442"></a>00442         m_n.Decode(ssN, (<span class="keywordtype">size_t</span>)ssN.MaxRetrievable());
<a name="l00443"></a>00443         m_k = param.h;
<a name="l00444"></a>00444 }
<a name="l00445"></a>00445 
<a name="l00446"></a>00446 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00447"></a><a class="code" href="class_d_l___group_parameters___e_c.html#ae8d87127ad35ac8738e078069770d4fe">00447</a> <span class="keywordtype">bool</span> <a class="code" href="class_d_l___group_parameters___e_c.html#ae8d87127ad35ac8738e078069770d4fe" title="to be implemented by derived classes, users should use one of the above functions...">DL_GroupParameters_EC&lt;EC&gt;::GetVoidValue</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> std::type_info &amp;valueType, <span class="keywordtype">void</span> *pValue)<span class="keyword"> const</span>
<a name="l00448"></a>00448 <span class="keyword"></span>{
<a name="l00449"></a>00449         <span class="keywordflow">if</span> (strcmp(name, Name::GroupOID()) == 0)
<a name="l00450"></a>00450         {
<a name="l00451"></a>00451                 <span class="keywordflow">if</span> (m_oid.m_values.empty())
<a name="l00452"></a>00452                         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00453"></a>00453 
<a name="l00454"></a>00454                 this-&gt;<a class="code" href="class_name_value_pairs.html#aa50a73b1705adb00ace9463b59696fb7" title="used by derived classes to check for type mismatch">ThrowIfTypeMismatch</a>(name, <span class="keyword">typeid</span>(<a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a>), valueType);
<a name="l00455"></a>00455                 *<span class="keyword">reinterpret_cast&lt;</span><a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a> *<span class="keyword">&gt;</span>(pValue) = m_oid;
<a name="l00456"></a>00456                 <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00457"></a>00457         }
<a name="l00458"></a>00458         <span class="keywordflow">else</span>
<a name="l00459"></a>00459                 <span class="keywordflow">return</span> GetValueHelper&lt;DL_GroupParameters&lt;Element&gt; &gt;(<span class="keyword">this</span>, name, valueType, pValue).Assignable()
<a name="l00460"></a>00460                         CRYPTOPP_GET_FUNCTION_ENTRY(Curve);
<a name="l00461"></a>00461 }
<a name="l00462"></a>00462 
<a name="l00463"></a>00463 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00464"></a><a class="code" href="class_d_l___group_parameters___e_c.html#a8fa1181ce7cf91f12ba6de286d1da5bd">00464</a> <span class="keywordtype">void</span> <a class="code" href="class_d_l___group_parameters___e_c.html#a8fa1181ce7cf91f12ba6de286d1da5bd" title="assign values from source to this object">DL_GroupParameters_EC&lt;EC&gt;::AssignFrom</a>(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &amp;source)
<a name="l00465"></a>00465 {
<a name="l00466"></a>00466         <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a> oid;
<a name="l00467"></a>00467         <span class="keywordflow">if</span> (source.<a class="code" href="class_name_value_pairs.html#a96686e9f8d6ce3ab870e516fb72b608e" title="get a named value, returns true if the name exists">GetValue</a>(Name::GroupOID(), oid))
<a name="l00468"></a>00468                 Initialize(oid);
<a name="l00469"></a>00469         <span class="keywordflow">else</span>
<a name="l00470"></a>00470         {
<a name="l00471"></a>00471                 EllipticCurve ec;
<a name="l00472"></a>00472                 Point G;
<a name="l00473"></a>00473                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> n;
<a name="l00474"></a>00474 
<a name="l00475"></a>00475                 source.GetRequiredParameter(<span class="stringliteral">&quot;DL_GroupParameters_EC&lt;EC&gt;&quot;</span>, Name::Curve(), ec);
<a name="l00476"></a>00476                 source.GetRequiredParameter(<span class="stringliteral">&quot;DL_GroupParameters_EC&lt;EC&gt;&quot;</span>, Name::SubgroupGenerator(), G);
<a name="l00477"></a>00477                 source.GetRequiredParameter(<span class="stringliteral">&quot;DL_GroupParameters_EC&lt;EC&gt;&quot;</span>, Name::SubgroupOrder(), n);
<a name="l00478"></a>00478                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> k = source.<a class="code" href="class_name_value_pairs.html#a943b2009297783f1c35bae46efc3b5f7" title="get a named value, returns the default if the name doesn&amp;#39;t exist">GetValueWithDefault</a>(Name::Cofactor(), <a class="code" href="class_integer.html#a19b7e6d48b1b57bd4846160ea2928175" title="avoid calling constructors for these frequently used integers">Integer::Zero</a>());
<a name="l00479"></a>00479 
<a name="l00480"></a>00480                 Initialize(ec, G, n, k);
<a name="l00481"></a>00481         }
<a name="l00482"></a>00482 }
<a name="l00483"></a>00483 
<a name="l00484"></a>00484 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00485"></a><a class="code" href="class_d_l___group_parameters___e_c.html#a519a33d073fe5bf2f278a0de75a404ab">00485</a> <span class="keywordtype">void</span> <a class="code" href="class_d_l___group_parameters___e_c.html#a519a33d073fe5bf2f278a0de75a404ab" title="this implementation doesn&amp;#39;t actually generate a curve, it just initializes the...">DL_GroupParameters_EC&lt;EC&gt;::GenerateRandom</a>(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &amp;alg)
<a name="l00486"></a>00486 {
<a name="l00487"></a>00487         <span class="keywordflow">try</span>
<a name="l00488"></a>00488         {
<a name="l00489"></a>00489                 <a class="code" href="class_d_l___group_parameters___e_c.html#a8fa1181ce7cf91f12ba6de286d1da5bd" title="assign values from source to this object">AssignFrom</a>(alg);
<a name="l00490"></a>00490         }
<a name="l00491"></a>00491         <span class="keywordflow">catch</span> (<a class="code" href="class_invalid_argument.html" title="exception thrown when an invalid argument is detected">InvalidArgument</a> &amp;)
<a name="l00492"></a>00492         {
<a name="l00493"></a>00493                 <span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(<span class="stringliteral">&quot;DL_GroupParameters_EC&lt;EC&gt;: curve generation is not implemented yet&quot;</span>);
<a name="l00494"></a>00494         }
<a name="l00495"></a>00495 }
<a name="l00496"></a>00496 
<a name="l00497"></a>00497 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00498"></a>00498 <span class="keywordtype">void</span> <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC&lt;EC&gt;::BERDecode</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt)
<a name="l00499"></a>00499 {
<a name="l00500"></a>00500         byte b;
<a name="l00501"></a>00501         <span class="keywordflow">if</span> (!bt.<a class="code" href="class_buffered_transformation.html#a5fa048faf8c043ad57ae0a8911070090" title="peek at the next byte without removing it from the output buffer">Peek</a>(b))
<a name="l00502"></a>00502                 BERDecodeError();
<a name="l00503"></a>00503         <span class="keywordflow">if</span> (b == OBJECT_IDENTIFIER)
<a name="l00504"></a>00504                 Initialize(<a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a>(bt));
<a name="l00505"></a>00505         <span class="keywordflow">else</span>
<a name="l00506"></a>00506         {
<a name="l00507"></a>00507                 <a class="code" href="class_b_e_r_sequence_decoder.html" title="BER Sequence Decoder.">BERSequenceDecoder</a> seq(bt);
<a name="l00508"></a>00508                         word32 version;
<a name="l00509"></a>00509                         BERDecodeUnsigned&lt;word32&gt;(seq, version, INTEGER, 1, 1); <span class="comment">// check version</span>
<a name="l00510"></a>00510                         EllipticCurve ec(seq);
<a name="l00511"></a>00511                         Point G = ec.BERDecodePoint(seq);
<a name="l00512"></a>00512                         <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> n(seq);
<a name="l00513"></a>00513                         <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> k;
<a name="l00514"></a>00514                         <span class="keywordtype">bool</span> cofactorPresent = !seq.EndReached();
<a name="l00515"></a>00515                         <span class="keywordflow">if</span> (cofactorPresent)
<a name="l00516"></a>00516                                 k.BERDecode(seq);
<a name="l00517"></a>00517                         <span class="keywordflow">else</span>
<a name="l00518"></a>00518                                 k = <a class="code" href="class_integer.html#a19b7e6d48b1b57bd4846160ea2928175" title="avoid calling constructors for these frequently used integers">Integer::Zero</a>();
<a name="l00519"></a>00519                 seq.MessageEnd();
<a name="l00520"></a>00520 
<a name="l00521"></a>00521                 Initialize(ec, G, n, k);
<a name="l00522"></a>00522         }
<a name="l00523"></a>00523 }
<a name="l00524"></a>00524 
<a name="l00525"></a>00525 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00526"></a>00526 <span class="keywordtype">void</span> <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC&lt;EC&gt;::DEREncode</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span>
<a name="l00527"></a>00527 <span class="keyword"></span>{
<a name="l00528"></a>00528         <span class="keywordflow">if</span> (m_encodeAsOID &amp;&amp; !m_oid.m_values.empty())
<a name="l00529"></a>00529                 m_oid.DEREncode(bt);
<a name="l00530"></a>00530         <span class="keywordflow">else</span>
<a name="l00531"></a>00531         {
<a name="l00532"></a>00532                 <a class="code" href="class_d_e_r_sequence_encoder.html" title="DER Sequence Encoder.">DERSequenceEncoder</a> seq(bt);
<a name="l00533"></a>00533                 DEREncodeUnsigned&lt;word32&gt;(seq, 1);      <span class="comment">// version</span>
<a name="l00534"></a>00534                 GetCurve().DEREncode(seq);
<a name="l00535"></a>00535                 GetCurve().DEREncodePoint(seq, this-&gt;GetSubgroupGenerator(), m_compress);
<a name="l00536"></a>00536                 m_n.<a class="code" href="class_integer.html#a6ab51a05bee88cfa690179611e8a084e" title="encode using Distinguished Encoding Rules, put result into a BufferedTransformation...">DEREncode</a>(seq);
<a name="l00537"></a>00537                 <span class="keywordflow">if</span> (m_k.NotZero())
<a name="l00538"></a>00538                         m_k.<a class="code" href="class_integer.html#a6ab51a05bee88cfa690179611e8a084e" title="encode using Distinguished Encoding Rules, put result into a BufferedTransformation...">DEREncode</a>(seq);
<a name="l00539"></a>00539                 seq.MessageEnd();
<a name="l00540"></a>00540         }
<a name="l00541"></a>00541 }
<a name="l00542"></a>00542 
<a name="l00543"></a>00543 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00544"></a>00544 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC&lt;EC&gt;::GetCofactor</a>()<span class="keyword"> const</span>
<a name="l00545"></a>00545 <span class="keyword"></span>{
<a name="l00546"></a>00546         <span class="keywordflow">if</span> (!m_k)
<a name="l00547"></a>00547         {
<a name="l00548"></a>00548                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> q = GetCurve().FieldSize();
<a name="l00549"></a>00549                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> qSqrt = q.<a class="code" href="class_integer.html#a9cbc1009bb421942470163aed5e3fefb" title="extract square root, if negative return 0, else return floor of square root">SquareRoot</a>();
<a name="l00550"></a>00550                 m_k = (q+2*qSqrt+1)/m_n;
<a name="l00551"></a>00551         }
<a name="l00552"></a>00552 
<a name="l00553"></a>00553         <span class="keywordflow">return</span> m_k;
<a name="l00554"></a>00554 }
<a name="l00555"></a>00555 
<a name="l00556"></a>00556 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00557"></a>00557 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC&lt;EC&gt;::ConvertElementToInteger</a>(<span class="keyword">const</span> Element &amp;element)<span class="keyword"> const</span>
<a name="l00558"></a>00558 <span class="keyword"></span>{
<a name="l00559"></a>00559         <span class="keywordflow">return</span> ConvertToInteger(element.x);
<a name="l00560"></a>00560 };
<a name="l00561"></a>00561 
<a name="l00562"></a>00562 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00563"></a>00563 <span class="keywordtype">bool</span> <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC&lt;EC&gt;::ValidateGroup</a>(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> level)<span class="keyword"> const</span>
<a name="l00564"></a>00564 <span class="keyword"></span>{
<a name="l00565"></a>00565         <span class="keywordtype">bool</span> pass = GetCurve().ValidateParameters(rng, level);
<a name="l00566"></a>00566 
<a name="l00567"></a>00567         <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> q = GetCurve().FieldSize();
<a name="l00568"></a>00568         pass = pass &amp;&amp; m_n!=q;
<a name="l00569"></a>00569 
<a name="l00570"></a>00570         <span class="keywordflow">if</span> (level &gt;= 2)
<a name="l00571"></a>00571         {
<a name="l00572"></a>00572                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> qSqrt = q.<a class="code" href="class_integer.html#a9cbc1009bb421942470163aed5e3fefb" title="extract square root, if negative return 0, else return floor of square root">SquareRoot</a>();
<a name="l00573"></a>00573                 pass = pass &amp;&amp; m_n&gt;4*qSqrt;
<a name="l00574"></a>00574                 pass = pass &amp;&amp; VerifyPrime(rng, m_n, level-2);
<a name="l00575"></a>00575                 pass = pass &amp;&amp; (m_k.IsZero() || m_k == (q+2*qSqrt+1)/m_n);
<a name="l00576"></a>00576                 pass = pass &amp;&amp; CheckMOVCondition(q, m_n);
<a name="l00577"></a>00577         }
<a name="l00578"></a>00578 
<a name="l00579"></a>00579         <span class="keywordflow">return</span> pass;
<a name="l00580"></a>00580 }
<a name="l00581"></a>00581 
<a name="l00582"></a>00582 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00583"></a>00583 <span class="keywordtype">bool</span> <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC&lt;EC&gt;::ValidateElement</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> level, <span class="keyword">const</span> Element &amp;g, <span class="keyword">const</span> <a class="code" href="class_d_l___fixed_base_precomputation.html">DL_FixedBasePrecomputation&lt;Element&gt;</a> *gpc)<span class="keyword"> const</span>
<a name="l00584"></a>00584 <span class="keyword"></span>{
<a name="l00585"></a>00585         <span class="keywordtype">bool</span> pass = !IsIdentity(g) &amp;&amp; GetCurve().VerifyPoint(g);
<a name="l00586"></a>00586         <span class="keywordflow">if</span> (level &gt;= 1)
<a name="l00587"></a>00587         {
<a name="l00588"></a>00588                 <span class="keywordflow">if</span> (gpc)
<a name="l00589"></a>00589                         pass = pass &amp;&amp; gpc-&gt;Exponentiate(this-&gt;GetGroupPrecomputation(), <a class="code" href="class_integer.html#a8c070592581bf6c2f928c72bfa1c1638" title="avoid calling constructors for these frequently used integers">Integer::One</a>()) == g;
<a name="l00590"></a>00590         }
<a name="l00591"></a>00591         <span class="keywordflow">if</span> (level &gt;= 2 &amp;&amp; pass)
<a name="l00592"></a>00592         {
<a name="l00593"></a>00593                 <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &amp;q = GetSubgroupOrder();
<a name="l00594"></a>00594                 Element gq = gpc ? gpc-&gt;Exponentiate(this-&gt;GetGroupPrecomputation(), q) : ExponentiateElement(g, q);
<a name="l00595"></a>00595                 pass = pass &amp;&amp; IsIdentity(gq);
<a name="l00596"></a>00596         }
<a name="l00597"></a>00597         <span class="keywordflow">return</span> pass;
<a name="l00598"></a>00598 }
<a name="l00599"></a>00599 
<a name="l00600"></a>00600 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00601"></a>00601 <span class="keywordtype">void</span> <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC&lt;EC&gt;::SimultaneousExponentiate</a>(Element *results, <span class="keyword">const</span> Element &amp;base, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> *exponents, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> exponentsCount)<span class="keyword"> const</span>
<a name="l00602"></a>00602 <span class="keyword"></span>{
<a name="l00603"></a>00603         GetCurve().SimultaneousMultiply(results, base, exponents, exponentsCount);
<a name="l00604"></a>00604 }
<a name="l00605"></a>00605 
<a name="l00606"></a>00606 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00607"></a>00607 CPP_TYPENAME <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC&lt;EC&gt;::Element</a> <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC&lt;EC&gt;::MultiplyElements</a>(<span class="keyword">const</span> Element &amp;a, <span class="keyword">const</span> Element &amp;b)<span class="keyword"> const</span>
<a name="l00608"></a>00608 <span class="keyword"></span>{
<a name="l00609"></a>00609         <span class="keywordflow">return</span> GetCurve().Add(a, b);
<a name="l00610"></a>00610 }
<a name="l00611"></a>00611 
<a name="l00612"></a>00612 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00613"></a>00613 CPP_TYPENAME <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC&lt;EC&gt;::Element</a> <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC&lt;EC&gt;::CascadeExponentiate</a>(<span class="keyword">const</span> Element &amp;element1, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &amp;exponent1, <span class="keyword">const</span> Element &amp;element2, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &amp;exponent2)<span class="keyword"> const</span>
<a name="l00614"></a>00614 <span class="keyword"></span>{
<a name="l00615"></a>00615         <span class="keywordflow">return</span> GetCurve().CascadeMultiply(exponent1, element1, exponent2, element2);
<a name="l00616"></a>00616 }
<a name="l00617"></a>00617 
<a name="l00618"></a>00618 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00619"></a>00619 <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a> <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC&lt;EC&gt;::GetAlgorithmID</a>()<span class="keyword"> const</span>
<a name="l00620"></a>00620 <span class="keyword"></span>{
<a name="l00621"></a>00621         <span class="keywordflow">return</span> ASN1::id_ecPublicKey();
<a name="l00622"></a>00622 }
<a name="l00623"></a>00623 
<a name="l00624"></a>00624 <span class="comment">// ******************************************************************</span>
<a name="l00625"></a>00625 
<a name="l00626"></a>00626 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00627"></a><a class="code" href="class_d_l___public_key___e_c.html#ab436957725e2d94340f3de56b1260109">00627</a> <span class="keywordtype">void</span> <a class="code" href="class_d_l___public_key___e_c.html#ab436957725e2d94340f3de56b1260109" title="decode subjectPublicKey part of subjectPublicKeyInfo, without the BIT STRING header...">DL_PublicKey_EC&lt;EC&gt;::BERDecodePublicKey</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt, <span class="keywordtype">bool</span> parametersPresent, <span class="keywordtype">size_t</span> size)
<a name="l00628"></a>00628 {
<a name="l00629"></a>00629         <span class="keyword">typename</span> EC::Point P;
<a name="l00630"></a>00630         <span class="keywordflow">if</span> (!this-&gt;GetGroupParameters().GetCurve().DecodePoint(P, bt, size))
<a name="l00631"></a>00631                 BERDecodeError();
<a name="l00632"></a>00632         SetPublicElement(P);
<a name="l00633"></a>00633 }
<a name="l00634"></a>00634 
<a name="l00635"></a>00635 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00636"></a><a class="code" href="class_d_l___public_key___e_c.html#a8ab4bc2bb34c0572cbba3e5830bd64a7">00636</a> <span class="keywordtype">void</span> <a class="code" href="class_d_l___public_key___e_c.html#a8ab4bc2bb34c0572cbba3e5830bd64a7" title="encode subjectPublicKey part of subjectPublicKeyInfo, without the BIT STRING header...">DL_PublicKey_EC&lt;EC&gt;::DEREncodePublicKey</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span>
<a name="l00637"></a>00637 <span class="keyword"></span>{
<a name="l00638"></a>00638         this-&gt;GetGroupParameters().GetCurve().EncodePoint(bt, this-&gt;GetPublicElement(), this-&gt;GetGroupParameters().GetPointCompression());
<a name="l00639"></a>00639 }
<a name="l00640"></a>00640 
<a name="l00641"></a>00641 <span class="comment">// ******************************************************************</span>
<a name="l00642"></a>00642 
<a name="l00643"></a>00643 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00644"></a><a class="code" href="class_d_l___private_key___e_c.html#a790483afe21298af518603dd50fff6cd">00644</a> <span class="keywordtype">void</span> <a class="code" href="class_d_l___private_key___e_c.html#a790483afe21298af518603dd50fff6cd" title="decode privateKey part of privateKeyInfo, without the OCTET STRING header">DL_PrivateKey_EC&lt;EC&gt;::BERDecodePrivateKey</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt, <span class="keywordtype">bool</span> parametersPresent, <span class="keywordtype">size_t</span> size)
<a name="l00645"></a>00645 {
<a name="l00646"></a>00646         <a class="code" href="class_b_e_r_sequence_decoder.html" title="BER Sequence Decoder.">BERSequenceDecoder</a> seq(bt);
<a name="l00647"></a>00647                 word32 version;
<a name="l00648"></a>00648                 BERDecodeUnsigned&lt;word32&gt;(seq, version, INTEGER, 1, 1); <span class="comment">// check version</span>
<a name="l00649"></a>00649 
<a name="l00650"></a>00650                 <a class="code" href="class_b_e_r_general_decoder.html" title="BER General Decoder.">BERGeneralDecoder</a> dec(seq, OCTET_STRING);
<a name="l00651"></a>00651                 <span class="keywordflow">if</span> (!dec.IsDefiniteLength())
<a name="l00652"></a>00652                         BERDecodeError();
<a name="l00653"></a>00653                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> x;
<a name="l00654"></a>00654                 x.Decode(dec, (<span class="keywordtype">size_t</span>)dec.RemainingLength());
<a name="l00655"></a>00655                 dec.MessageEnd();
<a name="l00656"></a>00656                 <span class="keywordflow">if</span> (!parametersPresent &amp;&amp; seq.PeekByte() != (CONTEXT_SPECIFIC | CONSTRUCTED | 0))
<a name="l00657"></a>00657                         BERDecodeError();
<a name="l00658"></a>00658                 <span class="keywordflow">if</span> (!seq.EndReached() &amp;&amp; seq.PeekByte() == (CONTEXT_SPECIFIC | CONSTRUCTED | 0))
<a name="l00659"></a>00659                 {
<a name="l00660"></a>00660                         <a class="code" href="class_b_e_r_general_decoder.html" title="BER General Decoder.">BERGeneralDecoder</a> parameters(seq, CONTEXT_SPECIFIC | CONSTRUCTED | 0);
<a name="l00661"></a>00661                         this-&gt;AccessGroupParameters().BERDecode(parameters);
<a name="l00662"></a>00662                         parameters.MessageEnd();
<a name="l00663"></a>00663                 }
<a name="l00664"></a>00664                 <span class="keywordflow">if</span> (!seq.EndReached())
<a name="l00665"></a>00665                 {
<a name="l00666"></a>00666                         <span class="comment">// skip over the public element</span>
<a name="l00667"></a>00667                         <a class="code" href="class_sec_block.html">SecByteBlock</a> subjectPublicKey;
<a name="l00668"></a>00668                         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> unusedBits;
<a name="l00669"></a>00669                         <a class="code" href="class_b_e_r_general_decoder.html" title="BER General Decoder.">BERGeneralDecoder</a> publicKey(seq, CONTEXT_SPECIFIC | CONSTRUCTED | 1);
<a name="l00670"></a>00670                         BERDecodeBitString(publicKey, subjectPublicKey, unusedBits);
<a name="l00671"></a>00671                         publicKey.MessageEnd();
<a name="l00672"></a>00672                         Element Q;
<a name="l00673"></a>00673                         <span class="keywordflow">if</span> (!(unusedBits == 0 &amp;&amp; this-&gt;GetGroupParameters().GetCurve().DecodePoint(Q, subjectPublicKey, subjectPublicKey.size())))
<a name="l00674"></a>00674                                 BERDecodeError();
<a name="l00675"></a>00675                 }
<a name="l00676"></a>00676         seq.MessageEnd();
<a name="l00677"></a>00677 
<a name="l00678"></a>00678         this-&gt;SetPrivateExponent(x);
<a name="l00679"></a>00679 }
<a name="l00680"></a>00680 
<a name="l00681"></a>00681 <span class="keyword">template</span> &lt;<span class="keyword">class</span> EC&gt;
<a name="l00682"></a><a class="code" href="class_d_l___private_key___e_c.html#afc281492defbf652c0cdb1af4a9f3df7">00682</a> <span class="keywordtype">void</span> <a class="code" href="class_d_l___private_key___e_c.html#afc281492defbf652c0cdb1af4a9f3df7" title="encode privateKey part of privateKeyInfo, without the OCTET STRING header">DL_PrivateKey_EC&lt;EC&gt;::DEREncodePrivateKey</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span>
<a name="l00683"></a>00683 <span class="keyword"></span>{
<a name="l00684"></a>00684         <a class="code" href="class_d_e_r_sequence_encoder.html" title="DER Sequence Encoder.">DERSequenceEncoder</a> privateKey(bt);
<a name="l00685"></a>00685                 DEREncodeUnsigned&lt;word32&gt;(privateKey, 1);       <span class="comment">// version</span>
<a name="l00686"></a>00686                 <span class="comment">// SEC 1 ver 1.0 says privateKey (m_d) has the same length as order of the curve</span>
<a name="l00687"></a>00687                 <span class="comment">// this will be changed to order of base point in a future version</span>
<a name="l00688"></a>00688                 this-&gt;GetPrivateExponent().<a class="code" href="class_integer.html#a1dc54b479df856d614cb23e362126110" title="encode absolute value as big-endian octet string">DEREncodeAsOctetString</a>(privateKey, this-&gt;GetGroupParameters().GetSubgroupOrder().ByteCount());
<a name="l00689"></a>00689         privateKey.MessageEnd();
<a name="l00690"></a>00690 }
<a name="l00691"></a>00691 
<a name="l00692"></a>00692 NAMESPACE_END
<a name="l00693"></a>00693 
<a name="l00694"></a>00694 <span class="preprocessor">#endif</span>
</pre></div></div>
<hr size="1"/><address style="text-align: right;"><small>Generated on 9 Dec 2009 for Crypto++ by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>