📄 xtrcrypt_8cpp-source.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>Crypto++: xtrcrypt.cpp Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.3.2 --><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">Compound 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">Compound Members</a> | <a class="qindex" href="globals.html">File Members</a></div><h1>xtrcrypt.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// xtrcrypt.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="xtrcrypt_8h.html">xtrcrypt.h</a>"</span>00005 <span class="preprocessor">#include "nbtheory.h"</span>00006 <span class="preprocessor">#include "asn.h"</span>00007 <span class="preprocessor">#include "argnames.h"</span>00008 00009 NAMESPACE_BEGIN(CryptoPP)00010 00011 XTR_DH::XTR_DH(<span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &p, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &q, <span class="keyword">const</span> <a class="code" href="class_g_f_p2_element.html">GFP2Element</a> &g)00012 : m_p(p), m_q(q), m_g(g)00013 {00014 }00015 00016 XTR_DH::XTR_DH(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> pbits, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> qbits)00017 {00018 XTR_FindPrimesAndGenerator(rng, m_p, m_q, m_g, pbits, qbits);00019 }00020 00021 XTR_DH::XTR_DH(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt)00022 {00023 <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> seq(bt);00024 m_p.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00025 m_q.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00026 m_g.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento0">c1</a>.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00027 m_g.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento1">c2</a>.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00028 seq.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera9">MessageEnd</a>();00029 }00030 <a name="l00031"></a><a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha3">00031</a> <span class="keywordtype">void</span> <a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha3">XTR_DH::DEREncode</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt)<span class="keyword"> const</span>00032 <span class="keyword"></span>{00033 <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> seq(bt);00034 m_p.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00035 m_q.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00036 m_g.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento0">c1</a>.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00037 m_g.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento1">c2</a>.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00038 seq.<a class="code" href="class_d_e_r_general_encoder.html#_d_e_r_set_encodera2">MessageEnd</a>();00039 }00040 <a name="l00041"></a><a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha4">00041</a> <span class="keywordtype">bool</span> <a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha4">XTR_DH::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>00042 <span class="keyword"></span>{00043 <span class="keywordtype">bool</span> pass = <span class="keyword">true</span>;00044 pass = pass && m_p > <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() && m_p.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>();00045 pass = pass && m_q > <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() && m_q.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>();00046 <a class="code" href="class_g_f_p2_element.html">GFP2Element</a> three = <a class="code" href="class_g_f_p2___o_n_b.html">GFP2_ONB<ModularArithmetic></a>(m_p).ConvertIn(3);00047 pass = pass && !(m_g.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento0">c1</a>.<a class="code" href="class_integer.html#_integerz41_10">IsNegative</a>() || m_g.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento1">c2</a>.<a class="code" href="class_integer.html#_integerz41_10">IsNegative</a>() || m_g.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento0">c1</a> >= m_p || m_g.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento1">c2</a> >= m_p || m_g == three);00048 <span class="keywordflow">if</span> (level >= 1)00049 pass = pass && ((m_p.<a class="code" href="class_integer.html#_integerz49_2">Squared</a>()-m_p+1)%m_q).IsZero();00050 <span class="keywordflow">if</span> (level >= 2)00051 {00052 pass = pass && VerifyPrime(rng, m_p, level-2) && VerifyPrime(rng, m_q, level-2);00053 pass = pass && XTR_Exponentiate(m_g, (m_p.<a class="code" href="class_integer.html#_integerz49_2">Squared</a>()-m_p+1)/m_q, m_p) != three;00054 pass = pass && XTR_Exponentiate(m_g, m_q, m_p) == three;00055 }00056 <span class="keywordflow">return</span> pass;00057 }00058 <a name="l00059"></a><a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha5">00059</a> <span class="keywordtype">bool</span> <a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha5">XTR_DH::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>00060 <span class="keyword"></span>{00061 <span class="keywordflow">return</span> GetValueHelper(<span class="keyword">this</span>, name, valueType, pValue).Assignable()00062 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a15">Modulus</a>)00063 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a19">SubgroupOrder</a>)00064 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a21">SubgroupGenerator</a>)00065 ;00066 }00067 <a name="l00068"></a><a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha6">00068</a> <span class="keywordtype">void</span> <a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha6">XTR_DH::AssignFrom</a>(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &source)00069 {00070 AssignFromHelper(<span class="keyword">this</span>, source)00071 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a15">Modulus</a>)00072 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a19">SubgroupOrder</a>)00073 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a21">SubgroupGenerator</a>)00074 ;00075 }00076 <a name="l00077"></a><a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha11">00077</a> <span class="keywordtype">void</span> <a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha11">XTR_DH::GeneratePrivateKey</a>(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, byte *privateKey)<span class="keyword"> const</span>00078 <span class="keyword"></span>{00079 <a class="code" href="class_integer.html">Integer</a> x(rng, <a class="code" href="class_integer.html#_integerz37_10">Integer::Zero</a>(), m_q-1);00080 x.Encode(privateKey, <a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha9">PrivateKeyLength</a>());00081 }00082 <a name="l00083"></a><a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha12">00083</a> <span class="keywordtype">void</span> <a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha12">XTR_DH::GeneratePublicKey</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>00084 <span class="keyword"></span>{00085 <a class="code" href="class_integer.html">Integer</a> x(privateKey, <a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha9">PrivateKeyLength</a>());00086 <a class="code" href="class_g_f_p2_element.html">GFP2Element</a> y = XTR_Exponentiate(m_g, x, m_p);00087 y.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elementa3">Encode</a>(publicKey, <a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha10">PublicKeyLength</a>());00088 }00089 <a name="l00090"></a><a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha13">00090</a> <span class="keywordtype">bool</span> <a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha13">XTR_DH::Agree</a>(byte *agreedValue, <span class="keyword">const</span> byte *privateKey, <span class="keyword">const</span> byte *otherPublicKey, <span class="keywordtype">bool</span> validateOtherPublicKey)<span class="keyword"> const</span>00091 <span class="keyword"></span>{00092 <a class="code" href="class_g_f_p2_element.html">GFP2Element</a> w(otherPublicKey, <a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha10">PublicKeyLength</a>());00093 <span class="keywordflow">if</span> (validateOtherPublicKey)00094 {00095 <a class="code" href="class_g_f_p2___o_n_b.html">GFP2_ONB<ModularArithmetic></a> gfp2(m_p);00096 <a class="code" href="class_g_f_p2_element.html">GFP2Element</a> three = gfp2.<a class="code" href="class_g_f_p2___o_n_b.html#_g_f_p2___o_n_ba2">ConvertIn</a>(3);00097 <span class="keywordflow">if</span> (w.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento0">c1</a>.<a class="code" href="class_integer.html#_integerz41_10">IsNegative</a>() || w.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento1">c2</a>.<a class="code" href="class_integer.html#_integerz41_10">IsNegative</a>() || w.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento0">c1</a> >= m_p || w.<a class="code" href="class_g_f_p2_element.html#_g_f_p2_elemento1">c2</a> >= m_p || w == three)00098 <span class="keywordflow">return</span> <span class="keyword">false</span>;00099 <span class="keywordflow">if</span> (XTR_Exponentiate(w, m_q, m_p) != three)00100 <span class="keywordflow">return</span> <span class="keyword">false</span>;00101 }00102 <a class="code" href="class_integer.html">Integer</a> s(privateKey, <a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha9">PrivateKeyLength</a>());00103 <a class="code" href="class_g_f_p2_element.html">GFP2Element</a> z = XTR_Exponentiate(w, s, m_p);00104 z.Encode(agreedValue, <a class="code" href="class_x_t_r___d_h.html#_x_t_r___d_ha8">AgreedValueLength</a>());00105 <span class="keywordflow">return</span> <span class="keyword">true</span>;00106 }00107 00108 NAMESPACE_END</pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:28 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 + -