decryptBlock method
Decrypts the block at input[inputOffset..+16) into
output[outputOffset..+16) (may alias).
Implementation
void decryptBlock(
Uint8List input,
int inputOffset,
Uint8List output,
int outputOffset,
) {
final rk = _decKeys;
final td0 = _t.td0, td1 = _t.td1, td2 = _t.td2, td3 = _t.td3;
var s0 = _load(input, inputOffset) ^ rk[0];
var s1 = _load(input, inputOffset + 4) ^ rk[1];
var s2 = _load(input, inputOffset + 8) ^ rk[2];
var s3 = _load(input, inputOffset + 12) ^ rk[3];
var k = 4;
for (var round = 1; round < _rounds; round++, k += 4) {
final t0 =
td0[s0 >>> 24] ^
td1[(s3 >>> 16) & 0xFF] ^
td2[(s2 >>> 8) & 0xFF] ^
td3[s1 & 0xFF] ^
rk[k];
final t1 =
td0[s1 >>> 24] ^
td1[(s0 >>> 16) & 0xFF] ^
td2[(s3 >>> 8) & 0xFF] ^
td3[s2 & 0xFF] ^
rk[k + 1];
final t2 =
td0[s2 >>> 24] ^
td1[(s1 >>> 16) & 0xFF] ^
td2[(s0 >>> 8) & 0xFF] ^
td3[s3 & 0xFF] ^
rk[k + 2];
final t3 =
td0[s3 >>> 24] ^
td1[(s2 >>> 16) & 0xFF] ^
td2[(s1 >>> 8) & 0xFF] ^
td3[s0 & 0xFF] ^
rk[k + 3];
s0 = t0;
s1 = t1;
s2 = t2;
s3 = t3;
}
final inv = _t.invSbox;
_store(
output,
outputOffset,
((inv[s0 >>> 24] << 24) |
(inv[(s3 >>> 16) & 0xFF] << 16) |
(inv[(s2 >>> 8) & 0xFF] << 8) |
inv[s1 & 0xFF]) ^
rk[k],
);
_store(
output,
outputOffset + 4,
((inv[s1 >>> 24] << 24) |
(inv[(s0 >>> 16) & 0xFF] << 16) |
(inv[(s3 >>> 8) & 0xFF] << 8) |
inv[s2 & 0xFF]) ^
rk[k + 1],
);
_store(
output,
outputOffset + 8,
((inv[s2 >>> 24] << 24) |
(inv[(s1 >>> 16) & 0xFF] << 16) |
(inv[(s0 >>> 8) & 0xFF] << 8) |
inv[s3 & 0xFF]) ^
rk[k + 2],
);
_store(
output,
outputOffset + 12,
((inv[s3 >>> 24] << 24) |
(inv[(s2 >>> 16) & 0xFF] << 16) |
(inv[(s1 >>> 8) & 0xFF] << 8) |
inv[s0 & 0xFF]) ^
rk[k + 3],
);
}