import 'dart:math'; import 'package:flutter_test/flutter_test.dart'; import 'package:friendly_map/modules/keys/src/shamir.dart'; void main() { final secret = List.generate(16, (i) => (i * 37 + 11) % 256); test('5조각 중 어느 3조각으로도 비밀이 돌아온다', () { final shares = Shamir.split(secret, n: 5, k: 3, random: Random(1)); expect(shares.length, 5); for (final pick in [ [0, 1, 2], [0, 2, 4], [1, 3, 4], [2, 3, 4], [0, 1, 4], ]) { expect(Shamir.combine([for (final i in pick) shares[i]]), secret); } }); test('필요한 수보다 많이 모아도 같은 비밀', () { final shares = Shamir.split(secret, n: 5, k: 3, random: Random(2)); expect(Shamir.combine(shares), secret); }); test('2조각만으로는 비밀이 돌아오지 않는다', () { final shares = Shamir.split(secret, n: 5, k: 3, random: Random(3)); expect(Shamir.combine([shares[0], shares[1]]) == secret, false); }); test('조각을 글자로 바꿨다 되돌려도 같다', () { final shares = Shamir.split(secret, n: 4, k: 2, random: Random(4)); final back = [for (final s in shares.take(2)) Share.decode(s.encode())]; expect(Shamir.combine(back), secret); }); test('2~10 조각 조합 전부 시험', () { for (var n = 2; n <= 10; n++) { for (var k = 2; k <= n; k++) { final shares = Shamir.split(secret, n: n, k: k, random: Random(n * 100 + k)); expect(Shamir.combine(shares.sublist(n - k)), secret); } } }); test('잘못된 수는 거절', () { expect(() => Shamir.split(secret, n: 2, k: 3), throwsArgumentError); expect(() => Shamir.split(secret, n: 5, k: 1), throwsArgumentError); }); }