pbkdf2 method

Uint8List pbkdf2(
  1. List<int> password,
  2. List<int> salt,
  3. int iterations,
  4. int length,
)

Implementation

Uint8List pbkdf2(
    List<int> password, List<int> salt, int iterations, int length) {
  final mac = crypto.Hmac(crypto.sha512, password);
  final out = Uint8List(length);
  final blocks = (length / 64).ceil();
  for (var i = 1; i <= blocks; i++) {
    var u = mac.convert([
      ...salt,
      ...Uint8List(4)..buffer.asByteData().setInt32(0, i, Endian.big)
    ]).bytes;
    var t = Uint8List.fromList(u);
    for (var j = 1; j < iterations; j++) {
      u = mac.convert(u).bytes;
      for (var k = 0; k < t.length; k++) t[k] ^= u[k];
    }
    final off = (i - 1) * 64;
    out.setRange(off, off + min(64, length - off), t);
  }
  return out;
}