processBlockWithKey static method

void processBlockWithKey(
  1. Uint8List inp,
  2. int inpOff,
  3. Uint8List out,
  4. int outOff,
  5. List<int> wKey,
)

Bouncy Castle's desFunc.

Implementation

static void processBlockWithKey(
  Uint8List inp,
  int inpOff,
  Uint8List out,
  int outOff,
  List<int> wKey,
) {
  int left = _readUint32(inp, inpOff);
  int right = _readUint32(inp, inpOff + 4);
  int work;

  work = ((left >> 4) ^ right) & 0x0f0f0f0f;
  right ^= work;
  left ^= (work << 4) & 0xFFFFFFFF;
  work = ((left >> 16) ^ right) & 0x0000ffff;
  right ^= work;
  left ^= (work << 16) & 0xFFFFFFFF;
  work = ((right >> 2) ^ left) & 0x33333333;
  left ^= work;
  right ^= (work << 2) & 0xFFFFFFFF;
  work = ((right >> 8) ^ left) & 0x00ff00ff;
  left ^= work;
  right ^= (work << 8) & 0xFFFFFFFF;
  right = ((right << 1) | (right >> 31)) & 0xFFFFFFFF;
  work = (left ^ right) & 0xaaaaaaaa;
  left ^= work;
  right ^= work;
  left = ((left << 1) | (left >> 31)) & 0xFFFFFFFF;

  for (int round = 0; round < 8; round++) {
    int fval;

    work = ((right << 28) | (right >> 4)) & 0xFFFFFFFF;
    work ^= wKey[round * 4 + 0];
    fval = _sp7[work & 0x3f];
    fval |= _sp5[(work >> 8) & 0x3f];
    fval |= _sp3[(work >> 16) & 0x3f];
    fval |= _sp1[(work >> 24) & 0x3f];
    work = right ^ wKey[round * 4 + 1];
    fval |= _sp8[work & 0x3f];
    fval |= _sp6[(work >> 8) & 0x3f];
    fval |= _sp4[(work >> 16) & 0x3f];
    fval |= _sp2[(work >> 24) & 0x3f];
    left ^= fval;
    work = ((left << 28) | (left >> 4)) & 0xFFFFFFFF;
    work ^= wKey[round * 4 + 2];
    fval = _sp7[work & 0x3f];
    fval |= _sp5[(work >> 8) & 0x3f];
    fval |= _sp3[(work >> 16) & 0x3f];
    fval |= _sp1[(work >> 24) & 0x3f];
    work = left ^ wKey[round * 4 + 3];
    fval |= _sp8[work & 0x3f];
    fval |= _sp6[(work >> 8) & 0x3f];
    fval |= _sp4[(work >> 16) & 0x3f];
    fval |= _sp2[(work >> 24) & 0x3f];
    right ^= fval;
  }

  right = ((right << 31) | (right >> 1)) & 0xFFFFFFFF;
  work = (left ^ right) & 0xaaaaaaaa;
  left ^= work;
  right ^= work;
  left = ((left << 31) | (left >> 1)) & 0xFFFFFFFF;
  work = ((left >> 8) ^ right) & 0x00ff00ff;
  right ^= work;
  left ^= (work << 8) & 0xFFFFFFFF;
  work = ((left >> 2) ^ right) & 0x33333333;
  right ^= work;
  left ^= (work << 2) & 0xFFFFFFFF;
  work = ((right >> 16) ^ left) & 0x0000ffff;
  left ^= work;
  right ^= (work << 16) & 0xFFFFFFFF;
  work = ((right >> 4) ^ left) & 0x0f0f0f0f;
  left ^= work;
  right ^= (work << 4) & 0xFFFFFFFF;

  _writeUint32(right, out, outOff);
  _writeUint32(left, out, outOff + 4);
}