string representation of shares
[secretsharing.git] / test / test_shamir.rb
blobfb88712949a57df93a908690a3afc6578856ea4b
1 require 'test/unit'
2 require 'lib/secretsharing/shamir'
4 DEFAULT_SECRET_BITLENGTH = 256
6 class TestShamir < Test::Unit::TestCase
7         def test_instantiation
8                 assert_raise( ArgumentError ) { SecretSharing::Shamir.new }
9                 s1 = SecretSharing::Shamir.new(5)
10                 assert_equal(5, s1.n)
11                 assert_equal(5, s1.k)
12                 assert(! s1.secret_set?)
13                 s2 = SecretSharing::Shamir.new(5, 3)
14                 assert_equal(5, s2.n)
15                 assert_equal(3, s2.k)
16                 assert(! s2.secret_set?)
17                 assert_raise( ArgumentError ) { SecretSharing::Shamir.new(5, 7) }
18                 assert_raise( ArgumentError ) { SecretSharing::Shamir.new(1) }
19         end
21         def test_create_random_secret
22                 s = SecretSharing::Shamir.new(5)
23                 s.create_random_secret()
24                 assert(s.secret_set?)
25                 assert_not_nil(s.secret)
26                 assert_not_nil(s.shares)
27                 assert_equal(Array, s.shares.class)
28                 assert_equal(5, s.shares.length)
29                 assert_equal(SecretSharing::Shamir::Share, s.shares[0].class)
30                 assert_equal(DEFAULT_SECRET_BITLENGTH, s.secret_bitlength)
32                 # can only be called once
33                 assert_raise( RuntimeError) { s.create_random_secret() }
35                 s2 = SecretSharing::Shamir.new(7)
36                 s2.create_random_secret(512)
37                 assert_equal(512, s2.secret_bitlength)
38         end
40         def test_recover_secret_k_eq_n
41                 s = SecretSharing::Shamir.new(5)
42                 s.create_random_secret()
43                 
44                 s2 = SecretSharing::Shamir.new(5)
45                 s2 << s.shares[0]
46                 assert(! s2.secret_set?)
47                 assert_nil(s2.secret)
48                 # adding the same share raises an error
49                 assert_raise( RuntimeError ) { s2 << s.shares[0] }
50                 # add more shares
51                 s2 << s.shares[1]
52                 assert(! s2.secret_set?)
53                 s2 << s.shares[2]
54                 assert(! s2.secret_set?)
55                 s2 << s.shares[3]
56                 assert(! s2.secret_set?)
57                 s2 << s.shares[4]
58                 assert(s2.secret_set?)
59                 assert_equal(s.secret, s2.secret)
60         end
62         def test_recover_secret_k_le_n
63                 s = SecretSharing::Shamir.new(5, 3)
64                 s.create_random_secret()
65                 
66                 s2 = SecretSharing::Shamir.new(5, 3)
67                 s2 << s.shares[0]
68                 assert(! s2.secret_set?)
69                 assert_nil(s2.secret)
70                 # add more shares
71                 s2 << s.shares[1]
72                 assert(! s2.secret_set?)
73                 s2 << s.shares[2]
74                 assert(s2.secret_set?)
75                 assert_equal(s.secret, s2.secret)
77                 # adding more shares than needed raises an error
78                 assert_raise( RuntimeError ) { s2 << s.shares[3] }
79         end     
81         def test_recover_secret_k_le_n_strings
82                 s = SecretSharing::Shamir.new(5, 3)
83                 s.create_random_secret()
84                 
85                 s2 = SecretSharing::Shamir.new(5, 3)
86                 s2 << "#{s.shares[0]}"
87                 assert(! s2.secret_set?)
88                 assert_nil(s2.secret)
89                 # add more shares
90                 s2 << "#{s.shares[1]}"
91                 assert(! s2.secret_set?)
92                 s2 << s.shares[2].to_s
93                 assert(s2.secret_set?)
94                 assert_equal(s.secret, s2.secret)
96                 # adding more shares than needed raises an error
97                 assert_raise( RuntimeError ) { s2 << s.shares[3] }
98         end     
99 end