<!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++: rsa.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>rsa.cpp</h1><pre class="fragment"><div>00001 <span class="comment">// rsa.cpp - written and placed in the public domain by Wei Dai</span> 00002 00003 <span class="preprocessor">#include "pch.h"</span> 00004 <span class="preprocessor">#include "<a class="code" href="rsa_8h.html">rsa.h</a>"</span> 00005 <span class="preprocessor">#include "asn.h"</span> 00006 <span class="preprocessor">#include "oids.h"</span> 00007 <span class="preprocessor">#include "modarith.h"</span> 00008 <span class="preprocessor">#include "nbtheory.h"</span> 00009 <span class="preprocessor">#include "sha.h"</span> 00010 <span class="preprocessor">#include "algparam.h"</span> 00011 <span class="preprocessor">#include "<a class="code" href="fips140_8h.html">fips140.h</a>"</span> 00012 00013 <span class="preprocessor">#if !defined(NDEBUG) && !defined(CRYPTOPP_IS_DLL)</span> 00014 <span class="preprocessor"></span><span class="preprocessor">#include "pssr.h"</span> 00015 NAMESPACE_BEGIN(CryptoPP) 00016 void RSA_TestInstantiations() 00017 { 00018 <a class="code" href="struct_r_s_a_s_s.html">RSASS<PKCS1v15, SHA></a>::Verifier x1(1, 1); 00019 <a class="code" href="struct_r_s_a_s_s.html">RSASS<PKCS1v15, SHA></a>::Signer x2(NullRNG(), 1); 00020 <a class="code" href="struct_r_s_a_s_s.html">RSASS<PKCS1v15, SHA></a>::Verifier x3(x2); 00021 <a class="code" href="struct_r_s_a_s_s.html">RSASS<PKCS1v15, SHA></a>::Verifier x4(x2.GetKey()); 00022 <a class="code" href="struct_r_s_a_s_s.html">RSASS<PSS, SHA></a>::Verifier x5(x3); 00023 <span class="preprocessor">#ifndef __MWERKS__</span> 00024 <span class="preprocessor"></span> <a class="code" href="struct_r_s_a_s_s.html">RSASS<PSSR, SHA></a>::Signer x6 = x2; 00025 x3 = x2; 00026 x6 = x2; 00027 <span class="preprocessor">#endif</span> 00028 <span class="preprocessor"></span> <a class="code" href="struct_r_s_a_e_s.html">RSAES<PKCS1v15></a>::Encryptor x7(x2); 00029 <span class="preprocessor">#ifndef __GNUC__</span> 00030 <span class="preprocessor"></span> <a class="code" href="struct_r_s_a_e_s.html">RSAES<PKCS1v15></a>::Encryptor x8(x3); 00031 <span class="preprocessor">#endif</span> 00032 <span class="preprocessor"></span> <a class="code" href="struct_r_s_a_e_s.html">RSAES<OAEP<SHA></a> >::Encryptor x9(x2); 00033 00034 x4 = x2.GetKey(); 00035 } 00036 NAMESPACE_END 00037 <span class="preprocessor">#endif</span> 00038 <span class="preprocessor"></span> 00039 <span class="preprocessor">#ifndef CRYPTOPP_IMPORTS</span> 00040 <span class="preprocessor"></span> 00041 NAMESPACE_BEGIN(CryptoPP) 00042 00043 <a class="code" href="class_o_i_d.html">OID</a> <a class="code" href="class_r_s_a_function.html">RSAFunction</a>::GetAlgorithmID()<span class="keyword"> const</span> 00044 <span class="keyword"></span>{ 00045 <span class="keywordflow">return</span> ASN1::rsaEncryption(); 00046 } 00047 <a name="l00048"></a><a class="code" href="class_r_s_a_function.html#_r_s_a_functiona2">00048</a> <span class="keywordtype">void</span> <a class="code" href="class_r_s_a_function.html#_r_s_a_functiona2">RSAFunction::BERDecodeKey</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt) 00049 { 00050 <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> seq(bt); 00051 m_n.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq); 00052 m_e.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq); 00053 seq.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera9">MessageEnd</a>(); 00054 } 00055 <a name="l00056"></a><a class="code" href="class_r_s_a_function.html#_r_s_a_functiona3">00056</a> <span class="keywordtype">void</span> <a class="code" href="class_r_s_a_function.html#_r_s_a_functiona3">RSAFunction::DEREncodeKey</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt)<span class="keyword"> const</span> 00057 <span class="keyword"></span>{ 00058 <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> seq(bt); 00059 m_n.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq); 00060 m_e.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq); 00061 seq.<a class="code" href="class_d_e_r_general_encoder.html#_d_e_r_set_encodera2">MessageEnd</a>(); 00062 } 00063 00064 <a class="code" href="class_integer.html">Integer</a> RSAFunction::ApplyFunction(<span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &x)<span class="keyword"> const</span> 00065 <span class="keyword"></span>{ 00066 DoQuickSanityCheck(); 00067 <span class="keywordflow">return</span> a_exp_b_mod_c(x, m_e, m_n); 00068 } 00069 <a name="l00070"></a><a class="code" href="class_r_s_a_function.html#_r_s_a_functiona4">00070</a> <span class="keywordtype">bool</span> <a class="code" href="class_r_s_a_function.html#_r_s_a_functiona4">RSAFunction::Validate</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> 00071 <span class="keyword"></span>{ 00072 <span class="keywordtype">bool</span> pass = <span class="keyword">true</span>; 00073 pass = pass && m_n > <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() && m_n.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>(); 00074 pass = pass && m_e > <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() && m_e.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() && m_e < m_n; 00075 <span class="keywordflow">return</span> pass; 00076 } 00077 <a name="l00078"></a><a class="code" href="class_r_s_a_function.html#_r_s_a_functiona5">00078</a> <span class="keywordtype">bool</span> <a class="code" href="class_r_s_a_function.html#_r_s_a_functiona5">RSAFunction::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> 00079 <span class="keyword"></span>{ 00080 <span class="keywordflow">return</span> GetValueHelper(<span class="keyword">this</span>, name, valueType, pValue).Assignable() 00081 CRYPTOPP_GET_FUNCTION_ENTRY(Modulus) 00082 CRYPTOPP_GET_FUNCTION_ENTRY(PublicExponent) 00083 ; 00084 } 00085 <a name="l00086"></a><a class="code" href="class_r_s_a_function.html#_r_s_a_functiona6">00086</a> <span class="keywordtype">void</span> <a class="code" href="class_r_s_a_function.html#_r_s_a_functiona6">RSAFunction::AssignFrom</a>(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &source) 00087 { 00088 AssignFromHelper(<span class="keyword">this</span>, source) 00089 CRYPTOPP_SET_FUNCTION_ENTRY(Modulus) 00090 CRYPTOPP_SET_FUNCTION_ENTRY(PublicExponent) 00091 ; 00092 } 00093 00094 <span class="comment">// *****************************************************************************</span> 00095 00096 <span class="keyword">class </span>RSAPrimeSelector : <span class="keyword">public</span> PrimeSelector 00097 { 00098 <span class="keyword">public</span>: 00099 RSAPrimeSelector(<span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &e) : m_e(e) {} 00100 <span class="keywordtype">bool</span> IsAcceptable(<span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &candidate)<span class="keyword"> const </span>{<span class="keywordflow">return</span> RelativelyPrime(m_e, candidate-Integer::One());} 00101 <a class="code" href="class_integer.html">Integer</a> m_e; 00102 }; 00103 <a name="l00104"></a><a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona9">00104</a> <span class="keywordtype">void</span> <a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona9">InvertibleRSAFunction::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) 00105 { 00106 <span class="keywordtype">int</span> modulusSize = 2048; 00107 alg.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha42">GetIntValue</a>(Name::ModulusSize(), modulusSize) || alg.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha42">GetIntValue</a>(Name::KeySize(), modulusSize); 00108 00109 <span class="keywordflow">if</span> (modulusSize < 16) 00110 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(<span class="stringliteral">"InvertibleRSAFunction: specified modulus size is too small"</span>); 00111 00112 m_e = alg.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha40">GetValueWithDefault</a>(Name::PublicExponent(), <a class="code" href="class_integer.html">Integer</a>(17)); 00113 00114 <span class="keywordflow">if</span> (m_e < 3 || m_e.<a class="code" href="class_integer.html#_integerz41_14">IsEven</a>()) 00115 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(<span class="stringliteral">"InvertibleRSAFunction: invalid public exponent"</span>); 00116 00117 RSAPrimeSelector selector(m_e); 00118 <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &primeParam = MakeParametersForTwoPrimesOfEqualSize(modulusSize) 00119 (<a class="code" href="namespace_name.html#a24">Name::PointerToPrimeSelector</a>(), selector.GetSelectorPointer()); 00120 m_p.<a class="code" href="class_integer.html#_integerz43_14">GenerateRandom</a>(rng, primeParam); 00121 m_q.<a class="code" href="class_integer.html#_integerz43_14">GenerateRandom</a>(rng, primeParam); 00122 00123 m_d = EuclideanMultiplicativeInverse(m_e, LCM(m_p-1, m_q-1)); 00124 assert(m_d.<a class="code" href="class_integer.html#_integerz41_12">IsPositive</a>()); 00125 00126 m_dp = m_d % (m_p-1); 00127 m_dq = m_d % (m_q-1); 00128 m_n = m_p * m_q; 00129 m_u = m_q.<a class="code" href="class_integer.html#_integerz49_7">InverseMod</a>(m_p); 00130 00131 <span class="keywordflow">if</span> (FIPS_140_2_ComplianceEnabled()) 00132 { 00133 <a class="code" href="struct_r_s_a_s_s.html">RSASS<PKCS1v15, SHA></a>::Signer signer(*<span class="keyword">this</span>); 00134 <a class="code" href="struct_r_s_a_s_s.html">RSASS<PKCS1v15, SHA></a>::Verifier verifier(signer); 00135 SignaturePairwiseConsistencyTest_FIPS_140_Only(signer, verifier); 00136 00137 <a class="code" href="struct_r_s_a_e_s.html">RSAES<OAEP<SHA></a> >::Decryptor decryptor(*<span class="keyword">this</span>); 00138 <a class="code" href="struct_r_s_a_e_s.html">RSAES<OAEP<SHA></a> >::Encryptor encryptor(decryptor); 00139 EncryptionPairwiseConsistencyTest_FIPS_140_Only(encryptor, decryptor); 00140 } 00141 } 00142 00143 <span class="keywordtype">void</span> InvertibleRSAFunction::Initialize(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> keybits, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &e) 00144 { 00145 GenerateRandom(rng, MakeParameters(Name::ModulusSize(), (<span class="keywordtype">int</span>)keybits)(Name::PublicExponent(), e+e.IsEven())); 00146 } 00147 <a name="l00148"></a><a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona2">00148</a> <span class="keywordtype">void</span> InvertibleRSAFunction::Initialize(<span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &n, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &e, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &d) 00149 { 00150 <span class="keywordflow">if</span> (n.<a class="code" href="class_integer.html#_integerz41_14">IsEven</a>() || e.IsEven() | d.IsEven()) 00151 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(<span class="stringliteral">"InvertibleRSAFunction: input is not a valid RSA private key"</span>); 00152 00153 m_n = n; 00154 m_e = e; 00155 m_d = d; 00156 00157 <a class="code" href="class_integer.html">Integer</a> r = --(d*e); 00158 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> s = 0; 00159 <span class="keywordflow">while</span> (r.<a class="code" href="class_integer.html#_integerz41_14">IsEven</a>()) 00160 { 00161 r >>= 1; 00162 s++; 00163 } 00164 00165 <a class="code" href="class_modular_arithmetic.html">ModularArithmetic</a> modn(n); 00166 <span class="keywordflow">for</span> (<a class="code" href="class_integer.html">Integer</a> i = 2; ; ++i) 00167 { 00168 <a class="code" href="class_integer.html">Integer</a> a = modn.<a class="code" href="class_abstract_ring.html#_euclidean_domain_ofa19">Exponentiate</a>(i, r); 00169 <span class="keywordflow">if</span> (a == 1) 00170 <span class="keywordflow">continue</span>; 00171 <a class="code" href="class_integer.html">Integer</a> b; 00172 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j = 0; 00173 <span class="keywordflow">while</span> (a != n-1) 00174 { 00175 b = modn.<a class="code" href="class_modular_arithmetic.html#_modular_arithmetica23">Square</a>(a); 00176 <span class="keywordflow">if</span> (b == 1) 00177 { 00178 m_p = GCD(a-1, n); 00179 m_q = n/m_p; 00180 m_dp = m_d % (m_p-1); 00181 m_dq = m_d % (m_q-1); 00182 m_u = m_q.<a class="code" href="class_integer.html#_integerz49_7">InverseMod</a>(m_p); 00183 <span class="keywordflow">return</span>; 00184 } 00185 <span class="keywordflow">if</span> (++j == s) 00186 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(<span class="stringliteral">"InvertibleRSAFunction: input is not a valid RSA private key"</span>); 00187 a = b; 00188 } 00189 } 00190 } 00191 <a name="l00192"></a><a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona5">00192</a> <span class="keywordtype">void</span> <a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona5">InvertibleRSAFunction::BERDecodeKey</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt) 00193 { 00194 <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> privateKey(bt); 00195 word32 version; 00196 BERDecodeUnsigned<word32>(privateKey, version, INTEGER, 0, 0); <span class="comment">// check version</span> 00197 m_n.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(privateKey); 00198 m_e.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(privateKey); 00199 m_d.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(privateKey); 00200 m_p.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(privateKey); 00201 m_q.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(privateKey); 00202 m_dp.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(privateKey); 00203 m_dq.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(privateKey); 00204 m_u.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(privateKey); 00205 privateKey.MessageEnd(); 00206 } 00207 <a name="l00208"></a><a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona6">00208</a> <span class="keywordtype">void</span> <a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona6">InvertibleRSAFunction::DEREncodeKey</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt)<span class="keyword"> const</span> 00209 <span class="keyword"></span>{ 00210 <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> privateKey(bt); 00211 DEREncodeUnsigned<word32>(privateKey, 0); <span class="comment">// version</span> 00212 m_n.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(privateKey); 00213 m_e.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(privateKey); 00214 m_d.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(privateKey); 00215 m_p.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(privateKey); 00216 m_q.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(privateKey); 00217 m_dp.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(privateKey); 00218 m_dq.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(privateKey); 00219 m_u.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(privateKey); 00220 privateKey.MessageEnd(); 00221 } 00222 00223 <a class="code" href="class_integer.html">Integer</a> InvertibleRSAFunction::CalculateInverse(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &x)<span class="keyword"> const </span> 00224 <span class="keyword"></span>{ 00225 DoQuickSanityCheck(); 00226 <a class="code" href="class_modular_arithmetic.html">ModularArithmetic</a> modn(m_n); 00227 <a class="code" href="class_integer.html">Integer</a> r, rInv; 00228 <span class="keywordflow">do</span> { <span class="comment">// do this loop for people using small numbers for testing</span> 00229 r.<a class="code" href="class_integer.html#_integerz43_10">Randomize</a>(rng, Integer::One(), m_n - Integer::One()); 00230 rInv = modn.<a class="code" href="class_modular_arithmetic.html#_modular_arithmetica25">MultiplicativeInverse</a>(r); 00231 } <span class="keywordflow">while</span> (rInv.<a class="code" href="class_integer.html#_integerz41_8">IsZero</a>()); 00232 <a class="code" href="class_integer.html">Integer</a> re = modn.<a class="code" href="class_abstract_ring.html#_euclidean_domain_ofa19">Exponentiate</a>(r, m_e); 00233 re = modn.<a class="code" href="class_modular_arithmetic.html#_modular_arithmetica22">Multiply</a>(re, x); <span class="comment">// blind</span> 00234 <span class="comment">// here we follow the notation of PKCS #1 and let u=q inverse mod p</span> 00235 <span class="comment">// but in ModRoot, u=p inverse mod q, so we reverse the order of p and q</span> 00236 <a class="code" href="class_integer.html">Integer</a> y = ModularRoot(re, m_dq, m_dp, m_q, m_p, m_u); 00237 y = modn.<a class="code" href="class_modular_arithmetic.html#_modular_arithmetica22">Multiply</a>(y, rInv); <span class="comment">// unblind</span> 00238 <span class="keywordflow">if</span> (modn.<a class="code" href="class_abstract_ring.html#_euclidean_domain_ofa19">Exponentiate</a>(y, m_e) != x) <span class="comment">// check</span> 00239 <span class="keywordflow">throw</span> <a class="code" href="class_exception.html">Exception</a>(Exception::OTHER_ERROR, <span class="stringliteral">"InvertibleRSAFunction: computational error during private key operation"</span>); 00240 <span class="keywordflow">return</span> y; 00241 } 00242 <a name="l00243"></a><a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona8">00243</a> <span class="keywordtype">bool</span> <a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona8">InvertibleRSAFunction::Validate</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> 00244 <span class="keyword"></span>{ 00245 <span class="keywordtype">bool</span> pass = RSAFunction::Validate(rng, level); 00246 pass = pass && m_p > <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() && m_p.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() && m_p < m_n; 00247 pass = pass && m_q > <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() && m_q.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() && m_q < m_n; 00248 pass = pass && m_d > <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() && m_d.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() && m_d < m_n; 00249 pass = pass && m_dp > <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() && m_dp.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() && m_dp < m_p; 00250 pass = pass && m_dq > <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() && m_dq.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() && m_dq < m_q; 00251 pass = pass && m_u.<a class="code" href="class_integer.html#_integerz41_12">IsPositive</a>() && m_u < m_p; 00252 <span class="keywordflow">if</span> (level >= 1) 00253 { 00254 pass = pass && m_p * m_q == m_n; 00255 pass = pass && m_e*m_d % LCM(m_p-1, m_q-1) == 1; 00256 pass = pass && m_dp == m_d%(m_p-1) && m_dq == m_d%(m_q-1); 00257 pass = pass && m_u * m_q % m_p == 1; 00258 } 00259 <span class="keywordflow">if</span> (level >= 2) 00260 pass = pass && VerifyPrime(rng, m_p, level-2) && VerifyPrime(rng, m_q, level-2); 00261 <span class="keywordflow">return</span> pass; 00262 } 00263 <a name="l00264"></a><a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona10">00264</a> <span class="keywordtype">bool</span> <a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona10">InvertibleRSAFunction::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> 00265 <span class="keyword"></span>{ 00266 <span class="keywordflow">return</span> GetValueHelper<RSAFunction>(<span class="keyword">this</span>, name, valueType, pValue).Assignable() 00267 CRYPTOPP_GET_FUNCTION_ENTRY(Prime1) 00268 CRYPTOPP_GET_FUNCTION_ENTRY(Prime2) 00269 CRYPTOPP_GET_FUNCTION_ENTRY(PrivateExponent) 00270 CRYPTOPP_GET_FUNCTION_ENTRY(ModPrime1PrivateExponent) 00271 CRYPTOPP_GET_FUNCTION_ENTRY(ModPrime2PrivateExponent) 00272 CRYPTOPP_GET_FUNCTION_ENTRY(MultiplicativeInverseOfPrime2ModPrime1) 00273 ; 00274 } 00275 <a name="l00276"></a><a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona11">00276</a> <span class="keywordtype">void</span> <a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona11">InvertibleRSAFunction::AssignFrom</a>(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &source) 00277 { 00278 AssignFromHelper<RSAFunction>(<span class="keyword">this</span>, source) 00279 CRYPTOPP_SET_FUNCTION_ENTRY(Prime1) 00280 CRYPTOPP_SET_FUNCTION_ENTRY(Prime2) 00281 CRYPTOPP_SET_FUNCTION_ENTRY(PrivateExponent) 00282 CRYPTOPP_SET_FUNCTION_ENTRY(ModPrime1PrivateExponent) 00283 CRYPTOPP_SET_FUNCTION_ENTRY(ModPrime2PrivateExponent) 00284 CRYPTOPP_SET_FUNCTION_ENTRY(MultiplicativeInverseOfPrime2ModPrime1) 00285 ; 00286 } 00287 00288 NAMESPACE_END 00289 00290 <span class="preprocessor">#endif</span> </div></pre><hr size="1"><address style="align: right;"><small>Generated on Sun Nov 7 08:23:59 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>