Skip to content

Commit 2438cc9

Browse files
committed
fail consistenly when ed25519 gem isn't loaded
1 parent ca0ab31 commit 2438cc9

File tree

4 files changed

+36
-6
lines changed

4 files changed

+36
-6
lines changed

lib/ssh_data/private_key/ed25519.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ class ED25519 < Base
77
#
88
# Returns a PublicKey::Base subclass instance.
99
def self.generate
10+
PublicKey::ED25519.ed25519_gem_required!
1011
from_ed25519(Ed25519::SigningKey.generate)
1112
end
1213

@@ -56,6 +57,7 @@ def initialize(algo:, pk:, sk:, comment:)
5657
#
5758
# Returns a binary String signature.
5859
def sign(signed_data, algo: nil)
60+
PublicKey::ED25519.ed25519_gem_required!
5961
algo ||= self.algo
6062
raise AlgorithmError unless algo == self.algo
6163
raw_sig = ed25519_key.sign(signed_data)

lib/ssh_data/public_key/ed25519.rb

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@ def self.enabled?
99
Object.const_defined?(:Ed25519)
1010
end
1111

12+
# Assert that the ed25519 gem has been loaded.
13+
#
14+
# Returns nothing, raises AlgorithmError.
15+
def self.ed25519_gem_required!
16+
raise AlgorithmError, "the ed25519 gem is not loaded" unless enabled?
17+
end
18+
1219
def initialize(algo:, pk:)
1320
unless algo == ALGO_ED25519
1421
raise DecodeError, "bad algorithm: #{algo.inspect}"
@@ -30,9 +37,7 @@ def initialize(algo:, pk:)
3037
#
3138
# Returns boolean.
3239
def verify(signed_data, signature)
33-
unless self.class.enabled?
34-
raise VerifyError, "the ed25519 gem isn't loadedd"
35-
end
40+
self.class.ed25519_gem_required!
3641

3742
sig_algo, raw_sig, _ = Encoding.decode_signature(signature)
3843
if sig_algo != ALGO_ED25519

spec/private_key/ed25519_spec.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,27 @@
7878
expect(keys.size).to eq(1)
7979
expect(keys.first).to be_an(SSHData::PrivateKey::ED25519)
8080
end
81+
82+
it "fails cleanly if the ed25519 gem hasn't been loaded" do
83+
backup = Object.send(:remove_const, :Ed25519)
84+
key = openssh_key.first
85+
86+
begin
87+
expect {
88+
expect(key.sk).not_to be_nil
89+
expect(key.pk).not_to be_nil
90+
expect(key.public_key).not_to be_nil
91+
}.not_to raise_error
92+
93+
expect {
94+
described_class.generate
95+
}.to raise_error(SSHData::AlgorithmError)
96+
97+
expect {
98+
key.sign(message)
99+
}.to raise_error(SSHData::AlgorithmError)
100+
ensure
101+
Object.const_set(:Ed25519, backup)
102+
end
103+
end
81104
end

spec/public_key/ed25519_spec.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,15 @@
6767

6868
it "fails cleanly if the ed25519 gem hasn't been loaded" do
6969
expect(described_class.enabled?).to be(true)
70-
backup = Object.send(:remove_const, :Ed25519)
71-
expect(described_class.enabled?).to be(false)
70+
backup = Object.send(:remove_const, :Ed25519)
71+
expect(described_class.enabled?).to be(false)
7272

7373
begin
7474
expect {
7575
SSHData::Certificate.parse_openssh(fixture("rsa_leaf_for_ed25519_ca-cert.pub"),
7676
unsafe_no_verify: false
7777
)
78-
}.to raise_error(SSHData::VerifyError)
78+
}.to raise_error(SSHData::AlgorithmError)
7979
ensure
8080
Object.const_set(:Ed25519, backup)
8181
end

0 commit comments

Comments
 (0)