Skip to content

Commit 826dfe8

Browse files
committed
Improve specs and blind spots
1 parent 9e6c4d8 commit 826dfe8

File tree

18 files changed

+177
-40
lines changed

18 files changed

+177
-40
lines changed

lib/jwt/decode.rb

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,8 @@ def allowed_and_valid_algorithms
7777
:algorithms].freeze
7878

7979
def given_algorithms
80-
ALGORITHM_KEYS.each do |alg_key|
81-
alg = @options[alg_key]
82-
return Array(alg) if alg
83-
end
84-
[]
80+
alg_key = ALGORITHM_KEYS.find { |key| @options[key] }
81+
Array(@options[alg_key])
8582
end
8683

8784
def allowed_algorithms

lib/jwt/jwa/ecdsa.rb

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,6 @@ def verify(data:, signature:, verification_key:)
5656
register_algorithm(new(v[:algorithm], v[:digest]))
5757
end
5858

59-
def self.from_algorithm(algorithm)
60-
new(algorithm, algorithm.downcase.gsub('es', 'sha'))
61-
end
62-
6359
def self.curve_by_name(name)
6460
NAMED_CURVES.fetch(name) do
6561
raise UnsupportedEcdsaCurve, "The ECDSA curve '#{name}' is not supported"

lib/jwt/jwa/hmac.rb

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@ module JWA
66
class Hmac
77
include JWT::JWA::SigningAlgorithm
88

9-
def self.from_algorithm(algorithm)
10-
new(algorithm, OpenSSL::Digest.new(algorithm.downcase.gsub('hs', 'sha')))
11-
end
12-
139
def initialize(alg, digest)
1410
@alg = alg
1511
@digest = digest

lib/jwt/jwk/ec.rb

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,6 @@ def encode_octets(octets)
124124
::JWT::Base64.url_encode(octets)
125125
end
126126

127-
def encode_open_ssl_bn(key_part)
128-
::JWT::Base64.url_encode(key_part.to_s(BINARY))
129-
end
130-
131127
def parse_ec_key(key)
132128
crv, x_octets, y_octets = keypair_components(key)
133129
octets = key.private_key&.to_bn&.to_s(BINARY)

lib/jwt/jwk/rsa.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ def create_rsa_key_using_sets(rsa_parameters)
165165
end
166166
end
167167

168+
# :nocov:
169+
# Before openssl 2.0, we need to use the accessors to set the key
168170
def create_rsa_key_using_accessors(rsa_parameters) # rubocop:disable Metrics/AbcSize
169171
validate_rsa_parameters!(rsa_parameters)
170172

@@ -179,6 +181,7 @@ def create_rsa_key_using_accessors(rsa_parameters) # rubocop:disable Metrics/Abc
179181
rsa_key.iqmp = rsa_parameters[:qi] if rsa_parameters[:qi]
180182
end
181183
end
184+
# :nocov:
182185

183186
def validate_rsa_parameters!(rsa_parameters)
184187
return unless rsa_parameters.key?(:d)

spec/jwt/claims/verifier_spec.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# frozen_string_literal: true
2+
3+
RSpec.describe JWT::Claims::Verifier do
4+
describe '.verify!' do
5+
context 'when all claims are given' do
6+
let(:options) do
7+
[
8+
:exp,
9+
:nbf,
10+
{ iss: 'issuer' },
11+
:iat,
12+
:jti,
13+
{ aud: 'aud' },
14+
:sub,
15+
:crit,
16+
{ required: [] },
17+
:numeric
18+
]
19+
end
20+
21+
it 'verifies all claims' do
22+
token = SpecSupport::Token.new(payload: { 'iss' => 'issuer', 'jti' => 1, 'aud' => 'aud' }, header: { 'crit' => [] })
23+
expect(described_class.verify!(token, *options)).to eq(nil)
24+
end
25+
end
26+
end
27+
end

spec/jwt/jwa/none_spec.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# frozen_string_literal: true
2+
3+
RSpec.describe JWT::JWA::None do
4+
subject { described_class.new }
5+
6+
describe '#sign' do
7+
it 'returns an empty string' do
8+
expect(subject.sign('data', 'key')).to eq('')
9+
end
10+
end
11+
12+
describe '#verify' do
13+
it 'returns true' do
14+
expect(subject.verify('data', 'signature', 'key')).to be true
15+
end
16+
end
17+
end

spec/jwt/jwa/ps_spec.rb

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

33
RSpec.describe JWT::JWA::Ps do
4-
let(:rsa_key) { OpenSSL::PKey::RSA.generate(2048) }
4+
let(:rsa_key) { test_pkey('rsa-2048-private.pem') }
55
let(:data) { 'test data' }
66
let(:ps256_instance) { described_class.new('PS256') }
77
let(:ps384_instance) { described_class.new('PS384') }
@@ -44,7 +44,7 @@
4444
end
4545

4646
context 'with a key length less than 2048 bits' do
47-
let(:rsa_key) { OpenSSL::PKey::RSA.generate(1024) }
47+
let(:rsa_key) { OpenSSL::PKey::RSA.generate(2047) }
4848

4949
it 'raises an error' do
5050
expect do

spec/jwt/jwa/rsa_spec.rb

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

33
RSpec.describe JWT::JWA::Rsa do
4-
let(:rsa_key) { OpenSSL::PKey::RSA.generate(2048) }
4+
let(:rsa_key) { test_pkey('rsa-2048-private.pem') }
55
let(:data) { 'test data' }
66
let(:rsa_instance) { described_class.new('RS256') }
77

@@ -21,7 +21,7 @@
2121
end
2222

2323
context 'with a key length less than 2048 bits' do
24-
let(:rsa_key) { OpenSSL::PKey::RSA.generate(1024) }
24+
let(:rsa_key) { OpenSSL::PKey::RSA.generate(2047) }
2525

2626
it 'raises an error' do
2727
expect do

spec/jwt/jwa/unsupported_spec.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# frozen_string_literal: true
2+
3+
RSpec.describe JWT::JWA::Unsupported do
4+
describe '.sign' do
5+
it 'raises an error for unsupported signing method' do
6+
expect { described_class.sign('data', 'key') }.to raise_error(JWT::EncodeError, 'Unsupported signing method')
7+
end
8+
end
9+
10+
describe '.verify' do
11+
it 'raises an error for unsupported algorithm' do
12+
expect { described_class.verify('data', 'signature', 'key') }.to raise_error(JWT::VerificationError, 'Algorithm not supported')
13+
end
14+
end
15+
end

0 commit comments

Comments
 (0)