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.
- 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
|