📄 rw_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++: 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 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>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><> <span class="keyword">const</span> byte EMSA2DigestDecoration<SHA>::decoration = 0x33;00011 <span class="keyword">template</span><> <span class="keyword">const</span> byte EMSA2DigestDecoration<RIPEMD160>::decoration = 0x31;00012 00013 <span class="keywordtype">void</span> EMSA2Pad::Pad(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &, <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 > 0 && inputLen <= 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 > 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 > 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<emsa2BlockLen-1 && 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> <word r>00065 <span class="keywordtype">void</span> <a class="code" href="class_r_w_function.html">RWFunction<r>::BERDecode</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &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> <word r>00073 <span class="keywordtype">void</span> <a class="code" href="class_r_w_function.html">RWFunction<r>::DEREncode</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &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> <word r>00081 <a class="code" href="class_integer.html">Integer</a> <a class="code" href="class_r_w_function.html">RWFunction<r>::ApplyFunction</a>(<span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &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 <<= 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 <<= 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> <word r><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<r>::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>00117 <span class="keyword"></span>{00118 <span class="keywordtype">bool</span> pass = <span class="keyword">true</span>;00119 pass = pass && m_n > <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() && m_n%8 == 5;00120 <span class="keywordflow">return</span> pass;00121 }00122
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -