Skip to content

Commit 6ad10c4

Browse files
committed
use the same tests as dargon2
1 parent c98eee0 commit 6ad10c4

File tree

2 files changed

+136
-49
lines changed

2 files changed

+136
-49
lines changed

.idea/workspace.xml

Lines changed: 15 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 121 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,135 @@
1+
import 'dart:convert';
2+
3+
import 'package:dargon2_flutter/dargon2_flutter.dart';
14
import 'package:flutter_test/flutter_test.dart';
25
import 'package:integration_test/integration_test.dart';
3-
import 'package:flutter/material.dart';
46

57
import 'package:dargon2_flutter_example/main.dart' as app;
68

79
void main() {
810
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
11+
app.main();
912

10-
group('dargon2_flutter Tests', () {
11-
testWidgets('Test 1 - Password: password, Salt: somesalt',
12-
(WidgetTester tester) async {
13-
expect(await getEncodedHash(tester, "password", "somesalt"),
14-
"\$argon2i\$v=19\$m=256,t=32,p=2\$c29tZXNhbHQ\$wxqz54yTDqhGKcTe4g4AhcjIM2rL8+CRm/cToHmBwo4"
15-
);
16-
});
17-
testWidgets('Test 2 - Password: adifferentpassword, Salt: somesalt',
18-
(WidgetTester tester) async {
19-
expect(await getEncodedHash(tester, "adifferentpassword", "somesalt"),
20-
"\$argon2i\$v=19\$m=256,t=32,p=2\$c29tZXNhbHQ\$iz9v0NbPE3KlH+JyjuQ8FT/zBsWeDn3/FFURLCnk9s0"
21-
);
22-
});
23-
testWidgets('Test 3 - Password: password, Salt: adifferentsalt',
24-
(WidgetTester tester) async {
25-
expect(await getEncodedHash(tester, "password", "adifferentsalt"),
26-
"\$argon2i\$v=19\$m=256,t=32,p=2\$YWRpZmZlcmVudHNhbHQ\$xTUGyeSvH+c8ss2pFpe9qPovrEUGB2oBi4NZZmlG7VM"
27-
);
28-
});
29-
testWidgets('Test 4 - Password: adifferentpassword, Salt: adifferentsalt',
30-
(WidgetTester tester) async {
31-
expect(await getEncodedHash(tester, "adifferentpassword", "adifferentsalt"),
32-
"\$argon2i\$v=19\$m=256,t=32,p=2\$YWRpZmZlcmVudHNhbHQ\$qrZf7a27IhS3n0yXxo1niBLciHsHR7s54SwLus4+zxw"
33-
);
13+
// Argon2i test group
14+
group('Hash Tests - Argon2i', () {
15+
testWidgets('v = ${0x13}, t = 2, m = 16, p = 1,', (_) async {
16+
var code = await hashTest(Argon2Version.V13, 2, 16, 1, 'password', 'somesalt',
17+
'03df1d13e10203bcc663405e31ab1687939730c9152459bca28fd10c23e38f50',
18+
'\$argon2i\$v=19\$m=16,t=2,p=1\$c29tZXNhbHQ\$A98dE+ECA7zGY0BeMasWh5OXMMkVJFm8oo/RDCPjj1A', Argon2Type.i);
19+
expect(code, DArgon2ErrorCode.ARGON2_OK);
20+
});
21+
testWidgets('v = ${0x13}, t = 2, m = 18, p = 1,', (_) async {
22+
var code = await hashTest(Argon2Version.V13, 2, 18, 1, 'password', 'somesalt',
23+
'3b1b4ad0a66b3f00b4cd04225e4e6da950ee152bf0d29aabcb123c2f1a90567a',
24+
'\$argon2i\$v=19\$m=18,t=2,p=1\$c29tZXNhbHQ\$OxtK0KZrPwC0zQQiXk5tqVDuFSvw0pqryxI8LxqQVno', Argon2Type.i);
25+
expect(code, DArgon2ErrorCode.ARGON2_OK);
26+
});
27+
testWidgets('v = ${0x13}, t = 2, m = 8, p = 1,', (_) async {
28+
var code = await hashTest(Argon2Version.V13, 2, 8, 1, 'password', 'somesalt',
29+
'48cc13c16c5a2d254a278e2c44420ba0fb2d0f070661e35d6486604a7a2ff1a9',
30+
'\$argon2i\$v=19\$m=8,t=2,p=1\$c29tZXNhbHQ\$SMwTwWxaLSVKJ44sREILoPstDwcGYeNdZIZgSnov8ak', Argon2Type.i);
31+
expect(code, DArgon2ErrorCode.ARGON2_OK);
32+
});
33+
testWidgets('v = ${0x13}, t = 2, m = 16, p = 2,', (_) async {
34+
var code = await hashTest(Argon2Version.V13, 2, 16, 2, 'password', 'somesalt',
35+
'7fbb85db7e9636115f2fd0f29ea4214baaada18b39fffed7875eeb9fa9b308c5',
36+
'\$argon2i\$v=19\$m=16,t=2,p=2\$c29tZXNhbHQ\$f7uF236WNhFfL9DynqQhS6qtoYs5//7Xh17rn6mzCMU', Argon2Type.i);
37+
expect(code, DArgon2ErrorCode.ARGON2_OK);
38+
});
39+
});
40+
// Argon2d test group
41+
group('Hash Tests - Argon2d', () {
42+
testWidgets('v = ${0x13}, t = 2, m = 16, p = 1,', (_) async {
43+
var code = await hashTest(Argon2Version.V13, 2, 16, 1, 'password', 'somesalt',
44+
'e742c05880c44c4df5fe79937be77897a6e41ca758affc42301f1e4040e35bd2',
45+
'\$argon2d\$v=19\$m=16,t=2,p=1\$c29tZXNhbHQ\$50LAWIDETE31/nmTe+d4l6bkHKdYr/xCMB8eQEDjW9I', Argon2Type.d);
46+
expect(code, DArgon2ErrorCode.ARGON2_OK);
47+
});
48+
testWidgets('v = ${0x13}, t = 2, m = 18, p = 1,', (_) async {
49+
var code = await hashTest(Argon2Version.V13, 2, 18, 1, 'password', 'somesalt',
50+
'd24d7d614122db6458d66b4f35dc45b1cca59f9b71945db207e78062601d2dd5',
51+
'\$argon2d\$v=19\$m=18,t=2,p=1\$c29tZXNhbHQ\$0k19YUEi22RY1mtPNdxFscyln5txlF2yB+eAYmAdLdU', Argon2Type.d);
52+
expect(code, DArgon2ErrorCode.ARGON2_OK);
53+
});
54+
testWidgets('v = ${0x13}, t = 2, m = 8, p = 1,', (_) async {
55+
var code = await hashTest(Argon2Version.V13, 2, 8, 1, 'password', 'somesalt',
56+
'7d124315b3ba588668393b2e2d6867bd9f211a4eebd240d0023e540a783a69f0',
57+
'\$argon2d\$v=19\$m=8,t=2,p=1\$c29tZXNhbHQ\$fRJDFbO6WIZoOTsuLWhnvZ8hGk7r0kDQAj5UCng6afA', Argon2Type.d);
58+
expect(code, DArgon2ErrorCode.ARGON2_OK);
59+
});
60+
testWidgets('v = ${0x13}, t = 2, m = 16, p = 2,', (_) async {
61+
var code = await hashTest(Argon2Version.V13, 2, 16, 2, 'password', 'somesalt',
62+
'59f20a66a4c31bf0438a2f494867c32120409a91380f0687aefee984ba86bda8',
63+
'\$argon2d\$v=19\$m=16,t=2,p=2\$c29tZXNhbHQ\$WfIKZqTDG/BDii9JSGfDISBAmpE4DwaHrv7phLqGvag', Argon2Type.d);
64+
expect(code, DArgon2ErrorCode.ARGON2_OK);
65+
});
66+
});
67+
// Argon2id test group
68+
group('Hash Tests - Argon2id', () {
69+
testWidgets('v = ${0x13}, t = 2, m = 16, p = 1,', (_) async {
70+
var code = await hashTest(Argon2Version.V13, 2, 16, 1, 'password', 'somesalt',
71+
'058202c0723cd88c24408ccac1cbf828dee63bcf3843a150ea364a1e0b4e1ff8',
72+
'\$argon2id\$v=19\$m=16,t=2,p=1\$c29tZXNhbHQ\$BYICwHI82IwkQIzKwcv4KN7mO884Q6FQ6jZKHgtOH/g', Argon2Type.id);
73+
expect(code, DArgon2ErrorCode.ARGON2_OK);
74+
});
75+
testWidgets('v = ${0x13}, t = 2, m = 18, p = 1,', (_) async {
76+
var code = await hashTest(Argon2Version.V13, 2, 18, 1, 'password', 'somesalt',
77+
'0e6408c954c4980f6313756ea01ee7ddebb362efbb20d49d08a6859787024e3f',
78+
'\$argon2id\$v=19\$m=18,t=2,p=1\$c29tZXNhbHQ\$DmQIyVTEmA9jE3VuoB7n3euzYu+7INSdCKaFl4cCTj8', Argon2Type.id);
79+
expect(code, DArgon2ErrorCode.ARGON2_OK);
80+
});
81+
testWidgets('v = ${0x13}, t = 2, m = 8, p = 1,', (_) async {
82+
var code = await hashTest(Argon2Version.V13, 2, 8, 1, 'password', 'somesalt',
83+
'fdb4ddb6d5887131b66f0b2a3740c077dd05b755845861f6b5a1dde8b1071646',
84+
'\$argon2id\$v=19\$m=8,t=2,p=1\$c29tZXNhbHQ\$/bTdttWIcTG2bwsqN0DAd90Ft1WEWGH2taHd6LEHFkY', Argon2Type.id);
85+
expect(code, DArgon2ErrorCode.ARGON2_OK);
86+
});
87+
testWidgets('v = ${0x13}, t = 2, m = 16, p = 2,', (_) async {
88+
var code = await hashTest(Argon2Version.V13, 2, 16, 2, 'password', 'somesalt',
89+
'747d7631b182faf749d7efc31aec31df4ecfe3b57c792f53800ac2c9978b4888',
90+
'\$argon2id\$v=19\$m=16,t=2,p=2\$c29tZXNhbHQ\$dH12MbGC+vdJ1+/DGuwx307P47V8eS9TgArCyZeLSIg', Argon2Type.id);
91+
expect(code, DArgon2ErrorCode.ARGON2_OK);
3492
});
3593
});
3694
}
3795

38-
Future<String> getEncodedHash(WidgetTester tester, String password, String salt) async {
39-
app.main();
40-
await tester.pumpAndSettle();
41-
42-
// find all entry fields
43-
final hashEntryField = find.byKey(Key("hashEntry"));
44-
final saltEntryField = find.byKey(Key("saltEntry"));
45-
final hashButton = find.byKey(Key("hash"));
46-
final hashText = find.byKey(Key("hashText"));
47-
48-
await tester.tap(hashEntryField);
49-
await tester.enterText(hashEntryField, password);
50-
await tester.tap(saltEntryField);
51-
await tester.enterText(saltEntryField, salt);
52-
await tester.tap(hashButton);
53-
54-
await tester.pumpAndSettle();
96+
Future<DArgon2ErrorCode> hashTest(Argon2Version version, int iterations, int memory, int parallelism, String password, String salt, String hexHash, String encodedHash, Argon2Type type) async {
97+
var s = Salt(utf8.encode(salt));
98+
DArgon2Result resultString;
99+
DArgon2Result resultBytes;
100+
// get hashed results
101+
try {
102+
resultString = await argon2.hashPasswordString(password, salt: s,
103+
iterations: iterations,
104+
memory: memory,
105+
parallelism: parallelism,
106+
version: version,
107+
type: type);
108+
resultBytes = await argon2.hashPasswordBytes(utf8.encode(password), salt: s,
109+
iterations: iterations,
110+
memory: memory,
111+
parallelism: parallelism,
112+
version: version,
113+
type: type);
114+
// Test both bytes and string for equaluty
115+
if (resultString.encodedString != resultBytes.encodedString) {
116+
return DArgon2ErrorCode.ARGON2_UNKNOWN_ERROR;
117+
}
118+
// Check if both hex strings are equivalent to the one given
119+
if (resultBytes.hexString != hexHash || resultString.hexString != hexHash) {
120+
return DArgon2ErrorCode.ARGON2_UNKNOWN_ERROR;
121+
}
122+
// Check if both are verified
123+
if (!await argon2.verifyHashString(password, encodedHash, type: type) || !await argon2.verifyHashBytes(utf8.encode(password), utf8.encode(encodedHash), type: type)) {
124+
return DArgon2ErrorCode.ARGON2_UNKNOWN_ERROR;
125+
}
126+
// Check if both are verified against each other
127+
if (!await argon2.verifyHashString(password, resultBytes.encodedString, type: type) || !await argon2.verifyHashString(password, resultString.encodedString, type: type)) {
128+
return DArgon2ErrorCode.ARGON2_UNKNOWN_ERROR;
129+
}
130+
return DArgon2ErrorCode.ARGON2_OK;
55131

56-
return (tester.widget(hashText) as Text).data!
57-
.replaceAll("Encoded String\n", "");
132+
} on DArgon2Exception catch (e) {
133+
return e.errorCode;
134+
}
58135
}

0 commit comments

Comments
 (0)