jwt 2.10.0 → 3.0.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +35 -0
- data/README.md +44 -54
- data/UPGRADING.md +46 -0
- data/lib/jwt/base64.rb +1 -10
- data/lib/jwt/claims/numeric.rb +0 -32
- data/lib/jwt/claims.rb +0 -7
- data/lib/jwt/configuration/container.rb +0 -1
- data/lib/jwt/decode.rb +5 -8
- data/lib/jwt/encoded_token.rb +71 -4
- data/lib/jwt/jwa/ecdsa.rb +0 -4
- data/lib/jwt/jwa/hmac.rb +0 -4
- data/lib/jwt/jwa/ps.rb +1 -0
- data/lib/jwt/jwa/rsa.rb +1 -0
- data/lib/jwt/jwa/signing_algorithm.rb +0 -1
- data/lib/jwt/jwa.rb +1 -26
- data/lib/jwt/jwk/ec.rb +0 -4
- data/lib/jwt/jwk/hmac.rb +2 -2
- data/lib/jwt/jwk/key_finder.rb +14 -1
- data/lib/jwt/jwk/rsa.rb +3 -0
- data/lib/jwt/jwk.rb +0 -1
- data/lib/jwt/token.rb +22 -3
- data/lib/jwt/version.rb +4 -22
- data/lib/jwt.rb +1 -7
- metadata +5 -17
- data/lib/jwt/claims/verification_methods.rb +0 -20
- data/lib/jwt/claims_validator.rb +0 -18
- data/lib/jwt/deprecations.rb +0 -49
- data/lib/jwt/jwa/compat.rb +0 -32
- data/lib/jwt/jwa/eddsa.rb +0 -35
- data/lib/jwt/jwa/hmac_rbnacl.rb +0 -50
- data/lib/jwt/jwa/hmac_rbnacl_fixed.rb +0 -47
- data/lib/jwt/jwa/wrapper.rb +0 -44
- data/lib/jwt/jwk/okp_rbnacl.rb +0 -109
- data/lib/jwt/verify.rb +0 -40
data/lib/jwt/jwk/key_finder.rb
CHANGED
@@ -2,8 +2,13 @@
|
|
2
2
|
|
3
3
|
module JWT
|
4
4
|
module JWK
|
5
|
-
#
|
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
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
|
-
#
|
15
|
+
# Version constants
|
16
16
|
module VERSION
|
17
|
-
MAJOR =
|
18
|
-
MINOR =
|
17
|
+
MAJOR = 3
|
18
|
+
MINOR = 0
|
19
19
|
TINY = 0
|
20
|
-
PRE =
|
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
|
-
|
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:
|
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:
|
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/
|
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.
|
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
|
data/lib/jwt/claims_validator.rb
DELETED
@@ -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
|
data/lib/jwt/deprecations.rb
DELETED
@@ -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
|
data/lib/jwt/jwa/compat.rb
DELETED
@@ -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
|
data/lib/jwt/jwa/hmac_rbnacl.rb
DELETED
@@ -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
|
data/lib/jwt/jwa/wrapper.rb
DELETED
@@ -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
|
data/lib/jwt/jwk/okp_rbnacl.rb
DELETED
@@ -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
|