json-jwt 1.2.3 → 1.2.4

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: 1815ea41a4fd9ae6a1d6232259a7956ba070b713
4
- data.tar.gz: 2efa46ef39b82e61e5d58817cd804eb3dd50d053
3
+ metadata.gz: 277237d4a352434fcec5c0ba7b57c9b1a8d11995
4
+ data.tar.gz: efabaf69fe883f6fdfb74a57bab183476a52c7c3
5
5
  SHA512:
6
- metadata.gz: a3ecc9a34475f36916f12242f2293db9d9c5a0382619bf250ef1b5aa5650ae0030cfbcc533a56ebbd63a2f43e065f27322c4dc747fee850310f6d8ecab30ce93
7
- data.tar.gz: e4c2d71d75053fc1357e1d0e88b9f88e048587d11189dfdb934e24f3a74b33f7e9dec885aeb1874ffff16609e4bcae15b893efd68d5e5cf6490a90771a4dd3e3
6
+ metadata.gz: 28b18f91c670f47765b070ce57c0bed07d98f5120c4046e4e4dd4439412e287ce4282a0f2909612bb3a1942260d13bb0c9b36648c9913772c584f5b5b221d1b8
7
+ data.tar.gz: 636e0f99153f0eef1f477dc4bee7ffb7a75a6fa22e1104b83778c8a88bb19ae5a392e7d93a1c6da69573aa6c72fe2febbf18141efa88dc1d544eca41295a68de
data/README.md CHANGED
@@ -81,42 +81,110 @@ jwt_string = "jwt_header.jwt_claims.jwt_signature"
81
81
  JSON::JWT.decode(jwt_string, key)
82
82
  ```
83
83
 
84
+ Supported `key` are
85
+ * `String`
86
+ * `OpenSSL::PKey::RSA`
87
+ * `OpenSSL::PKey::EC`
88
+ * `JSON::JWK`
89
+ * `JSON::JWK::Set` # NOTE: proper `JSON::JWK` in the set will be selected by `kid` in the header.
90
+ * `:skip_verification` # NOTE: skip signature verification
91
+
84
92
  ### JWK
85
93
 
94
+ `JSON::JWK.new` accepts these instances as key inputs
95
+ * `String` # NOTE: for shared key (kty=oct)
96
+ * `OpenSSL::PKey::RSA`
97
+ * `OpenSSL::PKey::EC`
98
+ * `JSON::JWK`
99
+ * `Hash`
100
+
101
+ This gem also defines
102
+ * `OpenSSL::PKey::RSA#to_jwk`
103
+ * `OpenSSL::PKey::EC#to_jwk`
104
+
86
105
  #### RSA
87
106
 
