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 Sun Mar 14 20:44:27 2004 for Crypto++ by doxygen 1.3.6-20040222