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, size_t 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                 unsigned int L = UnsignedMin(16U-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, size_t 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 Sat Dec 23 02:07:08 2006 for Crypto++ by  doxygen 1.5.1-p1