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

📄 haval_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++: haval.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>haval.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// haval.cpp - written and placed in the public domain by Wei Dai</span>00002 00003 <span class="preprocessor">#include "pch.h"</span>00004 <span class="preprocessor">#include "haval.h"</span>00005 <span class="preprocessor">#include "misc.h"</span>00006 00007 NAMESPACE_BEGIN(CryptoPP)00008 <a name="l00009"></a><a class="code" href="class_h_a_v_a_l.html#_h_a_v_a_la0">00009</a> <a class="code" href="class_h_a_v_a_l.html#_h_a_v_a_la0">HAVAL::HAVAL</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> digestSize, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> pass)00010         : <a class="code" href="class_iterated_hash.html">IteratedHash</a>&lt;word32, LittleEndian, 128&gt;(DIGESTSIZE)00011         , digestSize(digestSize), pass(pass)00012 {00013         <span class="keywordflow">if</span> (!(digestSize &gt;= 16 &amp;&amp; digestSize &lt;= 32 &amp;&amp; digestSize%4==0))00014                 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(<span class="stringliteral">"HAVAL: invalid digest size"</span>);00015 00016         <span class="keywordflow">if</span> (!(pass &gt;= 3 &amp;&amp; pass &lt;= 5))00017                 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(<span class="stringliteral">"HAVAL: invalid number of passes"</span>);00018 00019         Init();00020 }00021 00022 <span class="keywordtype">void</span> HAVAL::Init()00023 {00024         m_digest[0] = 0x243F6A88;00025         m_digest[1] = 0x85A308D3;00026         m_digest[2] = 0x13198A2E;00027         m_digest[3] = 0x03707344;00028         m_digest[4] = 0xA4093822;00029         m_digest[5] = 0x299F31D0;00030         m_digest[6] = 0x082EFA98;00031         m_digest[7] = 0xEC4E6C89;00032 }00033 00034 <span class="keyword">inline</span> <span class="keywordtype">void</span> HAVAL::vTransform(<span class="keyword">const</span> word32 *in)00035 {00036         <span class="keywordflow">if</span> (pass==3)00037                 HAVAL3::Transform(m_digest, in);00038         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pass==4)00039                 HAVAL4::Transform(m_digest, in);00040         <span class="keywordflow">else</span>00041                 HAVAL5::Transform(m_digest, in);00042 }00043 <a name="l00044"></a><a class="code" href="class_h_a_v_a_l.html#_h_a_v_a_l5a1">00044</a> <span class="keywordtype">void</span> <a class="code" href="class_h_a_v_a_l.html#_h_a_v_a_l5a1">HAVAL::TruncatedFinal</a>(byte *hash, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size)00045 {00046         ThrowIfInvalidTruncatedSize(size);00047 00048         PadLastBlock(118, 1);   <span class="comment">// first byte of padding for HAVAL is 1 instead of 0x80</span>00049         CorrectEndianess(m_data, m_data, 120);00050 00051         m_data[29] &amp;= 0xffff;00052         m_data[29] |= ((word32)digestSize&lt;&lt;25) | ((word32)pass&lt;&lt;19) | ((word32)HAVAL_VERSION&lt;&lt;16);00053         m_data[30] = GetBitCountLo();00054         m_data[31] = GetBitCountHi();00055 00056         vTransform(m_data);00057         Tailor(digestSize*8);00058         CorrectEndianess(m_digest, m_digest, digestSize);00059         memcpy(hash, m_digest, size);00060 00061         <a class="code" href="class_hash_transformation.html#_x_m_a_c_ca8">Restart</a>();              <span class="comment">// reinit for next use</span>00062 }00063 00064 <span class="preprocessor">#define ROTR(x, y) rotrFixed(x, y##u)</span>00065 <span class="preprocessor"></span>00066 <span class="comment">// fold digest down to desired size</span>00067 <span class="keywordtype">void</span> HAVAL::Tailor(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bitlen)00068 {00069 <span class="preprocessor">#define EB(a, b, c) (m_digest[a] &amp; (((~(word32)0) &lt;&lt; b) &amp; ((~(word32)0) &gt;&gt; (8*sizeof(word32)-b-c))))</span>00070 <span class="preprocessor"></span><span class="preprocessor">#define S(a, b) (a &gt; b ? a - b : 32 + a - b)</span>00071 <span class="preprocessor"></span><span class="preprocessor">#define T128(a, b, c, d, e) ROTR(EB(7, b, S(a,b)) | EB(6, c, S(b,c)) | EB(5, d, S(c,d)) | EB(4, e, S(d,e)), e)</span>00072 <span class="preprocessor"></span><span class="preprocessor">#define T160(a, b, c, d) ROTR(EB(7, b, S(a,b)) | EB(6, c, S(b,c)) | EB(5, d, S(c,d)), d)</span>00073 <span class="preprocessor"></span><span class="preprocessor">#define T192(a, b, c) ROTR(EB(7, b, S(a,b)) | EB(6, c, S(b,c)), c)</span>00074 <span class="preprocessor"></span><span class="preprocessor">#define T224(a, b) ROTR(EB(7, b, S(a,b)), b)</span>00075 <span class="preprocessor"></span>00076         <span class="keywordflow">switch</span> (bitlen)00077         {00078         <span class="keywordflow">case</span> 128:00079                 m_digest[0] += T128(8, 0, 24, 16, 8);00080                 m_digest[1] += T128(16, 8, 0, 24, 16);00081                 m_digest[2] += T128(24, 16, 8, 0, 24);00082                 m_digest[3] += T128(0, 24, 16, 8, 0);00083                 <span class="keywordflow">break</span>;00084 00085         <span class="keywordflow">case</span> 160:00086                 m_digest[0] += T160(6, 0, 25, 19);00087                 m_digest[1] += T160(12, 6, 0, 25);00088                 m_digest[2] += T160(19, 12, 6, 0);00089                 m_digest[3] += T160(25, 19, 12, 6);00090                 m_digest[4] += T160(0, 25, 19, 12);00091                 <span class="keywordflow">break</span>;00092 00093         <span class="keywordflow">case</span> 192:00094                 m_digest[0] += T192(5, 0, 26);00095                 m_digest[1] += T192(10, 5, 0);00096                 m_digest[2] += T192(16, 10, 5);00097                 m_digest[3] += T192(21, 16, 10);00098                 m_digest[4] += T192(26, 21, 16);00099                 m_digest[5] += T192(0, 26, 21);00100                 <span class="keywordflow">break</span>;00101 00102         <span class="keywordflow">case</span> 224:00103                 m_digest[0] += T224(0, 27);00104                 m_digest[1] += T224(27, 22);00105                 m_digest[2] += T224(22, 18);00106                 m_digest[3] += T224(18, 13);00107                 m_digest[4] += T224(13, 9);00108                 m_digest[5] += T224(9, 4);00109                 m_digest[6] += T224(4, 0);00110                 <span class="keywordflow">break</span>;00111 00112         <span class="keywordflow">case</span> 256:00113                 <span class="keywordflow">break</span>;00114 00115         <span class="keywordflow">default</span>:00116                 assert(<span class="keyword">false</span>);00117         }00118 }00119 00120 <span class="comment">/* Nonlinear F functions */</span>00121 00122 <span class="comment">/* #define F1(X6, X5, X4, X3, X2, X1, X0) \</span>00123 <span class="comment">        ((X1) &amp; (X4) ^ (X2) &amp; (X5) ^ (X3) &amp; (X6) ^ (X0) &amp; (X1) ^ (X0))*/</span>00124 <span class="preprocessor">#define F1(X6, X5, X4, X3, X2, X1, X0) \</span>00125 <span class="preprocessor">        (((X1) &amp; ((X4) ^ (X0))) ^ ((X2) &amp; (X5)) ^ ((X3) &amp; (X6)) ^ (X0))</span>00126 <span class="preprocessor"></span>00127 <span class="comment">/* #define F2(X6, X5, X4, X3, X2, X1, X0) \</span>00128 <span class="comment">        ((X1) &amp; (X2) &amp; (X3) ^ (X2) &amp; (X4) &amp; (X5) ^ \</span>00129 <span class="comment">        (X1) &amp; (X2) ^ (X1) &amp; (X4) ^ (X2) &amp; (X6) ^ (X3) &amp; (X5) ^ \</span>00130 <span class="comment">        (X4) &amp; (X5) ^ (X0) &amp; (X2) ^ (X0))*/</span>00131 <span class="preprocessor">#define F2(X6, X5, X4, X3, X2, X1, X0) \</span>00132 <span class="preprocessor">        (((X2) &amp; (((X1) &amp; (~(X3))) ^ ((X4) &amp; (X5)) ^ (X6) ^ (X0))) ^ \</span>00133 <span class="preprocessor">        (((X4) &amp; ((X1) ^ (X5))) ^ ((X3) &amp; (X5)) ^ (X0)))</span>00134 <span class="preprocessor"></span>00135 <span class="comment">/* #define F3(X6, X5, X4, X3, X2, X1, X0) \</span>00136 <span class="comment">        ((X1) &amp; (X2) &amp; (X3) ^ (X1) &amp; (X4) ^ (X2) &amp; (X5) ^ (X3) &amp; (X6) ^ (X0) &amp;</span>00137 <span class="comment">(X3) ^ (X0))*/</span>00138 <span class="preprocessor">#define F3(X6, X5, X4, X3, X2, X1, X0) \</span>

⌨️ 快捷键说明

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