88
107
  ```ruby
89
108
  k = OpenSSL::PKey::RSA.new(2048)
90
- p k.to_jwk
91
- # => JSON::JWK
109
+
110
+ k.to_jwk # NOTE: same with `JSON::JWK.new(k)`
111
+ # => JSON::JWK (private key)
112
+
113
+ k.public_key.to_jwk
114
+ # => JSON::JWK (public key)
115
+ ```
116
+
117
+ ```ruby
118
+ jwk = JSON::JWK.new(
119
+ kty: "RSA",
120
+ e: "AQAB",
121
+ n: "0OIOijENzP0AXnxP-X8Dnazt3m4NTamfNsSCkH4xzgZAJj2Eur9-zmq9IukwN37lIrm3oAE6lL4ytNkv-DQpAivKLE8bh4c9qlB9o32VWyg-mg-2af-JlfGXYoaCW2GDMOV6EKqHBxE0x1EI0tG4gcNwO6A_kYtK6_ACgTQudWz_gnPrL-QCunjIMbbrK9JqgMZhgMARMQpB-j8oet2FFsEcquR5MWtBeAn7qC1AD2ya0EmzplZJP6oCka_VVuxAnyWfRGA0bzCBRIVbcGUXVNIXpRtA_4960e7AlGfMSA-ofN-vo7v0CMkA8BwpZHai9CAJ-cTCX1AVbov83LVIWw",
122
+ d: "BZCgNopMBdQPuHSzZMA_hmnfBHgGHrWQKlNd7x-NkCGWf-5PpPIJHNK3K0DvKetVi3FLNRYTS3ctvqeyoXgyR36HKlsJLrkpqWnvjvV_jygpUs1sXLKUJcyD7foLawfUCO90KxF_-24367967rLrqXldehkw2F3Ppy2Dw5FyU2qBqcpLeruBt6-UdMmBufzNQLisPJ67vhCTVrTNaHDDeCK2gHI3gqsnnbzOMS45VknmFOgKUp1C8GZu5BsT-AdDApEtY-DRZqnr6BxZv4-hG5OdEUA4_LCaI6JwlaAzv0Z74jpBZDC73cXWKJPgVuhARZcll5cexB2_EpgZDB6akQ",
123
+ p: "6GFVNgaXcW39NG-sRqKPzFtz1usfAkdCydPmfZirfHRhSh3OojX3Glbe7BI_SRSOLc2d2xw2_ZwKRlruY44aGEf4s5gD_nKgq2QS-1cA5uNAU91wRtY2rdoAuCnk2BX3WTZPnzyxkokFY0S0R_9IpJhRz72ggxYyhx0ymRUBIWc",
124
+ q: "5h1QX2JWLbcIT_cfrkmMoES1z06Fu88MLORYppiRDqkXl3CJFxKFtKJtDPLTf0MeTFexh81V52Ztsd8UttPInyDl9l5T0AOy8NmqHKqjI1063uy4bnHWetN7ovHftc_TOlnldAoQh9bmhZAhEyGlwa5Kros2YD2amIgDhcOmRO0"
125
+ )
126
+ jwk.to_key
127
+ # => OpenSSL::PKey::RSA (private key)
92
128
 
93
129
  jwk = JSON::JWK.new(
94
130
  kty: "RSA",
95
131
  e: "AQAB",
96
- n: "utwietJHu65N7kIa52bMkKgbS1CGmhKNDx3gTBEvQmQhg1BbKHfdmqapMt699T-aloeslYxeO9ItOhprnE0vG-pbDUE7Jg51gtK6kjpLFZOLNpRHJnRikyF6dav1IdJa4fSpOiEJiHk_DuFnAMI04_1H_NISn1TzEBflbyb6BSyIPkfO9433zR2-clvHdIXppq-N272vHA64Xp5hslzY91QodXo5--9iIblPVxzd9aH-aBMSkRbmlIKuz14tWhR-6RLNsWtqxWfKvgeoBLh5e9E5MrlNuRnaaLqHOMWrW1l9985eqmCD3PD4wjwINFKrU4L0fMBCHgCDAZLhbLfUJw",
97
- d: "NtFBpDpwJNT7s7vc3KnBtWY7q5qSAj0S-K5REL-x1448bqNyOqr_bdEarfu-SmZAWYyvyqeFNZNxBSyfCRlzioLz9y19xqpTOu_LH_7N7CR-oKJbRSK7kGIv5Llvjl6BnuwBgTYT799x6lGhwA05KvEw3zBZmjh3ne8Etdj_W-i2LDBDUimgmVrgXWY1KvWFgh2zpptIINX2Q8UxV121bdcBIbj008Cs64m2mMpaa3ggqqNoXnYb8HnJDnYx-WIbUMHJ2-hpZAsVFNet8ZVEMt4cTKaTHY23m9Ditj-7VfFzkoiH9Yj45ewJMpcssadnAPrBgKbjTFuTdJfP8IqMoQ"
132
+ n: "0OIOijENzP0AXnxP-X8Dnazt3m4NTamfNsSCkH4xzgZAJj2Eur9-zmq9IukwN37lIrm3oAE6lL4ytNkv-DQpAivKLE8bh4c9qlB9o32VWyg-mg-2af-JlfGXYoaCW2GDMOV6EKqHBxE0x1EI0tG4gcNwO6A_kYtK6_ACgTQudWz_gnPrL-QCunjIMbbrK9JqgMZhgMARMQpB-j8oet2FFsEcquR5MWtBeAn7qC1AD2ya0EmzplZJP6oCka_VVuxAnyWfRGA0bzCBRIVbcGUXVNIXpRtA_4960e7AlGfMSA-ofN-vo7v0CMkA8BwpZHai9CAJ-cTCX1AVbov83LVIWw"
98
133
  )
99
134
  jwk.to_key
100
- # => OpenSSL::PKey::RSA
135
+ # => OpenSSL::PKey::RSA (public key)
101
136
  ```
102
137
 
103
138
  #### EC
104
139
 
