📄 multiswap.c
字号:
#include "MultiSwap.h"
static int mod232inv(int x)
{
int rval = x;
int i;
for (i = 0; i < 30; i++)
rval *= rval * x;
return rval;
}
void MultiSwapSetKey(MULTISWAPKEY * out, unsigned int *datain)
{
int i;
for (i = 0; i < 5; i++) {
out->round[0].multikey[i] = datain[i] | 1;
out->round[0].multiinv[i] = mod232inv(datain[i] | 1);
out->round[1].multikey[i] = datain[6 + i] | 1;
out->round[1].multiinv[i] = mod232inv(datain[6 + i] | 1);
}
/* Note that the "| 1" part isn't necessary here, since we don't
* need multiplicative inverses. But they do it anyway!
*/
out->round[0].additive = datain[5] | 1;
out->round[1].additive = datain[11] | 1;
}
void MultiSwapEncode(MULTISWAPKEY * key, unsigned int *state,
unsigned int *datain, unsigned int *dataout)
{
unsigned int cst = state[0];
cst += datain[0];
cst *= key->round[0].multikey[0];
cst = (cst >> 16) | (cst << 16);
cst *= key->round[0].multikey[1];
cst = (cst >> 16) | (cst << 16);
cst *= key->round[0].multikey[2];
cst = (cst >> 16) | (cst << 16);
cst *= key->round[0].multikey[3];
cst = (cst >> 16) | (cst << 16);
cst = cst * key->round[0].multikey[4] + key->round[0].additive;
dataout[1] = cst + state[1];
cst += datain[1];
cst *= key->round[1].multikey[0];
cst = (cst >> 16) | (cst << 16);
cst *= key->round[1].multikey[1];
cst = (cst >> 16) | (cst << 16);
cst *= key->round[1].multikey[2];
cst = (cst >> 16) | (cst << 16);
cst *= key->round[1].multikey[3];
cst = (cst >> 16) | (cst << 16);
cst = cst * key->round[1].multikey[4] + key->round[1].additive;
dataout[1] += cst;
dataout[0] = cst;
}
void MultiSwapMAC(MULTISWAPKEY * key, unsigned int *data, int num64bits,
unsigned int *out)
{
unsigned int state[2];
unsigned int newstate[2] = { 0, 0 };
int i;
for (i = 0; i < num64bits; i++) {
state[0] = newstate[0];
state[1] = newstate[1];
MultiSwapEncode(key, state, data + 2 * i, newstate);
}
out[0] = newstate[0];
out[1] = newstate[1];
}
void MultiSwapDecode(MULTISWAPKEY * key, unsigned int *state,
unsigned int *datain, unsigned int *dataout)
{
unsigned int cst = datain[0];
unsigned int tmp;
dataout[1] = datain[1] - cst;
cst = (cst - key->round[1].additive) * key->round[1].multiinv[4];
cst = (cst >> 16) | (cst << 16);
cst *= key->round[1].multiinv[3];
cst = (cst >> 16) | (cst << 16);
cst *= key->round[1].multiinv[2];
cst = (cst >> 16) | (cst << 16);
cst *= key->round[1].multiinv[1];
cst = (cst >> 16) | (cst << 16);
cst *= key->round[1].multiinv[0];
tmp = dataout[1] - state[1];
dataout[1] = cst - tmp;
cst = tmp;
cst = (cst - key->round[0].additive) * key->round[0].multiinv[4];
cst = (cst >> 16) | (cst << 16);
cst *= key->round[0].multiinv[3];
cst = (cst >> 16) | (cst << 16);
cst *= key->round[0].multiinv[2];
cst = (cst >> 16) | (cst << 16);
cst *= key->round[0].multiinv[1];
cst = (cst >> 16) | (cst << 16);
cst *= key->round[0].multiinv[0];
dataout[0] = cst - state[0];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -