Skip to content

Commit b86aaae

Browse files
committed
Add support for OpenSSL 3.0
Fixes #4 `ECDSA::SigningKey` and `RSA::SigningKey` are changed to wrap the OpenSSL PKey classes instead of inheriting them, because there seem to be no way with version 3.0.0 of the `openssl` gem to generate such PKeys without using a `.generate` factory method.
1 parent 5bf43cd commit b86aaae

File tree

4 files changed

+37
-10
lines changed

4 files changed

+37
-10
lines changed

Gemfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ PATH
22
remote: .
33
specs:
44
openssl-signature_algorithm (1.1.1)
5-
openssl (~> 2.0)
5+
openssl (> 2.0, < 3.1)
66

77
GEM
88
remote: https://rubygems.org/
@@ -16,7 +16,7 @@ GEM
1616
diff-lcs (1.3)
1717
ed25519 (1.2.4)
1818
jaro_winkler (1.5.4)
19-
openssl (2.2.0)
19+
openssl (3.0.0)
2020
parallel (1.19.1)
2121
parser (2.7.0.5)
2222
ast (~> 2.4.0)

lib/openssl/signature_algorithm/ecdsa.rb

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# frozen_string_literal: true
22

3+
require "forwardable"
34
require "openssl"
45
require "openssl/signature_algorithm/base"
56

@@ -8,9 +9,15 @@ module SignatureAlgorithm
89
class ECDSA < Base
910
BYTE_LENGTH = 8
1011

11-
class SigningKey < OpenSSL::PKey::EC
12+
class SigningKey
13+
extend Forwardable
14+
15+
def_delegators :@pkey, :sign, :verify
16+
def_delegators :@pkey, :public_key, :private_key, :to_pem, :to_der, :public?, :private?, :export, :to_s
17+
def_delegators :@pkey, :group, :check_key, :dh_compute_key, :dsa_sign_asn1, :dsa_verify_asn1
18+
1219
def initialize(*args)
13-
super(*args).generate_key
20+
@pkey = OpenSSL::PKey::EC.generate(*args)
1421
end
1522

1623
def verify_key
@@ -30,10 +37,16 @@ def serialize
3037
def ec_key
3138
@ec_key ||=
3239
begin
33-
ec_key = OpenSSL::PKey::EC.new(group)
34-
ec_key.public_key = self
35-
36-
ec_key
40+
# RFC5480 SubjectPublicKeyInfo
41+
asn1 = OpenSSL::ASN1::Sequence([
42+
OpenSSL::ASN1::Sequence([
43+
OpenSSL::ASN1::ObjectId("id-ecPublicKey"),
44+
OpenSSL::ASN1::ObjectId(group.curve_name),
45+
]),
46+
OpenSSL::ASN1::BitString(to_octet_string(:uncompressed))
47+
])
48+
49+
OpenSSL::PKey::EC.new(asn1.to_der)
3750
end
3851
end
3952

lib/openssl/signature_algorithm/rsa.rb

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,26 @@
11
# frozen_string_literal: true
22

3+
require "forwardable"
34
require "openssl"
45
require "openssl/signature_algorithm/base"
56

67
module OpenSSL
78
module SignatureAlgorithm
89
class RSA < Base
9-
class SigningKey < OpenSSL::PKey::RSA
10+
class SigningKey
11+
extend Forwardable
12+
13+
def_delegators :@pkey, :sign, :verify
14+
def_delegators :@pkey, :public_key, :private_key, :to_pem, :to_der, :public?, :private?, :export, :to_s
15+
def_delegators :@pkey, :public_encrypt, :public_decrypt, :private_encrypt, :private_decrypt
16+
def_delegators :@pkey, :sign_pss, :verify_pss
17+
def_delegators :@pkey, :blinding_off!, :blinding_on!
18+
def_delegators :@pkey, :params, :to_text
19+
20+
def initialize(*args)
21+
@pkey = OpenSSL::PKey::RSA.generate(*args)
22+
end
23+
1024
def verify_key
1125
VerifyKey.new(public_key.to_pem)
1226
end

openssl-signature_algorithm.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,5 @@ Gem::Specification.new do |spec|
2828
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
2929
spec.require_paths = ["lib"]
3030

31-
spec.add_runtime_dependency "openssl", "~> 2.0"
31+
spec.add_runtime_dependency "openssl", "> 2.0", "< 3.1"
3232
end

0 commit comments

Comments
 (0)