📄 haval_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++: 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 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>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><word32, LittleEndian, 128>(DIGESTSIZE)00011 , digestSize(digestSize), pass(pass)00012 {00013 <span class="keywordflow">if</span> (!(digestSize >= 16 && digestSize <= 32 && 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 >= 3 && pass <= 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] &= 0xffff;00052 m_data[29] |= ((word32)digestSize<<25) | ((word32)pass<<19) | ((word32)HAVAL_VERSION<<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] & (((~(word32)0) << b) & ((~(word32)0) >> (8*sizeof(word32)-b-c))))</span>00070 <span class="preprocessor"></span><span class="preprocessor">#define S(a, b) (a > 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) & (X4) ^ (X2) & (X5) ^ (X3) & (X6) ^ (X0) & (X1) ^ (X0))*/</span>00124 <span class="preprocessor">#define F1(X6, X5, X4, X3, X2, X1, X0) \</span>00125 <span class="preprocessor"> (((X1) & ((X4) ^ (X0))) ^ ((X2) & (X5)) ^ ((X3) & (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) & (X2) & (X3) ^ (X2) & (X4) & (X5) ^ \</span>00129 <span class="comment"> (X1) & (X2) ^ (X1) & (X4) ^ (X2) & (X6) ^ (X3) & (X5) ^ \</span>00130 <span class="comment"> (X4) & (X5) ^ (X0) & (X2) ^ (X0))*/</span>00131 <span class="preprocessor">#define F2(X6, X5, X4, X3, X2, X1, X0) \</span>00132 <span class="preprocessor"> (((X2) & (((X1) & (~(X3))) ^ ((X4) & (X5)) ^ (X6) ^ (X0))) ^ \</span>00133 <span class="preprocessor"> (((X4) & ((X1) ^ (X5))) ^ ((X3) & (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) & (X2) & (X3) ^ (X1) & (X4) ^ (X2) & (X5) ^ (X3) & (X6) ^ (X0) &</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 + -