������� RFC 1321 (original) (raw)
#define H(x, y, z) ((x) ^ (y) ^ (z)) #define I(x, y, z) ((y) ^ ((x) | (~z)))
/* ROTATE_LEFT ���������� ������� x ����� �� n �����. */ #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
/* �������������� FF, GG, HH � II ��� ������ 1, 2, 3, 4.
����������� ����� ������� �� ���������� ��� �������������� ���������� �������.
*/ #define FF(a, b, c, d, x, s, ac) { \
(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \ } #define GG(a, b, c, d, x, s, ac) { \
(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \ } #define HH(a, b, c, d, x, s, ac) { \
(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \ } #define II(a, b, c, d, x, s, ac) { \
(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \ }
/* ������������� MD5. �������� ������ MD5, ��������� ����� ��������. */
void MD5Init (context)
MD5_CTX *context; /* �������� */
{
context->count[0] = context->count[1] = 0;
/* �������� ������������ �������� �������������. */
context->state[0] = 0x67452301;
context->state[1] = 0xefcdab89;
context->state[2] = 0x98badcfe;
context->state[3] = 0x10325476; }
/* MD5 ��������� �������� ����������. ������������ �������� ��������� MD5, ��������� ������� ����� ��������� � ���������� ���������. */ void MD5Update (context, input, inputLen) MD5_CTX *context; /* �������� */
unsigned char *input; /* ������� ���� */
unsigned int inputLen; /* ������ �������� ����� */
{
unsigned int i, index, partLen;
/* ������ ����� ������ mod 64 */
index = (unsigned int)((context->count[0] >> 3) & 0x3F);
/* ���������� ����� ����� */
if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3))
context->count[1]++; context->count[1] += ((UINT4)inputLen >> 29);
partLen = 64 - index;
/* �������������� ��������� ����� ���. */ if (inputLen >= partLen) {
MD5_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen);
MD5Transform (context->state, context->buffer);
for (i = partLen; i + 63 < inputLen; i += 64)
MD5Transform (context->state, &input[i]);
index = 0; } else
i = 0; /* ����������� ���������� ������� ������ */
MD5_memcpy((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen-i); }