<!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 Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="globals.html">File Members</a></div> <h1>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<SHA></a>::Signer test; 00017 <a class="code" href="struct_g_d_s_a.html">GDSA<SHA></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<SHA></a>::Signer test3; 00021 <a class="code" href="struct_n_r.html">NR<SHA></a>::Verifier test4; 00022 <a class="code" href="struct_d_l_i_e_s.html">DLIES<></a>::Encryptor test6; 00023 <a class="code" href="struct_d_l_i_e_s.html">DLIES<></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> &rng, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &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) && 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 <= 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> &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 && DSA::IsValidPrimeLength(GetModulus().BitCount()); 00065 pass = pass && 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> &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> &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 > representativeBitLength) 00084 { 00085 <a class="code" href="class_integer.html">Integer</a> h(representative, representativeByteLength); 00086 h >>= 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> &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> &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 >= representativeBitLength) 00106 { 00107 <a class="code" href="class_integer.html">Integer</a> h(representative, representativeByteLength); 00108 h >>= 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> &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> &p = GetModulus(), &q = GetSubgroupOrder(); 00116 00117 <span class="keywordtype">bool</span> pass = <span class="keyword">true</span>; 00118 pass = pass && p > <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() && p.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>(); 00119 pass = pass && q > <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() && q.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>(); 00120 00121 <span class="keywordflow">if</span> (level >= 1) 00122 pass = pass && GetCofactor() > <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() && GetGroupOrder() % q == <a class="code" href="class_integer.html#_integerz37_12">Integer::Zero</a>(); 00123 <span class="keywordflow">if</span> (level >= 2) 00124 pass = pass && VerifyPrime(rng, q, level-2) && 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> &g, <span class="keyword">const</span> DL_FixedBasePrecomputation<Integer> *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> &p = GetModulus(), &q = GetSubgroupOrder(); 00132 00133 <span class="keywordtype">bool</span> pass = <span class="keyword">true</span>; 00134 pass = pass && GetFieldType() == 1 ? g.IsPositive() : g.NotNegative(); 00135 pass = pass && g < p && !IsIdentity(g); 00136 00137 <span class="keywordflow">if</span> (level >= 1) 00138 { 00139 <span class="keywordflow">if</span> (gpc) 00140 pass = pass && gpc->Exponentiate(GetGroupPrecomputation(), Integer::One()) == g; 00141 } 00142 <span class="keywordflow">if</span> (level >= 2) 00143 { 00144 <span class="keywordflow">if</span> (GetFieldType() == 2) 00145 pass = pass && 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 && level >= 3) || !FastSubgroupCheckAvailable(); 00150 00151 <span class="keywordflow">if</span> (fullValidate) 00152 pass = pass && IsIdentity(gpc ? gpc->Exponentiate(GetGroupPrecomputation(), q) : ExponentiateElement(g, q)); 00153 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (GetFieldType() == 1) 00154 pass = pass && 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> &rng, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &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) && 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> &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> &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 &valueType, <span class="keywordtype">void</span> *pValue)<span class="keyword"> const</span> 00225 <span class="keyword"></span>{ 00226 <span class="keywordflow">return</span> GetValueHelper<DL_GroupParameters<Element> >(<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> &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 &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 &a, <span class="keyword">const</span> Element &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 &element1, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &exponent1, <span class="keyword">const</span> Element &element2, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &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>