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++) 00084 t=m_X[j]^=S[t]; 00085 t=(t+i) & 0xFF; 00086 } 00087 } 00088 } 00089 } 00090 00091 void MD2::TruncatedFinal(byte *hash, unsigned int size) 00092 { 00093 ThrowIfInvalidTruncatedSize(size); 00094 00095 byte padding[16]; 00096 word32 padlen; 00097 unsigned int i; 00098 00099 padlen= 16-m_count; 00100 for(i=0; i<padlen; i++) padding[i]=(byte)padlen; 00101 Update(padding, padlen); 00102 Update(m_C, 16); 00103 memcpy(hash, m_X, size); 00104 00105 Init(); 00106 } 00107 00108 NAMESPACE_END

Generated on Fri Aug 13 09:56:54 2004 for Crypto++ by doxygen 1.3.7