jwt 2.0.0 → 2.2.2

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.
Files changed (57) hide show
  1. checksums.yaml +5 -5
  2. data/.ebert.yml +2 -1
  3. data/.gitignore +1 -1
  4. data/.travis.yml +18 -3
  5. data/AUTHORS +84 -0
  6. data/Appraisals +18 -0
  7. data/CHANGELOG.md +223 -18
  8. data/README.md +136 -81
  9. data/lib/jwt.rb +9 -40
  10. data/lib/jwt/algos/ecdsa.rb +35 -0
  11. data/lib/jwt/algos/eddsa.rb +23 -0
  12. data/lib/jwt/algos/hmac.rb +34 -0
  13. data/lib/jwt/algos/ps.rb +43 -0
  14. data/lib/jwt/algos/rsa.rb +19 -0
  15. data/lib/jwt/algos/unsupported.rb +16 -0
  16. data/lib/jwt/base64.rb +19 -0
  17. data/lib/jwt/claims_validator.rb +33 -0
  18. data/lib/jwt/decode.rb +83 -25
  19. data/lib/jwt/default_options.rb +2 -1
  20. data/lib/jwt/encode.rb +42 -25
  21. data/lib/jwt/error.rb +4 -0
  22. data/lib/jwt/json.rb +18 -0
  23. data/lib/jwt/jwk.rb +31 -0
  24. data/lib/jwt/jwk/key_finder.rb +57 -0
  25. data/lib/jwt/jwk/rsa.rb +54 -0
  26. data/lib/jwt/security_utils.rb +6 -1
  27. data/lib/jwt/signature.rb +27 -79
  28. data/lib/jwt/verify.rb +5 -8
  29. data/lib/jwt/version.rb +2 -2
  30. data/ruby-jwt.gemspec +7 -4
  31. metadata +54 -63
  32. data/.reek.yml +0 -40
  33. data/Manifest +0 -8
  34. data/spec/fixtures/certs/ec256-private.pem +0 -8
  35. data/spec/fixtures/certs/ec256-public.pem +0 -4
  36. data/spec/fixtures/certs/ec256-wrong-private.pem +0 -8
  37. data/spec/fixtures/certs/ec256-wrong-public.pem +0 -4
  38. data/spec/fixtures/certs/ec384-private.pem +0 -9
  39. data/spec/fixtures/certs/ec384-public.pem +0 -5
  40. data/spec/fixtures/certs/ec384-wrong-private.pem +0 -9
  41. data/spec/fixtures/certs/ec384-wrong-public.pem +0 -5
  42. data/spec/fixtures/certs/ec512-private.pem +0 -10
  43. data/spec/fixtures/certs/ec512-public.pem +0 -6
  44. data/spec/fixtures/certs/ec512-wrong-private.pem +0 -10
  45. data/spec/fixtures/certs/ec512-wrong-public.pem +0 -6
  46. data/spec/fixtures/certs/rsa-1024-private.pem +0 -15
  47. data/spec/fixtures/certs/rsa-1024-public.pem +0 -6
  48. data/spec/fixtures/certs/rsa-2048-private.pem +0 -27
  49. data/spec/fixtures/certs/rsa-2048-public.pem +0 -9
  50. data/spec/fixtures/certs/rsa-2048-wrong-private.pem +0 -27
  51. data/spec/fixtures/certs/rsa-2048-wrong-public.pem +0 -9
  52. data/spec/fixtures/certs/rsa-4096-private.pem +0 -51
  53. data/spec/fixtures/certs/rsa-4096-public.pem +0 -14
  54. data/spec/integration/readme_examples_spec.rb +0 -202
  55. data/spec/jwt/verify_spec.rb +0 -219
  56. data/spec/jwt_spec.rb +0 -257
  57. data/spec/spec_helper.rb +0 -28
@@ -3,6 +3,8 @@
3
3
  module JWT
4
4
  class EncodeError < StandardError; end
5
5
  class DecodeError < StandardError; end
6
+ class RequiredDependencyError < StandardError; end
7
+
6
8
  class VerificationError < DecodeError; end
7
9
  class ExpiredSignature < DecodeError; end
8
10
  class IncorrectAlgorithm < DecodeError; end
@@ -13,4 +15,6 @@ module JWT
13
15
  class InvalidSubError < DecodeError; end
14
16
  class InvalidJtiError < DecodeError; end
15
17
  class InvalidPayload < DecodeError; end
