Sophie

Sophie

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

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>Crypto++: gfpcrypt.cpp Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.3.7 -->
<div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;Members</a></div>
<h1>gfpcrypt.cpp</h1><pre class="fragment"><div>00001 <span class="comment">// dsa.cpp - written and placed in the public domain by Wei Dai</span>
00002 
00003 <span class="preprocessor">#include "pch.h"</span>
00004 
00005 <span class="preprocessor">#ifndef CRYPTOPP_IMPORTS</span>
00006 <span class="preprocessor"></span>
00007 <span class="preprocessor">#include "<a class="code" href="gfpcrypt_8h.html">gfpcrypt.h</a>"</span>
00008 <span class="preprocessor">#include "asn.h"</span>
00009 <span class="preprocessor">#include "oids.h"</span>
00010 <span class="preprocessor">#include "nbtheory.h"</span>
00011 
00012 NAMESPACE_BEGIN(CryptoPP)
00013 
00014 void TestInstantiations_gfpcrypt()
00015 {
00016         <a class="code" href="struct_g_d_s_a.html">GDSA&lt;SHA&gt;</a>::Signer test;
00017         <a class="code" href="struct_g_d_s_a.html">GDSA&lt;SHA&gt;</a>::Verifier test1;
00018         <a class="code" href="class_d_l___s_s.html#_d_l___s_sw0">DSA::Signer</a> test5(NullRNG(), 100);
00019         <a class="code" href="class_d_l___s_s.html#_d_l___s_sw0">DSA::Signer</a> test2(test5);
00020         <a class="code" href="struct_n_r.html">NR&lt;SHA&gt;</a>::Signer test3;
00021         <a class="code" href="struct_n_r.html">NR&lt;SHA&gt;</a>::Verifier test4;
00022         <a class="code" href="struct_d_l_i_e_s.html">DLIES&lt;&gt;</a>::Encryptor test6;
00023         <a class="code" href="struct_d_l_i_e_s.html">DLIES&lt;&gt;</a>::Decryptor test7;
00024 }
00025 
<a name="l00026"></a><a class="code" href="class_d_l___group_parameters___d_s_a.html#_d_l___group_parameters___d_s_aa1">00026</a> <span class="keywordtype">void</span> <a class="code" href="class_d_l___group_parameters___d_s_a.html#_d_l___group_parameters___d_s_aa1">DL_GroupParameters_DSA::GenerateRandom</a>(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &amp;rng, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &amp;alg)
00027 {
00028         <a class="code" href="class_integer.html">Integer</a> p, q, g;
00029 
00030         <span class="keywordflow">if</span> (alg.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha39">GetValue</a>(<span class="stringliteral">"Modulus"</span>, p) &amp;&amp; alg.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha39">GetValue</a>(<span class="stringliteral">"SubgroupGenerator"</span>, g))
00031         {
00032                 q = alg.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha40">GetValueWithDefault</a>(<span class="stringliteral">"SubgroupOrder"</span>, ComputeGroupOrder(p)/2);
00033         }
00034         <span class="keywordflow">else</span>
00035         {
00036                 <span class="keywordtype">int</span> modulusSize = 1024;
00037                 alg.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha42">GetIntValue</a>(<span class="stringliteral">"ModulusSize"</span>, modulusSize) || alg.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha42">GetIntValue</a>(<span class="stringliteral">"KeySize"</span>, modulusSize);
00038 
00039                 <span class="keywordflow">if</span> (!DSA::IsValidPrimeLength(modulusSize))
00040                         <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(<span class="stringliteral">"DSA: not a valid prime length"</span>);
00041 
00042                 <a class="code" href="class_sec_block.html">SecByteBlock</a> seed(SHA::DIGESTSIZE);
00043                 <a class="code" href="class_integer.html">Integer</a> h;
00044                 <span class="keywordtype">int</span> c;
00045 
00046                 <span class="keywordflow">do</span>
00047                 {
00048                         rng.<a class="code" href="class_random_number_generator.html#_x917_r_n_ga4">GenerateBlock</a>(seed, SHA::DIGESTSIZE);
00049                 } <span class="keywordflow">while</span> (!DSA::GeneratePrimes(seed, SHA::DIGESTSIZE*8, c, p, modulusSize, q));
00050 
00051                 <span class="keywordflow">do</span>
00052                 {
00053                         h.Randomize(rng, 2, p-2);
00054                         g = a_exp_b_mod_c(h, (p-1)/q, p);
00055                 } <span class="keywordflow">while</span> (g &lt;= 1);
00056         }
00057 
00058         Initialize(p, q, g);
00059 }
00060 
<a name="l00061"></a><a class="code" href="class_d_l___group_parameters___d_s_a.html#_d_l___group_parameters___d_s_aa0">00061</a> <span class="keywordtype">bool</span> <a class="code" href="class_d_l___group_parameters___d_s_a.html#_d_l___group_parameters___d_s_aa0">DL_GroupParameters_DSA::ValidateGroup</a>(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &amp;rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> level)<span class="keyword"> const</span>
00062 <span class="keyword"></span>{
00063         <span class="keywordtype">bool</span> pass = DL_GroupParameters_GFP::ValidateGroup(rng, level);
00064         pass = pass &amp;&amp; DSA::IsValidPrimeLength(GetModulus().BitCount());
00065         pass = pass &amp;&amp; GetSubgroupOrder().<a class="code" href="class_integer.html#_integerz41_2">BitCount</a>() == 160;
00066         <span class="keywordflow">return</span> pass;
00067 }
00068 
00069 <span class="keywordtype">void</span> DL_SignatureMessageEncodingMethod_DSA::ComputeMessageRepresentative(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &amp;rng, 
00070         <span class="keyword">const</span> byte *recoverableMessage, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> recoverableMessageLength,
00071         <a class="code" href="class_hash_transformation.html">HashTransformation</a> &amp;hash, HashIdentifier hashIdentifier, <span class="keywordtype">bool</span> messageEmpty,
00072         byte *representative, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> representativeBitLength)<span class="keyword"> const</span>
00073 <span class="keyword"></span>{
00074         assert(recoverableMessageLength == 0);
00075         assert(hashIdentifier.second == 0);
00076         <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> representativeByteLength = BitsToBytes(representativeBitLength);
00077         <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> digestSize = hash.<a class="code" href="class_hash_transformation.html#_x_m_a_c_c___basea8">DigestSize</a>();
00078         <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> paddingLength = SaturatingSubtract(representativeByteLength, digestSize);
00079 
00080         memset(representative, 0, paddingLength);
00081         hash.<a class="code" href="class_hash_transformation.html#_two_bases_3_01_message_authentication_code_00_01_variable_key_length_3_0132_00_010_00_01_u_i_n_t___m_a_x_01_4_01_4a11">TruncatedFinal</a>(representative+paddingLength, STDMIN(representativeByteLength, digestSize));
00082 
00083         <span class="keywordflow">if</span> (digestSize*8 &gt; representativeBitLength)
00084         {
00085                 <a class="code" href="class_integer.html">Integer</a> h(representative, representativeByteLength);
00086                 h &gt;&gt;= representativeByteLength*8 - representativeBitLength;
00087                 h.Encode(representative, representativeByteLength);
00088         }
00089 }
00090 
00091 <span class="keywordtype">void</span> DL_SignatureMessageEncodingMethod_NR::ComputeMessageRepresentative(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &amp;rng, 
00092         <span class="keyword">const</span> byte *recoverableMessage, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> recoverableMessageLength,
00093         <a class="code" href="class_hash_transformation.html">HashTransformation</a> &amp;hash, HashIdentifier hashIdentifier, <span class="keywordtype">bool</span> messageEmpty,
00094         byte *representative, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> representativeBitLength)<span class="keyword"> const</span>
00095 <span class="keyword"></span>{
00096         assert(recoverableMessageLength == 0);
00097         assert(hashIdentifier.second == 0);
00098         <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> representativeByteLength = BitsToBytes(representativeBitLength);
00099         <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> digestSize = hash.<a class="code" href="class_hash_transformation.html#_x_m_a_c_c___basea8">DigestSize</a>();
00100         <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> paddingLength = SaturatingSubtract(representativeByteLength, digestSize);
00101 
00102         memset(representative, 0, paddingLength);
00103         hash.<a class="code" href="class_hash_transformation.html#_two_bases_3_01_message_authentication_code_00_01_variable_key_length_3_0132_00_010_00_01_u_i_n_t___m_a_x_01_4_01_4a11">TruncatedFinal</a>(representative+paddingLength, STDMIN(representativeByteLength, digestSize));
00104 
00105         <span class="keywordflow">if</span> (digestSize*8 &gt;= representativeBitLength)
00106         {
00107                 <a class="code" href="class_integer.html">Integer</a> h(representative, representativeByteLength);
00108                 h &gt;&gt;= representativeByteLength*8 - representativeBitLength + 1;
00109                 h.Encode(representative, representativeByteLength);
00110         }
00111 }
00112 
00113 <span class="keywordtype">bool</span> DL_GroupParameters_IntegerBased::ValidateGroup(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &amp;rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> level)<span class="keyword"> const</span>
00114 <span class="keyword"></span>{
00115         <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;p = GetModulus(), &amp;q = GetSubgroupOrder();
00116 
00117         <span class="keywordtype">bool</span> pass = <span class="keyword">true</span>;
00118         pass = pass &amp;&amp; p &gt; <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() &amp;&amp; p.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>();
00119         pass = pass &amp;&amp; q &gt; <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() &amp;&amp; q.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>();
00120 
00121         <span class="keywordflow">if</span> (level &gt;= 1)
00122                 pass = pass &amp;&amp; GetCofactor() &gt; <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() &amp;&amp; GetGroupOrder() % q == <a class="code" href="class_integer.html#_integerz37_12">Integer::Zero</a>();
00123         <span class="keywordflow">if</span> (level &gt;= 2)
00124                 pass = pass &amp;&amp; VerifyPrime(rng, q, level-2) &amp;&amp; VerifyPrime(rng, p, level-2);
00125 
00126         <span class="keywordflow">return</span> pass;
00127 }
00128 
00129 <span class="keywordtype">bool</span> DL_GroupParameters_IntegerBased::ValidateElement(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> level, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;g, <span class="keyword">const</span> DL_FixedBasePrecomputation&lt;Integer&gt; *gpc)<span class="keyword"> const</span>
00130 <span class="keyword"></span>{
00131         <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;p = GetModulus(), &amp;q = GetSubgroupOrder();
00132 
00133         <span class="keywordtype">bool</span> pass = <span class="keyword">true</span>;
00134         pass = pass &amp;&amp; GetFieldType() == 1 ? g.IsPositive() : g.NotNegative();
00135         pass = pass &amp;&amp; g &lt; p &amp;&amp; !IsIdentity(g);
00136 
00137         <span class="keywordflow">if</span> (level &gt;= 1)
00138         {
00139                 <span class="keywordflow">if</span> (gpc)
00140                         pass = pass &amp;&amp; gpc-&gt;Exponentiate(GetGroupPrecomputation(), Integer::One()) == g;
00141         }
00142         <span class="keywordflow">if</span> (level &gt;= 2)
00143         {
00144                 <span class="keywordflow">if</span> (GetFieldType() == 2)
00145                         pass = pass &amp;&amp; Jacobi(g*g-4, p)==-1;
00146 
00147                 <span class="comment">// verifying that Lucas((p+1)/2, w, p)==2 is omitted because it's too costly</span>
00148                 <span class="comment">// and at most 1 bit is leaked if it's false</span>
00149                 <span class="keywordtype">bool</span> fullValidate = (GetFieldType() == 2 &amp;&amp; level &gt;= 3) || !FastSubgroupCheckAvailable();
00150 
00151                 <span class="keywordflow">if</span> (fullValidate)
00152                         pass = pass &amp;&amp; IsIdentity(gpc ? gpc-&gt;Exponentiate(GetGroupPrecomputation(), q) : ExponentiateElement(g, q));
00153                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (GetFieldType() == 1)
00154                         pass = pass &amp;&amp; Jacobi(g, p) == 1;
00155         }
00156 
00157         <span class="keywordflow">return</span> pass;
00158 }
00159 
<a name="l00160"></a><a class="code" href="class_d_l___group_parameters___integer_based.html#_d_l___group_parameters_impl_3_01_mod_exp_precomputation_00_01_d_l___fixed_base_precomputation_impl_3_01typename_mod_exp_precomputation_1_1_element_01_4_00_01_d_l___group_parameters___integer_based_01_4a9">00160</a> <span class="keywordtype">void</span> <a class="code" href="class_d_l___group_parameters___integer_based.html#_d_l___group_parameters_impl_3_01_mod_exp_precomputation_00_01_d_l___fixed_base_precomputation_impl_3_01typename_mod_exp_precomputation_1_1_element_01_4_00_01_d_l___group_parameters___integer_based_01_4a9">DL_GroupParameters_IntegerBased::GenerateRandom</a>(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &amp;rng, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &amp;alg)
00161 {
00162         <a class="code" href="class_integer.html">Integer</a> p, q, g;
00163         
00164         <span class="keywordflow">if</span> (alg.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha39">GetValue</a>(<span class="stringliteral">"Modulus"</span>, p) &amp;&amp; alg.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha39">GetValue</a>(<span class="stringliteral">"SubgroupGenerator"</span>, g))
00165         {
00166                 q = alg.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha40">GetValueWithDefault</a>(<span class="stringliteral">"SubgroupOrder"</span>, ComputeGroupOrder(p)/2);
00167         }
00168         <span class="keywordflow">else</span>
00169         {
00170                 <span class="keywordtype">int</span> modulusSize, subgroupOrderSize;
00171 
00172                 <span class="keywordflow">if</span> (!alg.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha42">GetIntValue</a>(<span class="stringliteral">"ModulusSize"</span>, modulusSize))
00173                         modulusSize = alg.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha43">GetIntValueWithDefault</a>(<span class="stringliteral">"KeySize"</span>, 2048);
00174 
00175                 <span class="keywordflow">if</span> (!alg.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha42">GetIntValue</a>(<span class="stringliteral">"SubgroupOrderSize"</span>, subgroupOrderSize))
00176                         subgroupOrderSize = GetDefaultSubgroupOrderSize(modulusSize);
00177 
00178                 <a class="code" href="class_prime_and_generator.html">PrimeAndGenerator</a> pg;
00179                 pg.<a class="code" href="class_prime_and_generator.html#_prime_and_generatora3">Generate</a>(GetFieldType() == 1 ? 1 : -1, rng, modulusSize, subgroupOrderSize);
00180                 p = pg.<a class="code" href="class_prime_and_generator.html#_prime_and_generatora4">Prime</a>();
00181                 q = pg.<a class="code" href="class_prime_and_generator.html#_prime_and_generatora5">SubPrime</a>();
00182                 g = pg.<a class="code" href="class_prime_and_generator.html#_prime_and_generatora6">Generator</a>();
00183         }
00184 
00185         Initialize(p, q, g);
00186 }
00187 
00188 <a class="code" href="class_integer.html">Integer</a> DL_GroupParameters_IntegerBased::DecodeElement(<span class="keyword">const</span> byte *encoded, <span class="keywordtype">bool</span> checkForGroupMembership)<span class="keyword"> const</span>
00189 <span class="keyword"></span>{
00190         <a class="code" href="class_integer.html">Integer</a> g(encoded, GetModulus().ByteCount());
00191         <span class="keywordflow">if</span> (!ValidateElement(1, g, NULL))
00192                 <span class="keywordflow">throw</span> <a class="code" href="class_d_l___bad_element.html">DL_BadElement</a>();
00193         <span class="keywordflow">return</span> g;
00194 }
00195 
<a name="l00196"></a><a class="code" href="class_d_l___group_parameters___integer_based.html#_d_l___group_parameters_impl_3_01_mod_exp_precomputation_00_01_d_l___fixed_base_precomputation_impl_3_01typename_mod_exp_precomputation_1_1_element_01_4_00_01_d_l___group_parameters___integer_based_01_4a7">00196</a> <span class="keywordtype">void</span> <a class="code" href="class_d_l___group_parameters___integer_based.html#_d_l___group_parameters_impl_3_01_mod_exp_precomputation_00_01_d_l___fixed_base_precomputation_impl_3_01typename_mod_exp_precomputation_1_1_element_01_4_00_01_d_l___group_parameters___integer_based_01_4a7">DL_GroupParameters_IntegerBased::BERDecode</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)
00197 {
00198         <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> parameters(bt);
00199                 <a class="code" href="class_integer.html">Integer</a> p(parameters);
00200                 <a class="code" href="class_integer.html">Integer</a> q(parameters);
00201                 <a class="code" href="class_integer.html">Integer</a> g;
00202                 <span class="keywordflow">if</span> (parameters.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera4">EndReached</a>())
00203                 {
00204                         g = q;
00205                         q = ComputeGroupOrder(p) / 2;
00206                 }
00207                 <span class="keywordflow">else</span>
00208                         g.BERDecode(parameters);
00209         parameters.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera9">MessageEnd</a>();
00210 
00211         SetModulusAndSubgroupGenerator(p, g);
00212         SetSubgroupOrder(q);
00213 }
00214 
<a name="l00215"></a><a class="code" href="class_d_l___group_parameters___integer_based.html#_d_l___group_parameters_impl_3_01_mod_exp_precomputation_00_01_d_l___fixed_base_precomputation_impl_3_01typename_mod_exp_precomputation_1_1_element_01_4_00_01_d_l___group_parameters___integer_based_01_4a8">00215</a> <span class="keywordtype">void</span> <a class="code" href="class_d_l___group_parameters___integer_based.html#_d_l___group_parameters_impl_3_01_mod_exp_precomputation_00_01_d_l___fixed_base_precomputation_impl_3_01typename_mod_exp_precomputation_1_1_element_01_4_00_01_d_l___group_parameters___integer_based_01_4a8">DL_GroupParameters_IntegerBased::DEREncode</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span>
00216 <span class="keyword"></span>{
00217         <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> parameters(bt);
00218                 GetModulus().<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(parameters);
00219                 m_q.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(parameters);
00220                 GetSubgroupGenerator().DEREncode(parameters);
00221         parameters.<a class="code" href="class_d_e_r_general_encoder.html#_d_e_r_set_encodera2">MessageEnd</a>();
00222 }
00223 
<a name="l00224"></a><a class="code" href="class_d_l___group_parameters___integer_based.html#_d_l___group_parameters_impl_3_01_mod_exp_precomputation_00_01_d_l___fixed_base_precomputation_impl_3_01typename_mod_exp_precomputation_1_1_element_01_4_00_01_d_l___group_parameters___integer_based_01_4a10">00224</a> <span class="keywordtype">bool</span> <a class="code" href="class_d_l___group_parameters___integer_based.html#_d_l___group_parameters_impl_3_01_mod_exp_precomputation_00_01_d_l___fixed_base_precomputation_impl_3_01typename_mod_exp_precomputation_1_1_element_01_4_00_01_d_l___group_parameters___integer_based_01_4a10">DL_GroupParameters_IntegerBased::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>
00225 <span class="keyword"></span>{
00226         <span class="keywordflow">return</span> GetValueHelper&lt;DL_GroupParameters&lt;Element&gt; &gt;(<span class="keyword">this</span>, name, valueType, pValue)
00227                 CRYPTOPP_GET_FUNCTION_ENTRY(Modulus);
00228 }
00229 
<a name="l00230"></a><a class="code" href="class_d_l___group_parameters___integer_based.html#_d_l___group_parameters_impl_3_01_mod_exp_precomputation_00_01_d_l___fixed_base_precomputation_impl_3_01typename_mod_exp_precomputation_1_1_element_01_4_00_01_d_l___group_parameters___integer_based_01_4a11">00230</a> <span class="keywordtype">void</span> <a class="code" href="class_d_l___group_parameters___integer_based.html#_d_l___group_parameters_impl_3_01_mod_exp_precomputation_00_01_d_l___fixed_base_precomputation_impl_3_01typename_mod_exp_precomputation_1_1_element_01_4_00_01_d_l___group_parameters___integer_based_01_4a11">DL_GroupParameters_IntegerBased::AssignFrom</a>(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &amp;source)
00231 {
00232         AssignFromHelper(<span class="keyword">this</span>, source)
00233                 CRYPTOPP_SET_FUNCTION_ENTRY2(Modulus, SubgroupGenerator)
00234                 CRYPTOPP_SET_FUNCTION_ENTRY(SubgroupOrder)
00235                 ;
00236 }
00237 
00238 <a class="code" href="class_o_i_d.html">OID</a> DL_GroupParameters_IntegerBased::GetAlgorithmID()<span class="keyword"> const</span>
00239 <span class="keyword"></span>{
00240         <span class="keywordflow">return</span> ASN1::id_dsa();
00241 }
00242 
00243 <span class="keywordtype">void</span> DL_GroupParameters_GFP::SimultaneousExponentiate(Element *results, <span class="keyword">const</span> Element &amp;base, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> *exponents, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> exponentsCount)<span class="keyword"> const</span>
00244 <span class="keyword"></span>{
00245         <a class="code" href="class_modular_arithmetic.html">ModularArithmetic</a> ma(GetModulus());
00246         ma.<a class="code" href="class_modular_arithmetic.html#_modular_arithmetica28">SimultaneousExponentiate</a>(results, base, exponents, exponentsCount);
00247 }
00248 
00249 DL_GroupParameters_GFP::Element DL_GroupParameters_GFP::MultiplyElements(<span class="keyword">const</span> Element &amp;a, <span class="keyword">const</span> Element &amp;b)<span class="keyword"> const</span>
00250 <span class="keyword"></span>{
00251         <span class="keywordflow">return</span> a_times_b_mod_c(a, b, GetModulus());
00252 }
00253 
00254 DL_GroupParameters_GFP::Element DL_GroupParameters_GFP::CascadeExponentiate(<span class="keyword">const</span> Element &amp;element1, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;exponent1, <span class="keyword">const</span> Element &amp;element2, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;exponent2)<span class="keyword"> const</span>
00255 <span class="keyword"></span>{
00256         <a class="code" href="class_modular_arithmetic.html">ModularArithmetic</a> ma(GetModulus());
00257         <span class="keywordflow">return</span> ma.<a class="code" href="class_modular_arithmetic.html#_modular_arithmetica27">CascadeExponentiate</a>(element1, exponent1, element2, exponent2);
00258 }
00259 
00260 <a class="code" href="class_integer.html">Integer</a> DL_GroupParameters_IntegerBased::GetMaxExponent()<span class="keyword"> const</span>
00261 <span class="keyword"></span>{
00262         <span class="keywordflow">return</span> STDMIN(GetSubgroupOrder()-1, Integer::Power2(2*DiscreteLogWorkFactor(GetFieldType()*GetModulus().BitCount())));
00263 }
00264 
00265 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DL_GroupParameters_IntegerBased::GetDefaultSubgroupOrderSize(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> modulusSize)<span class="keyword"> const</span>
00266 <span class="keyword"></span>{
00267         <span class="keywordflow">return</span> 2*DiscreteLogWorkFactor(GetFieldType()*modulusSize);
00268 }
00269 
00270 NAMESPACE_END
00271 
00272 <span class="preprocessor">#endif</span>
</div></pre><hr size="1"><address style="align: right;"><small>Generated on Sun Nov 7 08:23:57 2004 for Crypto++ by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border=0 ></a> 1.3.7 </small></address>
</body>
</html>