9 NAMESPACE_BEGIN(CryptoPP)
11 void
MARS::Base::UncheckedSetKey(const byte *userKey,
unsigned int length, const
NameValuePairs &)
13 AssertValidKeyLength(length);
17 GetUserKey(LITTLE_ENDIAN_ORDER, T.begin(), 15, userKey, length);
18 T[length/4] = length/4;
20 for (
unsigned int j=0; j<4; j++)
25 T[i] = T[i] ^ rotlFixed(T[(i+8)%15] ^ T[(i+13)%15], 3) ^ (4*i+j);
28 for (
unsigned int k=0; k<4; k++)
30 T[i] = rotlFixed(T[i] + Sbox[T[(i+14)%15]%512], 9);
34 m_k[10*j+i] = T[4*i%15];
38 for(
unsigned int i = 5; i < 37; i += 2)
40 word32 m, w = m_k[i] | 3;
41 m = (~w ^ (w<<1)) & (~w ^ (w>>1)) & 0x7ffffffe;
42 m &= m>>1; m &= m>>2; m &= m>>4;
43 m |= m<<1; m |= m<<2; m |= m<<4;
45 w ^= rotlMod(Sbox[265 + (m_k[i] & 3)], m_k[i-1]) & m;
50 #define S(a) Sbox[(a)&0x1ff]
51 #define S0(a) Sbox[(a)&0xff]
52 #define S1(a) Sbox[((a)&0xff) + 256]
56 void MARS::Enc::ProcessAndXorBlock(
const byte *inBlock,
const byte *xorBlock, byte *outBlock)
const
59 word32 a, b, c, d, l, m, r, t;
60 const word32 *k = m_k;
62 Block::Get(inBlock)(a)(b)(c)(d);
64 a += k[0]; b += k[1]; c += k[2]; d += k[3];
68 b = (b ^ S0(a)) + S1(a>>8);
72 a += (i%4==0) ? d : 0;
73 a += (i%4==1) ? b : 0;
74 t = a; a = b; b = c; c = d; d = t;
80 r = rotlFixed(t * k[2*i+5], 10);
82 l = rotlMod((S(m) ^ rotrFixed(r, 5) ^ r), r);
83 c += rotlMod(m, rotrFixed(r, 5));
86 a = b; b = c; c = d; d = t;
91 a -= (i%4==2) ? d : 0;
92 a -= (i%4==3) ? b : 0;
96 d = (d - S1(a>>16)) ^ S0(t);
97 a = b; b = c; c = d; d = t;
100 a -= k[36]; b -= k[37]; c -= k[38]; d -= k[39];
105 void MARS::Dec::ProcessAndXorBlock(
const byte *inBlock,
const byte *xorBlock, byte *outBlock)
const
108 word32 a, b, c, d, l, m, r, t;
109 const word32 *k = m_k;
111 Block::Get(inBlock)(d)(c)(b)(a);
113 d += k[36]; c += k[37]; b += k[38]; a += k[39];
117 b = (b ^ S0(a)) + S1(a>>8);
119 a = rotrFixed(a, 24);
121 a += (i%4==0) ? d : 0;
122 a += (i%4==1) ? b : 0;
123 t = a; a = b; b = c; c = d; d = t;
128 t = rotrFixed(a, 13);
129 r = rotlFixed(a * k[35-2*i], 10);
131 l = rotlMod((S(m) ^ rotrFixed(r, 5) ^ r), r);
132 c -= rotlMod(m, rotrFixed(r, 5));
135 a = b; b = c; c = d; d = t;
140 a -= (i%4==2) ? d : 0;
141 a -= (i%4==3) ? b : 0;
144 t = rotlFixed(a, 24);
145 d = (d - S1(a>>16)) ^ S0(t);
146 a = b; b = c; c = d; d = t;
149 d -= k[0]; c -= k[1]; b -= k[2]; a -= k[3];