json-jwt 1.8.3 → 1.9.0

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.

Potentially problematic release.


This version of json-jwt might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3abc4f60457c79cdc55e59cb46553722b816acbe
4
- data.tar.gz: 5c305020b1dfcc15f0aff4ee7ea0ab2dee3a9009
3
+ metadata.gz: ac7876d6689bcbfa09531f34dca2b9e899e5271c
4
+ data.tar.gz: 39c83be6aa4d803d67b2db513846c1539876abc4
5
5
  SHA512:
6
- metadata.gz: 83f3cc919f8336b259a1e8fd203692024ae6d5cd7d6402ce83713a28994dd896e0e9b1800b53f9bd1ff8cc98fddf1f18ba3d1241c1349482c56d2a23ba1ffc6b
7
- data.tar.gz: f17db83dbd4751c3da5f4e3d37b1e231ae5bda78916677dd13e7fb854ce0706dc58221657542287dd5e55dc81101afe498baf199ec1ba9caa633ede5b3095e90
6
+ metadata.gz: c95995a62590d5f37fecbdf4930000a7e7c58cb97288a852c10b1c60915f8f54da30a1b99e7d9d892c85370fa77ecf7698dd7616573376a946f4b1a0c04fc488
7
+ data.tar.gz: 9401202361965498b2410b84d9ef95196f5945956e28cfd86af2c77caf6d416ab7433f8b2d7c8179ea4390fffdb30acb951271c054bd3de4a8c1e3a3e888a30d
data/.travis.yml CHANGED
@@ -3,10 +3,9 @@ before_install:
3
3
  - git submodule update --init --recursive
4
4
 
5
5
  rvm:
6
- - 2.2.2 # NOTE: 2.2.1 or lower aren't supported by activesupport 5.0, CI isn't needed for such legacy versions.
7
- - 2.2.6
8
- - 2.3.3
9
- - 2.4.1
6
+ - 2.3.6
7
+ - 2.4.3
8
+ - 2.5.0
10
9
 
11
10
  jdk:
12
11
  - oraclejdk8
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.8.3
1
+ 1.9.0
data/json-jwt.gemspec CHANGED
@@ -19,4 +19,4 @@ Gem::Specification.new do |gem|
19
19
  gem.add_development_dependency 'simplecov'
20
20
  gem.add_development_dependency 'rspec'
21
21
  gem.add_development_dependency 'rspec-its'
22
- end
22
+ end
data/lib/json/jwt.rb CHANGED
@@ -31,7 +31,16 @@ module JSON
31
31
  # I'd like to make :RS256 default.
32
32
  # However, by histrical reasons, :HS256 was default.
33
33
  # This code is needed to keep legacy behavior.
34
- algorithm = private_key_or_secret.is_a?(String) ? :HS256 : :RS256
34
+ algorithm = case private_key_or_secret
35
+ when String
36
+ :HS256
37
+ when OpenSSL::PKey::RSA
38
+ :RS256
39
+ when OpenSSL::PKey::EC
40
+ :ES256
41
+ else
42
+ raise UnexpectedAlgorithm.new('Signature algorithm auto-detection failed')
43
+ end
35
44
  end
36
45
  jws = JWS.new self
37
46
  jws.kid ||= private_key_or_secret[:kid] if private_key_or_secret.is_a? JSON::JWK
@@ -191,7 +191,7 @@ describe JSON::JWT do
191
191
  ].join('.')
192
192
  end
193
193
 
194
- it 'should do verification' do
194
+ it do
195
195
  expect do
196
196
  JSON::JWT.decode malformed_jwt_string, 'secret'
197
197
  end.to raise_error JSON::JWT::VerificationFailed
@@ -215,7 +215,7 @@ describe JSON::JWT do
215
215
  ].join('.')
216
216
  end
217
217
 
218
- it 'should fail verification' do
218
+ it do
219
219
  expect do
220
220
  JSON::JWT.decode malformed_jwt_string, public_key
221
221
  end.to raise_error JSON::JWT::UnexpectedAlgorithm
@@ -229,7 +229,7 @@ describe JSON::JWT do
229
229
  malformed_signature = OpenSSL::HMAC.digest(
230
230
  OpenSSL::Digest.new('SHA256'),
231
231
  public_key.to_s,
232
- [malformed_header, payload].join('.')
232
+ [UrlSafeBase64.encode64(malformed_header), payload].join('.')
233
233
  )
234
234
  [
235
235
  UrlSafeBase64.encode64(malformed_header),
@@ -238,13 +238,93 @@ describe JSON::JWT do
238
238
  ].join('.')
239
239
  end
240
240
 
241
- it 'should fail verification' do
241
+ it do
242
242
  expect do
243
243
  JSON::JWT.decode malformed_jwt_string, public_key
244
244
  end.to raise_error JSON::JWS::UnexpectedAlgorithm
245
245
  end
246
246
  end
247
247
  end
