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