lib/sharing/polynomial/shamir/v1.rb in sharing-0.2.0 vs lib/sharing/polynomial/shamir/v1.rb in sharing-0.3.0

- old
+ new

@@ -67,10 +67,22 @@ def self.create_shares(secret, total_shares, threshold, lambda_, prime) random_coefficients = generate_random_coefficients(threshold, lambda_) (1..total_shares).map.with_index { |x, i| [i + 1, f(x, secret, random_coefficients) % prime] } end + def self.generate_division_masking(prime) + r1, r2 = random_distinct_numbers("integer", 2, prime.bit_length - 1) + r3 = (r2 * mod_inverse(r1, prime)) % prime + [r1, r2, r3] + end + + def self.compute_numerator_denominator(shares1, shares2, r1_, r2_, prime) + cs = shares1.map { |i, share| [i, (share * r1_) % prime] } + ds = shares2.map { |i, share| [i, (share * r2_) % prime] } + [cs, ds] + end + def initialize(params = {}) @lambda_ = params[:lambda_] @total_shares = params[:total_shares] @threshold = params[:threshold] generate_prime @@ -89,9 +101,15 @@ xs = points.map(&:first) ys = points.map(&:last) l0s = lagrange_basis_polynomial(xs) reconstructed_secret = l0s.zip(ys).map { |l, y| l * y }.sum % p encode_to_integer(reconstructed_secret) + end + + def reconstruct_division(cs_, ds_, r3_) + c, d = [cs_, ds_].map { |shares| reconstruct_secret(shares) } + c_d_encoded = (c * mod_inverse(d, p) * r3_) % p + HenselCode::TruncatedFinitePadicExpansion.new(p, 1, c_d_encoded).to_r end private def generate_prime