Crypto++
|
00001 // md2.cpp - modified by Wei Dai from Andrew M. Kuchling's md2.c 00002 // The original code and all modifications are in the public domain. 00003 00004 // This is the original introductory comment: 00005 00006 /* 00007 * md2.c : MD2 hash algorithm. 00008 * 00009 * Part of the Python Cryptography Toolkit, version 1.1 00010 * 00011 * Distribute and use freely; there are no restrictions on further 00012 * dissemination and usage except those imposed by the laws of your 00013 * country of residence. 00014 * 00015 */ 00016 00017 #include "pch.h" 00018 #define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1 00019 #include "md2.h" 00020 00021 NAMESPACE_BEGIN(CryptoPP) 00022 namespace Weak1 { 00023 00024 MD2::MD2() 00025 : m_X(48), m_C(16), m_buf(16) 00026 { 00027 Init(); 00028 } 00029 00030 void MD2::Init() 00031 { 00032 memset(m_X, 0, 48); 00033 memset(m_C, 0, 16); 00034 memset(m_buf, 0, 16); 00035 m_count = 0; 00036 } 00037 00038 void MD2::Update(const byte *buf, size_t len) 00039 { 00040 static const byte S[256] = { 00041 41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236, 240, 6, 00042 19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188, 00043 76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24, 00044 138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251, 00045 245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63, 00046 148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50, 00047 39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165, 00048 181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210, 00049 150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157, 00050 112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27, 00051 96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15, 00052 85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197, 00053 234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65, 00054 129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123, 00055 8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233, 00056 203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228, 00057 166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237, 00058 31, 26, 219, 153, 141, 51, 159, 17, 131, 20 00059 }; 00060 00061 while (len) 00062 { 00063 unsigned int L = UnsignedMin(16U-m_count, len); 00064 memcpy(m_buf+m_count, buf, L); 00065 m_count+=L; 00066 buf+=L; 00067 len-=L; 00068 if (m_count==16) 00069 { 00070 byte t; 00071 int i,j; 00072 00073 m_count=0; 00074 memcpy(m_X+16, m_buf, 16); 00075 t=m_C[15]; 00076 for(i=0; i<16; i++) 00077 { 00078 m_X[32+i]=m_X[16+i]^m_X[i]; 00079 t=m_C[i]^=S[m_buf[i]^t]; 00080 } 00081 00082 t=0; 00083 for(i=0; i<18; i++) 00084 { 00085 for(j=0; j<48; j+=8) 00086 { 00087 t=m_X[j+0]^=S[t]; 00088 t=m_X[j+1]^=S[t]; 00089 t=m_X[j+2]^=S[t]; 00090 t=m_X[j+3]^=S[t]; 00091 t=m_X[j+4]^=S[t]; 00092 t=m_X[j+5]^=S[t]; 00093 t=m_X[j+6]^=S[t]; 00094 t=m_X[j+7]^=S[t]; 00095 } 00096 t=(t+i) & 0xFF; 00097 } 00098 } 00099 } 00100 } 00101 00102 void MD2::TruncatedFinal(byte *hash, size_t size) 00103 { 00104 ThrowIfInvalidTruncatedSize(size); 00105 00106 byte padding[16]; 00107 word32 padlen; 00108 unsigned int i; 00109 00110 padlen= 16-m_count; 00111 for(i=0; i<padlen; i++) padding[i]=(byte)padlen; 00112 Update(padding, padlen); 00113 Update(m_C, 16); 00114 memcpy(hash, m_X, size); 00115 00116 Init(); 00117 } 00118 00119 } 00120 NAMESPACE_END