Sha256: cc1abc2d4be10ce0b7ff346fd1f3aeb03ca4584914329d7cc0197ba0551119dd

Contents?: true

Size: 1.46 KB

Versions: 4

Compression:

Stored size: 1.46 KB

Contents

require 'secretsharing'

module VaultTree
  module Crypto
    class AssembledShamirKey
      attr_reader :key_shares

      # Creates a new AssembledShamirKey object
      #
      # @param [Hash]
      # @option opts [Array] :key_shares Secret Shares as strings
      #
      # @return [AssembledShamirKey]
      def initialize(params)
        @key_shares = params[:key_shares]
        validate_key_shares
      end

      # Recovers the shared secret from the shares provided
      # in the initializer.
      #
      # @return [String] Secure Hash digest of the assembled secret
      def assemble
        LockSmith.new(message: assembled_secret).secure_hash
      end

      private

      def assembled_secret
        assemble_secret_object
        assembled_object_string
      end

      def assemble_secret_object
        key_shares.each { |s| assembled_object << s }
      end

      def assembled_object
        @assembled_object ||= SecretSharing::Shamir.new(total_key_shares)
      end

      def assembled_object_string
        assembled_object.secret.to_s
      end

      def total_key_shares
        key_shares.length
      end

      def validate_key_shares
        raise(TypeError, 'nil key_shares passed') if key_shares.nil?
        raise(TypeError) if any_none_string_key_shares?
      end

      def any_none_string_key_shares?
        key_shares.any? { |s| not_a_string?(s)}
      end

      def not_a_string?(s)
        ! s.kind_of?(String)
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
vault-tree-0.8.0 lib/vault-tree/lock_smith/assembled_shamir_key.rb
vault-tree-0.6.0 lib/vault-tree/lock_smith/assembled_shamir_key.rb
vault-tree-0.3.4 lib/vault-tree/lock_smith/assembled_shamir_key.rb
vault-tree-0.3.3 lib/vault-tree/lock_smith/assembled_shamir_key.rb