jwt 2.10.1 → 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,12 +12,12 @@ 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
19
- TINY = 1
20
- PRE = nil
17
+ MAJOR = 3
18
+ MINOR = 0
19
+ TINY = 0
20
+ PRE = 'beta1'
21
21
 
22
22
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
23
23
  end
@@ -32,22 +32,6 @@ module JWT
32
32
  true if 3 * 0x10000000 <= OpenSSL::OPENSSL_VERSION_NUMBER
33
33
  end
34
34
 
35
- # Checks if the RbNaCl library is defined.
36
- #
37
- # @return [Boolean] true if RbNaCl is defined, false otherwise.
38
- # @api private
39
- def self.rbnacl?
40
- defined?(::RbNaCl)
41
- end
42
-
43
- # Checks if the RbNaCl library version is 6.0.0 or greater.
44
- #
45
- # @return [Boolean] true if RbNaCl version is 6.0.0 or greater, false otherwise.
46
- # @api private
47
- def self.rbnacl_6_or_greater?
48
- rbnacl? && ::Gem::Version.new(::RbNaCl::VERSION) >= ::Gem::Version.new('6.0.0')
49
- end
50
-
51
35
  # Checks if there is an OpenSSL 3 HMAC empty key regression.
52
36
  #
53
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,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jwt
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.10.1
4
+ version: 3.0.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Rudat
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2024-12-26 00:00:00.000000000 Z
10
+ date: 2025-01-25 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: base64
@@ -120,6 +120,7 @@ files:
120
120
  - CONTRIBUTING.md
121
121
  - LICENSE
122
122
  - README.md
123
+ - UPGRADING.md
123
124
  - lib/jwt.rb
124
125
  - lib/jwt/base64.rb
125
126
  - lib/jwt/claims.rb
@@ -134,44 +135,34 @@ files:
134
135
  - lib/jwt/claims/numeric.rb
135
136
  - lib/jwt/claims/required.rb
136
137
  - lib/jwt/claims/subject.rb
137
- - lib/jwt/claims/verification_methods.rb
138
138
  - lib/jwt/claims/verifier.rb
139
- - lib/jwt/claims_validator.rb
140
139
  - lib/jwt/configuration.rb
141
140
  - lib/jwt/configuration/container.rb
142
141
  - lib/jwt/configuration/decode_configuration.rb
143
142
  - lib/jwt/configuration/jwk_configuration.rb
144
143
  - lib/jwt/decode.rb
145
- - lib/jwt/deprecations.rb
146
144
  - lib/jwt/encode.rb
147
145
  - lib/jwt/encoded_token.rb
148
146
  - lib/jwt/error.rb
149
147
  - lib/jwt/json.rb
150
148
  - lib/jwt/jwa.rb
151
- - lib/jwt/jwa/compat.rb
152
149
  - lib/jwt/jwa/ecdsa.rb
153
- - lib/jwt/jwa/eddsa.rb
154
150
  - lib/jwt/jwa/hmac.rb
155
- - lib/jwt/jwa/hmac_rbnacl.rb
156
- - lib/jwt/jwa/hmac_rbnacl_fixed.rb
157
151
  - lib/jwt/jwa/none.rb
158
152
  - lib/jwt/jwa/ps.rb
159
153
  - lib/jwt/jwa/rsa.rb
160
154
  - lib/jwt/jwa/signing_algorithm.rb
161
155
  - lib/jwt/jwa/unsupported.rb
162
- - lib/jwt/jwa/wrapper.rb
163
156
  - lib/jwt/jwk.rb
164
157
  - lib/jwt/jwk/ec.rb
165
158
  - lib/jwt/jwk/hmac.rb
166
159
  - lib/jwt/jwk/key_base.rb
167
160
  - lib/jwt/jwk/key_finder.rb
168
161
  - lib/jwt/jwk/kid_as_key_digest.rb
169
- - lib/jwt/jwk/okp_rbnacl.rb
170
162
  - lib/jwt/jwk/rsa.rb
171
163
  - lib/jwt/jwk/set.rb
172
164
  - lib/jwt/jwk/thumbprint.rb
173
165
  - lib/jwt/token.rb
174
- - lib/jwt/verify.rb
175
166
  - lib/jwt/version.rb
176
167
  - lib/jwt/x5c_key_finder.rb
177
168
  - ruby-jwt.gemspec
@@ -180,7 +171,7 @@ licenses:
180
171
  - MIT
181
172
  metadata:
182
173
  bug_tracker_uri: https://github.com/jwt/ruby-jwt/issues
183
- changelog_uri: https://github.com/jwt/ruby-jwt/blob/v2.10.1/CHANGELOG.md
174
+ changelog_uri: https://github.com/jwt/ruby-jwt/blob/v3.0.0.beta1/CHANGELOG.md
184
175
  rubygems_mfa_required: 'true'
185
176
  rdoc_options: []
186
177
  require_paths:
@@ -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