processBlockWithKey static method
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);
}