Sophie

Sophie

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

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++: 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&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>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) &amp;&amp; !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&lt;PKCS1v15, SHA&gt;</a>::Verifier x1(1, 1);
00019         <a class="code" href="struct_r_s_a_s_s.html">RSASS&lt;PKCS1v15, SHA&gt;</a>::Signer x2(NullRNG(), 1);
00020         <a class="code" href="struct_r_s_a_s_s.html">RSASS&lt;PKCS1v15, SHA&gt;</a>::Verifier x3(x2);
00021         <a class="code" href="struct_r_s_a_s_s.html">RSASS&lt;PKCS1v15, SHA&gt;</a>::Verifier x4(x2.GetKey());
00022         <a class="code" href="struct_r_s_a_s_s.html">RSASS&lt;PSS, SHA&gt;</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&lt;PSSR, SHA&gt;</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&lt;PKCS1v15&gt;</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&lt;PKCS1v15&gt;</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&lt;OAEP&lt;SHA&gt;</a> &gt;::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> &amp;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> &amp;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> &amp;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> &amp;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 &amp;&amp; m_n &gt; <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() &amp;&amp; m_n.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>();
00074         pass = pass &amp;&amp; m_e &gt; <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() &amp;&amp; m_e.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() &amp;&amp; m_e &lt; 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 &amp;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> &amp;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> &amp;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> &amp;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> &amp;rng, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &amp;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 &lt; 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 &lt; 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> &amp;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&lt;PKCS1v15, SHA&gt;</a>::Signer signer(*<span class="keyword">this</span>);
00134                 <a class="code" href="struct_r_s_a_s_s.html">RSASS&lt;PKCS1v15, SHA&gt;</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&lt;OAEP&lt;SHA&gt;</a> &gt;::Decryptor decryptor(*<span class="keyword">this</span>);
00138                 <a class="code" href="struct_r_s_a_e_s.html">RSAES&lt;OAEP&lt;SHA&gt;</a> &gt;::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> &amp;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> &amp;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> &amp;n, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;e, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;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 &gt;&gt;= 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> &amp;bt)
00193 {
00194         <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> privateKey(bt);
00195                 word32 version;
00196                 BERDecodeUnsigned&lt;word32&gt;(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> &amp;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&lt;word32&gt;(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> &amp;rng, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;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> &amp;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 &amp;&amp; m_p &gt; <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() &amp;&amp; m_p.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() &amp;&amp; m_p &lt; m_n;
00247         pass = pass &amp;&amp; m_q &gt; <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() &amp;&amp; m_q.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() &amp;&amp; m_q &lt; m_n;
00248         pass = pass &amp;&amp; m_d &gt; <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() &amp;&amp; m_d.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() &amp;&amp; m_d &lt; m_n;
00249         pass = pass &amp;&amp; m_dp &gt; <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() &amp;&amp; m_dp.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() &amp;&amp; m_dp &lt; m_p;
00250         pass = pass &amp;&amp; m_dq &gt; <a class="code" href="class_integer.html#_integerz37_13">Integer::One</a>() &amp;&amp; m_dq.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() &amp;&amp; m_dq &lt; m_q;
00251         pass = pass &amp;&amp; m_u.<a class="code" href="class_integer.html#_integerz41_12">IsPositive</a>() &amp;&amp; m_u &lt; m_p;
00252         <span class="keywordflow">if</span> (level &gt;= 1)
00253         {
00254                 pass = pass &amp;&amp; m_p * m_q == m_n;
00255                 pass = pass &amp;&amp; m_e*m_d % LCM(m_p-1, m_q-1) == 1;
00256                 pass = pass &amp;&amp; m_dp == m_d%(m_p-1) &amp;&amp; m_dq == m_d%(m_q-1);
00257                 pass = pass &amp;&amp; m_u * m_q % m_p == 1;
00258         }
00259         <span class="keywordflow">if</span> (level &gt;= 2)
00260                 pass = pass &amp;&amp; VerifyPrime(rng, m_p, level-2) &amp;&amp; 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 &amp;valueType, <span class="keywordtype">void</span> *pValue)<span class="keyword"> const</span>
00265 <span class="keyword"></span>{
00266         <span class="keywordflow">return</span> GetValueHelper&lt;RSAFunction&gt;(<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> &amp;source)
00277 {
00278         AssignFromHelper&lt;RSAFunction&gt;(<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>