105
140
  ```ruby
106
- k = OpenSSL::PKey::RSA.new(2048)
141
+ k = OpenSSL::PKey::EC.new('prime256v1').generate_key
142
+
143
+ k.to_jwk
144
+ # => JSON::JWK (private key)
145
+
146
+ k.private_key = nil
107
147
  k.to_jwk
148
+ # => JSON::JWK (public key)
149
+ ```
150
+
151
+ ```ruby
152
+ jwk = JSON::JWK.new(
153
+ kty: "EC",
154
+ crv: "P-256",
155
+ x: "D4L5V9QocZvfuEEGfGD5YCEbIcXR-KfF7RqqZUaovJ8",
156
+ y: "VX0T94KUo0YkhuvT2q0MXMOTtfaIjDS4fb9ii54g4gU",
157
+ d: "MCOTV6Ncg7KTuGh1hTa029ZVkqdlaXaYnfLSkZjJ_uE"
158
+ )
159
+ jwk.to_key
160
+ # => OpenSSL::PKey::EC (private key)
161
+
162
+ jwk = JSON::JWK.new(
163
+ kty: "EC",
164
+ crv: "P-256",
165
+ x: "D4L5V9QocZvfuEEGfGD5YCEbIcXR-KfF7RqqZUaovJ8",
166
+ y: "VX0T94KUo0YkhuvT2q0MXMOTtfaIjDS4fb9ii54g4gU"
167
+ )
168
+ jwk.to_key
169
+ # => OpenSSL::PKey::EC (public key)
170
+ ```
171
+
172
+ #### oct
173
+
174
+ NOTE: no `String#to_jwk` is defined for now.
175
+
176
+ ```ruby
177
+ JSON::JWK.new 'secret'
108
178
  # => JSON::JWK
179
+ ```
109
180
 
181
+ ```ruby
110
182
  jwk = JSON::JWK.new(
111
- kty: "RSA",
112
- e: "AQAB",
113
- n: "0OIOijENzP0AXnxP-X8Dnazt3m4NTamfNsSCkH4xzgZAJj2Eur9-zmq9IukwN37lIrm3oAE6lL4ytNkv-DQpAivKLE8bh4c9qlB9o32VWyg-mg-2af-JlfGXYoaCW2GDMOV6EKqHBxE0x1EI0tG4gcNwO6A_kYtK6_ACgTQudWz_gnPrL-QCunjIMbbrK9JqgMZhgMARMQpB-j8oet2FFsEcquR5MWtBeAn7qC1AD2ya0EmzplZJP6oCka_VVuxAnyWfRGA0bzCBRIVbcGUXVNIXpRtA_4960e7AlGfMSA-ofN-vo7v0CMkA8BwpZHai9CAJ-cTCX1AVbov83LVIWw",
114
- d: "BZCgNopMBdQPuHSzZMA_hmnfBHgGHrWQKlNd7x-NkCGWf-5PpPIJHNK3K0DvKetVi3FLNRYTS3ctvqeyoXgyR36HKlsJLrkpqWnvjvV_jygpUs1sXLKUJcyD7foLawfUCO90KxF_-24367967rLrqXldehkw2F3Ppy2Dw5FyU2qBqcpLeruBt6-UdMmBufzNQLisPJ67vhCTVrTNaHDDeCK2gHI3gqsnnbzOMS45VknmFOgKUp1C8GZu5BsT-AdDApEtY-DRZqnr6BxZv4-hG5OdEUA4_LCaI6JwlaAzv0Z74jpBZDC73cXWKJPgVuhARZcll5cexB2_EpgZDB6akQ",
115
- p: "6GFVNgaXcW39NG-sRqKPzFtz1usfAkdCydPmfZirfHRhSh3OojX3Glbe7BI_SRSOLc2d2xw2_ZwKRlruY44aGEf4s5gD_nKgq2QS-1cA5uNAU91wRtY2rdoAuCnk2BX3WTZPnzyxkokFY0S0R_9IpJhRz72ggxYyhx0ymRUBIWc",
116
- q: "5h1QX2JWLbcIT_cfrkmMoES1z06Fu88MLORYppiRDqkXl3CJFxKFtKJtDPLTf0MeTFexh81V52Ztsd8UttPInyDl9l5T0AOy8NmqHKqjI1063uy4bnHWetN7ovHftc_TOlnldAoQh9bmhZAhEyGlwa5Kros2YD2amIgDhcOmRO0"
183
+ kty: "oct",
184
+ k: "secret"
117
185
  )
118
186
  jwk.to_key
119
- # => OpenSSL::PKey::EC
187
+ # => String
120
188
  ```