18
+
19
+ class JWKError < DecodeError; end
16
20
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module JWT
6
+ # JSON wrapper
7
+ class JSON
8
+ class << self
9
+ def generate(data)
10
+ ::JSON.generate(data)
11
+ end
12
+
13
+ def parse(data)
14
+ ::JSON.parse(data)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'jwk/rsa'
4
+ require_relative 'jwk/key_finder'
5
+
6
+ module JWT
7
+ module JWK
8
+ MAPPINGS = {
9
+ 'RSA' => ::JWT::JWK::RSA,
10
+ OpenSSL::PKey::RSA => ::JWT::JWK::RSA
11
+ }.freeze
12
+
13
+ class << self
14
+ def import(jwk_data)
15
+ raise JWT::JWKError, 'Key type (kty) not provided' unless jwk_data[:kty]
16
+
17
+ MAPPINGS.fetch(jwk_data[:kty].to_s) do |kty|
18
+ raise JWT::JWKError, "Key type #{kty} not supported"
19
+ end.import(jwk_data)
20
+ end
21
+
22
+ def create_from(keypair)
23
+ MAPPINGS.fetch(keypair.class) do |klass|
24
+ raise JWT::JWKError, "Cannot create JWK from a #{klass.name}"
25
+ end.new(keypair)
26
+ end
27
+
28
+ alias new create_from
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JWT
4
+ module JWK
5
+ class KeyFinder
6
+ def initialize(options)
7
+ jwks_or_loader = options[:jwks]
8
+ @jwks = jwks_or_loader if jwks_or_loader.is_a?(Hash)
9
+ @jwk_loader = jwks_or_loader if jwks_or_loader.respond_to?(:call)
10
+ end
11
+
12
+ def key_for(kid)
13
+ raise ::JWT::DecodeError, 'No key id (kid) found from token headers' unless kid
14
+
15
+ jwk = resolve_key(kid)
16
+
17
+ raise ::JWT::DecodeError, "Could not find public key for kid #{kid}" unless jwk
18
+
19
+ ::JWT::JWK.import(jwk).keypair
20
+ end
21
+
22
+ private
23
+
24
+ def resolve_key(kid)
25
+ jwk = find_key(kid)
26
+
27
+ return jwk if jwk
28
+
29
+ if reloadable?
30
+ load_keys(invalidate: true)
31
+ return find_key(kid)
32
+ end
33
+
34
+ nil
35
+ end
36
+
37
+ def jwks
38
+ return @jwks if @jwks
39
+
40
+ load_keys
41
+ @jwks
42
+ end
43
+
44
+ def load_keys(opts = {})
45
+ @jwks = @jwk_loader.call(opts)
46
+ end
47
+
48
+ def find_key(kid)
49
+ Array(jwks[:keys]).find { |key| key[:kid] == kid }
50
+ end
51
+
52
+ def reloadable?
53
+ @jwk_loader
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module JWT
4
+ module JWK
5
+ class RSA
6
+ attr_reader :keypair
7
+
8
+ BINARY = 2
9
+ KTY = 'RSA'.freeze
10
+
11
+ def initialize(keypair)
12
+ raise ArgumentError, 'keypair must be of type OpenSSL::PKey::RSA' unless keypair.is_a?(OpenSSL::PKey::RSA)
13
+
14
+ @keypair = keypair
15
+ end
16
+
17
+ def private?
18
+ keypair.private?
19
+ end
20
+
21
+ def public_key
22
+ keypair.public_key
23
+ end
24
+
25
+ def kid
26
+ sequence = OpenSSL::ASN1::Sequence([OpenSSL::ASN1::Integer.new(public_key.n),
27
+ OpenSSL::ASN1::Integer.new(public_key.e)])
28
+ OpenSSL::Digest::SHA256.hexdigest(sequence.to_der)
29
+ end
30
+
31
+ def export
32
+ {
33
+ kty: KTY,
34
+ n: ::Base64.urlsafe_encode64(public_key.n.to_s(BINARY), padding: false),
35
+ e: ::Base64.urlsafe_encode64(public_key.e.to_s(BINARY), padding: false),
36
+ kid: kid
37
+ }
38
+ end
39
+
40
+ def self.import(jwk_data)
41
+ imported_key = OpenSSL::PKey::RSA.new
42
+ if imported_key.respond_to?(:set_key)
43
+ imported_key.set_key(OpenSSL::BN.new(::Base64.urlsafe_decode64(jwk_data[:n]), BINARY),
44
+ OpenSSL::BN.new(::Base64.urlsafe_decode64(jwk_data[:e]), BINARY),
45
+ nil)
46
+ else
47
+ imported_key.n = OpenSSL::BN.new(::Base64.urlsafe_decode64(jwk_data[:n]), BINARY)
48
+ imported_key.e = OpenSSL::BN.new(::Base64.urlsafe_decode64(jwk_data[:e]), BINARY)
49
+ end
50
+ self.new(imported_key)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -3,7 +3,6 @@ module JWT
3
3
  #
