twonly-app-dependencies/hashlib/test/pbkdf2_test.dart
2025-12-07 16:10:41 +01:00

187 lines
6.7 KiB
Dart

// Copyright (c) 2023, Sudipto Chandra
// All rights reserved. Check LICENSE file for details.
import 'package:hashlib/hashlib.dart';
import 'package:test/test.dart';
void main() {
group('PBKDF2 test', () {
test("name", () {
final iv = "key".codeUnits;
expect(sha256.pbkdf2(iv).name, 'SHA-256/HMAC/PBKDF2');
expect(sha256.hmac.pbkdf2(iv).name, 'SHA-256/HMAC/PBKDF2');
expect(sha1.pbkdf2(iv).name, 'SHA1/HMAC/PBKDF2');
expect(sha1.hmac.pbkdf2(iv).name, 'SHA1/HMAC/PBKDF2');
expect(md5.pbkdf2(iv).name, 'MD5/HMAC/PBKDF2');
expect(md5.hmac.pbkdf2(iv).name, 'MD5/HMAC/PBKDF2');
});
test('fromSecurity', () {
var pw = 'password'.codeUnits;
var out = PBKDF2.fromSecurity(PBKDF2Security.little).convert(pw);
expect(out.length, PBKDF2Security.little.dklen);
});
test("Default method: pbkdf2", () {
var hash = pbkdf2(
'password'.codeUnits,
"some salt".codeUnits,
50,
32,
);
var matcher =
'09d106dccc35eae63c48aa472394de511547ce296ab55685b7ba8b304bec68fe';
expect(hash.hex(), matcher);
});
test("with MD5", () {
final pw = 'password'.codeUnits;
final iv = "some salt".codeUnits;
final result =
'592e779487b7c4dc20ca5cd276163bbb760a40960bb17187cd4895238361d201';
final output = md5.pbkdf2(iv, iterations: 100, keyLength: 32).hex(pw);
expect(output, equals(result));
});
test("with MD5 through HMAC", () {
final pw = 'password'.codeUnits;
final iv = "some salt".codeUnits;
final result = '592e779487b7c4dc20ca5cd276163bbb';
final output = md5.pbkdf2(iv, iterations: 100, keyLength: 16).hex(pw);
expect(output, equals(result));
});
test("with SHA-1", () {
final pw = 'password'.codeUnits;
final iv = "some salt".codeUnits;
final result =
'a001e5ddf0b823ccc74edc957ab881e7924ef5c608956cd7d32606b8d7c8acb1';
final output = sha1.pbkdf2(iv, iterations: 100, keyLength: 32).hex(pw);
expect(output, equals(result));
});
test("with SHA-224", () {
var pw = 'password'.codeUnits;
var iv = "some salt".codeUnits;
var output = sha224.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw);
var matcher =
'57f86bc67aad5fa335f8f0f8ecd7b550c7f2462502d3058897299f49111f8948';
expect(output, equals(matcher));
});
test("with SHA-256", () {
var pw = 'password'.codeUnits;
var iv = "some salt".codeUnits;
var output = sha256.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw);
var matcher =
'09d106dccc35eae63c48aa472394de511547ce296ab55685b7ba8b304bec68fe';
expect(output, equals(matcher));
});
test("with SHA-384", () {
var pw = 'password'.codeUnits;
var iv = "some salt".codeUnits;
var output = sha384.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw);
var matcher =
'6091b46523e28ffa34d777f81c9ef446cd2983601a6dbdd8cc63aa0fa461b624';
expect(output, equals(matcher));
});
test("with SHA-512", () {
var pw = 'password'.codeUnits;
var iv = "some salt".codeUnits;
var output = sha512.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw);
var matcher =
'05f45e131d21985a38c25cb30c9edee0bfe697d19fb84a0d55e89e2a347c7905';
expect(output, equals(matcher));
});
test("with SHA-512/224", () {
var pw = 'password'.codeUnits;
var iv = "some salt".codeUnits;
var output = sha512t224.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw);
var matcher =
'7b03e2f53046cf52a0d8ace8f469bef3fdbe0a2b4b112b10586d33119a98aa94';
expect(output, equals(matcher));
});
test("with SHA-512/256", () {
var pw = 'password'.codeUnits;
var iv = "some salt".codeUnits;
var output = sha512t256.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw);
var matcher =
'73b02a03a67fe08ab8fee80f2d135f4afb954380406994b0f2670a0f5d0c7faa';
expect(output, equals(matcher));
});
test("with SHA3-224", () {
var pw = 'password'.codeUnits;
var iv = "some salt".codeUnits;
var output = sha3_224.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw);
var matcher =
'3543a75506759d603c2058847f39969f8d6c164ebc50c53eb44f290c7835521c';
expect(output, equals(matcher));
});
test("with SHA3-256", () {
var pw = 'password'.codeUnits;
var iv = "some salt".codeUnits;
var output = sha3_256.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw);
var matcher =
'c4aae4cbf79071757bf167a8cff387a615295bed94320d394e9ed15a4b53a9c1';
expect(output, equals(matcher));
});
test("with SHA3-384", () {
var pw = 'password'.codeUnits;
var iv = "some salt".codeUnits;
var output = sha3_384.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw);
var matcher =
'e39eef6add54c1b1cddb35dcf44cce8163941b1e73a26bd6f422dbdf4a98b7c0';
expect(output, equals(matcher));
});
test("with SHA3-512", () {
var pw = 'password'.codeUnits;
var iv = "some salt".codeUnits;
var output = sha3_512.pbkdf2(iv, iterations: 50, keyLength: 32).hex(pw);
var matcher =
'349d16a5e9cb37d277c0d05235c63bf1d094367c27968262d9d9460d96bbed79';
expect(output, equals(matcher));
});
test("long password with SHA-256", () {
var hash = pbkdf2(
'passwd'.codeUnits,
"salt".codeUnits,
1,
256,
);
var matcher =
'55ac046e56e3089fec1691c22544b605f94185216dde0465e68b9d57c20dacbc'
'49ca9cccf179b645991664b39d77ef317c71b845b1e30bd509112041d3a19783'
'c294e850150390e1160c34d62e9665d659ae49d314510fc98274cc7968196810'
'4b8f89237e69b2d549111868658be62f59bd715cac44a1147ed5317c9bae6b2a'
'd89a7e71d005442240f5d97bd6d58c2cec9417c63f4ebf19661303a083c430c5'
'ac29e5732761e3659cdf6a7b0f13f630042fadef4ed2c2a59d805b39590beedf'
'906b7f15744f4f2403cd27c0b61d9c270f6395a47e72cd57ff14a63eb0d38a7e'
'fac778f409b9d733e12ca7afb23690b212e5f55397bdc884c73193cb2feec7ef';
expect(hash.hex(), matcher);
});
test("The iterations must be at least 1", () {
expect(() => pbkdf2([9], [5], 0), throwsStateError);
expect(() => pbkdf2([9], [5], -1), throwsStateError);
});
test("The iterations must be less than 2^31", () {
expect(() => pbkdf2([9], [5], 0x80000000), throwsStateError);
expect(() => pbkdf2([9], [5], 0x8FFFFFFF), throwsStateError);
expect(() => pbkdf2([9], [5], 0xFFFFFFFF), throwsStateError);
});
test("The keyLength must be at least 1", () {
expect(() => pbkdf2([9], [5], 10, 0), throwsStateError);
expect(() => pbkdf2([9], [5], 10, -1), throwsStateError);
});
});
}