<!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 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 List</span></a></li> <li><a href="globals.html"><span>File 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 "pch.h"</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 "<a class="code" href="eccrypto_8h.html">eccrypto.h</a>"</span> <a name="l00008"></a>00008 <span class="preprocessor">#include "nbtheory.h"</span> <a name="l00009"></a>00009 <span class="preprocessor">#include "oids.h"</span> <a name="l00010"></a>00010 <span class="preprocessor">#include "hex.h"</span> <a name="l00011"></a>00011 <span class="preprocessor">#include "argnames.h"</span> <a name="l00012"></a>00012 <span class="preprocessor">#include "ec2n.h"</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<EC2N>::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<EC2N>::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<ECP>::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<ECP>::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<ECP>::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<EC2N>::Decryptor</a> t6; <a name="l00025"></a>00025 <a class="code" href="class_d_h___domain.html" title=",">ECDH<ECP>::Domain</a> t7; <a name="l00026"></a>00026 <a class="code" href="class_m_q_v___domain.html" title="_">ECMQV<ECP>::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> &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> &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> &q, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &r) <a name="l00045"></a>00045 { <a name="l00046"></a>00046 <span class="comment">// see "Updated standards for validating elliptic curves", 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)<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> <<span class="keyword">class</span> T> <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><> <span class="keyword">struct </span>EcRecommendedParameters<<a class="code" href="class_e_c2_n.html" title="Elliptic Curve over GF(2^n).">EC2N</a>> <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> &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> &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><> <span class="keyword">struct </span>EcRecommendedParameters<<a class="code" href="class_e_c_p.html" title="Elliptic Curve over GF(p), where p is prime.">ECP</a>> <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> &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> <<span class="keyword">typename</span> T> <a name="l00109"></a>00109 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> EcRecommendedParameters<T>& a, <span class="keyword">const</span> <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a>& b) {<span class="keywordflow">return</span> a.oid < b;} <a name="l00110"></a>00110 <span class="keyword">template</span> <<span class="keyword">typename</span> T> <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>& a, <span class="keyword">const</span> EcRecommendedParameters<T>& b) {<span class="keywordflow">return</span> a < b.oid;} <a name="l00112"></a>00112 <span class="keyword">template</span> <<span class="keyword">typename</span> T> <a name="l00113"></a>00113 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> EcRecommendedParameters<T>& a, <span class="keyword">const</span> EcRecommendedParameters<T>& b) {<span class="keywordflow">return</span> a.oid < 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<EC2N></a> *&begin, <span class="keyword">const</span> <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters<EC2N></a> *&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<EC2N></a> rec[] = { <a name="l00120"></a>00120 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c2_n_01_4.html">EcRecommendedParameters<EC2N></a>(ASN1::sect163k1(), <a name="l00121"></a>00121 163, 7, 6, 3, 0, <a name="l00122"></a>00122 <span class="stringliteral">"000000000000000000000000000000000000000001"</span>, <a name="l00123"></a>00123 <span class="stringliteral">"000000000000000000000000000000000000000001"</span>, <a name="l00124"></a>00124 <span class="stringliteral">"0402FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE80289070FB05D38FF58321F2E800536D538CCDAA3D9"</span>, <a name="l00125"></a>00125 <span class="stringliteral">"04000000000000000000020108A2E0CC0D99F8A5EF"</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<EC2N></a>(ASN1::sect163r1(), <a name="l00128"></a>00128 163, 7, 6, 3, 0, <a name="l00129"></a>00129 <span class="stringliteral">"07B6882CAAEFA84F9554FF8428BD88E246D2782AE2"</span>, <a name="l00130"></a>00130 <span class="stringliteral">"0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9"</span>, <a name="l00131"></a>00131 <span class="stringliteral">"040369979697AB43897789566789567F787A7876A65400435EDB42EFAFB2989D51FEFCE3C80988F41FF883"</span>, <a name="l00132"></a>00132 <span class="stringliteral">"03FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B"</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<EC2N></a>(ASN1::sect239k1(), <a name="l00135"></a>00135 239, 158, 0, <a name="l00136"></a>00136 <span class="stringliteral">"000000000000000000000000000000000000000000000000000000000000"</span>, <a name="l00137"></a>00137 <span class="stringliteral">"000000000000000000000000000000000000000000000000000000000001"</span>, <a name="l00138"></a>00138 <span class="stringliteral">"0429A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC76310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA"</span>, <a name="l00139"></a>00139 <span class="stringliteral">"2000000000000000000000000000005A79FEC67CB6E91F1C1DA800E478A5"</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<EC2N></a>(ASN1::sect113r1(), <a name="l00142"></a>00142 113, 9, 0, <a name="l00143"></a>00143 <span class="stringliteral">"003088250CA6E7C7FE649CE85820F7"</span>, <a name="l00144"></a>00144 <span class="stringliteral">"00E8BEE4D3E2260744188BE0E9C723"</span>, <a name="l00145"></a>00145 <span class="stringliteral">"04009D73616F35F4AB1407D73562C10F00A52830277958EE84D1315ED31886"</span>, <a name="l00146"></a>00146 <span class="stringliteral">"0100000000000000D9CCEC8A39E56F"</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<EC2N></a>(ASN1::sect113r2(), <a name="l00149"></a>00149 113, 9, 0, <a name="l00150"></a>00150 <span class="stringliteral">"00689918DBEC7E5A0DD6DFC0AA55C7"</span>, <a name="l00151"></a>00151 <span class="stringliteral">"0095E9A9EC9B297BD4BF36E059184F"</span>, <a name="l00152"></a>00152 <span class="stringliteral">"0401A57A6A7B26CA5EF52FCDB816479700B3ADC94ED1FE674C06E695BABA1D"</span>, <a name="l00153"></a>00153 <span class="stringliteral">"010000000000000108789B2496AF93"</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<EC2N></a>(ASN1::sect163r2(), <a name="l00156"></a>00156 163, 7, 6, 3, 0, <a name="l00157"></a>00157 <span class="stringliteral">"000000000000000000000000000000000000000001"</span>, <a name="l00158"></a>00158 <span class="stringliteral">"020A601907B8C953CA1481EB10512F78744A3205FD"</span>, <a name="l00159"></a>00159 <span class="stringliteral">"0403F0EBA16286A2D57EA0991168D4994637E8343E3600D51FBC6C71A0094FA2CDD545B11C5C0C797324F1"</span>, <a name="l00160"></a>00160 <span class="stringliteral">"040000000000000000000292FE77E70C12A4234C33"</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<EC2N></a>(ASN1::sect283k1(), <a name="l00163"></a>00163 283, 12, 7, 5, 0, <a name="l00164"></a>00164 <span class="stringliteral">"000000000000000000000000000000000000000000000000000000000000000000000000"</span>, <a name="l00165"></a>00165 <span class="stringliteral">"000000000000000000000000000000000000000000000000000000000000000000000001"</span>, <a name="l00166"></a>00166 <span class="stringliteral">"040503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC245849283601CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2259"</span>, <a name="l00167"></a>00167 <span class="stringliteral">"01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163C61"</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<EC2N></a>(ASN1::sect283r1(), <a name="l00170"></a>00170 283, 12, 7, 5, 0, <a name="l00171"></a>00171 <span class="stringliteral">"000000000000000000000000000000000000000000000000000000000000000000000001"</span>, <a name="l00172"></a>00172 <span class="stringliteral">"027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A2F5"</span>, <a name="l00173"></a>00173 <span class="stringliteral">"0405F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B1205303676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE8112F4"</span>, <a name="l00174"></a>00174 <span class="stringliteral">"03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB307"</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<EC2N></a>(ASN1::sect131r1(), <a name="l00177"></a>00177 131, 8, 3, 2, 0, <a name="l00178"></a>00178 <span class="stringliteral">"07A11B09A76B562144418FF3FF8C2570B8"</span>, <a name="l00179"></a>00179 <span class="stringliteral">"0217C05610884B63B9C6C7291678F9D341"</span>, <a name="l00180"></a>00180 <span class="stringliteral">"040081BAF91FDF9833C40F9C181343638399078C6E7EA38C001F73C8134B1B4EF9E150"</span>, <a name="l00181"></a>00181 <span class="stringliteral">"0400000000000000023123953A9464B54D"</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<EC2N></a>(ASN1::sect131r2(), <a name="l00184"></a>00184 131, 8, 3, 2, 0, <a name="l00185"></a>00185 <span class="stringliteral">"03E5A88919D7CAFCBF415F07C2176573B2"</span>, <a name="l00186"></a>00186 <span class="stringliteral">"04B8266A46C55657AC734CE38F018F2192"</span>, <a name="l00187"></a>00187 <span class="stringliteral">"040356DCD8F2F95031AD652D23951BB366A80648F06D867940A5366D9E265DE9EB240F"</span>, <a name="l00188"></a>00188 <span class="stringliteral">"0400000000000000016954A233049BA98F"</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<EC2N></a>(ASN1::sect193r1(), <a name="l00191"></a>00191 193, 15, 0, <a name="l00192"></a>00192 <span class="stringliteral">"0017858FEB7A98975169E171F77B4087DE098AC8A911DF7B01"</span>, <a name="l00193"></a>00193 <span class="stringliteral">"00FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D831478814"</span>, <a name="l00194"></a>00194 <span class="stringliteral">"0401F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E10025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B05"</span>, <a name="l00195"></a>00195 <span class="stringliteral">"01000000000000000000000000C7F34A778F443ACC920EBA49"</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<EC2N></a>(ASN1::sect193r2(), <a name="l00198"></a>00198 193, 15, 0, <a name="l00199"></a>00199 <span class="stringliteral">"0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709B"</span>, <a name="l00200"></a>00200 <span class="stringliteral">"00C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AE"</span>, <a name="l00201"></a>00201 <span class="stringliteral">"0400D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F01CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6C"</span>, <a name="l00202"></a>00202 <span class="stringliteral">"010000000000000000000000015AAB561B005413CCD4EE99D5"</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<EC2N></a>(ASN1::sect233k1(), <a name="l00205"></a>00205 233, 74, 0, <a name="l00206"></a>00206 <span class="stringliteral">"000000000000000000000000000000000000000000000000000000000000"</span>, <a name="l00207"></a>00207 <span class="stringliteral">"000000000000000000000000000000000000000000000000000000000001"</span>, <a name="l00208"></a>00208 <span class="stringliteral">"04017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD612601DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3"</span>, <a name="l00209"></a>00209 <span class="stringliteral">"8000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF"</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<EC2N></a>(ASN1::sect233r1(), <a name="l00212"></a>00212 233, 74, 0, <a name="l00213"></a>00213 <span class="stringliteral">"000000000000000000000000000000000000000000000000000000000001"</span>, <a name="l00214"></a>00214 <span class="stringliteral">"0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD"</span>, <a name="l00215"></a>00215 <span class="stringliteral">"0400FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052"</span>, <a name="l00216"></a>00216 <span class="stringliteral">"01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7"</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<EC2N></a>(ASN1::sect409k1(), <a name="l00219"></a>00219 409, 87, 0, <a name="l00220"></a>00220 <span class="stringliteral">"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"</span>, <a name="l00221"></a>00221 <span class="stringliteral">"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"</span>, <a name="l00222"></a>00222 <span class="stringliteral">"040060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE902374601E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B"</span>, <a name="l00223"></a>00223 <span class="stringliteral">"7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF"</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<EC2N></a>(ASN1::sect409r1(), <a name="l00226"></a>00226 409, 87, 0, <a name="l00227"></a>00227 <span class="stringliteral">"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"</span>, <a name="l00228"></a>00228 <span class="stringliteral">"0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9A197B272822F6CD57A55AA4F50AE317B13545F"</span>, <a name="l00229"></a>00229 <span class="stringliteral">"04015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A70061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F38514F1FDF4B4F40D2181B3681C364BA0273C706"</span>, <a name="l00230"></a>00230 <span class="stringliteral">"010000000000000000000000000000000000000000000000000001E2AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A21173"</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<EC2N></a>(ASN1::sect571k1(), <a name="l00233"></a>00233 571, 10, 5, 2, 0, <a name="l00234"></a>00234 <span class="stringliteral">"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"</span>, <a name="l00235"></a>00235 <span class="stringliteral">"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"</span>, <a name="l00236"></a>00236 <span class="stringliteral">"04026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA44370958493B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C89720349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D4979C0AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143EF1C7A3"</span>, <a name="l00237"></a>00237 <span class="stringliteral">"020000000000000000000000000000000000000000000000000000000000000000000000131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C1001"</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<EC2N></a>(ASN1::sect571r1(), <a name="l00240"></a>00240 571, 10, 5, 2, 0, <a name="l00241"></a>00241 <span class="stringliteral">"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001"</span>, <a name="l00242"></a>00242 <span class="stringliteral">"02F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFABBD8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F2955727A"</span>, <a name="l00243"></a>00243 <span class="stringliteral">"040303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D19037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423E43BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B8AC15B"</span>, <a name="l00244"></a>00244 <span class="stringliteral">"03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47"</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<ECP></a> *&begin, <span class="keyword">const</span> <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters<ECP></a> *&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<ECP></a> rec[] = { <a name="l00255"></a>00255 <a class="code" href="struct_ec_recommended_parameters_3_01_e_c_p_01_4.html">EcRecommendedParameters<ECP></a>(ASN1::secp192r1(), <a name="l00256"></a>00256 <span class="stringliteral">"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF"</span>, <a name="l00257"></a>00257 <span class="stringliteral">"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC"</span>, <a name="l00258"></a>00258 <span class="stringliteral">"64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1"</span>, <a name="l00259"></a>00259 <span class="stringliteral">"04188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF101207192B95FFC8DA78631011ED6B24CDD573F977A11E794811"</span>, <a name="l00260"></a>00260 <span class="stringliteral">"FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831"</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<ECP></a>(ASN1::secp256r1(), <a name="l00263"></a>00263 <span class="stringliteral">"FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF"</span>, <a name="l00264"></a>00264 <span class="stringliteral">"FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC"</span>, <a name="l00265"></a>00265 <span class="stringliteral">"5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B"</span>, <a name="l00266"></a>00266 <span class="stringliteral">"046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5"</span>, <a name="l00267"></a>00267 <span class="stringliteral">"FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"</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<ECP></a>(ASN1::brainpoolP160r1(), <a name="l00270"></a>00270 <span class="stringliteral">"E95E4A5F737059DC60DFC7AD95B3D8139515620F"</span>, <a name="l00271"></a>00271 <span class="stringliteral">"340E7BE2A280EB74E2BE61BADA745D97E8F7C300"</span>, <a name="l00272"></a>00272 <span class="stringliteral">"1E589A8595423412134FAA2DBDEC95C8D8675E58"</span>, <a name="l00273"></a>00273 <span class="stringliteral">"04BED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC31667CB477A1A8EC338F94741669C976316DA6321"</span>, <a name="l00274"></a>00274 <span class="stringliteral">"E95E4A5F737059DC60DF5991D45029409E60FC09"</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<ECP></a>(ASN1::brainpoolP192r1(), <a name="l00277"></a>00277 <span class="stringliteral">"C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297"</span>, <a name="l00278"></a>00278 <span class="stringliteral">"6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF"</span>, <a name="l00279"></a>00279 <span class="stringliteral">"469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9"</span>, <a name="l00280"></a>00280 <span class="stringliteral">"04C0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD614B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F"</span>, <a name="l00281"></a>00281 <span class="stringliteral">"C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1"</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<ECP></a>(ASN1::brainpoolP224r1(), <a name="l00284"></a>00284 <span class="stringliteral">"D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF"</span>, <a name="l00285"></a>00285 <span class="stringliteral">"68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43"</span>, <a name="l00286"></a>00286 <span class="stringliteral">"2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B"</span>, <a name="l00287"></a>00287 <span class="stringliteral">"040D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD"</span>, <a name="l00288"></a>00288 <span class="stringliteral">"D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F"</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<ECP></a>(ASN1::brainpoolP256r1(), <a name="l00291"></a>00291 <span class="stringliteral">"A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377"</span>, <a name="l00292"></a>00292 <span class="stringliteral">"7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9"</span>, <a name="l00293"></a>00293 <span class="stringliteral">"26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6"</span>, <a name="l00294"></a>00294 <span class="stringliteral">"048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997"</span>, <a name="l00295"></a>00295 <span class="stringliteral">"A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7"</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<ECP></a>(ASN1::brainpoolP320r1(), <a name="l00298"></a>00298 <span class="stringliteral">"D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E27"</span>, <a name="l00299"></a>00299 <span class="stringliteral">"3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F492F375A97D860EB4"</span>, <a name="l00300"></a>00300 <span class="stringliteral">"520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD884539816F5EB4AC8FB1F1A6"</span>, <a name="l00301"></a>00301 <span class="stringliteral">"0443BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C710AF8D0D39E2061114FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7D35245D1692E8EE1"</span>, <a name="l00302"></a>00302 <span class="stringliteral">"D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E98691555B44C59311"</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<ECP></a>(ASN1::brainpoolP384r1(), <a name="l00305"></a>00305 <span class="stringliteral">"8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53"</span>, <a name="l00306"></a>00306 <span class="stringliteral">"7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503AD4EB04A8C7DD22CE2826"</span>, <a name="l00307"></a>00307 <span class="stringliteral">"04A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D57CB4390295DBC9943AB78696FA504C11"</span>, <a name="l00308"></a>00308 <span class="stringliteral">"041D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315"</span>, <a name="l00309"></a>00309 <span class="stringliteral">"8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565"</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<ECP></a>(ASN1::brainpoolP512r1(), <a name="l00312"></a>00312 <span class="stringliteral">"AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3"</span>, <a name="l00313"></a>00313 <span class="stringliteral">"7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA"</span>, <a name="l00314"></a>00314 <span class="stringliteral">"3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723"</span>, <a name="l00315"></a>00315 <span class="stringliteral">"0481AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F8227DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892"</span>, <a name="l00316"></a>00316 <span class="stringliteral">"AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069"</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<ECP></a>(ASN1::secp112r1(), <a name="l00319"></a>00319 <span class="stringliteral">"DB7C2ABF62E35E668076BEAD208B"</span>, <a name="l00320"></a>00320 <span class="stringliteral">"DB7C2ABF62E35E668076BEAD2088"</span>, <a name="l00321"></a>00321 <span class="stringliteral">"659EF8BA043916EEDE8911702B22"</span>, <a name="l00322"></a>00322 <span class="stringliteral">"0409487239995A5EE76B55F9C2F098A89CE5AF8724C0A23E0E0FF77500"</span>, <a name="l00323"></a>00323 <span class="stringliteral">"DB7C2ABF62E35E7628DFAC6561C5"</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<ECP></a>(ASN1::secp112r2(), <a name="l00326"></a>00326 <span class="stringliteral">"DB7C2ABF62E35E668076BEAD208B"</span>, <a name="l00327"></a>00327 <span class="stringliteral">"6127C24C05F38A0AAAF65C0EF02C"</span>, <a name="l00328"></a>00328 <span class="stringliteral">"51DEF1815DB5ED74FCC34C85D709"</span>, <a name="l00329"></a>00329 <span class="stringliteral">"044BA30AB5E892B4E1649DD0928643ADCD46F5882E3747DEF36E956E97"</span>, <a name="l00330"></a>00330 <span class="stringliteral">"36DF0AAFD8B8D7597CA10520D04B"</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<ECP></a>(ASN1::secp160r1(), <a name="l00333"></a>00333 <span class="stringliteral">"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF"</span>, <a name="l00334"></a>00334 <span class="stringliteral">"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC"</span>, <a name="l00335"></a>00335 <span class="stringliteral">"1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45"</span>, <a name="l00336"></a>00336 <span class="stringliteral">"044A96B5688EF573284664698968C38BB913CBFC8223A628553168947D59DCC912042351377AC5FB32"</span>, <a name="l00337"></a>00337 <span class="stringliteral">"0100000000000000000001F4C8F927AED3CA752257"</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<ECP></a>(ASN1::secp160k1(), <a name="l00340"></a>00340 <span class="stringliteral">"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73"</span>, <a name="l00341"></a>00341 <span class="stringliteral">"0000000000000000000000000000000000000000"</span>, <a name="l00342"></a>00342 <span class="stringliteral">"0000000000000000000000000000000000000007"</span>, <a name="l00343"></a>00343 <span class="stringliteral">"043B4C382CE37AA192A4019E763036F4F5DD4D7EBB938CF935318FDCED6BC28286531733C3F03C4FEE"</span>, <a name="l00344"></a>00344 <span class="stringliteral">"0100000000000000000001B8FA16DFAB9ACA16B6B3"</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<ECP></a>(ASN1::secp256k1(), <a name="l00347"></a>00347 <span class="stringliteral">"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F"</span>, <a name="l00348"></a>00348 <span class="stringliteral">"0000000000000000000000000000000000000000000000000000000000000000"</span>, <a name="l00349"></a>00349 <span class="stringliteral">"0000000000000000000000000000000000000000000000000000000000000007"</span>, <a name="l00350"></a>00350 <span class="stringliteral">"0479BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8"</span>, <a name="l00351"></a>00351 <span class="stringliteral">"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141"</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<ECP></a>(ASN1::secp128r1(), <a name="l00354"></a>00354 <span class="stringliteral">"FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF"</span>, <a name="l00355"></a>00355 <span class="stringliteral">"FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC"</span>, <a name="l00356"></a>00356 <span class="stringliteral">"E87579C11079F43DD824993C2CEE5ED3"</span>, <a name="l00357"></a>00357 <span class="stringliteral">"04161FF7528B899B2D0C28607CA52C5B86CF5AC8395BAFEB13C02DA292DDED7A83"</span>, <a name="l00358"></a>00358 <span class="stringliteral">"FFFFFFFE0000000075A30D1B9038A115"</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<ECP></a>(ASN1::secp128r2(), <a name="l00361"></a>00361 <span class="stringliteral">"FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF"</span>, <a name="l00362"></a>00362 <span class="stringliteral">"D6031998D1B3BBFEBF59CC9BBFF9AEE1"</span>, <a name="l00363"></a>00363 <span class="stringliteral">"5EEEFCA380D02919DC2C6558BB6D8A5D"</span>, <a name="l00364"></a>00364 <span class="stringliteral">"047B6AA5D85E572983E6FB32A7CDEBC14027B6916A894D3AEE7106FE805FC34B44"</span>, <a name="l00365"></a>00365 <span class="stringliteral">"3FFFFFFF7FFFFFFFBE0024720613B5A3"</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<ECP></a>(ASN1::secp160r2(), <a name="l00368"></a>00368 <span class="stringliteral">"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73"</span>, <a name="l00369"></a>00369 <span class="stringliteral">"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70"</span>, <a name="l00370"></a>00370 <span class="stringliteral">"B4E134D3FB59EB8BAB57274904664D5AF50388BA"</span>, <a name="l00371"></a>00371 <span class="stringliteral">"0452DCB034293A117E1F4FF11B30F7199D3144CE6DFEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E"</span>, <a name="l00372"></a>00372 <span class="stringliteral">"0100000000000000000000351EE786A818F3A1A16B"</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<ECP></a>(ASN1::secp192k1(), <a name="l00375"></a>00375 <span class="stringliteral">"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37"</span>, <a name="l00376"></a>00376 <span class="stringliteral">"000000000000000000000000000000000000000000000000"</span>, <a name="l00377"></a>00377 <span class="stringliteral">"000000000000000000000000000000000000000000000003"</span>, <a name="l00378"></a>00378 <span class="stringliteral">"04DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D"</span>, <a name="l00379"></a>00379 <span class="stringliteral">"FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D"</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<ECP></a>(ASN1::secp224k1(), <a name="l00382"></a>00382 <span class="stringliteral">"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D"</span>, <a name="l00383"></a>00383 <span class="stringliteral">"00000000000000000000000000000000000000000000000000000000"</span>, <a name="l00384"></a>00384 <span class="stringliteral">"00000000000000000000000000000000000000000000000000000005"</span>, <a name="l00385"></a>00385 <span class="stringliteral">"04A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5"</span>, <a name="l00386"></a>00386 <span class="stringliteral">"010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7"</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<ECP></a>(ASN1::secp224r1(), <a name="l00389"></a>00389 <span class="stringliteral">"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001"</span>, <a name="l00390"></a>00390 <span class="stringliteral">"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE"</span>, <a name="l00391"></a>00391 <span class="stringliteral">"B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4"</span>, <a name="l00392"></a>00392 <span class="stringliteral">"04B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34"</span>, <a name="l00393"></a>00393 <span class="stringliteral">"FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D"</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<ECP></a>(ASN1::secp384r1(), <a name="l00396"></a>00396 <span class="stringliteral">"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF"</span>, <a name="l00397"></a>00397 <span class="stringliteral">"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC"</span>, <a name="l00398"></a>00398 <span class="stringliteral">"B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF"</span>, <a name="l00399"></a>00399 <span class="stringliteral">"04AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB73617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F"</span>, <a name="l00400"></a>00400 <span class="stringliteral">"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973"</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<ECP></a>(ASN1::secp521r1(), <a name="l00403"></a>00403 <span class="stringliteral">"01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"</span>, <a name="l00404"></a>00404 <span class="stringliteral">"01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC"</span>, <a name="l00405"></a>00405 <span class="stringliteral">"0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00"</span>, <a name="l00406"></a>00406 <span class="stringliteral">"0400C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650"</span>, <a name="l00407"></a>00407 <span class="stringliteral">"01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409"</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> <<span class="keyword">class</span> EC> <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<EC>::GetNextRecommendedParametersOID</a>(<span class="keyword">const</span> <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a> &oid) <a name="l00415"></a>00415 { <a name="l00416"></a>00416 <span class="keyword">const</span> EcRecommendedParameters<EllipticCurve> *begin, *end; <a name="l00417"></a>00417 GetRecommendedParameters(begin, end); <a name="l00418"></a>00418 <span class="keyword">const</span> EcRecommendedParameters<EllipticCurve> *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->oid); <a name="l00420"></a>00420 } <a name="l00421"></a>00421 <a name="l00422"></a>00422 <span class="keyword">template</span> <<span class="keyword">class</span> EC> <span class="keywordtype">void</span> <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC<EC>::Initialize</a>(<span class="keyword">const</span> <a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a> &oid) <a name="l00423"></a>00423 { <a name="l00424"></a>00424 <span class="keyword">const</span> EcRecommendedParameters<EllipticCurve> *begin, *end; <a name="l00425"></a>00425 GetRecommendedParameters(begin, end); <a name="l00426"></a>00426 <span class="keyword">const</span> EcRecommendedParameters<EllipticCurve> *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->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<EllipticCurve> &param = *it; <a name="l00431"></a>00431 m_oid = oid; <a name="l00432"></a>00432 std::auto_ptr<EllipticCurve> ec(param.NewEC()); <a name="l00433"></a>00433 this->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> <<span class="keyword">class</span> EC> <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<EC>::GetVoidValue</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> std::type_info &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-><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<</span><a class="code" href="class_o_i_d.html" title="Object Identifier.">OID</a> *<span class="keyword">></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<DL_GroupParameters<Element> >(<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> <<span class="keyword">class</span> EC> <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<EC>::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> &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">"DL_GroupParameters_EC<EC>"</span>, Name::Curve(), ec); <a name="l00476"></a>00476 source.GetRequiredParameter(<span class="stringliteral">"DL_GroupParameters_EC<EC>"</span>, Name::SubgroupGenerator(), G); <a name="l00477"></a>00477 source.GetRequiredParameter(<span class="stringliteral">"DL_GroupParameters_EC<EC>"</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&#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> <<span class="keyword">class</span> EC> <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&#39;t actually generate a curve, it just initializes the...">DL_GroupParameters_EC<EC>::GenerateRandom</a>(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &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> &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> &) <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">"DL_GroupParameters_EC<EC>: curve generation is not implemented yet"</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> <<span class="keyword">class</span> EC> <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<EC>::BERDecode</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &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<word32>(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> <<span class="keyword">class</span> EC> <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<EC>::DEREncode</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &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 && !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<word32>(seq, 1); <span class="comment">// version</span> <a name="l00534"></a>00534 GetCurve().DEREncode(seq); <a name="l00535"></a>00535 GetCurve().DEREncodePoint(seq, this->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> <<span class="keyword">class</span> EC> <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<EC>::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> <<span class="keyword">class</span> EC> <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<EC>::ConvertElementToInteger</a>(<span class="keyword">const</span> Element &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> <<span class="keyword">class</span> EC> <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<EC>::ValidateGroup</a>(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &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 && m_n!=q; <a name="l00569"></a>00569 <a name="l00570"></a>00570 <span class="keywordflow">if</span> (level >= 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 && m_n>4*qSqrt; <a name="l00574"></a>00574 pass = pass && VerifyPrime(rng, m_n, level-2); <a name="l00575"></a>00575 pass = pass && (m_k.IsZero() || m_k == (q+2*qSqrt+1)/m_n); <a name="l00576"></a>00576 pass = pass && 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> <<span class="keyword">class</span> EC> <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<EC>::ValidateElement</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> level, <span class="keyword">const</span> Element &g, <span class="keyword">const</span> <a class="code" href="class_d_l___fixed_base_precomputation.html">DL_FixedBasePrecomputation<Element></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) && GetCurve().VerifyPoint(g); <a name="l00586"></a>00586 <span class="keywordflow">if</span> (level >= 1) <a name="l00587"></a>00587 { <a name="l00588"></a>00588 <span class="keywordflow">if</span> (gpc) <a name="l00589"></a>00589 pass = pass && gpc->Exponentiate(this->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 >= 2 && 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> &q = GetSubgroupOrder(); <a name="l00594"></a>00594 Element gq = gpc ? gpc->Exponentiate(this->GetGroupPrecomputation(), q) : ExponentiateElement(g, q); <a name="l00595"></a>00595 pass = pass && 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> <<span class="keyword">class</span> EC> <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<EC>::SimultaneousExponentiate</a>(Element *results, <span class="keyword">const</span> Element &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> <<span class="keyword">class</span> EC> <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<EC>::Element</a> <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC<EC>::MultiplyElements</a>(<span class="keyword">const</span> Element &a, <span class="keyword">const</span> Element &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> <<span class="keyword">class</span> EC> <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<EC>::Element</a> <a class="code" href="class_d_l___group_parameters___e_c.html" title="Elliptic Curve Parameters.">DL_GroupParameters_EC<EC>::CascadeExponentiate</a>(<span class="keyword">const</span> Element &element1, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &exponent1, <span class="keyword">const</span> Element &element2, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &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> <<span class="keyword">class</span> EC> <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<EC>::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> <<span class="keyword">class</span> EC> <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<EC>::BERDecodePublicKey</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &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->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> <<span class="keyword">class</span> EC> <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<EC>::DEREncodePublicKey</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &bt)<span class="keyword"> const</span> <a name="l00637"></a>00637 <span class="keyword"></span>{ <a name="l00638"></a>00638 this->GetGroupParameters().GetCurve().EncodePoint(bt, this->GetPublicElement(), this->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> <<span class="keyword">class</span> EC> <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<EC>::BERDecodePrivateKey</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &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<word32>(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 && seq.PeekByte() != (CONTEXT_SPECIFIC | CONSTRUCTED | 0)) <a name="l00657"></a>00657 BERDecodeError(); <a name="l00658"></a>00658 <span class="keywordflow">if</span> (!seq.EndReached() && 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->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 && this->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->SetPrivateExponent(x); <a name="l00679"></a>00679 } <a name="l00680"></a>00680 <a name="l00681"></a>00681 <span class="keyword">template</span> <<span class="keyword">class</span> EC> <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<EC>::DEREncodePrivateKey</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &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<word32>(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->GetPrivateExponent().<a class="code" href="class_integer.html#a1dc54b479df856d614cb23e362126110" title="encode absolute value as big-endian octet string">DEREncodeAsOctetString</a>(privateKey, this->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 <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address> </body> </html>