📄 cast_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++: 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 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>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<word32, BigEndian> 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 > 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 > 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 <= 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<=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<32; i++)00148 K[i] &= 0x1f;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -