|
| 1 | +import 'dart:convert'; |
| 2 | + |
| 3 | +import 'package:dargon2_flutter/dargon2_flutter.dart'; |
1 | 4 | import 'package:flutter_test/flutter_test.dart';
|
2 | 5 | import 'package:integration_test/integration_test.dart';
|
3 |
| -import 'package:flutter/material.dart'; |
4 | 6 |
|
5 | 7 | import 'package:dargon2_flutter_example/main.dart' as app;
|
6 | 8 |
|
7 | 9 | void main() {
|
8 | 10 | IntegrationTestWidgetsFlutterBinding.ensureInitialized();
|
| 11 | + app.main(); |
9 | 12 |
|
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); |
34 | 92 | });
|
35 | 93 | });
|
36 | 94 | }
|
37 | 95 |
|
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; |
55 | 131 |
|
56 |
| - return (tester.widget(hashText) as Text).data! |
57 |
| - .replaceAll("Encoded String\n", ""); |
| 132 | + } on DArgon2Exception catch (e) { |
| 133 | + return e.errorCode; |
| 134 | + } |
58 | 135 | }
|
0 commit comments