Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members

md2.cpp

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

Generated on Fri Aug 27 16:09:25 2004 for Crypto++ by doxygen 1.3.8