4
4
  # @see: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/security_utils.rb
5
5
  module SecurityUtils
6
-
7
6
  module_function
8
7
 
9
8
  def secure_compare(left, right)
@@ -21,6 +20,12 @@ module JWT
21
20
  public_key.verify(OpenSSL::Digest.new(algorithm.sub('RS', 'sha')), signature, signing_input)
22
21
  end
23
22
 
23
+ def verify_ps(algorithm, public_key, signing_input, signature)
24
+ formatted_algorithm = algorithm.sub('PS', 'sha')
25
+
26
+ public_key.verify_pss(formatted_algorithm, signature, signing_input, salt_length: :auto, mgf1_hash: formatted_algorithm)
27
+ end
28
+
24
29
  def asn1_to_raw(signature, public_key)
25
30
  byte_size = (public_key.group.degree + 7) / 8
26
31
  OpenSSL::ASN1.decode(signature).value.map { |value| value.value.to_s(2).rjust(byte_size, "\x00") }.join
@@ -2,10 +2,16 @@
2
2
 
3
3
  require 'jwt/security_utils'
4
4
  require 'openssl'
5
+ require 'jwt/algos/hmac'
6
+ require 'jwt/algos/eddsa'
7
+ require 'jwt/algos/ecdsa'
8
+ require 'jwt/algos/rsa'
9
+ require 'jwt/algos/ps'
10
+ require 'jwt/algos/unsupported'
5
11
  begin
6
12
  require 'rbnacl'
7
- rescue LoadError => e
8
- abort(e.message) if defined?(RbNaCl)
13
+ rescue LoadError
14
+ raise if defined?(RbNaCl)
9
15
  end
10
16
 
11
17
  # JWT::Signature module
@@ -13,94 +19,36 @@ module JWT
13
19
  # Signature logic for JWT
14
20
  module Signature
15
21
  extend self
16
-
17
- HMAC_ALGORITHMS = %w[HS256 HS512256 HS384 HS512].freeze
18
- RSA_ALGORITHMS = %w[RS256 RS384 RS512].freeze
19
- ECDSA_ALGORITHMS = %w[ES256 ES384 ES512].freeze
20
-
21
- NAMED_CURVES = {
22
- 'prime256v1' => 'ES256',
23
- 'secp384r1' => 'ES384',
24
- 'secp521r1' => 'ES512'
25
- }.freeze
22
+ ALGOS = [
23
+ Algos::Hmac,
24
+ Algos::Ecdsa,
25
+ Algos::Rsa,
26
+ Algos::Eddsa,
27
+ Algos::Ps,
28
+ Algos::Unsupported
29
+ ].freeze
30
+ ToSign = Struct.new(:algorithm, :msg, :key)
31
+ ToVerify = Struct.new(:algorithm, :public_key, :signing_input, :signature)
26
32
 
27
33
  def sign(algorithm, msg, key)
28
- if HMAC_ALGORITHMS.include?(algorithm)
29
- sign_hmac(algorithm, msg, key)
30
- elsif RSA_ALGORITHMS.include?(algorithm)
31
- sign_rsa(algorithm, msg, key)
32
- elsif ECDSA_ALGORITHMS.include?(algorithm)
33
- sign_ecdsa(algorithm, msg, key)
34
- else
35
- raise NotImplementedError, 'Unsupported signing method'
34
+ algo = ALGOS.find do |alg|
35
+ alg.const_get(:SUPPORTED).include? algorithm
36
36
  end
37
+ algo.sign ToSign.new(algorithm, msg, key)
37
38
  end
38
39
 
39
- def verify(algo, key, signing_input, signature)
40
- verified = if HMAC_ALGORITHMS.include?(algo)
41
- verify_hmac(algo, key, signing_input, signature)
42
- elsif RSA_ALGORITHMS.include?(algo)
43
- SecurityUtils.verify_rsa(algo, key, signing_input, signature)
44
- elsif ECDSA_ALGORITHMS.include?(algo)
45
- verify_ecdsa(algo, key, signing_input, signature)
46
- else
47
- raise JWT::VerificationError, 'Algorithm not supported'
48
- end
40
+ def verify(algorithm, key, signing_input, signature)
41
+ raise JWT::DecodeError, 'No verification key available' unless key
49
42
 
