/*
* libtilemcore - Graphing calculator emulation library
*
* Copyright (C) 2009 Benjamin Moody
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* .
*/
#ifdef HAVE_CONFIG_H
# include
#endif
#include
#include "tilem.h"
void tilem_md5_assist_reset(TilemCalc* calc)
{
int i;
for (i = 0; i < 6; i++)
calc->md5assist.regs[i] = 0;
calc->md5assist.shift = 0;
calc->md5assist.mode = 0;
}
dword tilem_md5_assist_get_value(TilemCalc* calc)
{
/* Return the result of a complete MD5 operation:
b + ((a + f(b,c,d) + X + T) <<< s) */
dword a, b, c, d, x, t, result;
byte mode, s;
mode = calc->md5assist.mode;
a = calc->md5assist.regs[TILEM_MD5_REG_A];
b = calc->md5assist.regs[TILEM_MD5_REG_B];
c = calc->md5assist.regs[TILEM_MD5_REG_C];
d = calc->md5assist.regs[TILEM_MD5_REG_D];
x = calc->md5assist.regs[TILEM_MD5_REG_X];
t = calc->md5assist.regs[TILEM_MD5_REG_T];
s = calc->md5assist.shift;
switch (mode) {
case TILEM_MD5_FUNC_FF:
/* F(X,Y,Z) = XY v not(X) Z */
result = (b & c) | ((~b) & d);
break;
case TILEM_MD5_FUNC_GG:
/* G(X,Y,Z) = XZ v Y not(Z) */
result = (b & d) | (c & (~d));
break;
case TILEM_MD5_FUNC_HH:
/* H(X,Y,Z) = X xor Y xor Z */
result = b ^ c ^ d;
break;
case TILEM_MD5_FUNC_II:
/* I(X,Y,Z) = Y xor (X v not(Z)) */
result = c ^ (b | (~d));
break;
default:
tilem_internal(calc, "Invalid MD5 mode %d", mode);
return 0;
}
result += a + x + t;
result &= 0xffffffff;
result = (result << s) | (result >> (32 - s));
result += b;
return result;
}