📄 mqv_8h-source.html
字号:
00072 params.<a class="code" href="class_d_l___group_parameters.html#_d_l___group_parametersa19">EncodeElement</a>(<span class="keyword">true</span>, y, privateKey+<a class="code" href="class_m_q_v___domain.html#_m_q_v___domaina10">StaticPrivateKeyLength</a>());00073 }00074 <a name="l00075"></a><a class="code" href="class_m_q_v___domain.html#_m_q_v___domaina17">00075</a> <span class="keywordtype">void</span> <a class="code" href="class_m_q_v___domain.html#_m_q_v___domaina17">GenerateEphemeralPublicKey</a>(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keyword">const</span> byte *privateKey, byte *publicKey)<span class="keyword"> const</span>00076 <span class="keyword"> </span>{00077 memcpy(publicKey, privateKey+<a class="code" href="class_m_q_v___domain.html#_m_q_v___domaina10">StaticPrivateKeyLength</a>(), <a class="code" href="class_m_q_v___domain.html#_m_q_v___domaina15">EphemeralPublicKeyLength</a>());00078 }00079 <a name="l00080"></a><a class="code" href="class_m_q_v___domain.html#_m_q_v___domaina18">00080</a> <span class="keywordtype">bool</span> <a class="code" href="class_m_q_v___domain.html#_m_q_v___domaina18">Agree</a>(byte *agreedValue,00081 <span class="keyword">const</span> byte *staticPrivateKey, <span class="keyword">const</span> byte *ephemeralPrivateKey, 00082 <span class="keyword">const</span> byte *staticOtherPublicKey, <span class="keyword">const</span> byte *ephemeralOtherPublicKey,00083 <span class="keywordtype">bool</span> validateStaticOtherPublicKey=<span class="keyword">true</span>)<span class="keyword"> const</span>00084 <span class="keyword"> </span>{00085 <span class="keywordflow">try</span>00086 {00087 <span class="keyword">const</span> <a class="code" href="class_d_l___group_parameters.html">DL_GroupParameters<Element></a> &params = GetAbstractGroupParameters();00088 Element WW = params.<a class="code" href="class_d_l___group_parameters.html#_d_l___group_parametersa20">DecodeElement</a>(staticOtherPublicKey, validateStaticOtherPublicKey);00089 Element VV = params.<a class="code" href="class_d_l___group_parameters.html#_d_l___group_parametersa20">DecodeElement</a>(ephemeralOtherPublicKey, <span class="keyword">true</span>);00090 00091 <a class="code" href="class_integer.html">Integer</a> s(staticPrivateKey, <a class="code" href="class_m_q_v___domain.html#_m_q_v___domaina10">StaticPrivateKeyLength</a>());00092 <a class="code" href="class_integer.html">Integer</a> u(ephemeralPrivateKey, <a class="code" href="class_m_q_v___domain.html#_m_q_v___domaina10">StaticPrivateKeyLength</a>());00093 Element V = params.<a class="code" href="class_d_l___group_parameters.html#_d_l___group_parametersa20">DecodeElement</a>(ephemeralPrivateKey+<a class="code" href="class_m_q_v___domain.html#_m_q_v___domaina10">StaticPrivateKeyLength</a>(), <span class="keyword">false</span>);00094 00095 <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &r = params.<a class="code" href="class_d_l___group_parameters.html#_d_l___group_parametersa14">GetSubgroupOrder</a>();00096 <a class="code" href="class_integer.html">Integer</a> h2 = <a class="code" href="class_integer.html#_integerz37_13">Integer::Power2</a>((r.<a class="code" href="class_integer.html#_integerz41_2">BitCount</a>()+1)/2);00097 <a class="code" href="class_integer.html">Integer</a> e = ((h2+params.<a class="code" href="class_d_l___group_parameters.html#_d_l___group_parametersa21">ConvertElementToInteger</a>(V)%h2)*s+u) % r;00098 <a class="code" href="class_integer.html">Integer</a> tt = h2 + params.<a class="code" href="class_d_l___group_parameters.html#_d_l___group_parametersa21">ConvertElementToInteger</a>(VV) % h2;00099 00100 <span class="keywordflow">if</span> (COFACTOR_OPTION::ToEnum() == NO_COFACTOR_MULTIPLICTION)00101 {00102 Element P = params.<a class="code" href="class_d_l___group_parameters.html#_d_l___group_parametersa10">ExponentiateElement</a>(WW, tt);00103 P = m_groupParameters.MultiplyElements(P, VV);00104 Element R[2];00105 <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> e2[2] = {r, e};00106 params.<a class="code" href="class_d_l___group_parameters.html#_d_l___group_parametersa26">SimultaneousExponentiate</a>(R, P, e2, 2);00107 <span class="keywordflow">if</span> (!params.<a class="code" href="class_d_l___group_parameters.html#_d_l___group_parametersa25">IsIdentity</a>(R[0]) || params.<a class="code" href="class_d_l___group_parameters.html#_d_l___group_parametersa25">IsIdentity</a>(R[1]))00108 <span class="keywordflow">return</span> <span class="keyword">false</span>;00109 params.<a class="code" href="class_d_l___group_parameters.html#_d_l___group_parametersa19">EncodeElement</a>(<span class="keyword">false</span>, R[1], agreedValue);00110 }00111 <span class="keywordflow">else</span>00112 {00113 <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &k = params.<a class="code" href="class_d_l___group_parameters.html#_d_l___group_parametersa17">GetCofactor</a>();00114 <span class="keywordflow">if</span> (COFACTOR_OPTION::ToEnum() == COMPATIBLE_COFACTOR_MULTIPLICTION)00115 e = <a class="code" href="class_modular_arithmetic.html">ModularArithmetic</a>(r).Divide(e, k);00116 Element P = m_groupParameters.CascadeExponentiate(VV, k*e, WW, k*(e*tt%r));00117 <span class="keywordflow">if</span> (params.<a class="code" href="class_d_l___group_parameters.html#_d_l___group_parametersa25">IsIdentity</a>(P))00118 <span class="keywordflow">return</span> <span class="keyword">false</span>;00119 params.<a class="code" href="class_d_l___group_parameters.html#_d_l___group_parametersa19">EncodeElement</a>(<span class="keyword">false</span>, P, agreedValue);00120 }00121 }00122 <span class="keywordflow">catch</span> (DL_BadElement &)00123 {00124 <span class="keywordflow">return</span> <span class="keyword">false</span>;00125 }00126 <span class="keywordflow">return</span> <span class="keyword">true</span>;00127 }00128 00129 <span class="keyword">private</span>:00130 <a class="code" href="class_d_l___group_parameters.html">DL_GroupParameters<Element></a> & AccessAbstractGroupParameters() {<span class="keywordflow">return</span> m_groupParameters;}00131 <span class="keyword">const</span> <a class="code" href="class_d_l___group_parameters.html">DL_GroupParameters<Element></a> & GetAbstractGroupParameters()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_groupParameters;}00132 00133 GroupParameters m_groupParameters;00134 };00135 <span class="comment"></span>00136 <span class="comment">//! Menezes-Qu-Vanstone in GF(p) with key validation, AKA <a href="http://www.weidai.com/scan-mirror/ka.html#MQV">MQV</a></span><a name="l00137"></a><a class="code" href="mqv_8h.html#a0">00137</a> <span class="comment"></span><span class="keyword">typedef</span> <a class="code" href="class_m_q_v___domain.html">MQV_Domain<DL_GroupParameters_GFP_DefaultSafePrime></a> <a class="code" href="class_m_q_v___domain.html">MQV</a>;00138 00139 NAMESPACE_END00140 00141 <span class="preprocessor">#endif</span></pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:20 2003 for Crypto++ by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 > </a>1.3.2 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -