jwt 2.10.0 → 3.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,8 +2,13 @@
2
2
 
3
3
  module JWT
4
4
  module JWK
5
- # @api private
5
+ # JSON Web Key keyfinder
6
+ # To find the key for a given kid
6
7
  class KeyFinder
8
+ # Initializes a new KeyFinder instance.
9
+ # @param [Hash] options the options to create a KeyFinder with
10
+ # @option options [Proc, JWT::JWK::Set] :jwks the jwks or a loader proc
11
+ # @option options [Boolean] :allow_nil_kid whether to allow nil kid
7
12
  def initialize(options)
8
13
  @allow_nil_kid = options[:allow_nil_kid]
9
14
  jwks_or_loader = options[:jwks]
@@ -15,6 +20,8 @@ module JWT
15
20
  end
16
21
  end
17
22
 
23
+ # Returns the verification key for the given kid
24
+ # @param [String] kid the key id
18
25
  def key_for(kid)
19
26
  raise ::JWT::DecodeError, 'No key id (kid) found from token headers' unless kid || @allow_nil_kid
20
27
  raise ::JWT::DecodeError, 'Invalid type for kid header parameter' unless kid.nil? || kid.is_a?(String)
@@ -27,6 +34,12 @@ module JWT
27
34
  jwk.verify_key
28
35
  end
29
36
 
37
+ # Returns the key for the given token
38
+ # @param [JWT::EncodedToken] token the token
39
+ def call(token)
40
+ key_for(token.header['kid'])
41
+ end
42
+
30
43
  private
31
44
 
32
45
  def resolve_key(kid)
data/lib/jwt/jwk/rsa.rb CHANGED
@@ -165,6 +165,8 @@ module JWT
165
165
  end
166
166
  end
167
167
 
168
+ # :nocov:
169
+ # Before openssl 2.0, we need to use the accessors to set the key
168
170
  def create_rsa_key_using_accessors(rsa_parameters) # rubocop:disable Metrics/AbcSize
169
171
  validate_rsa_parameters!(rsa_parameters)
170
172
 
@@ -179,6 +181,7 @@ module JWT
179
181
  rsa_key.iqmp = rsa_parameters[:qi] if rsa_parameters[:qi]
180
182
  end
181
183
  end
184
+ # :nocov:
182
185
 
183
186
  def validate_rsa_parameters!(rsa_parameters)
184
187
  return unless rsa_parameters.key?(:d)
data/lib/jwt/jwk.rb CHANGED
@@ -53,4 +53,3 @@ require_relative 'jwk/key_base'
53
53
  require_relative 'jwk/ec'
54
54
  require_relative 'jwk/rsa'
55
55
  require_relative 'jwk/hmac'
56
- require_relative 'jwk/okp_rbnacl' if JWT.rbnacl?
data/lib/jwt/token.rb CHANGED
@@ -15,8 +15,6 @@ module JWT
15
15
  # token.header # => {"custom"=>"value", "alg"=>"HS256"}
16
16
  #
17
17
  class Token
18
- include Claims::VerificationMethods
19
-
20
18
  # Initializes a new Token instance.
21
19
  #
22
20
  # @param header [Hash] the header of the JWT token.
@@ -97,13 +95,34 @@ module JWT
97
95
  raise ::JWT::EncodeError, 'Token already signed' if @signature
98
96
 
99
97
  JWA.resolve(algorithm).tap do |algo|
100
- header.merge!(algo.header)
98
+ header.merge!(algo.header) { |_key, old, _new| old }
101
99
  @signature = algo.sign(data: signing_input, signing_key: key)
102
100
  end
103
101
 
104
102
  nil
105
103
  end
106
104
 
105
+ # Verifies the claims of the token.
106
+ # @param options [Array<Symbol>, Hash] the claims to verify.
107
+ # @raise [JWT::DecodeError] if the claims are invalid.
108
+ def verify_claims!(*options)
109
+ Claims::Verifier.verify!(self, *options)
110
+ end
111
+
112
+ # Returns the errors of the claims of the token.
113
+ # @param options [Array<Symbol>, Hash] the claims to verify.
114
+ # @return [Array<Symbol>] the errors of the claims.
115
+ def claim_errors(*options)
116
+ Claims::Verifier.errors(self, *options)
117
+ end
118
+
119
+ # Returns whether the claims of the token are valid.
120
+ # @param options [Array<Symbol>, Hash] the claims to verify.
121
+ # @return [Boolean] whether the claims are valid.
122
+ def valid_claims?(*options)
123
+ claim_errors(*options).empty?
124
+ end
125
+
107
126
  # Returns the JWT token as a string.
