������� 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); }