generateWorkingKey static method

List<int> generateWorkingKey(
  1. bool encrypting,
  2. Uint8List key
)

The 32 round-key words of Bouncy Castle's generateWorkingKey.

Implementation

static List<int> generateWorkingKey(bool encrypting, Uint8List key) {
  if (key.length < 8) {
    throw ArgumentError('Chave DES deve ter 8 bytes.');
  }
  final newKey = Uint32List(32);
  final pc1m = List<bool>.filled(56, false);
  final pcr = List<bool>.filled(56, false);

  for (int j = 0; j < 56; j++) {
    final l = _pc1[j];
    pc1m[j] = (key[l >> 3] & _bytebit[l & 7]) != 0;
  }

  for (int i = 0; i < 16; i++) {
    final m = encrypting ? i << 1 : (15 - i) << 1;
    final n = m + 1;
    int km = 0;
    int kn = 0;

    for (int j = 0; j < 28; j++) {
      final l = j + _totrot[i];
      pcr[j] = l < 28 ? pc1m[l] : pc1m[l - 28];
    }
    for (int j = 28; j < 56; j++) {
      final l = j + _totrot[i];
      pcr[j] = l < 56 ? pc1m[l] : pc1m[l - 28];
    }
    for (int j = 0; j < 24; j++) {
      if (pcr[_pc2[j]]) km |= _bigbyte[j];
      if (pcr[_pc2[j + 24]]) kn |= _bigbyte[j];
    }
    newKey[m] = km;
    newKey[n] = kn;
  }

  for (int i = 0; i != 32; i += 2) {
    final i1 = newKey[i];
    final i2 = newKey[i + 1];
    newKey[i] = (((i1 & 0x00fc0000) << 6) |
            ((i1 & 0x00000fc0) << 10) |
            ((i2 & 0x00fc0000) >> 10) |
            ((i2 & 0x00000fc0) >> 6)) &
        0xFFFFFFFF;
    newKey[i + 1] = (((i1 & 0x0003f000) << 12) |
            ((i1 & 0x0000003f) << 16) |
            ((i2 & 0x0003f000) >> 4) |
            (i2 & 0x0000003f)) &
        0xFFFFFFFF;
  }
  return newKey;
}