108
127
  #
109
128
  # @return [String] the JWT token as a string.
data/lib/jwt/version.rb CHANGED
@@ -12,16 +12,14 @@ module JWT
12
12
  Gem::Version.new(VERSION::STRING)
13
13
  end
14
14
 
15
- # @api private
15
+ # Version constants
16
16
  module VERSION
17
- MAJOR = 2
18
- MINOR = 10
17
+ MAJOR = 3
18
+ MINOR = 0
19
19
  TINY = 0
20
- PRE = nil
20
+ PRE = 'beta1'
21
21
 
22
22
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
23
-
24
- private_constant(:MAJOR, :MINOR, :TINY, :PRE)
25
23
  end
26
24
 
27
25
  # Checks if the OpenSSL version is 3 or greater.
@@ -34,22 +32,6 @@ module JWT
34
32
  true if 3 * 0x10000000 <= OpenSSL::OPENSSL_VERSION_NUMBER
35
33
  end
36
34
 
37
- # Checks if the RbNaCl library is defined.
38
- #
39
- # @return [Boolean] true if RbNaCl is defined, false otherwise.
40
- # @api private
41
- def self.rbnacl?
42
- defined?(::RbNaCl)
43
- end
44
-
45
- # Checks if the RbNaCl library version is 6.0.0 or greater.
46
- #
47
- # @return [Boolean] true if RbNaCl version is 6.0.0 or greater, false otherwise.
48
- # @api private
49
- def self.rbnacl_6_or_greater?
50
- rbnacl? && ::Gem::Version.new(::RbNaCl::VERSION) >= ::Gem::Version.new('6.0.0')
51
- end
52
-
53
35
  # Checks if there is an OpenSSL 3 HMAC empty key regression.
54
36
  #
55
37
  # @return [Boolean] true if there is an OpenSSL 3 HMAC empty key regression, false otherwise.
data/lib/jwt.rb CHANGED
@@ -5,7 +5,6 @@ require 'jwt/base64'
5
5
  require 'jwt/json'
6
6
  require 'jwt/decode'
7
7
  require 'jwt/configuration'
8
- require 'jwt/deprecations'
9
8
  require 'jwt/encode'
10
9
  require 'jwt/error'
11
10
  require 'jwt/jwk'
@@ -13,9 +12,6 @@ require 'jwt/claims'
13
12
  require 'jwt/encoded_token'
14
13
  require 'jwt/token'
15
14
 
16
- require 'jwt/claims_validator'
17
- require 'jwt/verify'
18
-
19
15
  # JSON Web Token implementation
20
16
  #
21
17
  # Should be up to date with the latest spec:
@@ -47,8 +43,6 @@ module JWT
47
43
  # @param options [Hash] additional options for decoding.
48
44
  # @return [Array<Hash>] the decoded payload and headers.
49
45
  def decode(jwt, key = nil, verify = true, options = {}, &keyfinder) # rubocop:disable Style/OptionalBooleanParameter
50
- Deprecations.context do
51
- Decode.new(jwt, key, verify, configuration.decode.to_h.merge(options), &keyfinder).decode_segments
52
- end
46
+ Decode.new(jwt, key, verify, configuration.decode.to_h.merge(options), &keyfinder).decode_segments
53
47
  end
54
48
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jwt
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.10.0
4
+ version: 3.0.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Rudat
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-12-25 00:00:00.000000000 Z
10
+ date: 2025-01-25 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: base64
@@ -121,6 +120,7 @@ files:
121
120
  - CONTRIBUTING.md
122
121
  - LICENSE
123
122
  - README.md
123
+ - UPGRADING.md
124
124
  - lib/jwt.rb
125
125
  - lib/jwt/base64.rb
126
126
  - lib/jwt/claims.rb
@@ -135,44 +135,34 @@ files:
135
135
  - lib/jwt/claims/numeric.rb
136
136
  - lib/jwt/claims/required.rb
137
137
  - lib/jwt/claims/subject.rb
