📄 sha_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++: sha.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>sha.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// sha.cpp - modified by Wei Dai from Steve Reid's public domain sha1.c</span>00002 00003 <span class="comment">// Steve Reid implemented SHA-1. Wei Dai implemented SHA-2.</span>00004 <span class="comment">// Both are in the public domain.</span>00005 00006 <span class="preprocessor">#include "pch.h"</span>00007 <span class="preprocessor">#include "sha.h"</span>00008 <span class="preprocessor">#include "misc.h"</span>00009 00010 NAMESPACE_BEGIN(CryptoPP)00011 00012 <span class="comment">// start of Steve Reid's code</span>00013 00014 #define blk0(i) (W[i] = data[i])00015 <span class="preprocessor">#define blk1(i) (W[i&15] = rotlFixed(W[(i+13)&15]^W[(i+8)&15]^W[(i+2)&15]^W[i&15],1))</span>00016 <span class="preprocessor"></span>00017 <span class="preprocessor">#ifndef CRYPTOPP_IMPORTS</span>00018 <span class="preprocessor"></span>00019 <span class="keywordtype">void</span> SHA::Init()00020 {00021 m_digest[0] = 0x67452301L;00022 m_digest[1] = 0xEFCDAB89L;00023 m_digest[2] = 0x98BADCFEL;00024 m_digest[3] = 0x10325476L;00025 m_digest[4] = 0xC3D2E1F0L;00026 }00027 00028 <span class="preprocessor">#define f1(x,y,z) (z^(x&(y^z)))</span>00029 <span class="preprocessor"></span><span class="preprocessor">#define f2(x,y,z) (x^y^z)</span>00030 <span class="preprocessor"></span><span class="preprocessor">#define f3(x,y,z) ((x&y)|(z&(x|y)))</span>00031 <span class="preprocessor"></span><span class="preprocessor">#define f4(x,y,z) (x^y^z)</span>00032 <span class="preprocessor"></span>00033 <span class="comment">/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */</span>00034 <span class="preprocessor">#define R0(v,w,x,y,z,i) z+=f1(w,x,y)+blk0(i)+0x5A827999+rotlFixed(v,5);w=rotlFixed(w,30);</span>00035 <span class="preprocessor"></span><span class="preprocessor">#define R1(v,w,x,y,z,i) z+=f1(w,x,y)+blk1(i)+0x5A827999+rotlFixed(v,5);w=rotlFixed(w,30);</span>00036 <span class="preprocessor"></span><span class="preprocessor">#define R2(v,w,x,y,z,i) z+=f2(w,x,y)+blk1(i)+0x6ED9EBA1+rotlFixed(v,5);w=rotlFixed(w,30);</span>00037 <span class="preprocessor"></span><span class="preprocessor">#define R3(v,w,x,y,z,i) z+=f3(w,x,y)+blk1(i)+0x8F1BBCDC+rotlFixed(v,5);w=rotlFixed(w,30);</span>00038 <span class="preprocessor"></span><span class="preprocessor">#define R4(v,w,x,y,z,i) z+=f4(w,x,y)+blk1(i)+0xCA62C1D6+rotlFixed(v,5);w=rotlFixed(w,30);</span>00039 <span class="preprocessor"></span>00040 <span class="keywordtype">void</span> SHA::Transform(word32 *state, <span class="keyword">const</span> word32 *data)00041 {00042 word32 W[16];00043 <span class="comment">/* Copy context->state[] to working vars */</span>00044 word32 a = state[0];00045 word32 b = state[1];00046 word32 c = state[2];00047 word32 d = state[3];00048 word32 e = state[4];00049 <span class="comment">/* 4 rounds of 20 operations each. Loop unrolled. */</span>00050 R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);00051 R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);00052 R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);00053 R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);00054 R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);00055 R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);00056 R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);00057 R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);00058 R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);00059 R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);00060 R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);00061 R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);00062 R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);00063 R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);00064 R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);00065 R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);00066 R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);00067 R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);00068 R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);00069 R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);00070 <span class="comment">/* Add the working vars back into context.state[] */</span>00071 state[0] += a;00072 state[1] += b;00073 state[2] += c;00074 state[3] += d;00075 state[4] += e;00076 <span class="comment">/* Wipe variables */</span>00077 a = b = c = d = e = 0;00078 memset(W, 0, <span class="keyword">sizeof</span>(W));00079 }00080 00081 <span class="preprocessor">#endif // #ifndef CRYPTOPP_IMPORTS</span>00082 <span class="preprocessor"></span>00083 <span class="comment">// end of Steve Reid's code</span>00084 00085 <span class="comment">// *************************************************************</span>00086 00087 <span class="keywordtype">void</span> SHA256::Init()00088 {00089 m_digest[0] = 0x6a09e667;00090 m_digest[1] = 0xbb67ae85;00091 m_digest[2] = 0x3c6ef372;00092 m_digest[3] = 0xa54ff53a;00093 m_digest[4] = 0x510e527f;00094 m_digest[5] = 0x9b05688c;00095 m_digest[6] = 0x1f83d9ab;00096 m_digest[7] = 0x5be0cd19;00097 }00098 00099 <span class="preprocessor">#define blk2(i) (W[i&15]+=s1(W[(i-2)&15])+W[(i-7)&15]+s0(W[(i-15)&15]))</span>00100 <span class="preprocessor"></span>00101 <span class="preprocessor">#define Ch(x,y,z) (z^(x&(y^z)))</span>00102 <span class="preprocessor"></span><span class="preprocessor">#define Maj(x,y,z) ((x&y)|(z&(x|y)))</span>00103 <span class="preprocessor"></span>00104 <span class="preprocessor">#define a(i) T[(0-i)&7]</span>00105 <span class="preprocessor"></span><span class="preprocessor">#define b(i) T[(1-i)&7]</span>00106 <span class="preprocessor"></span><span class="preprocessor">#define c(i) T[(2-i)&7]</span>00107 <span class="preprocessor"></span><span class="preprocessor">#define d(i) T[(3-i)&7]</span>00108 <span class="preprocessor"></span><span class="preprocessor">#define e(i) T[(4-i)&7]</span>00109 <span class="preprocessor"></span><span class="preprocessor">#define f(i) T[(5-i)&7]</span>00110 <span class="preprocessor"></span><span class="preprocessor">#define g(i) T[(6-i)&7]</span>00111 <span class="preprocessor"></span><span class="preprocessor">#define h(i) T[(7-i)&7]</span>00112 <span class="preprocessor"></span>00113 <span class="preprocessor">#define R(i) h(i)+=S1(e(i))+Ch(e(i),f(i),g(i))+K[i+j]+(j?blk2(i):blk0(i));\</span>00114 <span class="preprocessor"> d(i)+=h(i);h(i)+=S0(a(i))+Maj(a(i),b(i),c(i))</span>00115 <span class="preprocessor"></span>00116 <span class="comment">// for SHA256</span>00117 <span class="preprocessor">#define S0(x) (rotrFixed(x,2)^rotrFixed(x,13)^rotrFixed(x,22))</span>00118 <span class="preprocessor"></span><span class="preprocessor">#define S1(x) (rotrFixed(x,6)^rotrFixed(x,11)^rotrFixed(x,25))</span>00119 <span class="preprocessor"></span><span class="preprocessor">#define s0(x) (rotrFixed(x,7)^rotrFixed(x,18)^(x>>3))</span>00120 <span class="preprocessor"></span><span class="preprocessor">#define s1(x) (rotrFixed(x,17)^rotrFixed(x,19)^(x>>10))</span>00121 <span class="preprocessor"></span>00122 <span class="keywordtype">void</span> SHA256::Transform(word32 *state, <span class="keyword">const</span> word32 *data)00123 {00124 word32 W[16];00125 word32 T[8];00126 <span class="comment">/* Copy context->state[] to working vars */</span>00127 memcpy(T, state, <span class="keyword">sizeof</span>(T));00128 <span class="comment">/* 64 operations, partially loop unrolled */</span>00129 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j=0; j<64; j+=16)00130 {00131 R( 0); R( 1); R( 2); R( 3);00132 R( 4); R( 5); R( 6); R( 7);00133 R( 8); R( 9); R(10); R(11);00134 R(12); R(13); R(14); R(15);00135 }00136 <span class="comment">/* Add the working vars back into context.state[] */</span>00137 state[0] += a(0);00138 state[1] += b(0);00139 state[2] += c(0);00140 state[3] += d(0);00141 state[4] += e(0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -