ed25519-hd-rb 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/ed25519-hd.rb +58 -0
  3. metadata +105 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f7ea971134d01534dce4ad3021eb890f57d2a3069446c8a9d84bb52562de9b4a
4
+ data.tar.gz: e77cf7df6ebf579339239212e7e002688056eff0a315a2c4d0500f3b1109de56
5
+ SHA512:
6
+ metadata.gz: cd3fc7f08a81dca4adc95354ad5e390d89d5524880dcbb81295e59ffc2c05cc5f1410b9fa6285a5085f5777ae342aee992fe1927183e910c4bf5f69e74ca63b5
7
+ data.tar.gz: 398e25adbaac3c380f201d67eb6aae5dcf6d4fc1829dd6b5fb124c7a9569851ec48cbbcfe153e92d18c04aa0f47ed3e44dae207c689920689cbebee63e81c112
data/lib/ed25519-hd.rb ADDED
@@ -0,0 +1,58 @@
1
+ require "ed25519"
2
+ require "openssl"
3
+
4
+ module HDKEY
5
+ ED25519_CURVE = "ed25519 seed"
6
+
7
+ HARDENED_TESTNET = 0x80000001
8
+ HARDENED_BITCOIN = 0x80000000
9
+ HARDENED_AXENTRO = 0x80000276
10
+ PATH_REGEX = /^(m\/)?(\d+'?\/)*\d+'?$/
11
+
12
+ class Keys
13
+ attr_reader :private_key
14
+ attr_reader :chain_code
15
+
16
+ def initialize(private_key, chain_code)
17
+ @private_key = private_key
18
+ @chain_code = chain_code
19
+ end
20
+ end
21
+
22
+ class KeyRing
23
+ def self.get_keys(seed, key)
24
+ key = [key].pack("H*") unless key == ED25519_CURVE
25
+ digest = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha512"), key, [seed].pack("H*"))
26
+ private_key = digest[0..63]
27
+ chain_code = digest[64..-1]
28
+
29
+ Keys.new(private_key, chain_code)
30
+ end
31
+
32
+ def self.get_master_key_from_seed(seed)
33
+ get_keys(seed, ED25519_CURVE)
34
+ end
35
+
36
+ def self.ckd_priv(keys, index, hardened_offset = HARDENED_TESTNET)
37
+ seed = [0, keys.private_key, (index + hardened_offset)].pack("CH64N").unpack("H*").first
38
+ get_keys(seed, keys.chain_code)
39
+ end
40
+
41
+ def self.get_public_key(private_key, with_zero_byte = true)
42
+ signing_key = Ed25519::SigningKey.new([private_key].pack("H*"))
43
+ public_key = signing_key.keypair.unpack("H*").first[64..-1]
44
+ if with_zero_byte
45
+ public_key = [0, public_key].pack("CH64").unpack("H*").first
46
+ end
47
+ public_key
48
+ end
49
+
50
+ def self.derive_path(path, seed, hardened_offset = HARDENED_TESTNET)
51
+ raise "Invalid derivation path. Expected BIP32 format" if PATH_REGEX.match(path).nil?
52
+ master_keys = get_master_key_from_seed(seed)
53
+ path.gsub("'", "").split("/")[1..-1].map { |v| v.to_i }.reduce(master_keys) { |parent_keys, segment|
54
+ ckd_priv(parent_keys, segment, hardened_offset)
55
+ }
56
+ end
57
+ end
58
+ end
metadata ADDED
@@ -0,0 +1,105 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ed25519-hd-rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Kingsley Hendrickse
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-04-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ed25519
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.2'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.2.4
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.2'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.2.4
33
+ - !ruby/object:Gem::Dependency
34
+ name: bundler
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.3'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.3'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rspec
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ description: Ruby hd key derivation for ED25519
76
+ email: kingsley@axentro.io
77
+ executables: []
78
+ extensions: []
79
+ extra_rdoc_files: []
80
+ files:
81
+ - lib/ed25519-hd.rb
82
+ homepage: https://rubygems.org/gems/ed25519-hd-rb
83
+ licenses:
84
+ - MIT
85
+ metadata: {}
86
+ post_install_message:
87
+ rdoc_options: []
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubygems_version: 3.1.4
102
+ signing_key:
103
+ specification_version: 4
104
+ summary: HD key derivation for ED25519
105
+ test_files: []