138
- - lib/jwt/claims/verification_methods.rb
139
138
  - lib/jwt/claims/verifier.rb
140
- - lib/jwt/claims_validator.rb
141
139
  - lib/jwt/configuration.rb
142
140
  - lib/jwt/configuration/container.rb
143
141
  - lib/jwt/configuration/decode_configuration.rb
144
142
  - lib/jwt/configuration/jwk_configuration.rb
145
143
  - lib/jwt/decode.rb
146
- - lib/jwt/deprecations.rb
147
144
  - lib/jwt/encode.rb
148
145
  - lib/jwt/encoded_token.rb
149
146
  - lib/jwt/error.rb
150
147
  - lib/jwt/json.rb
151
148
  - lib/jwt/jwa.rb
152
- - lib/jwt/jwa/compat.rb
153
149
  - lib/jwt/jwa/ecdsa.rb
154
- - lib/jwt/jwa/eddsa.rb
155
150
  - lib/jwt/jwa/hmac.rb
156
- - lib/jwt/jwa/hmac_rbnacl.rb
157
- - lib/jwt/jwa/hmac_rbnacl_fixed.rb
158
151
  - lib/jwt/jwa/none.rb
159
152
  - lib/jwt/jwa/ps.rb
160
153
  - lib/jwt/jwa/rsa.rb
161
154
  - lib/jwt/jwa/signing_algorithm.rb
162
155
  - lib/jwt/jwa/unsupported.rb
163
- - lib/jwt/jwa/wrapper.rb
164
156
  - lib/jwt/jwk.rb
165
157
  - lib/jwt/jwk/ec.rb
166
158
  - lib/jwt/jwk/hmac.rb
167
159
  - lib/jwt/jwk/key_base.rb
168
160
  - lib/jwt/jwk/key_finder.rb
169
161
  - lib/jwt/jwk/kid_as_key_digest.rb
170
- - lib/jwt/jwk/okp_rbnacl.rb
171
162
  - lib/jwt/jwk/rsa.rb
172
163
  - lib/jwt/jwk/set.rb
173
164
  - lib/jwt/jwk/thumbprint.rb
174
165
  - lib/jwt/token.rb
175
- - lib/jwt/verify.rb
176
166
  - lib/jwt/version.rb
177
167
  - lib/jwt/x5c_key_finder.rb
178
168
  - ruby-jwt.gemspec
@@ -181,9 +171,8 @@ licenses:
181
171
  - MIT
182
172
  metadata:
183
173
  bug_tracker_uri: https://github.com/jwt/ruby-jwt/issues
184
- changelog_uri: https://github.com/jwt/ruby-jwt/blob/v2.10.0/CHANGELOG.md
174
+ changelog_uri: https://github.com/jwt/ruby-jwt/blob/v3.0.0.beta1/CHANGELOG.md
185
175
  rubygems_mfa_required: 'true'
186
- post_install_message:
187
176
  rdoc_options: []
188
177
  require_paths:
189
178
  - lib
@@ -198,8 +187,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
198
187
  - !ruby/object:Gem::Version
199
188
  version: '0'
200
189
  requirements: []
201
- rubygems_version: 3.5.22
202
- signing_key:
190
+ rubygems_version: 3.6.2
203
191
  specification_version: 4
204
192
  summary: JSON Web Token implementation in Ruby
