⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rw_8cpp-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<!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++: rw.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&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">Compound&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">Compound&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;Members</a></div><h1>rw.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// rw.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="rw_8h.html">rw.h</a>"</span>00005 <span class="preprocessor">#include "nbtheory.h"</span>00006 <span class="preprocessor">#include "asn.h"</span>00007 00008 NAMESPACE_BEGIN(CryptoPP)00009 00010 <span class="keyword">template</span>&lt;&gt; <span class="keyword">const</span> byte EMSA2DigestDecoration&lt;SHA&gt;::decoration = 0x33;00011 <span class="keyword">template</span>&lt;&gt; <span class="keyword">const</span> byte EMSA2DigestDecoration&lt;RIPEMD160&gt;::decoration = 0x31;00012 00013 <span class="keywordtype">void</span> EMSA2Pad::Pad(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &amp;, <span class="keyword">const</span> byte *input, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inputLen, byte *emsa2Block, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> emsa2BlockLen)<span class="keyword"> const</span>00014 <span class="keyword"></span>{00015         assert (inputLen &gt; 0 &amp;&amp; inputLen &lt;= MaxUnpaddedLength(emsa2BlockLen));00016 00017         <span class="comment">// convert from bit length to byte length</span>00018         emsa2BlockLen++;00019         <span class="keywordflow">if</span> (emsa2BlockLen % 8 &gt; 1)00020         {00021                 emsa2Block[0] = 0;00022                 emsa2Block++;00023         }00024         emsa2BlockLen /= 8;00025 00026         emsa2Block[0] = input[0];                       <span class="comment">// indicate empty or non-empty message</span>00027         memset(emsa2Block+1, 0xbb, emsa2BlockLen-inputLen-2);   <span class="comment">// padd with 0xbb</span>00028         emsa2Block[emsa2BlockLen-inputLen-1] = 0xba;    <span class="comment">// separator</span>00029         memcpy(emsa2Block+emsa2BlockLen-inputLen, input+1, inputLen-1);00030         emsa2Block[emsa2BlockLen-1] = 0xcc;     <span class="comment">// make it congruent to 12 mod 16</span>00031 }00032 00033 <a class="code" href="struct_decoding_result.html">DecodingResult</a> EMSA2Pad::Unpad(<span class="keyword">const</span> byte *emsa2Block, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> emsa2BlockLen, byte *output)<span class="keyword"> const</span>00034 <span class="keyword"></span>{00035         <span class="comment">// convert from bit length to byte length</span>00036         emsa2BlockLen++;00037         <span class="keywordflow">if</span> (emsa2BlockLen % 8 &gt; 1)00038         {00039                 <span class="keywordflow">if</span> (emsa2Block[0] != 0)00040                         <span class="keywordflow">return</span> <a class="code" href="struct_decoding_result.html">DecodingResult</a>();00041                 emsa2Block++;00042         }00043         emsa2BlockLen /= 8;00044 00045         <span class="comment">// check last byte</span>00046         <span class="keywordflow">if</span> (emsa2Block[emsa2BlockLen-1] != 0xcc)00047                 <span class="keywordflow">return</span> <a class="code" href="struct_decoding_result.html">DecodingResult</a>();00048 00049         <span class="comment">// skip past the padding until we find the seperator</span>00050         <span class="keywordtype">unsigned</span> i=1;00051         <span class="keywordflow">while</span> (i&lt;emsa2BlockLen-1 &amp;&amp; emsa2Block[i++] != 0xba)00052                 <span class="keywordflow">if</span> (emsa2Block[i-1] != 0xbb)     <span class="comment">// not valid padding</span>00053                         <span class="keywordflow">return</span> <a class="code" href="struct_decoding_result.html">DecodingResult</a>();00054         assert(i==emsa2BlockLen-1 || emsa2Block[i-1]==0xba);00055 00056         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputLen = emsa2BlockLen - i;00057         output[0] = emsa2Block[0];00058         memcpy (output+1, emsa2Block+i, outputLen-1);00059         <span class="keywordflow">return</span> <a class="code" href="struct_decoding_result.html">DecodingResult</a>(outputLen);00060 }00061 00062 <span class="comment">// *****************************************************************************</span>00063 00064 <span class="keyword">template</span> &lt;word r&gt;00065 <span class="keywordtype">void</span> <a class="code" href="class_r_w_function.html">RWFunction&lt;r&gt;::BERDecode</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)00066 {00067         <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> seq(bt);00068         m_n.BERDecode(seq);00069         seq.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera9">MessageEnd</a>();00070 }00071 00072 <span class="keyword">template</span> &lt;word r&gt;00073 <span class="keywordtype">void</span> <a class="code" href="class_r_w_function.html">RWFunction&lt;r&gt;::DEREncode</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span>00074 <span class="keyword"></span>{00075         <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> seq(bt);00076         m_n.DEREncode(seq);00077         seq.<a class="code" href="class_d_e_r_general_encoder.html#_d_e_r_set_encodera2">MessageEnd</a>();00078 }00079 00080 <span class="keyword">template</span> &lt;word r&gt;00081 <a class="code" href="class_integer.html">Integer</a> <a class="code" href="class_r_w_function.html">RWFunction&lt;r&gt;::ApplyFunction</a>(<span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;in)<span class="keyword"> const</span>00082 <span class="keyword"></span>{00083         DoQuickSanityCheck();00084 00085         <a class="code" href="class_integer.html">Integer</a> out = in.<a class="code" href="class_integer.html#_integerz49_2">Squared</a>()%m_n;00086         <span class="keyword">const</span> word r2 = r/2;00087         <span class="keyword">const</span> word r3a = (16 + 5 - r) % 16;     <span class="comment">// n%16 could be 5 or 13</span>00088         <span class="keyword">const</span> word r3b = (16 + 13 - r) % 16;00089         <span class="keyword">const</span> word r4 = (8 + 5 - r/2) % 8;      <span class="comment">// n%8 == 5</span>00090         <span class="keywordflow">switch</span> (out % 16)00091         {00092         <span class="keywordflow">case</span> r:00093                 <span class="keywordflow">break</span>;00094         <span class="keywordflow">case</span> r2:00095         <span class="keywordflow">case</span> r2+8:00096                 out &lt;&lt;= 1;00097                 <span class="keywordflow">break</span>;00098         <span class="keywordflow">case</span> r3a:00099         <span class="keywordflow">case</span> r3b:00100                 out.<a class="code" href="class_integer.html#_integerz43_17">Negate</a>();00101                 out += m_n;00102                 <span class="keywordflow">break</span>;00103         <span class="keywordflow">case</span> r4:00104         <span class="keywordflow">case</span> r4+8:00105                 out.<a class="code" href="class_integer.html#_integerz43_17">Negate</a>();00106                 out += m_n;00107                 out &lt;&lt;= 1;00108                 <span class="keywordflow">break</span>;00109         <span class="keywordflow">default</span>:00110                 out = <a class="code" href="class_integer.html#_integerz37_10">Integer::Zero</a>();00111         }00112         <span class="keywordflow">return</span> out;00113 }00114 00115 <span class="keyword">template</span> &lt;word r&gt;<a name="l00116"></a><a class="code" href="class_r_w_function.html#_r_w_functiona6">00116</a> <span class="keywordtype">bool</span> <a class="code" href="class_r_w_function.html#_r_w_functiona6">RWFunction&lt;r&gt;::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>00117 <span class="keyword"></span>{00118         <span class="keywordtype">bool</span> pass = <span class="keyword">true</span>;00119         pass = pass &amp;&amp; m_n &gt; <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() &amp;&amp; m_n%8 == 5;00120         <span class="keywordflow">return</span> pass;00121 }00122 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -