Sophie

Sophie

distrib > Mandriva > 10.2 > i586 > media > contrib > by-pkgid > 7457b841ac8136d3a1a9d3d960c5252e > files > 1372

libcryptopp-doc-5.2.1-2mdk.i586.rpm

<!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&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">Class&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">Class&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;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&lt;RC6_WORD&gt;</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&lt;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 &lt; 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&lt;RC6::RC6_WORD, LittleEndian&gt; 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&lt;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 &lt; 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>