248
+
249
+ context 'from alg=PS512' do
250
+ let(:jws) do
251
+ jwt.sign private_key, :PS512
252
+ end
253
+
254
+ if pss_supported?
255
+ context 'to alg=PS256' do
256
+ let(:malformed_jwt_string) do
257
+ header, payload, signature = jws.to_s.split('.')
258
+ malformed_header = {alg: :PS256}.to_json
259
+ digest = OpenSSL::Digest.new('SHA256')
260
+ malformed_signature = private_key.sign_pss(
261
+ digest,
262
+ [UrlSafeBase64.encode64(malformed_header), payload].join('.'),
263
+ salt_length: :digest,
264
+ mgf1_hash: digest
265
+ )
266
+ [
267
+ UrlSafeBase64.encode64(malformed_header),
268
+ payload,
269
+ UrlSafeBase64.encode64(malformed_signature)
270
+ ].join('.')
271
+ end
272
+
273
+ context 'when verification algorithm is specified' do
274
+ it do
275
+ expect do
276
+ JSON::JWT.decode malformed_jwt_string, public_key, :PS512
277
+ end.to raise_error JSON::JWS::UnexpectedAlgorithm, 'Unexpected alg header'
278
+ end
279
+ end
280
+
281
+ context 'otherwise' do
282
+ it do
283
+ expect do
284
+ JSON::JWT.decode malformed_jwt_string, public_key
285
+ end.not_to raise_error
286
+ end
287
+ end
288
+ end
289
+
290
+ context 'to alg=RS516' do
291
+ let(:malformed_jwt_string) do
292
+ header, payload, signature = jws.to_s.split('.')
293
+ malformed_header = {alg: :RS512}.to_json
294
+ malformed_signature = private_key.sign(
295
+ OpenSSL::Digest.new('SHA512'),
296
+ [UrlSafeBase64.encode64(malformed_header), payload].join('.')
297
+ )
298
+ [
299
+ UrlSafeBase64.encode64(malformed_header),
300
+ payload,
301
+ UrlSafeBase64.encode64(malformed_signature)
302
+ ].join('.')
303
+ end
304
+
305
+ context 'when verification algorithm is specified' do
306
+ it do
307
+ expect do
308
+ JSON::JWT.decode malformed_jwt_string, public_key, :PS512
309
+ end.to raise_error JSON::JWS::UnexpectedAlgorithm, 'Unexpected alg header'
310
+ end
311
+ end
312
+
313
+ context 'otherwise' do
314
+ it do
315
+ expect do
316
+ JSON::JWT.decode malformed_jwt_string, public_key
317
+ end.not_to raise_error
318
+ end
319
+ end
320
+ end
321
+ else
322
+ skip 'RSA PSS not supported'
323
+ it do
324
+ expect { jws }.to raise_error 'PS512 isn\'t supported. OpenSSL gem v2.1.0+ is required to use PS512.'
325
+ end
326
+ end
327
+ end
248
328
  end
249
329
 
250
330
  context 'when :skip_verification given as secret/key' do
@@ -320,6 +400,32 @@ describe JSON::JWT do
320
400
  end.not_to raise_error
321
401
  end
322
402
  end
403
+
404
+ context 'when alg & enc is specified' do
405
+ context 'when expected' do
406
+ it do
407
+ expect do
408
+ JSON::JWT.decode(input, private_key, 'RSA1_5', 'A128CBC-HS256')
409
+ end.not_to raise_error
410
+ end
411
+ end
412
+
413
+ context 'when alg is unexpected' do
414
+ it do
415
+ expect do
416
+ JSON::JWT.decode(input, private_key, 'dir', 'A128CBC-HS256')
417
+ end.to raise_error JSON::JWE::UnexpectedAlgorithm, 'Unexpected alg header'
418
+ end
419
+ end
420
+
421
+ context 'when enc is unexpected' do
422
+ it do
423
+ expect do
424
+ JSON::JWT.decode(input, private_key, 'RSA1_5', 'A128GCM')
425
+ end.to raise_error JSON::JWE::UnexpectedAlgorithm, 'Unexpected enc header'
426
+ end
427
+ end
428
+ end
323
429
  end
324
430
 
325
431
  context 'when JSON parse failed' do
@@ -348,4 +454,26 @@ describe JSON::JWT do
348
454
  end
349
455
  end
350
456
  end
457
+
458
+ describe '.pretty_generate' do
459
+ subject { JSON::JWT.pretty_generate jws.to_s }
460
+ its(:size) { should == 2 }
461
+ its(:first) do
462
+ should == <<~HEADER.chop
463
+ {
464
+ "typ": "JWT",
465
+ "alg": "HS256"
466
+ }
467
+ HEADER
468
+ end
469
+ its(:last) do
470
+ should == <<~HEADER.chop
471
+ {
472
+ "iss": "joe",
473
+ "exp": 1300819380,
474
+ "http://example.com/is_root": true
475
+ }
476
+ HEADER
477
+ end
478
+ end
351
479
  end
data/spec/spec_helper.rb CHANGED
@@ -20,5 +20,9 @@ def gcm_supported?
20
20
  end
21
21
  end
22
22
 
23
+ def pss_supported?
24
+ OpenSSL::VERSION >= '2.1.0'
25
+ end
26
+
23
27
  require 'helpers/sign_key_fixture_helper'
24
28
  require 'helpers/nimbus_spec_helper'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json-jwt
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.3
4
+ version: 1.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - nov matake
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-05 00:00:00.000000000 Z
11
+ date: 2018-02-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: url_safe_base64
@@ -188,7 +188,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
188
188
  version: '0'
189
189
  requirements: []
190
190
  rubyforge_project:
191
- rubygems_version: 2.6.13
191
+ rubygems_version: 2.6.11
192
192
  signing_key:
193
193
  specification_version: 4
194
194
  summary: JSON Web Token and its family (JSON Web Signature, JSON Web Encryption and