/***********************************************************************
**
** Filename: Md5.c
**
** Description:
**
** Version:
** Created: 2022/12/12 10:40
** Revision:
** Compiler:
**
** Author: clw
** Company: FJLEAD
**
***********************************************************************/
#include "includes.h"
/*该数组用于填充最后一个块的数据*/
u8 Md5_P_Add[] =
{
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
u32 Md5_Ti[] =
{
/*第一小轮(每轮16)*/
0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
/*第二小轮(每轮16)*/
0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
/*第三小轮(每轮16)*/
0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,
0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
/*第四小轮(每轮16)*/
0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391
};
u8 Md5_Shift_bit[] =
{
/*第一小轮(每轮4*4)*/
7,12,17,22,
/*第二小轮(每轮4*4)*/
5, 9,14,20,
/*第三小轮(每轮4*4)*/
4,11,16,23,
/*第四小轮(每轮4*4)*/
6,10,15,21
};
strMD5_DataType Md5_Str;
/***********************************************************************
** Time: 2022/12/12 10:40 CLW
** Function: 相关数据初始化
** Input: context:相关数据结构体
** Output:
** Attention: A=0x01234567,B=0x89ABCDEF,C=0xFEDCBA98,D=0x76543210
** 为大端方式表示,arm为小端,故:
** A=0x67452301,B=0xEFCDAB89,C=0x98BADCFE,D=0x10325476
***********************************************************************/
void Md5_Init(strMD5_DataType* context)
{
context->Cnt_bit[0] = 0;
context->Cnt_bit[1] = 0;
context->State[0] = 0x67452301;
context->State[1] = 0xEFCDAB89;
context->State[2] = 0x98BADCFE;
context->State[3] = 0x10325476;
}
/***********************************************************************
** Time: 2022/12/12 14:01 CLW
** Function: u32 变 u8
** Input: output:输出数组首地址 input:输入地址首地址 len:输出字节数
** Output:
** Attention: 64bit位长度填充,2个u32变成8个u8
** ABCD的4个u32变成16个u8
***********************************************************************/
void md5_encode(u8* output, u32* input, u32 len)
{
u32 i = 0, j = 0;
while (j < len)
{
output[j] = input[i] & 0xFF;
output[j + 1] = (input[i] >> 8) & 0xFF;
output[j + 2] = (input[i] >> 16) & 0xFF;
output[j + 3] = (input[i] >> 24) & 0xFF;
i++;
j += 4;
}
}
/***********************************************************************
** Time: 2022/12/12 11:28 CLW
** Function: u8变u32
** Input: output:输出数组首地址 input:输入地址首地址 len:输入字节数
** Output:
** Attention: 512bit的消息分组M[i]被分成16个子分组(每个子分组为 32bit)
** 参与每大轮中16步函数运算
***********************************************************************/
void md5_decode(u32* output, u8* input, u32 len)
{
u32 i = 0, j = 0;
while (j < len)
{
output[i] = ((u32)input[j]) |
((u32)input[j + 1] << 8) |
((u32)input[j + 2] << 16) |
((u32)input[j + 3] << 24);
i++;
j += 4;
}
}
/***********************************************************************
** Time: 2022/12/12 11:05 CLW
** Function: 计算本轮ABCD
** Input: state:ABCD的起始地址 block:本块的数据起始地址
** Output:
** Attention:
***********************************************************************/
void md5_transform(u32 state[4], u8 block[64])
{
u8 t = 0;
u8 offset = 0;
u32 temp = 0;
u32 a = state[0];
u32 b = state[1];
u32 c = state[2];
u32 d = state[3];
u32 m[16];
md5_decode(m, block, 64);
for (t = 0; t < 64; t++)
{
switch (t / 16)
{
case 0:
offset = (t & 0x0f);
temp = F(b, c, d) + m[offset] + Md5_Ti[t] + a;
offset = Md5_Shift_bit[0 + t % 4];
break;
case 1:
offset = ((1 + 5 * (t - 16)) & 0x0f);
temp = G(b, c, d) + m[offset] + Md5_Ti[t] + a;
offset = Md5_Shift_bit[4 + t % 4];
break;
case 2:
offset = ((5 + 3 * (t - 32)) & 0x0f);
temp = H(b, c, d) + m[offset] + Md5_Ti[t] + a;
offset = Md5_Shift_bit[8 + t % 4];
break;
case 3:
offset = ((0 + 7 * (t - 48)) & 0x0f);
temp = I(b, c, d) + m[offset] + Md5_Ti[t] + a;
offset = Md5_Shift_bit[12 + t % 4];
break;
}
temp = MD5CircularShift(offset, temp);
temp += b;
temp &= 0xFFFFFFFF; /*temp为本次计算出的a*/
a = d; /*d给a*/
d = c; /*c给d*/
c = b; /*b给c*/
b = temp; /*a给b*/
}
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
//FF(a, b, c, d, m[0], 7, 0xd76aa478);
//FF(d, a, b, c, m[1], 12, 0xe8c7b756);
//FF(c, d, a, b, m[2], 17, 0x242070db);
//FF(b, c, d, a, m[3], 22, 0xc1bdceee);
//FF(a, b, c, d, m[4], 7, 0xf57c0faf);
//FF(d, a, b, c, m[5], 12, 0x4787c62a);
//FF(c, d, a, b, m[6], 17, 0xa8304613);
//FF(b, c, d, a, m[7], 22, 0xfd469501);
//FF(a, b, c, d, m[8], 7, 0x698098d8);
//FF(d, a, b, c, m[9], 12, 0x8b44f7af);
//FF(c, d, a, b, m[10], 17, 0xffff5bb1);
//FF(b, c, d, a, m[11], 22, 0x895cd7be);
//FF(a, b, c, d, m[12], 7, 0x6b901122);
//FF(d, a, b, c, m[13], 12, 0xfd987193);
//FF(c, d, a, b, m[14], 17, 0xa679438e);
//FF(b, c, d, a, m[15], 22, 0x49b40821);
//GG(a, b, c, d, m[1], 5, 0xf61e2562);
//GG(d, a, b, c, m[6], 9, 0xc040b340);
//GG(c, d, a, b, m[11], 14, 0x265e5a51);
//GG(b, c, d, a, m[0], 20, 0xe9b6c7aa);
//GG(a, b, c, d, m[5], 5, 0xd62f105d);
//GG(d, a, b, c, m[10], 9, 0x2441453);
//GG(c, d, a, b, m[15], 14, 0xd8a1e681);
//GG(b, c, d, a, m[4], 20, 0xe7d3fbc8);
//GG(a, b, c, d, m[9], 5, 0x21e1cde6);
//GG(d, a, b, c, m[14], 9, 0xc33707d6);
//GG(c, d, a, b, m[3], 14, 0xf4d50d87);
//GG(b, c, d, a, m[8], 20, 0x455a14ed);
//GG(a, b, c, d, m[13], 5, 0xa9e3e905);
//GG(d, a, b, c, m[2], 9, 0xfcefa3f8);
//GG(c, d, a, b, m[7], 14, 0x676f02d9);
//GG(b, c, d, a, m[12], 20, 0x8d2a4c8a);
//HH(a, b, c, d, m[5], 4, 0xfffa3942);
//HH(d, a, b, c, m[8], 11, 0x8771f681);
//HH(c, d, a, b, m[11], 16, 0x6d9d6122);
//HH(b, c, d, a, m[14], 23, 0xfde5380c);
//HH(a, b, c, d, m[1], 4, 0xa4beea44);
//HH(d, a, b, c, m[4], 11, 0x4bdecfa9);
//HH(c, d, a, b, m[7], 16, 0xf6bb4b60);
//HH(b, c, d, a, m[10], 23, 0xbebfbc70);
//HH(a, b, c, d, m[13], 4, 0x289b7ec6);
//HH(d, a, b, c, m[0], 11, 0xeaa127fa);
//HH(c, d, a, b, m[3], 16, 0xd4ef3085);
//HH(b, c, d, a, m[6], 23, 0x4881d05);
//HH(a, b, c, d, m[9], 4, 0xd9d4d039);
//HH(d, a, b, c, m[12], 11, 0xe6db99e5);
//HH(c, d, a, b, m[15], 16, 0x1fa27cf8);
//HH(b, c, d, a, m[2], 23, 0xc4ac5665);
//II(a, b, c, d, m[0], 6, 0xf4292244);
//II(d, a, b, c, m[7], 10, 0x432aff97);
//II(c, d, a, b, m[14], 15, 0xab9423a7);
//II(b, c, d, a, m[5], 21, 0xfc93a039);
//II(a, b, c, d, m[12], 6, 0x655b59c3);
//II(d, a, b, c, m[3], 10, 0x8f0ccc92);
//II(c, d, a, b, m[10], 15, 0xffeff47d);
//II(b, c, d, a, m[1], 21, 0x85845dd1);
//II(a, b, c, d, m[8], 6, 0x6fa87e4f);
//II(d, a, b, c, m[15], 10, 0xfe2ce6e0);
//II(c, d, a, b, m[6], 15, 0xa3014314);
//II(b, c, d, a, m[13], 21, 0x4e0811a1);
//II(a, b, c, d, m[4], 6, 0xf7537e82);
//II(d, a, b, c, m[11], 10, 0xbd3af235);
//II(c, d, a, b, m[2], 15, 0x2ad7d2bb);
//II(b, c, d, a, m[9], 21, 0xeb86d391);
//state[0] += a;
//state[1] += b;
//