00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
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