Skip to content

Commit b9f3432

Browse files
q9fdebreczeni
andauthored
Fix private key immutability error when using OpenSSL 3.0 #64
* ci: enhance os/ruby matrix * gem: update deps * docs: happy new year * Fix private key immutability error when using OpenSSL 3.0 #64 Co-authored-by: David Debreczeni <[email protected]> * deps: force a specific gem config * ci: add openssl config * ci: condense matrix * ci: clean up Co-authored-by: David Debreczeni <[email protected]>
1 parent 36fc4be commit b9f3432

File tree

9 files changed

+42
-21
lines changed

9 files changed

+42
-21
lines changed

.github/workflows/code.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,18 @@ jobs:
2424
- ruby
2525
steps:
2626
- name: "Checkout repository"
27-
uses: actions/checkout@v2
27+
uses: actions/checkout@v3
2828
- name: "Initialize CodeQL"
29-
uses: github/codeql-action/init@v1
29+
uses: github/codeql-action/init@v2
3030
with:
3131
languages: "${{ matrix.language }}"
3232
- name: Autobuild
33-
uses: github/codeql-action/autobuild@v1
33+
uses: github/codeql-action/autobuild@v2
3434
- name: "Perform CodeQL Analysis"
35-
uses: github/codeql-action/analyze@v1
35+
uses: github/codeql-action/analyze@v2
3636
- uses: ruby/setup-ruby@v1
3737
with:
38-
ruby-version: '2.7'
38+
ruby-version: '3.0'
3939
bundler-cache: true
4040
- name: "Run rufo code formatting checks"
4141
run: |

.github/workflows/docs.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ jobs:
1313
- uses: actions/checkout@v2
1414
- uses: ruby/setup-ruby@v1
1515
with:
16-
ruby-version: '2.7'
16+
ruby-version: '3.0'
1717
bundler-cache: true
1818
- name: Run Yard Doc
1919
run: |
2020
gem install yard
2121
yard doc
2222
- name: Deploy GH Pages
23-
uses: JamesIves/github-pages-deploy-action@4.1.7
23+
uses: JamesIves/github-pages-deploy-action@4.4.1
2424
with:
2525
branch: gh-pages
2626
folder: doc/

.github/workflows/spec.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jobs:
1616
fail-fast: false
1717
matrix:
1818
os: [ubuntu-22.04, macos-12]
19-
ruby: ['2.7', '3.0', '3.1']
19+
ruby: ['3.0', '3.1', '3.2']
2020
steps:
2121
- uses: actions/checkout@v2
2222
- uses: ruby/setup-ruby@v1

Gemfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ group :test, :development do
55
gem "codecov", "~> 0.6"
66
gem "pry", "~> 0.14"
77
gem "rake", "~> 13.0"
8-
gem "rdoc", "~> 6.3"
9-
gem "rspec", "~> 3.10"
8+
gem "rdoc", "~> 6.5"
9+
gem "rspec", "~> 3.12"
1010
gem "rufo", "~> 0.13"
1111
gem "simplecov", "~> 0.21"
1212
gem "yard", "~> 0.9"

LICENSE.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Copyright (c) 2013-22 Micah Winkelspecht
1+
Copyright (c) 2013-23 Micah Winkelspecht
22

33
MIT License
44

config/openssl.conf

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
openssl_conf = openssl_init
2+
3+
[openssl_init]
4+
providers = provider_sect
5+
6+
[provider_sect]
7+
default = default_sect
8+
legacy = legacy_sect
9+
10+
[default_sect]
11+
activate = 1
12+
13+
[legacy_sect]
14+
activate = 1

lib/money-tree/key.rb

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,31 +39,38 @@ def to_i
3939
class PrivateKey < Key
4040
def initialize(opts = {})
4141
@options = opts
42-
@ec_key = PKey::EC.new GROUP_NAME
42+
generate
4343
if @options[:key]
4444
@raw_key = @options[:key]
4545
@key = parse_raw_key
4646
import
4747
else
48-
generate
4948
@key = to_hex
5049
end
5150
end
5251

5352
def generate
54-
ec_key.generate_key
53+
@ec_key = PKey::EC.generate GROUP_NAME
5554
end
5655

5756
def import
58-
ec_key.private_key = BN.new(key, 16)
59-
set_public_key
57+
@ec_key = OpenSSL::PKey::EC.new(data_sequence.to_der)
58+
end
59+
60+
def data_sequence
61+
OpenSSL::ASN1::Sequence([
62+
OpenSSL::ASN1::Integer(1),
63+
OpenSSL::ASN1::OctetString(OpenSSL::BN.new(key, 16).to_s(2)),
64+
OpenSSL::ASN1::ObjectId(GROUP_NAME, 0, :EXPLICIT),
65+
OpenSSL::ASN1::BitString(calculate_public_key.to_octet_string(:uncompressed), 1, :EXPLICIT),
66+
])
6067
end
6168

6269
def calculate_public_key(opts = {})
6370
opts[:compressed] = true unless opts[:compressed] == false
6471
group = ec_key.group
6572
group.point_conversion_form = opts[:compressed] ? :compressed : :uncompressed
66-
point = group.generator.mul ec_key.private_key
73+
point = group.generator.mul OpenSSL::BN.new(key, 16)
6774
end
6875

6976
def set_public_key(opts = {})

money-tree.gemspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,6 @@ Gem::Specification.new do |spec|
2828
spec.platform = Gem::Platform::RUBY
2929
spec.required_ruby_version = ">= 2.7", "< 4.0"
3030

31-
spec.add_dependency "openssl", "~> 3.0"
32-
spec.add_dependency "bech32", "~> 1.2"
31+
spec.add_dependency "openssl", "~> 3.1"
32+
spec.add_dependency "bech32", "~> 1.3"
3333
end

spec/money-tree/openssl_extensions_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
include MoneyTree::OpenSSLExtensions
2323

2424
context "with inputs" do
25-
let(:key1) { OpenSSL::PKey::EC.new("secp256k1").generate_key }
26-
let(:key2) { OpenSSL::PKey::EC.new("secp256k1").generate_key }
25+
let(:key1) { OpenSSL::PKey::EC.generate("secp256k1") }
26+
let(:key2) { OpenSSL::PKey::EC.generate("secp256k1") }
2727
let(:point_1) { key1.public_key }
2828
let(:point_2) { key2.public_key }
2929

0 commit comments

Comments
 (0)