43
+ algo = ALGOS.find do |alg|
44
+ alg.const_get(:SUPPORTED).include? algorithm
45
+ end
46
+ verified = algo.verify(ToVerify.new(algorithm, key, signing_input, signature))
50
47
  raise(JWT::VerificationError, 'Signature verification raised') unless verified
51
48
  rescue OpenSSL::PKey::PKeyError
52
49
  raise JWT::VerificationError, 'Signature verification raised'
53
50
  ensure
54
51
  OpenSSL.errors.clear
55
52
  end
56
-
57
- private
58
-
59
- def sign_rsa(algorithm, msg, private_key)
60
- raise EncodeError, "The given key is a #{private_key.class}. It has to be an OpenSSL::PKey::RSA instance." if private_key.class == String
61
- private_key.sign(OpenSSL::Digest.new(algorithm.sub('RS', 'sha')), msg)
62
- end
63
-
64
- def sign_ecdsa(algorithm, msg, private_key)
65
- key_algorithm = NAMED_CURVES[private_key.group.curve_name]
66
- if algorithm != key_algorithm
67
- raise IncorrectAlgorithm, "payload algorithm is #{algorithm} but #{key_algorithm} signing key was provided"
68
- end
69
-
70
- digest = OpenSSL::Digest.new(algorithm.sub('ES', 'sha'))
71
- SecurityUtils.asn1_to_raw(private_key.dsa_sign_asn1(digest.digest(msg)), private_key)
72
- end
73
-
74
- def sign_hmac(algorithm, msg, key)
75
- authenticator, padded_key = SecurityUtils.rbnacl_fixup(algorithm, key)
76
- if authenticator && padded_key
77
- authenticator.auth(padded_key, msg.encode('binary'))
78
- else
79
- OpenSSL::HMAC.digest(OpenSSL::Digest.new(algorithm.sub('HS', 'sha')), key, msg)
80
- end
81
- end
82
-
83
- def verify_ecdsa(algorithm, public_key, signing_input, signature)
84
- key_algorithm = NAMED_CURVES[public_key.group.curve_name]
85
- if algorithm != key_algorithm
86
- raise IncorrectAlgorithm, "payload algorithm is #{algorithm} but #{key_algorithm} verification key was provided"
87
- end
88
-
89
- digest = OpenSSL::Digest.new(algorithm.sub('ES', 'sha'))
90
- public_key.dsa_verify_asn1(digest.digest(signing_input), SecurityUtils.raw_to_asn1(signature, public_key))
91
- end
92
-
93
- def verify_hmac(algorithm, public_key, signing_input, signature)
94
- authenticator, padded_key = SecurityUtils.rbnacl_fixup(algorithm, public_key)
95
- if authenticator && padded_key
96
- begin
97
- authenticator.verify(padded_key, signature.encode('binary'), signing_input.encode('binary'))
98
- rescue RbNaCl::BadAuthenticatorError
99
- false
100
- end
101
- else
102
- SecurityUtils.secure_compare(signature, sign_hmac(algorithm, signing_input, public_key))
103
- end
104
- end
105
53
  end
106
54
  end
@@ -45,16 +45,16 @@ module JWT
45
45
  return unless @payload.include?('iat')
46
46
 
47
47
  iat = @payload['iat']
48
- raise(JWT::InvalidIatError, 'Invalid iat') if !iat.is_a?(Numeric) || iat.to_f > (Time.now.to_f + iat_leeway)
48
+ raise(JWT::InvalidIatError, 'Invalid iat') if !iat.is_a?(Numeric) || iat.to_f > Time.now.to_f
49
49
  end
50
50
 
51
51
  def verify_iss
52
52
  return unless (options_iss = @options[:iss])
53
53
 
54
54
  iss = @payload['iss']
55
-
55
+
56
56
  return if Array(options_iss).map(&:to_s).include?(iss.to_s)
57
-
57
+
58
58
  raise(JWT::InvalidIssuerError, "Invalid issuer. Expected #{options_iss}, received #{iss || '<none>'}")
59
59
  end
60
60
 
@@ -63,7 +63,8 @@ module JWT
63
63
  jti = @payload['jti']
64
64
 
65
65
  if options_verify_jti.respond_to?(:call)
