frindlymap/test/shamir_test.dart

49 lines
1.7 KiB
Dart

import 'dart:math';
import 'package:flutter_test/flutter_test.dart';
import 'package:friendly_map/modules/keys/src/shamir.dart';
void main() {
final secret = List<int>.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);
});
}