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

📄 sha_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++: 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&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>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&amp;15] = rotlFixed(W[(i+13)&amp;15]^W[(i+8)&amp;15]^W[(i+2)&amp;15]^W[i&amp;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&amp;(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&amp;y)|(z&amp;(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-&gt;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&amp;15]+=s1(W[(i-2)&amp;15])+W[(i-7)&amp;15]+s0(W[(i-15)&amp;15]))</span>00100 <span class="preprocessor"></span>00101 <span class="preprocessor">#define Ch(x,y,z) (z^(x&amp;(y^z)))</span>00102 <span class="preprocessor"></span><span class="preprocessor">#define Maj(x,y,z) ((x&amp;y)|(z&amp;(x|y)))</span>00103 <span class="preprocessor"></span>00104 <span class="preprocessor">#define a(i) T[(0-i)&amp;7]</span>00105 <span class="preprocessor"></span><span class="preprocessor">#define b(i) T[(1-i)&amp;7]</span>00106 <span class="preprocessor"></span><span class="preprocessor">#define c(i) T[(2-i)&amp;7]</span>00107 <span class="preprocessor"></span><span class="preprocessor">#define d(i) T[(3-i)&amp;7]</span>00108 <span class="preprocessor"></span><span class="preprocessor">#define e(i) T[(4-i)&amp;7]</span>00109 <span class="preprocessor"></span><span class="preprocessor">#define f(i) T[(5-i)&amp;7]</span>00110 <span class="preprocessor"></span><span class="preprocessor">#define g(i) T[(6-i)&amp;7]</span>00111 <span class="preprocessor"></span><span class="preprocessor">#define h(i) T[(7-i)&amp;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&gt;&gt;3))</span>00120 <span class="preprocessor"></span><span class="preprocessor">#define s1(x) (rotrFixed(x,17)^rotrFixed(x,19)^(x&gt;&gt;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-&gt;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&lt;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 + -