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