class HDKEY::KeyRing

Public Class Methods

ckd_priv(keys, index, hardened_offset = HARDENED_TESTNET) click to toggle source
# File lib/ed25519-hd.rb, line 36
def self.ckd_priv(keys, index, hardened_offset = HARDENED_TESTNET)
  seed = [0, keys.private_key, (index + hardened_offset)].pack("CH64N").unpack("H*").first
  get_keys(seed, keys.chain_code)
end
derive_path(path, seed, hardened_offset = HARDENED_TESTNET) click to toggle source
# File lib/ed25519-hd.rb, line 50
def self.derive_path(path, seed, hardened_offset = HARDENED_TESTNET)
  raise "Invalid derivation path. Expected BIP32 format" if PATH_REGEX.match(path).nil?
  master_keys = get_master_key_from_seed(seed)
  path.gsub("'", "").split("/")[1..-1].map { |v| v.to_i }.reduce(master_keys) { |parent_keys, segment|
    ckd_priv(parent_keys, segment, hardened_offset)
  }
end
get_keys(seed, key) click to toggle source
# File lib/ed25519-hd.rb, line 23
def self.get_keys(seed, key)
  key = [key].pack("H*") unless key == ED25519_CURVE
  digest = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha512"), key, [seed].pack("H*"))
  private_key = digest[0..63]
  chain_code = digest[64..-1]

  Keys.new(private_key, chain_code)
end
get_master_key_from_seed(seed) click to toggle source
# File lib/ed25519-hd.rb, line 32
def self.get_master_key_from_seed(seed)
  get_keys(seed, ED25519_CURVE)
end
get_public_key(private_key, with_zero_byte = true) click to toggle source
# File lib/ed25519-hd.rb, line 41
def self.get_public_key(private_key, with_zero_byte = true)
  signing_key = Ed25519::SigningKey.new([private_key].pack("H*"))
  public_key = signing_key.keypair.unpack("H*").first[64..-1]
  if with_zero_byte
    public_key = [0, public_key].pack("CH64").unpack("H*").first
  end
  public_key
end