pbkdf static method

void pbkdf(
  1. String password,
  2. Uint8List salt,
  3. int rounds,
  4. Uint8List output,
)

Implementation

static void pbkdf(
  String password,
  Uint8List salt,
  int rounds,
  Uint8List output,
) {
  var sha512 = SHA512Digest();
  var nblocks = ((output.length + 31) / 32).truncate();
  var hpass = sha512.process(Uint8List.fromList(password.codeUnits));
  var hsalt = Uint8List(64);
  var blockB = Uint8List(4);
  Uint8List out;
  Uint8List tmp;

  for (var block = 1; block <= nblocks; block++) {
    // Block count is in big endian
    blockB[0] = ((block >> 24) & 0xFF);
    blockB[1] = ((block >> 16) & 0xFF);
    blockB[2] = ((block >> 8) & 0xFF);
    blockB[3] = (block & 0xFF);

    sha512.reset();
    sha512.update(salt, 0, salt.length);
    sha512.update(blockB, 0, blockB.length);
    sha512.doFinal(hsalt, 0);

    out = Uint8List.fromList(BCrypt().hash(hpass, hsalt));
    tmp = Uint8List(out.length)..setAll(0, out);

    for (var round = 1; round < rounds; round++) {
      sha512.reset();
      sha512.update(tmp, 0, tmp.length);
      sha512.doFinal(hsalt, 0);

      tmp = BCrypt().hash(hpass, hsalt);

      for (var i = 0; i < tmp.length; i++) {
        out[i] ^= tmp[i];
      }
    }

    for (var i = 0; i < out.length; i++) {
      var idx = i * nblocks + (block - 1);
      if (idx < output.length) {
        output[idx] = out[i];
      }
    }
  }
}