decryptBlock method

void decryptBlock(
  1. Uint8List input,
  2. int inputOffset,
  3. Uint8List output,
  4. int outputOffset,
)

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],
  );
}