You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
2.6 KiB
92 lines
2.6 KiB
|
1 day ago
|
// The key of words against testdata/vectors/wordkey.json, the shared cases
|
||
|
|
// of spec §38.1 that §64 of v0.11 asks for: the words of each text, what a
|
||
|
|
// writer does with them, with the error of Go's wordkey.Check, and the
|
||
|
|
// identity and the recipient that the words derive. Each key is 600 000
|
||
|
|
// iterations of PBKDF2: on the VM only.
|
||
|
|
@TestOn('vm')
|
||
|
|
library;
|
||
|
|
|
||
|
|
import 'dart:convert';
|
||
|
|
import 'dart:io';
|
||
|
|
|
||
|
|
import 'package:datekeys/datekeys.dart';
|
||
|
|
import 'package:datekeys/src/wordkey.dart';
|
||
|
|
import 'package:test/test.dart';
|
||
|
|
|
||
|
|
typedef Json = Map<String, Object?>;
|
||
|
|
|
||
|
|
List<String> _strings(Object? v) => (v! as List).cast<String>();
|
||
|
|
|
||
|
|
void main() {
|
||
|
|
final f = jsonDecode(
|
||
|
|
File('testdata/vectors/wordkey.json').readAsStringSync(),
|
||
|
|
) as Json;
|
||
|
|
final normalize = (f['normalize']! as List).cast<Json>();
|
||
|
|
final check = (f['check']! as List).cast<Json>();
|
||
|
|
final keys = (f['keys']! as List).cast<Json>();
|
||
|
|
|
||
|
|
test('wordkey.json names this specification and has the cases of README', () {
|
||
|
|
expect(f['spec'], specVersion);
|
||
|
|
expect(
|
||
|
|
normalize.where((c) => (c['name']! as String).endsWith(' is a space')),
|
||
|
|
hasLength(25),
|
||
|
|
);
|
||
|
|
expect(check.where((c) => c['result'] == 'ok'), isNotEmpty);
|
||
|
|
expect(
|
||
|
|
check.where((c) => '${c['error']}'.contains('U+200B')),
|
||
|
|
hasLength(1),
|
||
|
|
);
|
||
|
|
expect(
|
||
|
|
keys.first['key'],
|
||
|
|
'fceec4d8ca8de86c85a1f26ed49f82a2b38431bd0ce36db995ae7dfd49b96e41',
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
group('normalize', () {
|
||
|
|
for (final c in normalize) {
|
||
|
|
test('${c['name']}', () {
|
||
|
|
expect(normalizeWords(c['text']! as String), _strings(c['words']));
|
||
|
|
});
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
group('check', () {
|
||
|
|
for (final c in check) {
|
||
|
|
test('${c['name']}', () {
|
||
|
|
final words = normalizeWords(c['text']! as String);
|
||
|
|
expect(words, _strings(c['words']));
|
||
|
|
if (c['result'] == 'ok') {
|
||
|
|
checkWords(words);
|
||
|
|
} else {
|
||
|
|
expect(c['result'], 'error');
|
||
|
|
expect(
|
||
|
|
() => checkWords(words),
|
||
|
|
throwsA(
|
||
|
|
isA<WordKeyException>().having(
|
||
|
|
(e) => e.message,
|
||
|
|
'message',
|
||
|
|
c['error'],
|
||
|
|
),
|
||
|
|
),
|
||
|
|
);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
group('keys', () {
|
||
|
|
for (final c in keys) {
|
||
|
|
test('${c['name']}', () {
|
||
|
|
final id = wordIdentity(
|
||
|
|
_strings(c['words']),
|
||
|
|
fromHex(c['chain_hash']! as String),
|
||
|
|
c['round']! as int,
|
||
|
|
fromHex(c['capsule_id']! as String),
|
||
|
|
);
|
||
|
|
expect(toHex(id.secretKey), c['key']);
|
||
|
|
expect(id.recipientString, c['recipient']);
|
||
|
|
});
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|