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 #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

Generated on Fri Jun 1 11:11:22 2007 for Crypto++ by  doxygen 1.5.2