205
193
  test_files: []
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JWT
4
- module Claims
5
- # @api private
6
- module VerificationMethods
7
- def verify_claims!(*options)
8
- Verifier.verify!(self, *options)
9
- end
10
-
11
- def claim_errors(*options)
12
- Verifier.errors(self, *options)
13
- end
14
-
15
- def valid_claims?(*options)
16
- claim_errors(*options).empty?
17
- end
18
- end
19
- end
20
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JWT
4
- # @deprecated Use `Claims.verify_payload!` directly instead.
5
- class ClaimsValidator
6
- # @deprecated Use `Claims.verify_payload!` directly instead.
7
- def initialize(payload)
8
- Deprecations.warning('The ::JWT::ClaimsValidator class is deprecated and will be removed in the next major version of ruby-jwt')
9
- @payload = payload
10
- end
11
-
12
- # @deprecated Use `Claims.verify_payload!` directly instead.
13
- def validate!
14
- Claims.verify_payload!(@payload, :numeric)
15
- true
16
- end
17
- end
18
- end
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JWT
4
- # Deprecations module to handle deprecation warnings in the gem
5
- # @api private
6
- module Deprecations
7
- class << self
8
- def context
9
- yield.tap { emit_warnings }
10
- ensure
11
- Thread.current[:jwt_warning_store] = nil
12
- end
13
-
14
- def warning(message, only_if_valid: false)
15
- method_name = only_if_valid ? :store : :warn
16
- case JWT.configuration.deprecation_warnings
17
- when :once
18
- return if record_warned(message)
19
- when :warn
20
- # noop
21
- else
22
- return
23
- end
24
-
25
- send(method_name, "[DEPRECATION WARNING] #{message}")
26
- end
27
-
28
- def store(message)
29
- (Thread.current[:jwt_warning_store] ||= []) << message
30
- end
31
-
32
- def emit_warnings
33
- return if Thread.current[:jwt_warning_store].nil?
34
-
35
- Thread.current[:jwt_warning_store].each { |warning| warn(warning) }
36
- end
37
-
38
- private
39
-
40
- def record_warned(message)
41
- @warned ||= []
42
- return true if @warned.include?(message)
43
-
44
- @warned << message
45
- false
46
- end
47
- end
48
- end
49
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JWT
4
- module JWA
5
- # Provides backwards compatibility for algorithms
6
- # @api private
7
- module Compat
8
- # @api private
9
- module ClassMethods
10
- def from_algorithm(algorithm)
11
- new(algorithm)
12
- end
13
-
14
- def sign(algorithm, msg, key)
15
- Deprecations.warning('Support for calling sign with positional arguments will be removed in future ruby-jwt versions')
16
-
17
- from_algorithm(algorithm).sign(data: msg, signing_key: key)
18
- end
19
-
20
- def verify(algorithm, key, signing_input, signature)
21
- Deprecations.warning('Support for calling verify with positional arguments will be removed in future ruby-jwt versions')
22
-
23
- from_algorithm(algorithm).verify(data: signing_input, signature: signature, verification_key: key)
24
- end
25
- end
26
-
27
- def self.included(klass)
28
- klass.extend(ClassMethods)
29
- end
30
- end
31
- end
32
- end
data/lib/jwt/jwa/eddsa.rb DELETED
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JWT
4
- module JWA
5
- # Implementation of the EdDSA family of algorithms
6
- class Eddsa
7
- include JWT::JWA::SigningAlgorithm
8
-
9
- def initialize(alg)
10
- @alg = alg
11
- end
12
-
13
- def sign(data:, signing_key:)
14
- raise_sign_error!("Key given is a #{signing_key.class} but has to be an RbNaCl::Signatures::Ed25519::SigningKey") unless signing_key.is_a?(RbNaCl::Signatures::Ed25519::SigningKey)
15
-
16
- Deprecations.warning('Using Ed25519 keys is deprecated and will be removed in a future version of ruby-jwt. Please use the ruby-eddsa gem instead.')
17
-
18
- signing_key.sign(data)
19
- end
20
-
21
- def verify(data:, signature:, verification_key:)
22
- raise_verify_error!("key given is a #{verification_key.class} but has to be a RbNaCl::Signatures::Ed25519::VerifyKey") unless verification_key.is_a?(RbNaCl::Signatures::Ed25519::VerifyKey)
23
-
24
- Deprecations.warning('Using Ed25519 keys is deprecated and will be removed in a future version of ruby-jwt. Please use the ruby-eddsa gem instead.')
25
-
26
- verification_key.verify(signature, data)
27
- rescue RbNaCl::CryptoError
28
- false
29
- end
30
-
31
- register_algorithm(new('ED25519'))
32
- register_algorithm(new('EdDSA'))
33
- end
34
- end
35
- end
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JWT
4
- module JWA
5
- # Implementation of the HMAC family of algorithms (using RbNaCl)
6
- class HmacRbNaCl
7
- include JWT::JWA::SigningAlgorithm
8
-
9
- def self.from_algorithm(algorithm)
10
- new(algorithm, ::RbNaCl::HMAC.const_get(algorithm.upcase.gsub('HS', 'SHA')))
11
- end
12
-
13
- def initialize(alg, hmac)
14
- @alg = alg
15
- @hmac = hmac
16
- end
17
-
18
- def sign(data:, signing_key:)
19
- Deprecations.warning("The use of the algorithm #{alg} is deprecated and will be removed in the next major version of ruby-jwt")
20
- hmac.auth(key_for_rbnacl(hmac, signing_key).encode('binary'), data.encode('binary'))
21
- end
22
-
23
- def verify(data:, signature:, verification_key:)
24
- Deprecations.warning("The use of the algorithm #{alg} is deprecated and will be removed in the next major version of ruby-jwt")
25
- hmac.verify(key_for_rbnacl(hmac, verification_key).encode('binary'), signature.encode('binary'), data.encode('binary'))
26
- rescue ::RbNaCl::BadAuthenticatorError, ::RbNaCl::LengthError
27
- false
28
- end
29
-
30
- register_algorithm(new('HS512256', ::RbNaCl::HMAC::SHA512256))
31
-
32
- private
33
-
34
- attr_reader :hmac
35
-
36
- def key_for_rbnacl(hmac, key)
37
- key ||= ''
38
- raise JWT::DecodeError, 'HMAC key expected to be a String' unless key.is_a?(String)
39
-
40
- return padded_empty_key(hmac.key_bytes) if key == ''
41
-
42
- key
43
- end
44
-
45
- def padded_empty_key(length)
46
- Array.new(length, 0x0).pack('C*').encode('binary')
47
- end
48
- end
49
- end
50
- end
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JWT
4
- module JWA
5
- # Implementation of the HMAC family of algorithms (using RbNaCl prior to a certain version)
6
- class HmacRbNaClFixed
7
- include JWT::JWA::SigningAlgorithm
8
-
9
- def self.from_algorithm(algorithm)
10
- new(algorithm, ::RbNaCl::HMAC.const_get(algorithm.upcase.gsub('HS', 'SHA')))
11
- end
12
-
13
- def initialize(alg, hmac)
14
- @alg = alg
15
- @hmac = hmac
16
- end
17
-
18
- def sign(data:, signing_key:)
19
- signing_key ||= ''
20
- Deprecations.warning("The use of the algorithm #{alg} is deprecated and will be removed in the next major version of ruby-jwt")
21
- raise JWT::DecodeError, 'HMAC key expected to be a String' unless signing_key.is_a?(String)
22
-
23
- hmac.auth(padded_key_bytes(signing_key, hmac.key_bytes), data.encode('binary'))
24
- end
25
-
26
- def verify(data:, signature:, verification_key:)
27
- verification_key ||= ''
28
- Deprecations.warning("The use of the algorithm #{alg} is deprecated and will be removed in the next major version of ruby-jwt")
29
- raise JWT::DecodeError, 'HMAC key expected to be a String' unless verification_key.is_a?(String)
30
-
31
- hmac.verify(padded_key_bytes(verification_key, hmac.key_bytes), signature.encode('binary'), data.encode('binary'))
32
- rescue ::RbNaCl::BadAuthenticatorError, ::RbNaCl::LengthError
33
- false
34
- end
35
-
36
- register_algorithm(new('HS512256', ::RbNaCl::HMAC::SHA512256))
37
-
38
- private
39
-
40
- attr_reader :hmac
41
-
42
- def padded_key_bytes(key, bytesize)
43
- key.bytes.fill(0, key.bytesize...bytesize).pack('C*')
44
- end
45
- end
46
- end
47
- end
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JWT
4
- module JWA
5
- # @api private
6
- class Wrapper
7
- include SigningAlgorithm
8
-
9
- def initialize(algorithm)
10
- @algorithm = algorithm
11
- end
12
-
13
- def alg
14
- return @algorithm.alg if @algorithm.respond_to?(:alg)
15
-
16
- super
17
- end
18
-
19
- def valid_alg?(alg_to_check)
20
- return @algorithm.valid_alg?(alg_to_check) if @algorithm.respond_to?(:valid_alg?)
21
-
22
- super
23
- end
24
-
25
- def header(*args, **kwargs)
26
- return @algorithm.header(*args, **kwargs) if @algorithm.respond_to?(:header)
27
-
28
- super
29
- end
30
-
31
- def sign(*args, **kwargs)
32
- return @algorithm.sign(*args, **kwargs) if @algorithm.respond_to?(:sign)
33
-
34
- super
35
- end
36
-
37
- def verify(*args, **kwargs)
38
- return @algorithm.verify(*args, **kwargs) if @algorithm.respond_to?(:verify)
39
-
40
- super
41
- end
42
- end
43
- end
44
- end
@@ -1,109 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module JWT
4
- module JWK
5
- # JSON Web Key (JWK) representation for Ed25519 keys
6
- class OKPRbNaCl < KeyBase
7
- KTY = 'OKP'
8
- KTYS = [KTY, JWT::JWK::OKPRbNaCl, RbNaCl::Signatures::Ed25519::SigningKey, RbNaCl::Signatures::Ed25519::VerifyKey].freeze
9
- OKP_PUBLIC_KEY_ELEMENTS = %i[kty n x].freeze
10
- OKP_PRIVATE_KEY_ELEMENTS = %i[d].freeze
11
-
12
- def initialize(key, params = nil, options = {})
13
- params ||= {}
14
- Deprecations.warning('Using the OKP JWK for Ed25519 keys is deprecated and will be removed in a future version of ruby-jwt. Please use the ruby-eddsa gem instead.')
15
- # For backwards compatibility when kid was a String
16
- params = { kid: params } if params.is_a?(String)
17
-
18
- key_params = extract_key_params(key)
19
-
20
- params = params.transform_keys(&:to_sym)
21
- check_jwk_params!(key_params, params)
22
- super(options, key_params.merge(params))
23
- end
24
-
25
- def verify_key
26
- return @verify_key if defined?(@verify_key)
27
-
28
- @verify_key = verify_key_from_parameters
29
- end
30
-
31
- def signing_key
32
- return @signing_key if defined?(@signing_key)
33
-
34
- @signing_key = signing_key_from_parameters
35
- end
36
-
37
- def key_digest
38
- Thumbprint.new(self).to_s
39
- end
40
-
41
- def private?
42
- !signing_key.nil?
43
- end
44
-
45
- def members
46
- OKP_PUBLIC_KEY_ELEMENTS.each_with_object({}) { |i, h| h[i] = self[i] }
47
- end
48
-
49
- def export(options = {})
50
- exported = parameters.clone
51
- exported.reject! { |k, _| OKP_PRIVATE_KEY_ELEMENTS.include?(k) } unless private? && options[:include_private] == true
52
- exported
53
- end
54
-
55
- private
56
-
57
- def extract_key_params(key)
58
- case key
59
- when JWT::JWK::KeyBase
60
- key.export(include_private: true)
61
- when RbNaCl::Signatures::Ed25519::SigningKey
62
- @signing_key = key
63
- @verify_key = key.verify_key
64
- parse_okp_key_params(@verify_key, @signing_key)
65
- when RbNaCl::Signatures::Ed25519::VerifyKey
66
- @signing_key = nil
67
- @verify_key = key
68
- parse_okp_key_params(@verify_key)
69
- when Hash
70
- key.transform_keys(&:to_sym)
71
- else
72
- raise ArgumentError, 'key must be of type RbNaCl::Signatures::Ed25519::SigningKey, RbNaCl::Signatures::Ed25519::VerifyKey or Hash with key parameters'
73
- end
74
- end
75
-
76
- def check_jwk_params!(key_params, _given_params)
77
- raise JWT::JWKError, "Incorrect 'kty' value: #{key_params[:kty]}, expected #{KTY}" unless key_params[:kty] == KTY
78
- end
79
-
80
- def parse_okp_key_params(verify_key, signing_key = nil)
81
- params = {
82
- kty: KTY,
83
- crv: 'Ed25519',
84
- x: ::JWT::Base64.url_encode(verify_key.to_bytes)
85
- }
86
-
87
- params[:d] = ::JWT::Base64.url_encode(signing_key.to_bytes) if signing_key
88
-
89
- params
90
- end
91
-
92
- def verify_key_from_parameters
93
- RbNaCl::Signatures::Ed25519::VerifyKey.new(::JWT::Base64.url_decode(self[:x]))
94
- end
95
-
96
- def signing_key_from_parameters
97
- return nil unless self[:d]
98
-
99
- RbNaCl::Signatures::Ed25519::SigningKey.new(::JWT::Base64.url_decode(self[:d]))
100
- end
101
-
102
- class << self
103
- def import(jwk_data)
104
- new(jwk_data)
105
- end
106
- end
107
- end
108
- end
109
- end