121
189
 
122
190
  ## Note on Patches/Pull Requests
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.3
1
+ 1.2.4
data/lib/json/jwk.rb CHANGED
@@ -13,6 +13,7 @@ module JSON
13
13
  k: params,
14
14
  kty: :oct
15
15
  )
16
+ merge! ex_params
16
17
  else
17
18
  super params
18
19
  merge! ex_params
@@ -40,11 +41,7 @@ module JSON
40
41
  when rsa?
41
42
  to_rsa_key
42
43
  when ec?
43
- if RUBY_VERSION >= '2.0.0'
44
- to_ec_key
45
- else
46
- raise UnknownAlgorithm.new('This feature requires Ruby 2.0+')
47
- end
44
+ to_ec_key
48
45
  when oct?
49
46
  self[:k]
50
47
  else
@@ -21,13 +21,6 @@ module JSON
21
21
 
22
22
  module EC
23
23
  def to_jwk(ex_params = {})
24
- # NOTE:
25
- # OpenSSL::PKey::EC instance can be both public & private key at the same time.
26
- # In such case, is it handled as public key or private key?
27
- # For now, this gem handles any OpenSSL::PKey::EC instances as public key.
28
- unless public_key?
29
- raise UnknownAlgorithm.new('EC private key is not supported yet')
30
- end
31
24
  params = {
32
25
  kty: :EC,
33
26
  crv: curve_name,
data/lib/json/jwk/set.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  module JSON
2
2
  class JWK
3
3
  class Set < Array
4
+ class KidNotFound < JWT::Exception; end
5
+
4
6
  def initialize(*jwks)
5
7
  jwks = Array(jwks).flatten.collect do |jwk|
6
8
  JWK.new jwk
data/lib/json/jws.rb CHANGED
@@ -129,7 +129,7 @@ module JSON
129
129
  when JSON::JWK::Set
130
130
  key.detect do |jwk|
131
131
  jwk[:kid] && jwk[:kid] == header[:kid]
132
- end.try(:to_key)
132
+ end.try(:to_key) or raise JWK::Set::KidNotFound
133
133
  else
134
134
  key
135
135
  end
@@ -1,46 +1,48 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe JSON::JWK::JWKizable do
4
- shared_examples_for :jwkizable do
5
- describe '#to_jwk' do
6
- it { key.to_jwk.should be_instance_of JSON::JWK }
7
- it { key.to_jwk.should include *expected_attributes.collect(&:to_s) }
8
- end
9
- end
4
+ describe '#to_jwk' do
5
+ subject { key.to_jwk }
10
6
 
11
- describe OpenSSL::PKey::RSA do
12
- describe :public_key do
13
- let(:key) { public_key :rsa }
14
- let(:expected_attributes) { [:kty, :n, :e] }
15
- it_behaves_like :jwkizable
7
+ shared_examples_for :jwkizable_as_public do
8
+ it { should be_instance_of JSON::JWK }
9
+ it { should include *public_key_attributes.collect(&:to_s) }
10
+ it { should_not include *private_key_attributes.collect(&:to_s) }
16
11
  end
17
12
 
18
- describe :private_key do
19
- let(:key) { private_key :rsa }
20
- let(:expected_attributes) { [:kty, :n, :e, :d] }
21
- it_behaves_like :jwkizable
13
+ shared_examples_for :jwkizable_as_private do
14
+ it { should be_instance_of JSON::JWK }
15
+ it { should include *public_key_attributes.collect(&:to_s) }
16
+ it { should include *private_key_attributes.collect(&:to_s) }
22
17
  end
23
- end
24
18
 
25
- describe OpenSSL::PKey::EC do
26
- describe :public_key do
27
- let(:key) { public_key :ecdsa }
28
- let(:expected_attributes) { [:kty, :crv, :x, :y] }
29
- it_behaves_like :jwkizable
19
+ describe OpenSSL::PKey::RSA do
20
+ let(:public_key_attributes) { [:kty, :n, :e] }
21
+ let(:private_key_attributes) { [:d, :p, :q] }
22
+
23
+ describe :public_key do
24
+ let(:key) { public_key :rsa }
25
+ it_behaves_like :jwkizable_as_public
26
+ end
27
+
28
+ describe :private_key do
29
+ let(:key) { private_key :rsa }
30
+ it_behaves_like :jwkizable_as_private
31
+ end
30
32
  end
31
33
 
32
- describe :private_key do
33
- let(:key) { private_key :ecdsa }
34
- let(:expected_attributes) { [:kty, :crv, :x, :y] } # NOTE: handled as public key
35
- it_behaves_like :jwkizable
36
-
37
- context 'when public key is not contained' do
38
- before { key.public_key = nil }
39
- it do
40
- expect do
41
- key.to_jwk
42
- end.to raise_error JSON::JWK::UnknownAlgorithm, 'EC private key is not supported yet'
43
- end
34
+ describe OpenSSL::PKey::EC do
35
+ let(:public_key_attributes) { [:kty, :crv, :x, :y] }
36
+ let(:private_key_attributes) { [:d] }
37
+
38
+ describe :public_key do
39
+ let(:key) { public_key :ecdsa }
40
+ it_behaves_like :jwkizable_as_public
41
+ end
42
+
43
+ describe :private_key do
44
+ let(:key) { private_key :ecdsa }
45
+ it_behaves_like :jwkizable_as_private
44
46
  end
45
47
  end
46
48
  end
@@ -72,9 +72,14 @@ describe JSON::JWK do
72
72
  it { should == '6v7pXTnQLMiQgvJlPJUdhAUSuGLzgF8C1r3ABAMFet6bc53ea-Pq4ZGbGu3RoAFsNRT1-RhTzDqtqXuLU6NOtw' }
73
73
  end
74
74
  end
75
+
76
+ describe '#to_key' do
77
+ it { jwk.to_key.should be_instance_of OpenSSL::PKey::RSA }
78
+ end
75
79
  end
76
80
 
77
- context 'when ECDSA public key given' do
81
+ context 'when EC public key given' do
82
+ let(:jwk) { JSON::JWK.new public_key(:ecdsa) }
78
83
  let(:expected_coordinates) do
79
84
  {
80
85
  256 => {
@@ -91,6 +96,7 @@ describe JSON::JWK do
91
96
  }
92
97
  }
93
98
  end
99
+
94
100
  [256, 384, 512].each do |digest_length|
95
101
  describe "EC#{digest_length}" do
96
102
  let(:jwk) { JSON::JWK.new public_key(:ecdsa, digest_length: digest_length) }
@@ -109,49 +115,52 @@ describe JSON::JWK do
109
115
  end.to raise_error JSON::JWK::UnknownAlgorithm, 'Unknown EC Curve'
110
116
  end
111
117
  end
112
- end
113
118
 
114
- describe 'unknown key type' do
115
- it do
116
- key = OpenSSL::PKey::DSA.generate 256
117
- expect do
118
- JSON::JWK.new key
119
- end.to raise_error JSON::JWK::UnknownAlgorithm, 'Unknown Key Type'
119
+ describe '#thumbprint' do
120
+ context 'using default hash function' do
121
+ subject { jwk.thumbprint }
122
+ it { should == '-egRpLjyZCqxBh4OOfd8JSvXwayHmNFAUNkbi8exfhc' }
123
+ end
124
+
125
+ context 'using SHA512 hash function' do
126
+ subject { jwk.thumbprint :SHA512 }
127
+ it { should == 'B_yXDZJ9doudaVCj5q5vqxshvVtW2IFnz_ypvRt5O60gemkDAhO78L6YMyTWH0ZRm15cO2_laTSaNO9yZQFsvQ' }
128
+ end
129
+ end
130
+
131
+ describe '#to_key' do
132
+ it { jwk.to_key.should be_instance_of OpenSSL::PKey::EC }
120
133
  end
121
134
  end
122
135
 
123
- describe '#thumbprint' do
124
- context 'when kty=RSA' do
125
- subject do
126
- JSON::JWK.new(
127
- kty: :RSA,
128
- e: 'AQAB',
129
- n: '0OIOijENzP0AXnxP-X8Dnazt3m4NTamfNsSCkH4xzgZAJj2Eur9-zmq9IukwN37lIrm3oAE6lL4ytNkv-DQpAivKLE8bh4c9qlB9o32VWyg-mg-2af-JlfGXYoaCW2GDMOV6EKqHBxE0x1EI0tG4gcNwO6A_kYtK6_ACgTQudWz_gnPrL-QCunjIMbbrK9JqgMZhgMARMQpB-j8oet2FFsEcquR5MWtBeAn7qC1AD2ya0EmzplZJP6oCka_VVuxAnyWfRGA0bzCBRIVbcGUXVNIXpRtA_4960e7AlGfMSA-ofN-vo7v0CMkA8BwpZHai9CAJ-cTCX1AVbov83LVIWw'
130
- )
136
+ context 'when shared secret given' do
137
+ let(:jwk) { JSON::JWK.new 'secret' }
138
+ its(:kty) { jwk[:kty].should == :oct }
139
+ its(:x) { jwk[:k].should == 'secret' }
140
+
141
+ describe '#thumbprint' do
142
+ context 'using default hash function' do
143
+ subject { jwk.thumbprint }
144
+ it { should == 'XZPWsTEZFIerowAF9GHzBtq5CkAOcVvIBnkMu0IIQH0' }
131
145
  end
132
- its(:thumbprint) { should == 'fFn3D1P0H7Qo1ugQ-5LM6LC63LtArbkPsbQcs2F-1yA' }
133
- end
134
146
 
135
- context 'when kty=EC' do
136
- subject do
137
- JSON::JWK.new(
138
- kty: 'EC',
139
- crv: 'P-256',
140
- x: 'saPyrO4Lh9kh2FxrF9y1QVmZznWnRRJwpr12UHqzrVY',
141
- y: 'MMz4W9zzqlrJhqr-JyrpvlnaIIyZQE6DfrgPkxMAw1M'
142
- )
147
+ context 'using SHA512 hash function' do
148
+ subject { jwk.thumbprint :SHA512 }
149
+ it { should == 'rK7EtcEe9Xr0kryR9lNnyOTRe7Vb_BglbTBtbcVG2LzvL26_PFaMCwOtiUiXWfCK-wV8vcxjmvbcvV4ZxDE0FQ' }
143
150
  end
144
- its(:thumbprint) { should == '-egRpLjyZCqxBh4OOfd8JSvXwayHmNFAUNkbi8exfhc' }
145
151
  end
146
152
 
147
- context 'when kty=oct' do
148
- subject do
149
- JSON::JWK.new(
150
- kty: 'oct',
151
- k: 'secret'
152
- )
153
- end
154
- its(:thumbprint) { should == 'XZPWsTEZFIerowAF9GHzBtq5CkAOcVvIBnkMu0IIQH0' }
153
+ describe '#to_key' do
154
+ it { jwk.to_key.should be_instance_of String }
155
+ end
156
+ end
157
+
158
+ describe 'unknown key type' do
159
+ it do
160
+ key = OpenSSL::PKey::DSA.generate 256
161
+ expect do
162
+ JSON::JWK.new key
163
+ end.to raise_error JSON::JWK::UnknownAlgorithm, 'Unknown Key Type'
155
164
  end
156
165
  end
157
166
 
@@ -167,30 +176,17 @@ describe JSON::JWK do
167
176
  let(:e) { 'AQAB' }
168
177
  let(:n) { 'AK8ppaAGn6N3jDic2DhDN5mI5mWzvhfL1AFZOS9q2EBM8L5sjZbYiaHeNoKillZGmEF9a9g6Z20bDnoHTuHPsx93HYkZqPumFZ8K9lLCbqKAMWw2Qgk10RgrZ-kblJotTBCeer9-tZSWO-OWFzP4gp8MpSuQOQbwTJwDgEkFIQLUK2YgzWbn1PoW8xcfbVyWhZD880ELGRW6GhRgYAl0DN_EQS8kyUa0CusYCzOOg2W3-7qjYeojyP6jiOEr-eyjC7hcUvTVoTfz84BiZv72KS3i5JS8ZNNuRp5Ce51wjoDDUoNxDLWv6Da6qMaGpKz6NTSNbvhE_KFhpp4wf5yRQD8=' }
169
178
  let(:pem) do
170
- if RUBY_VERSION >= '1.9.3'
171
- <<-PEM.strip_heredoc
172
- -----BEGIN PUBLIC KEY-----
173
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArymloAafo3eMOJzYOEM3
174
- mYjmZbO+F8vUAVk5L2rYQEzwvmyNltiJod42gqKWVkaYQX1r2DpnbRsOegdO4c+z
175
- H3cdiRmo+6YVnwr2UsJuooAxbDZCCTXRGCtn6RuUmi1MEJ56v361lJY745YXM/iC
176
- nwylK5A5BvBMnAOASQUhAtQrZiDNZufU+hbzFx9tXJaFkPzzQQsZFboaFGBgCXQM
177
- 38RBLyTJRrQK6xgLM46DZbf7uqNh6iPI/qOI4Sv57KMLuFxS9NWhN/PzgGJm/vYp
178
- LeLklLxk025GnkJ7nXCOgMNSg3EMta/oNrqoxoakrPo1NI1u+ET8oWGmnjB/nJFA
179
- PwIDAQAB
180
- -----END PUBLIC KEY-----
181
- PEM
182
- else
183
- <<-PEM.strip_heredoc
184
- -----BEGIN RSA PUBLIC KEY-----
185
- MIIBCgKCAQEArymloAafo3eMOJzYOEM3mYjmZbO+F8vUAVk5L2rYQEzwvmyNltiJ
186
- od42gqKWVkaYQX1r2DpnbRsOegdO4c+zH3cdiRmo+6YVnwr2UsJuooAxbDZCCTXR
187
- GCtn6RuUmi1MEJ56v361lJY745YXM/iCnwylK5A5BvBMnAOASQUhAtQrZiDNZufU
188
- +hbzFx9tXJaFkPzzQQsZFboaFGBgCXQM38RBLyTJRrQK6xgLM46DZbf7uqNh6iPI
189
- /qOI4Sv57KMLuFxS9NWhN/PzgGJm/vYpLeLklLxk025GnkJ7nXCOgMNSg3EMta/o
190
- NrqoxoakrPo1NI1u+ET8oWGmnjB/nJFAPwIDAQAB
191
- -----END RSA PUBLIC KEY-----
192
- PEM
193
- end
179
+ <<-PEM.strip_heredoc
180
+ -----BEGIN PUBLIC KEY-----
181
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArymloAafo3eMOJzYOEM3
182
+ mYjmZbO+F8vUAVk5L2rYQEzwvmyNltiJod42gqKWVkaYQX1r2DpnbRsOegdO4c+z
183
+ H3cdiRmo+6YVnwr2UsJuooAxbDZCCTXRGCtn6RuUmi1MEJ56v361lJY745YXM/iC
184
+ nwylK5A5BvBMnAOASQUhAtQrZiDNZufU+hbzFx9tXJaFkPzzQQsZFboaFGBgCXQM
185
+ 38RBLyTJRrQK6xgLM46DZbf7uqNh6iPI/qOI4Sv57KMLuFxS9NWhN/PzgGJm/vYp
186
+ LeLklLxk025GnkJ7nXCOgMNSg3EMta/oNrqoxoakrPo1NI1u+ET8oWGmnjB/nJFA
187
+ PwIDAQAB
188
+ -----END PUBLIC KEY-----
189
+ PEM
194
190
  end
195
191
 
196
192
  it { should be_instance_of OpenSSL::PKey::RSA }
@@ -206,43 +202,30 @@ describe JSON::JWK do
206
202
  end
207
203
 
208
204
  context 'when ECDSA' do
209
- if RUBY_VERSION >= '2.0.0'
210
- [{
211
- alg: 'EC',
212
- crv: 'P-256',
213
- kty: 'EC',
214
- x: 'saPyrO4Lh9kh2FxrF9y1QVmZznWnRRJwpr12UHqzrVY',
215
- y: 'MMz4W9zzqlrJhqr-JyrpvlnaIIyZQE6DfrgPkxMAw1M'
216
- }, {
217
- alg: 'EC',
218
- crv: 'P-384',
219
- kty: 'EC',
220
- x: 'plzApyFnK7qzhg5XnIZbFj2hZoH2Vdl4-RFm7DnsNMG9tyqrpfq2RyjfKABbcFRt',
221
- y: 'ixBzffhk3fcbmeipGLkvQBNCzeNm6QL3hOUTH6IFBzOL0Y7HsGTopNTTspLjlivb'
222
- }, {
223
- alg: 'EC',
224
- crv: 'P-521',
225
- kty: 'EC',
226
- x: 'AcMCD-a0a6rnE9TvC0mOqF_DGXRg5Y3iTb4eHNwTm2kD6iujx9M_f8d_FGHr0OhpqzEn4rYPYZouGsbIPEgL0q__',
227
- y: 'AULYEd8l-bV_BI289aezhSLZ1RDF2ltgDPEy9Y7YtqYa4cJcpiyzVDMpXWwBp6cjg6TXINkoVrVXZhN404ihu4I2'
228
- }].each do |jwk|
229
- describe jwk['crv'] do
230
- it do
231
- JSON::JWK.decode(jwk).should be_instance_of OpenSSL::PKey::EC
232
- end
205
+ [{
206
+ alg: 'EC',
207
+ crv: 'P-256',
208
+ kty: 'EC',
209
+ x: 'saPyrO4Lh9kh2FxrF9y1QVmZznWnRRJwpr12UHqzrVY',
210
+ y: 'MMz4W9zzqlrJhqr-JyrpvlnaIIyZQE6DfrgPkxMAw1M'
211
+ }, {
212
+ alg: 'EC',
213
+ crv: 'P-384',
214
+ kty: 'EC',
215
+ x: 'plzApyFnK7qzhg5XnIZbFj2hZoH2Vdl4-RFm7DnsNMG9tyqrpfq2RyjfKABbcFRt',
216
+ y: 'ixBzffhk3fcbmeipGLkvQBNCzeNm6QL3hOUTH6IFBzOL0Y7HsGTopNTTspLjlivb'
217
+ }, {
218
+ alg: 'EC',
219
+ crv: 'P-521',
220
+ kty: 'EC',
221
+ x: 'AcMCD-a0a6rnE9TvC0mOqF_DGXRg5Y3iTb4eHNwTm2kD6iujx9M_f8d_FGHr0OhpqzEn4rYPYZouGsbIPEgL0q__',
222
+ y: 'AULYEd8l-bV_BI289aezhSLZ1RDF2ltgDPEy9Y7YtqYa4cJcpiyzVDMpXWwBp6cjg6TXINkoVrVXZhN404ihu4I2'
223
+ }].each do |jwk|
224
+ describe jwk['crv'] do
225
+ it do
226
+ JSON::JWK.decode(jwk).should be_instance_of OpenSSL::PKey::EC
233
227
  end
234
228
  end
235
- else
236
- it do
237
- expect do
238
- JSON::JWK.decode(
239
- kty: :EC,
240
- crv: 'P-256',
241
- x: 'MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4',
242
- y: '4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM'
243
- )
244
- end.to raise_error JSON::JWK::UnknownAlgorithm
245
- end
246
229
  end
247
230
  end
248
231
 
@@ -122,7 +122,26 @@ describe JSON::JWS do
122
122
  end
123
123
 
124
124
  context 'when JSON::JWK::Set key given' do
125
- it :TODO
125
+ let(:alg) { :HS256 }
126
+ let(:kid) { 'kid' }
127
+ let(:jwks) do
128
+ jwk = JSON::JWK.new shared_secret, kid: kid
129
+ JSON::JWK::Set.new jwk, JSON::JWK.new('another')
130
+ end
131
+ let(:signed) { jws.sign!(jwks) }
132
+
133
+ context 'when jwk is found by given kid' do
134
+ before { jws.header[:kid] = kid }
135
+ it { should == jws.sign!('secret') }
136
+ end
137
+
138
+ context 'otherwise' do
139
+ it do
140
+ expect do
141
+ subject
142
+ end.to raise_error JSON::JWK::Set::KidNotFound
143
+ end
144
+ end
126
145
  end
127
146
 
128
147
  describe 'unknown algorithm' do
@@ -211,6 +230,31 @@ describe JSON::JWS do
211
230
  end
212
231
  end
213
232
 
233
+ context 'when JSON::JWK::Set key given' do
234
+ subject { JSON::JWT.decode signed.to_s, jwks }
235
+
236
+ let(:alg) { :HS256 }
237
+ let(:kid) { 'kid' }
238
+ let(:jwks) do
239
+ jwk = JSON::JWK.new shared_secret, kid: kid
240
+ JSON::JWK::Set.new jwk, JSON::JWK.new('another')
241
+ end
242
+ let(:signed) { jws.sign!(jwks) }
243
+
244
+ context 'when jwk is found by given kid' do
245
+ before { jws.header[:kid] = kid }
246
+ it { should == signed }
247
+ end
248
+
249
+ context 'otherwise' do
250
+ it do
251
+ expect do
252
+ subject
253
+ end.to raise_error JSON::JWK::Set::KidNotFound
254
+ end
255
+ end
256
+ end
257
+
214
258
  describe 'unknown algorithm' do
215
259
  let(:alg) { :unknown }
216
260
  it do
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.2.3
4
+ version: 1.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - nov matake
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-13 00:00:00.000000000 Z
11
+ date: 2015-08-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_json