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

📄 cast_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++: cast.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>cast.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// cast.cpp - written and placed in the public domain by Wei Dai and Leonard Janke</span>00002 <span class="comment">// based on Steve Reid's public domain cast.c</span>00003 00004 <span class="preprocessor">#include "pch.h"</span>00005 <span class="preprocessor">#include "<a class="code" href="cast_8h.html">cast.h</a>"</span>00006 <span class="preprocessor">#include "misc.h"</span>00007 00008 NAMESPACE_BEGIN(CryptoPP)00009 00010 <span class="comment">/* Macros to access 8-bit bytes out of a 32-bit word */</span>00011 #define U8a(x) GETBYTE(x,3)00012 #define U8b(x) GETBYTE(x,2)00013 #define U8c(x) GETBYTE(x,1)00014 #define U8d(x) GETBYTE(x,0)00015 00016 <span class="comment">/* CAST uses three different round functions */</span>00017 #define f1(l, r, km, kr) \00018         t = rotlVariable(km + r, kr); \00019         l ^= ((S[0][U8a(t)] ^ S[1][U8b(t)]) - \00020          S[2][U8c(t)]) + S[3][U8d(t)];00021 <span class="preprocessor">#define f2(l, r, km, kr) \</span>00022 <span class="preprocessor">        t = rotlVariable(km ^ r, kr); \</span>00023 <span class="preprocessor">        l ^= ((S[0][U8a(t)] - S[1][U8b(t)]) + \</span>00024 <span class="preprocessor">         S[2][U8c(t)]) ^ S[3][U8d(t)];</span>00025 <span class="preprocessor"></span><span class="preprocessor">#define f3(l, r, km, kr) \</span>00026 <span class="preprocessor">        t = rotlVariable(km - r, kr); \</span>00027 <span class="preprocessor">        l ^= ((S[0][U8a(t)] + S[1][U8b(t)]) ^ \</span>00028 <span class="preprocessor">         S[2][U8c(t)]) - S[3][U8d(t)];</span>00029 <span class="preprocessor"></span>00030 <span class="preprocessor">#define F1(l, r, i, j) f1(l, r, K[i], K[i+j])</span>00031 <span class="preprocessor"></span><span class="preprocessor">#define F2(l, r, i, j) f2(l, r, K[i], K[i+j])</span>00032 <span class="preprocessor"></span><span class="preprocessor">#define F3(l, r, i, j) f3(l, r, K[i], K[i+j])</span>00033 <span class="preprocessor"></span>00034 <span class="keyword">typedef</span> BlockGetAndPut&lt;word32, BigEndian&gt; Block;00035 00036 <span class="keywordtype">void</span> CAST128::Enc::ProcessAndXorBlock(<span class="keyword">const</span> byte *inBlock, <span class="keyword">const</span> byte *xorBlock, byte *outBlock)<span class="keyword"> const</span>00037 <span class="keyword"></span>{00038         word32 t, l, r;00039 00040         <span class="comment">/* Get inblock into l,r */</span>00041         Block::Get(inBlock)(l)(r);00042         <span class="comment">/* Do the work */</span>00043         F1(l, r,  0, 16);00044         F2(r, l,  1, 16);00045         F3(l, r,  2, 16);00046         F1(r, l,  3, 16);00047         F2(l, r,  4, 16);00048         F3(r, l,  5, 16);00049         F1(l, r,  6, 16);00050         F2(r, l,  7, 16);00051         F3(l, r,  8, 16);00052         F1(r, l,  9, 16);00053         F2(l, r, 10, 16);00054         F3(r, l, 11, 16);00055         <span class="comment">/* Only do full 16 rounds if key length &gt; 80 bits */</span>00056         <span class="keywordflow">if</span> (!reduced) {00057                 F1(l, r, 12, 16);00058                 F2(r, l, 13, 16);00059                 F3(l, r, 14, 16);00060                 F1(r, l, 15, 16);00061         }00062         <span class="comment">/* Put l,r into outblock */</span>00063         Block::Put(xorBlock, outBlock)(r)(l);00064 }00065 00066 <span class="keywordtype">void</span> CAST128::Dec::ProcessAndXorBlock(<span class="keyword">const</span> byte *inBlock, <span class="keyword">const</span> byte *xorBlock, byte *outBlock)<span class="keyword"> const</span>00067 <span class="keyword"></span>{00068         word32 t, l, r;00069 00070         <span class="comment">/* Get inblock into l,r */</span>00071         Block::Get(inBlock)(r)(l);00072         <span class="comment">/* Only do full 16 rounds if key length &gt; 80 bits */</span>00073         <span class="keywordflow">if</span> (!reduced) {00074                 F1(r, l, 15, 16);00075                 F3(l, r, 14, 16);00076                 F2(r, l, 13, 16);00077                 F1(l, r, 12, 16);00078         }00079         F3(r, l, 11, 16);00080         F2(l, r, 10, 16);00081         F1(r, l,  9, 16);00082         F3(l, r,  8, 16);00083         F2(r, l,  7, 16);00084         F1(l, r,  6, 16);00085         F3(r, l,  5, 16);00086         F2(l, r,  4, 16);00087         F1(r, l,  3, 16);00088         F3(l, r,  2, 16);00089         F2(r, l,  1, 16);00090         F1(l, r,  0, 16);00091         <span class="comment">/* Put l,r into outblock */</span>00092         Block::Put(xorBlock, outBlock)(l)(r);00093         <span class="comment">/* Wipe clean */</span>00094         t = l = r = 0;00095 }00096 00097 <span class="keywordtype">void</span> CAST128::Base::UncheckedSetKey(CipherDir dir, <span class="keyword">const</span> byte *userKey, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> keylength)00098 {00099         AssertValidKeyLength(keylength);00100 00101         reduced = (keylength &lt;= 10);00102 00103         word32 X[4], Z[4];00104         GetUserKey(BIG_ENDIAN_ORDER, X, 4, userKey, keylength);00105 00106 <span class="preprocessor">#define x(i) GETBYTE(X[i/4], 3-i%4)</span>00107 <span class="preprocessor"></span><span class="preprocessor">#define z(i) GETBYTE(Z[i/4], 3-i%4)</span>00108 <span class="preprocessor"></span>00109         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;00110         <span class="keywordflow">for</span> (i=0; i&lt;=16; i+=16)00111         {00112                 <span class="comment">// this part is copied directly from RFC 2144 (with some search and replace) by Wei Dai</span>00113                 Z[0] = X[0] ^ S[4][x(0xD)] ^ S[5][x(0xF)] ^ S[6][x(0xC)] ^ S[7][x(0xE)] ^ S[6][x(0x8)];00114                 Z[1] = X[2] ^ S[4][z(0x0)] ^ S[5][z(0x2)] ^ S[6][z(0x1)] ^ S[7][z(0x3)] ^ S[7][x(0xA)];00115                 Z[2] = X[3] ^ S[4][z(0x7)] ^ S[5][z(0x6)] ^ S[6][z(0x5)] ^ S[7][z(0x4)] ^ S[4][x(0x9)];00116                 Z[3] = X[1] ^ S[4][z(0xA)] ^ S[5][z(0x9)] ^ S[6][z(0xB)] ^ S[7][z(0x8)] ^ S[5][x(0xB)];00117                 K[i+0] = S[4][z(0x8)] ^ S[5][z(0x9)] ^ S[6][z(0x7)] ^ S[7][z(0x6)] ^ S[4][z(0x2)];00118                 K[i+1] = S[4][z(0xA)] ^ S[5][z(0xB)] ^ S[6][z(0x5)] ^ S[7][z(0x4)] ^ S[5][z(0x6)];00119                 K[i+2] = S[4][z(0xC)] ^ S[5][z(0xD)] ^ S[6][z(0x3)] ^ S[7][z(0x2)] ^ S[6][z(0x9)];00120                 K[i+3] = S[4][z(0xE)] ^ S[5][z(0xF)] ^ S[6][z(0x1)] ^ S[7][z(0x0)] ^ S[7][z(0xC)];00121                 X[0] = Z[2] ^ S[4][z(0x5)] ^ S[5][z(0x7)] ^ S[6][z(0x4)] ^ S[7][z(0x6)] ^ S[6][z(0x0)];00122                 X[1] = Z[0] ^ S[4][x(0x0)] ^ S[5][x(0x2)] ^ S[6][x(0x1)] ^ S[7][x(0x3)] ^ S[7][z(0x2)];00123                 X[2] = Z[1] ^ S[4][x(0x7)] ^ S[5][x(0x6)] ^ S[6][x(0x5)] ^ S[7][x(0x4)] ^ S[4][z(0x1)];00124                 X[3] = Z[3] ^ S[4][x(0xA)] ^ S[5][x(0x9)] ^ S[6][x(0xB)] ^ S[7][x(0x8)] ^ S[5][z(0x3)];00125                 K[i+4] = S[4][x(0x3)] ^ S[5][x(0x2)] ^ S[6][x(0xC)] ^ S[7][x(0xD)] ^ S[4][x(0x8)];00126                 K[i+5] = S[4][x(0x1)] ^ S[5][x(0x0)] ^ S[6][x(0xE)] ^ S[7][x(0xF)] ^ S[5][x(0xD)];00127                 K[i+6] = S[4][x(0x7)] ^ S[5][x(0x6)] ^ S[6][x(0x8)] ^ S[7][x(0x9)] ^ S[6][x(0x3)];00128                 K[i+7] = S[4][x(0x5)] ^ S[5][x(0x4)] ^ S[6][x(0xA)] ^ S[7][x(0xB)] ^ S[7][x(0x7)];00129                 Z[0] = X[0] ^ S[4][x(0xD)] ^ S[5][x(0xF)] ^ S[6][x(0xC)] ^ S[7][x(0xE)] ^ S[6][x(0x8)];00130                 Z[1] = X[2] ^ S[4][z(0x0)] ^ S[5][z(0x2)] ^ S[6][z(0x1)] ^ S[7][z(0x3)] ^ S[7][x(0xA)];00131                 Z[2] = X[3] ^ S[4][z(0x7)] ^ S[5][z(0x6)] ^ S[6][z(0x5)] ^ S[7][z(0x4)] ^ S[4][x(0x9)];00132                 Z[3] = X[1] ^ S[4][z(0xA)] ^ S[5][z(0x9)] ^ S[6][z(0xB)] ^ S[7][z(0x8)] ^ S[5][x(0xB)];00133                 K[i+8] = S[4][z(0x3)] ^ S[5][z(0x2)] ^ S[6][z(0xC)] ^ S[7][z(0xD)] ^ S[4][z(0x9)];00134                 K[i+9] = S[4][z(0x1)] ^ S[5][z(0x0)] ^ S[6][z(0xE)] ^ S[7][z(0xF)] ^ S[5][z(0xC)];00135                 K[i+10] = S[4][z(0x7)] ^ S[5][z(0x6)] ^ S[6][z(0x8)] ^ S[7][z(0x9)] ^ S[6][z(0x2)];00136                 K[i+11] = S[4][z(0x5)] ^ S[5][z(0x4)] ^ S[6][z(0xA)] ^ S[7][z(0xB)] ^ S[7][z(0x6)];00137                 X[0] = Z[2] ^ S[4][z(0x5)] ^ S[5][z(0x7)] ^ S[6][z(0x4)] ^ S[7][z(0x6)] ^ S[6][z(0x0)];00138                 X[1] = Z[0] ^ S[4][x(0x0)] ^ S[5][x(0x2)] ^ S[6][x(0x1)] ^ S[7][x(0x3)] ^ S[7][z(0x2)];00139                 X[2] = Z[1] ^ S[4][x(0x7)] ^ S[5][x(0x6)] ^ S[6][x(0x5)] ^ S[7][x(0x4)] ^ S[4][z(0x1)];00140                 X[3] = Z[3] ^ S[4][x(0xA)] ^ S[5][x(0x9)] ^ S[6][x(0xB)] ^ S[7][x(0x8)] ^ S[5][z(0x3)];00141                 K[i+12] = S[4][x(0x8)] ^ S[5][x(0x9)] ^ S[6][x(0x7)] ^ S[7][x(0x6)] ^ S[4][x(0x3)];00142                 K[i+13] = S[4][x(0xA)] ^ S[5][x(0xB)] ^ S[6][x(0x5)] ^ S[7][x(0x4)] ^ S[5][x(0x7)];00143                 K[i+14] = S[4][x(0xC)] ^ S[5][x(0xD)] ^ S[6][x(0x3)] ^ S[7][x(0x2)] ^ S[6][x(0x8)];00144                 K[i+15] = S[4][x(0xE)] ^ S[5][x(0xF)] ^ S[6][x(0x1)] ^ S[7][x(0x0)] ^ S[7][x(0xD)];00145         }00146 00147         <span class="keywordflow">for</span> (i=16; i&lt;32; i++)00148                 K[i] &amp;= 0x1f;

⌨️ 快捷键说明

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