tests: make design-rationale comments self-contained

Test comments referenced internal design documents that are not part
of this repository. The relevant invariants are now stated inline.
This commit is contained in:
Julius Joska
2026-07-11 20:02:56 +02:00
parent 8081d98c67
commit 92eb316a83
3 changed files with 13 additions and 9 deletions
+5 -4
View File
@@ -12,7 +12,7 @@ void main() {
await SepotCrypto.init(); await SepotCrypto.init();
}); });
group('S1: fingerprint a ID z klíče', () { group('fingerprint a ID z klíče', () {
test('fingerprint má 52 znaků Crockford base32, SEP- zkratka 14', () async { test('fingerprint má 52 znaků Crockford base32, SEP- zkratka 14', () async {
final identity = await LocalIdentity.create('Alice'); final identity = await LocalIdentity.create('Alice');
expect(identity.fingerprint.display, hasLength(52)); expect(identity.fingerprint.display, hasLength(52));
@@ -36,7 +36,7 @@ void main() {
); );
final fp = SepotFingerprint.ofPublicKey(pubkey); final fp = SepotFingerprint.ofPublicKey(pubkey);
expect(fp.display, hasLength(52)); expect(fp.display, hasLength(52));
// KAT hodnota vygenerovaná při zavedení S1 (2026-07-03) — pokud se // KAT hodnota zafixovaná při zavedení fingerprintů — pokud se
// změní, změnil se hash vstup/algoritmus a VŠECHNA ID uživatelů // změní, změnil se hash vstup/algoritmus a VŠECHNA ID uživatelů
expect( expect(
fp.display, fp.display,
@@ -53,7 +53,8 @@ void main() {
test('serializovaný privátní klíč je clamping-stabilní', () { test('serializovaný privátní klíč je clamping-stabilní', () {
// deserialize→serialize musí být identita na už serializovaných // deserialize→serialize musí být identita na už serializovaných
// bajtech — na tom stojí mnemonic roundtrip (MASTER-DESIGN §3, F-3) // bajtech — mnemonic kóduje serializovaný (clampnutý) privátní klíč,
// takže nestabilní serializace by rozbila obnovu účtu ze slov
for (var i = 0; i < 20; i++) { for (var i = 0; i < 20; i++) {
final keys = SepotCrypto.generateIdentityKeys(); final keys = SepotCrypto.generateIdentityKeys();
final roundtrip = SepotCrypto.derivePublicKey(keys.privateKey); final roundtrip = SepotCrypto.derivePublicKey(keys.privateKey);
@@ -67,7 +68,7 @@ void main() {
}); });
}); });
group('S2: mnemonic recovery', () { group('mnemonic recovery', () {
test('recover z mnemonic obnoví identický klíč i fingerprint', () async { test('recover z mnemonic obnoví identický klíč i fingerprint', () async {
final original = await LocalIdentity.create('Alice'); final original = await LocalIdentity.create('Alice');
final words = original.mnemonic; final words = original.mnemonic;
+6 -3
View File
@@ -12,9 +12,12 @@ import 'package:sepot/models/contact.dart';
import 'package:sepot/models/group.dart'; import 'package:sepot/models/group.dart';
import 'package:sepot/models/identity.dart'; import 'package:sepot/models/identity.dart';
/// Bezpečnostní pravidla skupin (GROUPS-V1.md §Bezpečnostní pravidla). /// Bezpečnostní pravidla skupin — invarianty příjmové cesty: fingerprint
/// Útočné scénáře: podvržený roster, cizí odesílatel, přepis identity /// v rosteru musí odpovídat identity klíči, odesílatel i já musíme být
/// klíče, pozvánka bez příjemce, roster přes strop. /// členy, roster smí měnit jen stávající člen a identity klíč známého
/// kontaktu se nikdy nepřepisuje (TOFU). Útočné scénáře: podvržený roster,
/// cizí odesílatel, přepis identity klíče, pozvánka bez příjemce, roster
/// přes strop.
void main() { void main() {
late Directory tmp; late Directory tmp;
late CryptoDb db; late CryptoDb db;
+2 -2
View File
@@ -9,7 +9,7 @@ import 'package:sepot/models/conversation.dart';
import 'package:sepot/models/group.dart'; import 'package:sepot/models/group.dart';
import 'package:sepot/models/message.dart'; import 'package:sepot/models/message.dart';
/// Skupiny v1 (GROUPS-V1.md) — perzistence a model. Bezpečnostní pravidla /// Skupiny v1 — perzistence a model. Bezpečnostní pravidla
/// příjmové cesty (roster anti-spoof, membership guard) mají vlastní test /// příjmové cesty (roster anti-spoof, membership guard) mají vlastní test
/// v `test/groups_security_test.dart`, protože nepotřebují DB. /// v `test/groups_security_test.dart`, protože nepotřebují DB.
void main() { void main() {
@@ -115,7 +115,7 @@ void main() {
expect(g.isMember('MALLORY'), isFalse); expect(g.isMember('MALLORY'), isFalse);
}); });
test('strop členů je 128 (MASTER-DESIGN otázka 9)', () { test('strop členů je 128 (párový fanout = N obálek na zprávu)', () {
expect(Group.maxMembers, 128); expect(Group.maxMembers, 128);
}); });