66
- raise(JWT::InvalidJtiError, 'Invalid jti') unless options_verify_jti.call(jti)
66
+ verified = options_verify_jti.arity == 2 ? options_verify_jti.call(jti, @payload) : options_verify_jti.call(jti)
67
+ raise(JWT::InvalidJtiError, 'Invalid jti') unless verified
67
68
  elsif jti.to_s.strip.empty?
68
69
  raise(JWT::InvalidJtiError, 'Missing jti')
69
70
  end
@@ -90,10 +91,6 @@ module JWT
90
91
  @options[:exp_leeway] || global_leeway
91
92
  end
92
93
 
93
- def iat_leeway
94
- @options[:iat_leeway] || global_leeway
95
- end
96
-
97
94
  def nbf_leeway
98
95
  @options[:nbf_leeway] || global_leeway
99
96
  end
@@ -12,9 +12,9 @@ module JWT
12
12
  # major version
13
13
  MAJOR = 2
14
14
  # minor version
15
- MINOR = 0
15
+ MINOR = 2
16
16
  # tiny version
17
- TINY = 0
17
+ TINY = 2
18
18
  # alpha, beta, etc. tag
19
19
  PRE = nil
20
20
 
@@ -11,21 +11,24 @@ Gem::Specification.new do |spec|
11
11
  spec.email = 'timrudat@gmail.com'
12
12
  spec.summary = 'JSON Web Token implementation in Ruby'
13
13
  spec.description = 'A pure ruby implementation of the RFC 7519 OAuth JSON Web Token (JWT) standard.'
14
- spec.homepage = 'http://github.com/jwt/ruby-jwt'
14
+ spec.homepage = 'https://github.com/jwt/ruby-jwt'
15
15
  spec.license = 'MIT'
16
16
  spec.required_ruby_version = '>= 2.1'
17
17
 
18
- spec.files = `git ls-files -z`.split("\x0")
19
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec|gemfiles|coverage|bin)/}) }
19
+ spec.executables = []
20
20
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
21
  spec.require_paths = %w[lib]
22
22
 
23
+ spec.add_development_dependency 'appraisal'
23
24
  spec.add_development_dependency 'bundler'
24
25
  spec.add_development_dependency 'rake'
25
26
  spec.add_development_dependency 'rspec'
26
- spec.add_development_dependency 'simplecov'
27
+ spec.add_development_dependency 'simplecov', '< 0.18'
27
28
  spec.add_development_dependency 'simplecov-json'
28
29
  spec.add_development_dependency 'codeclimate-test-reporter'
29
30
  spec.add_development_dependency 'codacy-coverage'
30
31
  spec.add_development_dependency 'rbnacl'
32
+ # RSASSA-PSS support provided by OpenSSL +2.1
33
+ spec.add_development_dependency 'openssl', '~> 2.1'
31
34
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jwt
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Rudat
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-03 00:00:00.000000000 Z
11
+ date: 2020-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
14
+ name: appraisal
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rspec
42
+ name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: simplecov
56
+ name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "<"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.18'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "<"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.18'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: simplecov-json
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +136,20 @@ dependencies:
122
136
  - - ">="
123
137
  - !ruby/object:Gem::Version
124
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: openssl
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '2.1'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '2.1'
125
153
  description: A pure ruby implementation of the RFC 7519 OAuth JSON Web Token (JWT)
126
154
  standard.
127
155
  email: timrudat@gmail.com
@@ -132,55 +160,43 @@ files:
132
160
  - ".codeclimate.yml"
133
161
  - ".ebert.yml"
134
162
  - ".gitignore"
135
- - ".reek.yml"
136
163
  - ".rspec"
137
164
  - ".rubocop.yml"
138
165
  - ".travis.yml"
166
+ - AUTHORS
167
+ - Appraisals
139
168
  - CHANGELOG.md
140
169
  - Gemfile
141
170
  - LICENSE
142
- - Manifest
143
171
  - README.md
144
172
  - Rakefile
145
173
  - lib/jwt.rb
174
+ - lib/jwt/algos/ecdsa.rb
175
+ - lib/jwt/algos/eddsa.rb
176
+ - lib/jwt/algos/hmac.rb
177
+ - lib/jwt/algos/ps.rb
178
+ - lib/jwt/algos/rsa.rb
179
+ - lib/jwt/algos/unsupported.rb
180
+ - lib/jwt/base64.rb
181
+ - lib/jwt/claims_validator.rb
146
182
  - lib/jwt/decode.rb
