<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>Crypto++: rc6.cpp Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.3.7 --> <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">Class 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">Class Members</a> | <a class="qindex" href="globals.html">File Members</a></div> <h1>rc6.cpp</h1><pre class="fragment"><div>00001 <span class="comment">// rc6.cpp - written and placed in the public domain by Sean Woods</span> 00002 <span class="comment">// based on Wei Dai's RC5 code.</span> 00003 00004 <span class="preprocessor">#include "pch.h"</span> 00005 <span class="preprocessor">#include "<a class="code" href="rc6_8h.html">rc6.h</a>"</span> 00006 <span class="preprocessor">#include "misc.h"</span> 00007 00008 NAMESPACE_BEGIN(CryptoPP) 00009 00010 void <a class="code" href="class_r_c6.html">RC6</a>::Base::UncheckedSetKey(CipherDir direction, const byte *k, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> keylen, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> rounds) 00011 { 00012 AssertValidKeyLength(keylen); 00013 AssertValidRounds(rounds); 00014 00015 r = rounds; 00016 sTable.New(2*(r+2)); 00017 00018 <span class="keyword">static</span> <span class="keyword">const</span> RC6_WORD MAGIC_P = 0xb7e15163L; <span class="comment">// magic constant P for wordsize</span> 00019 <span class="keyword">static</span> <span class="keyword">const</span> RC6_WORD MAGIC_Q = 0x9e3779b9L; <span class="comment">// magic constant Q for wordsize</span> 00020 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> U=<span class="keyword">sizeof</span>(RC6_WORD); 00021 00022 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> c = STDMAX((keylen+U-1)/U, 1U); <span class="comment">// RC6 paper says c=1 if keylen==0</span> 00023 <a class="code" href="class_sec_block.html">SecBlock<RC6_WORD></a> l(c); 00024 00025 GetUserKey(LITTLE_ENDIAN_ORDER, l.<a class="code" href="class_sec_block.html#_sec_block_with_hinta9">begin</a>(), c, k, keylen); 00026 00027 sTable[0] = MAGIC_P; 00028 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> j=1; j<sTable.size();j++) 00029 sTable[j] = sTable[j-1] + MAGIC_Q; 00030 00031 RC6_WORD a=0, b=0; 00032 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> n = 3*STDMAX((<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)sTable.size(), c); 00033 00034 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> h=0; h < n; h++) 00035 { 00036 a = sTable[h % sTable.size()] = rotlFixed((sTable[h % sTable.size()] + a + b), 3); 00037 b = l[h % c] = rotlMod((l[h % c] + a + b), (a+b)); 00038 } 00039 } 00040 00041 <span class="keyword">typedef</span> BlockGetAndPut<RC6::RC6_WORD, LittleEndian> Block; 00042 00043 <span class="keywordtype">void</span> RC6::Enc::ProcessAndXorBlock(<span class="keyword">const</span> byte *inBlock, <span class="keyword">const</span> byte *xorBlock, byte *outBlock)<span class="keyword"> const</span> 00044 <span class="keyword"></span>{ 00045 <span class="keyword">const</span> RC6_WORD *sptr = sTable; 00046 RC6_WORD a, b, c, d, t, u; 00047 00048 Block::Get(inBlock)(a)(b)(c)(d); 00049 b += sptr[0]; 00050 d += sptr[1]; 00051 sptr += 2; 00052 00053 <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> i=0; i<r; i++) 00054 { 00055 t = rotlFixed(b*(2*b+1), 5); 00056 u = rotlFixed(d*(2*d+1), 5); 00057 a = rotlMod(a^t,u) + sptr[0]; 00058 c = rotlMod(c^u,t) + sptr[1]; 00059 t = a; a = b; b = c; c = d; d = t; 00060 sptr += 2; 00061 } 00062 00063 a += sptr[0]; 00064 c += sptr[1]; 00065 00066 Block::Put(xorBlock, outBlock)(a)(b)(c)(d); 00067 } 00068 00069 <span class="keywordtype">void</span> RC6::Dec::ProcessAndXorBlock(<span class="keyword">const</span> byte *inBlock, <span class="keyword">const</span> byte *xorBlock, byte *outBlock)<span class="keyword"> const</span> 00070 <span class="keyword"></span>{ 00071 <span class="keyword">const</span> RC6_WORD *sptr = sTable.end(); 00072 RC6_WORD a, b, c, d, t, u; 00073 00074 Block::Get(inBlock)(a)(b)(c)(d); 00075 00076 sptr -= 2; 00077 c -= sptr[1]; 00078 a -= sptr[0]; 00079 00080 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i=0; i < r; i++) 00081 { 00082 sptr -= 2; 00083 t = a; a = d; d = c; c = b; b = t; 00084 u = rotlFixed(d*(2*d+1), 5); 00085 t = rotlFixed(b*(2*b+1), 5); 00086 c = rotrMod(c-sptr[1], t) ^ u; 00087 a = rotrMod(a-sptr[0], u) ^ t; 00088 } 00089 00090 sptr -= 2; 00091 d -= sTable[1]; 00092 b -= sTable[0]; 00093 00094 Block::Put(xorBlock, outBlock)(a)(b)(c)(d); 00095 } 00096 00097 NAMESPACE_END </div></pre><hr size="1"><address style="align: right;"><small>Generated on Sun Nov 7 08:23:58 2004 for Crypto++ by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0 ></a> 1.3.7 </small></address> </body> </html>