147
183
  - lib/jwt/default_options.rb
148
184
  - lib/jwt/encode.rb
149
185
  - lib/jwt/error.rb
186
+ - lib/jwt/json.rb
187
+ - lib/jwt/jwk.rb
188
+ - lib/jwt/jwk/key_finder.rb
189
+ - lib/jwt/jwk/rsa.rb
150
190
  - lib/jwt/security_utils.rb
151
191
  - lib/jwt/signature.rb
152
192
  - lib/jwt/verify.rb
153
193
  - lib/jwt/version.rb
154
194
  - ruby-jwt.gemspec
155
- - spec/fixtures/certs/ec256-private.pem
156
- - spec/fixtures/certs/ec256-public.pem
157
- - spec/fixtures/certs/ec256-wrong-private.pem
158
- - spec/fixtures/certs/ec256-wrong-public.pem
159
- - spec/fixtures/certs/ec384-private.pem
160
- - spec/fixtures/certs/ec384-public.pem
161
- - spec/fixtures/certs/ec384-wrong-private.pem
162
- - spec/fixtures/certs/ec384-wrong-public.pem
163
- - spec/fixtures/certs/ec512-private.pem
164
- - spec/fixtures/certs/ec512-public.pem
165
- - spec/fixtures/certs/ec512-wrong-private.pem
166
- - spec/fixtures/certs/ec512-wrong-public.pem
167
- - spec/fixtures/certs/rsa-1024-private.pem
168
- - spec/fixtures/certs/rsa-1024-public.pem
169
- - spec/fixtures/certs/rsa-2048-private.pem
170
- - spec/fixtures/certs/rsa-2048-public.pem
171
- - spec/fixtures/certs/rsa-2048-wrong-private.pem
172
- - spec/fixtures/certs/rsa-2048-wrong-public.pem
173
- - spec/fixtures/certs/rsa-4096-private.pem
174
- - spec/fixtures/certs/rsa-4096-public.pem
175
- - spec/integration/readme_examples_spec.rb
176
- - spec/jwt/verify_spec.rb
177
- - spec/jwt_spec.rb
178
- - spec/spec_helper.rb
179
- homepage: http://github.com/jwt/ruby-jwt
195
+ homepage: https://github.com/jwt/ruby-jwt
180
196
  licenses:
181
197
  - MIT
182
198
  metadata: {}
183
- post_install_message:
199
+ post_install_message:
184
200
  rdoc_options: []
185
201
  require_paths:
186
202
  - lib
@@ -195,33 +211,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
195
211
  - !ruby/object:Gem::Version
196
212
  version: '0'
197
213
  requirements: []
198
- rubyforge_project:
199
- rubygems_version: 2.6.13
200
- signing_key:
214
+ rubygems_version: 3.1.2
215
+ signing_key:
201
216
  specification_version: 4
202
217
  summary: JSON Web Token implementation in Ruby
203
- test_files:
204
- - spec/fixtures/certs/ec256-private.pem
205
- - spec/fixtures/certs/ec256-public.pem
206
- - spec/fixtures/certs/ec256-wrong-private.pem
207
- - spec/fixtures/certs/ec256-wrong-public.pem
208
- - spec/fixtures/certs/ec384-private.pem
209
- - spec/fixtures/certs/ec384-public.pem
210
- - spec/fixtures/certs/ec384-wrong-private.pem
211
- - spec/fixtures/certs/ec384-wrong-public.pem
212
- - spec/fixtures/certs/ec512-private.pem
213
- - spec/fixtures/certs/ec512-public.pem
214
- - spec/fixtures/certs/ec512-wrong-private.pem
215
- - spec/fixtures/certs/ec512-wrong-public.pem
216
- - spec/fixtures/certs/rsa-1024-private.pem
217
- - spec/fixtures/certs/rsa-1024-public.pem
218
- - spec/fixtures/certs/rsa-2048-private.pem
219
- - spec/fixtures/certs/rsa-2048-public.pem
220
- - spec/fixtures/certs/rsa-2048-wrong-private.pem
221
- - spec/fixtures/certs/rsa-2048-wrong-public.pem
222
- - spec/fixtures/certs/rsa-4096-private.pem
223
- - spec/fixtures/certs/rsa-4096-public.pem
224
- - spec/integration/readme_examples_spec.rb
225
- - spec/jwt/verify_spec.rb
226
- - spec/jwt_spec.rb
227
- - spec/spec_helper.rb
218
+ test_files: []