json-jwt 1.3.1 → 1.4.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: 05de8b3155d7e83d6f5fa6e4e9f157a775049cd5
4
- data.tar.gz: 08e6eea95c7e4b7fcfef3df410c9180bb1687042
3
+ metadata.gz: 6817c45c39a6ae6f9240df8b7edb8d407ef79744
4
+ data.tar.gz: 8f97ad80b2d8fda2732b8cbbf8166b9ca8bca404
5
5
  SHA512:
6
- metadata.gz: d9267cdcd5e667ababeb3924d22ff9f883ecae48152be82201dbf9a4ac7243bc950d737db479904a84936123ac5127847b3089219e8cc57d6e382ab9bb46aec7
7
- data.tar.gz: 57299440c5fb636ee600d13112b21a97b512afb5d581e2719fce6cc0bdd6e9449c7a0bb6f0978f26951b20bf91e8a0a77817586eef7ea86259f84c250538ab43
6
+ metadata.gz: 1cc01ddbca74f1dd13cc054e5b3e2d1d9242191309526a29c1c1e75e5c5f08d70cb79c208dd4afb1b7dc948bed2b85adef25f5c8a9314ec0f5ff256a9cbdd0b2
7
+ data.tar.gz: 17b0980e989fd63dcf0ee5ee48dd8cc44d38ead751ecf6523e2ea4ed7d820b520be0502d0fb9265d73c330bf0aebd8c7794b610d69373526bfc3d14a4803fe4a
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.3.1
1
+ 1.4.0
@@ -10,16 +10,16 @@ module JSON
10
10
  NUM_OF_SEGMENTS = 5
11
11
 
12
12
  attr_accessor(
13
- :public_key_or_secret, :private_key_or_secret, :mode,
14
- :input, :plain_text, :cipher_text, :authentication_tag, :iv,
13
+ :public_key_or_secret, :private_key_or_secret,
14
+ :plain_text, :cipher_text, :authentication_tag, :iv, :auth_data,
15
15
  :content_encryption_key, :jwe_encrypted_key, :encryption_key, :mac_key
16
16
  )
17
17
 
18
18
  register_header_keys :enc, :epk, :zip, :apu, :apv
19
19
  alias_method :encryption_method, :enc
20
20
 
21
- def initialize(input)
22
- self.input = input.to_s
21
+ def initialize(input = nil)
22
+ self.plain_text = input.to_s
23
23
  end
24
24
 
25
25
  def content_type
@@ -27,8 +27,6 @@ module JSON
27
27
  end
28
28
 
29
29
  def encrypt!(public_key_or_secret)
30
- self.mode = :encryption
31
- self.plain_text = input
32
30
  self.public_key_or_secret = public_key_or_secret
33
31
  cipher.encrypt
34
32
  generate_cipher_keys!
@@ -37,9 +35,7 @@ module JSON
37
35
  end
38
36
 
39
37
  def decrypt!(private_key_or_secret)
40
- self.mode = :decryption
41
38
  self.private_key_or_secret = private_key_or_secret
42
- decode_segments!
43
39
  cipher.decrypt
44
40
  restore_cipher_keys!
45
41
  self.plain_text = cipher.update(cipher_text) + cipher.final
@@ -48,18 +44,39 @@ module JSON
48
44
  end
49
45
 
50
46
  def to_s
51
- if mode == :encryption
52
- [
53
- header.to_json,
54
- jwe_encrypted_key,
55
- iv,
56
- cipher_text,
57
- authentication_tag
58
- ].collect do |segment|
59
- UrlSafeBase64.encode64 segment.to_s
60
- end.join('.')
47
+ [
48
+ header.to_json,
49
+ jwe_encrypted_key,
50
+ iv,
51
+ cipher_text,
52
+ authentication_tag
53
+ ].collect do |segment|
54
+ UrlSafeBase64.encode64 segment.to_s
55
+ end.join('.')
56
+ end
57
+
58
+ def as_json(options = {})
59
+ case options[:syntax]
60
+ when :general
61
+ {
62
+ protected: UrlSafeBase64.encode64(header.to_json),
63
+ recipients: [{
64
+ encrypted_key: UrlSafeBase64.encode64(jwe_encrypted_key)
65
+ }],
66
+ iv: UrlSafeBase64.encode64(iv),
67
+ ciphertext: UrlSafeBase64.encode64(cipher_text),
68
+ tag: UrlSafeBase64.encode64(authentication_tag)
69
+ }
70
+ when :flattened
71
+ {
72
+ protected: UrlSafeBase64.encode64(header.to_json),
73
+ encrypted_key: UrlSafeBase64.encode64(jwe_encrypted_key),
74
+ iv: UrlSafeBase64.encode64(iv),
75
+ ciphertext: UrlSafeBase64.encode64(cipher_text),
76
+ tag: UrlSafeBase64.encode64(authentication_tag)
77
+ }
61
78
  else
62
- plain_text
79
+ super
63
80
  end
64
81
  end
65
82
 
@@ -166,8 +183,9 @@ module JSON
166
183
  end
167
184
  cipher.key = encryption_key
168
185
  self.iv = cipher.random_iv
186
+ self.auth_data = UrlSafeBase64.encode64 header.to_json
169
187
  if gcm?
170
- cipher.auth_data = UrlSafeBase64.encode64 header.to_json
188
+ cipher.auth_data = self.auth_data
171
189
  end
172
190
  self
173
191
  end
@@ -197,7 +215,6 @@ module JSON
197
215
  when gcm?
198
216
  cipher.auth_tag
199
217
  when cbc?
200
- auth_data = UrlSafeBase64.encode64 header.to_json
201
218
  secured_input = [
202
219
  auth_data,
203
220
  iv,
@@ -212,16 +229,6 @@ module JSON
212
229
 
213
230
  # decryption
214
231
 
215
- def decode_segments!
216
- unless input.count('.') + 1 == NUM_OF_SEGMENTS
217
- raise InvalidFormat.new("Invalid JWE Format. JWE should include #{NUM_OF_SEGMENTS} segments.")
218
- end
219
- _header_json_, self.jwe_encrypted_key, self.iv, self.cipher_text, self.authentication_tag = input.split('.').collect do |segment|
220
- UrlSafeBase64.decode64 segment
221
- end
222
- self
223
- end
224
-
225
232
  def decrypt_content_encryption_key
226
233
  case algorithm.try(:to_sym)
227
234
  when :RSA1_5
@@ -257,12 +264,11 @@ module JSON
257
264
  cipher.iv = iv # NOTE: 'iv' has to be set after 'key' for GCM
258
265
  if gcm?
259
266
  cipher.auth_tag = authentication_tag
260
- cipher.auth_data = input.split('.').first
267
+ cipher.auth_data = auth_data
261
268
  end
262
269
  end
263
270
 
264
271
  def verify_cbc_authentication_tag!
265
- auth_data = input.split('.').first
266
272
  secured_input = [
267
273
  auth_data,
268
274
  iv,
@@ -276,5 +282,38 @@ module JSON
276
282
  raise DecryptionFailed.new('Invalid authentication tag')
277
283
  end
278
284
  end
285
+
286
+ class << self
287
+ def decode_compact_serialized(input, private_key_or_secret)
288
+ unless input.count('.') + 1 == NUM_OF_SEGMENTS
289
+ raise InvalidFormat.new("Invalid JWE Format. JWE should include #{NUM_OF_SEGMENTS} segments.")
290
+ end
291
+ jwe = new
292
+ _header_json_, jwe.jwe_encrypted_key, jwe.iv, jwe.cipher_text, jwe.authentication_tag = input.split('.').collect do |segment|
293
+ UrlSafeBase64.decode64 segment
294
+ end
295
+ jwe.auth_data = input.split('.').first
296
+ jwe.header = MultiJson.load(_header_json_).with_indifferent_access
297
+ jwe.decrypt! private_key_or_secret unless private_key_or_secret == :skip_decryption
298
+ jwe
299
+ end
300
+
301
+ def decode_json_serialized(input, private_key_or_secret)
302
+ input = input.with_indifferent_access
303
+ jwe_encrypted_key = if input[:recipients].present?
304
+ input[:recipients].first[:encrypted_key]
305
+ else
306
+ input[:encrypted_key]
307
+ end
308
+ compact_serialized = [
309
+ input[:protected],
310
+ jwe_encrypted_key,
311
+ input[:iv],
312
+ input[:ciphertext],
313
+ input[:tag]
314
+ ].join('.')
315
+ decode_compact_serialized compact_serialized, private_key_or_secret
316
+ end
317
+ end
279
318
  end
280
319
  end
@@ -6,9 +6,10 @@ module JSON
6
6
 
7
7
  NUM_OF_SEGMENTS = 3
8
8
 
9
+ attr_accessor :signature_base_string
10
+
9
11
  def initialize(jwt)
10
12
  update jwt
11
- raise InvalidFormat.new('Signature Algorithm Required') unless algorithm
12
13
  end
13
14
 
14
15
  def sign!(private_key_or_secret)
@@ -16,9 +17,14 @@ module JSON
16
17
  self
17
18
  end
18
19
 
19
- def verify(signature_base_string, public_key_or_secret)
20
- public_key_or_secret && valid?(signature_base_string, public_key_or_secret) or
21
- raise VerificationFailed
20
+ def verify!(public_key_or_secret)
21
+ if alg.try(:to_sym) == :none
22
+ raise UnexpectedAlgorithm if public_key_or_secret
23
+ signature == '' or raise VerificationFailed
24
+ else
25
+ public_key_or_secret && valid?(public_key_or_secret) or
26
+ raise VerificationFailed
27
+ end
22
28
  end
23
29
 
24
30
  def update_with_jose_attributes(hash_or_jwt)
@@ -50,7 +56,7 @@ module JSON
50
56
  end
51
57
 
52
58
  def signature_base_string
53
- [
59
+ @signature_base_string ||= [
54
60
  header.to_json,
55
61
  self.to_json
56
62
  ].collect do |segment|
@@ -79,7 +85,7 @@ module JSON
79
85
  end
80
86
  end
81
87
 
82
- def valid?(signature_base_string, public_key_or_secret)
88
+ def valid?(public_key_or_secret)
83
89
  public_key_or_secret = with_jwk_support public_key_or_secret
84
90
  case
85
91
  when hmac?
@@ -107,7 +113,7 @@ module JSON
107
113
  key.to_key
108
114
  when JSON::JWK::Set
109
115
  key.detect do |jwk|
110
- jwk[:kid] && jwk[:kid] == header[:kid]
116
+ jwk[:kid] && jwk[:kid] == kid
111
117
  end.try(:to_key) or raise JWK::Set::KidNotFound
112
118
  else
113
119
  key
@@ -138,5 +144,44 @@ module JSON
138
144
  byte_size = (private_key.group.degree + 7) / 8
139
145
  OpenSSL::ASN1.decode(signature).value.map { |value| value.value.to_s(2).rjust(byte_size, "\x00") }.join
140
146
  end
147
+
148
+ class << self
149
+ def decode_compact_serialized(input, public_key_or_secret)
150
+ unless input.count('.') + 1 == NUM_OF_SEGMENTS
151
+ raise InvalidFormat.new("Invalid JWS Format. JWS should include #{NUM_OF_SEGMENTS} segments.")
152
+ end
153
+ header, claims, signature = input.split('.', JWS::NUM_OF_SEGMENTS).collect do |segment|
154
+ UrlSafeBase64.decode64 segment.to_s
155
+ end
156
+ header, claims = [header, claims].collect do |json|
157
+ MultiJson.load(json).with_indifferent_access
158
+ end
159
+ jws = new claims
160
+ jws.header = header
161
+ jws.signature = signature
162
+ jws.signature_base_string = input.split('.')[0, JWS::NUM_OF_SEGMENTS - 1].join('.')
163
+ jws.verify! public_key_or_secret unless public_key_or_secret == :skip_verification
164
+ jws
165
+ end
166
+
167
+ def decode_json_serialized(input, public_key_or_secret)
168
+ input = input.with_indifferent_access
169
+ header, payload, signature = if input[:signatures].present?
170
+ [
171
+ input[:signatures].first[:protected],
172
+ input[:payload],
173
+ input[:signatures].first[:signature]
174
+ ].collect do |segment|
175
+ segment
176
+ end
177
+ else
178
+ [:protected, :payload, :signature].collect do |key|
179
+ input[key]
180
+ end
181
+ end
182
+ compact_serialized = [header, payload, signature].join('.')
183
+ decode_compact_serialized compact_serialized, public_key_or_secret
184
+ end
185
+ end
141
186
  end
142
187
  end
@@ -51,13 +51,11 @@ module JSON
51
51
  jws.sign! private_key_or_secret
52
52
  end
53
53
 
54
+ # NOTE: keeping for backward compatibility
54
55
  def verify(signature_base_string, public_key_or_secret = nil)
55
- if alg.try(:to_sym) == :none
56
- raise UnexpectedAlgorithm if public_key_or_secret
57
- signature == '' or raise VerificationFailed
58
- else
59
- JWS.new(self).verify(signature_base_string, public_key_or_secret)
60
- end
56
+ jws = JWS.new self
57
+ jws.signature_base_string = signature_base_string
58
+ jws.verify! public_key_or_secret
61
59
  end
62
60
 
63
61
  def encrypt(public_key_or_secret, algorithm = :RSA1_5, encryption_method = :'A128CBC-HS256')
@@ -105,64 +103,30 @@ module JSON
105
103
  else
106
104
  decode_compact_serialized input, key_or_secret
107
105
  end
106
+ rescue MultiJson::DecodeError
107
+ raise InvalidFormat.new("Invalid JSON Format")
108
108
  end
109
109
 
110
- private
111
-
112
110
  def decode_compact_serialized(jwt_string, key_or_secret)
113
111
  case jwt_string.count('.') + 1
114
- when JWS::NUM_OF_SEGMENTS # JWT / JWS
115
- header, claims, signature = jwt_string.split('.', JWS::NUM_OF_SEGMENTS).collect do |segment|
116
- UrlSafeBase64.decode64 segment.to_s
117
- end
118
- header, claims = [header, claims].collect do |json|
119
- MultiJson.load(json).with_indifferent_access
120
- end
121
- signature_base_string = jwt_string.split('.')[0, JWS::NUM_OF_SEGMENTS - 1].join('.')
122
- jwt = new claims
123
- jwt.header = header
124
- jwt.signature = signature
125
-
126
- # NOTE:
127
- # Some JSON libraries generates wrong format of JSON (spaces between keys and values etc.)
128
- # So we need to use raw base64 strings for signature verification.
129
- jwt.verify signature_base_string, key_or_secret unless key_or_secret == :skip_verification
130
- jwt
112
+ when JWS::NUM_OF_SEGMENTS
113
+ JWS.decode_compact_serialized jwt_string, key_or_secret
131
114
  when JWE::NUM_OF_SEGMENTS
132
- jwe = JWE.new jwt_string
133
- jwe.header = MultiJson.load(
134
- UrlSafeBase64.decode64 jwt_string.split('.').first
135
- ).with_indifferent_access
136
- if key_or_secret == :skip_decryption
137
- jwe
138
- else
139
- jwe.decrypt! key_or_secret
140
- JSON::JWT.decode jwe.plain_text, :skip_verification
141
- end
115
+ JWE.decode_compact_serialized jwt_string, key_or_secret
142
116
  else
143
117
  raise InvalidFormat.new("Invalid JWT Format. JWT should include #{JWS::NUM_OF_SEGMENTS} or #{JWE::NUM_OF_SEGMENTS} segments.")
144
118
  end
145
- rescue MultiJson::DecodeError
146
- raise InvalidFormat.new("Invalid JSON Format")
147
119
  end
148
120
 
149
121
  def decode_json_serialized(input, key_or_secret)
150
122
  input = input.with_indifferent_access
151
- header, payload, signature = if input[:signatures].present?
152
- [
153
- input[:signatures].first[:protected],
154
- input[:payload],
155
- input[:signatures].first[:signature]
156
- ].collect do |segment|
157
- segment
158
- end
123
+ if (input[:signatures] || input[:signature]).present?
124
+ JWS.decode_json_serialized input, key_or_secret
125
+ elsif input[:ciphertext].present?
126
+ JWE.decode_json_serialized input, key_or_secret
159
127
  else
160
- [:protected, :payload, :signature].collect do |key|
161
- input[key]
162
- end
128
+ raise InvalidFormat.new("Unexpected JOSE JSON Serialization Format.")
163
129
  end
164
- jwt_string = [header, payload, signature].join('.')
165
- decode_compact_serialized jwt_string, key_or_secret
166
130
  end
167
131
  end
168
132
  end
@@ -120,14 +120,14 @@ describe JSON::JWE do
120
120
 
121
121
  describe 'decrypt!' do
122
122
  let(:plain_text) { 'Hello World' }
123
- let(:input) do
123
+ let(:jwe_string) do
124
124
  _jwe_ = JSON::JWE.new plain_text
125
125
  _jwe_.alg, _jwe_.enc = alg, enc
126
126
  _jwe_.encrypt! key
127
127
  _jwe_.to_s
128
128
  end
129
129
  let(:jwe) do
130
- _jwe_ = JSON::JWE.new input
130
+ _jwe_ = JSON::JWE.decode jwe_string, :skip_decryption
131
131
  _jwe_.alg, _jwe_.enc = alg, enc
132
132
  _jwe_
133
133
  end
@@ -135,7 +135,7 @@ describe JSON::JWE do
135
135
  shared_examples_for :decryptable do
136
136
  it do
137
137
  jwe.decrypt! key
138
- jwe.to_s.should == plain_text
138
+ jwe.plain_text.should == plain_text
139
139
  end
140
140
  end
141
141
 
@@ -148,7 +148,7 @@ describe JSON::JWE do
148
148
  end
149
149
 
150
150
  shared_examples_for :verify_cbc_authentication_tag do
151
- let(:input) do
151
+ let(:jwe_string) do
152
152
  _jwe_ = JSON::JWE.new plain_text
153
153
  _jwe_.alg, _jwe_.enc = alg, enc
154
154
  _jwe_.encrypt! key
@@ -275,16 +275,5 @@ describe JSON::JWE do
275
275
  end
276
276
  end
277
277
  end
278
-
279
- context 'when invalid format of input given' do
280
- let(:input) { 'header.payload.signature' }
281
- let(:alg) { :RSA1_5 }
282
- let(:enc) { :'A128CBC-HS256' }
283
- it do
284
- expect do
285
- jwe.decrypt! public_key
286
- end.to raise_error JSON::JWE::InvalidFormat
287
- end
288
- end
289
278
  end
290
279
  end
@@ -45,6 +45,20 @@ describe JSON::JWK::Set do
45
45
  end
46
46
  end
47
47
 
48
+ context 'when pure Hash with :keys key given' do
49
+ subject do
50
+ JSON::JWK::Set.new(
51
+ keys: jwk.as_json
52
+ )
53
+ end
54
+
55
+ it 'should convert into JSON::JWK' do
56
+ subject.each do |jwk|
57
+ jwk.should be_instance_of JSON::JWK
58
+ end
59
+ end
60
+ end
61
+
48
62
  describe '#as_json' do
49
63
  it 'should become proper JWK set format' do
50
64
  json = set.as_json
@@ -131,7 +131,7 @@ describe JSON::JWS do
131
131
  let(:signed) { jws.sign!(jwks) }
132
132
 
133
133
  context 'when jwk is found by given kid' do
134
- before { jws.header[:kid] = kid }
134
+ before { jws.kid = kid }
135
135
  it { should == jws.sign!('secret') }
136
136
  end
137
137
 
@@ -242,7 +242,7 @@ describe JSON::JWS do
242
242
  let(:signed) { jws.sign!(jwks) }
243
243
 
244
244
  context 'when jwk is found by given kid' do
245
- before { jws.header[:kid] = kid }
245
+ before { jws.kid = kid }
246
246
  it { should == signed }
247
247
  end
248
248
 
@@ -92,7 +92,7 @@ describe JSON::JWT do
92
92
 
93
93
  context 'when signed' do
94
94
  it 'should delegate verification to JWS' do
95
- expect(jws).to receive(:verify)
95
+ expect(jws).to receive(:verify!)
96
96
  expect(JSON::JWS).to receive(:new).and_return(jws)
97
97
  jwt.verify 'shared_secret'
98
98
  end
@@ -148,16 +148,19 @@ describe JSON::JWT do
148
148
  context 'when alg header malformed' do
149
149
  context 'from alg=HS256' do
150
150
  context 'to alg=none' do
151
- let(:malformed_jwt) do
152
- jwt = JSON::JWT.decode jws.to_s, :skip_verification
153
- jwt.header[:alg] = :none
154
- jwt.signature = ''
155
- jwt
151
+ let(:malformed_jwt_string) do
152
+ header, payload, signature = jws.to_s.split('.')
153
+ malformed_header = {alg: :none}.to_json
154
+ [
155
+ UrlSafeBase64.encode64(malformed_header),
156
+ payload,
157
+ ''
158
+ ].join('.')
156
159
  end
157
160
 
158
161
  it 'should do verification' do
159
162
  expect do
160
- JSON::JWT.decode malformed_jwt.to_s, 'secret'
163
+ JSON::JWT.decode malformed_jwt_string, 'secret'
161
164
  end.to raise_error JSON::JWT::VerificationFailed
162
165
  end
163
166
  end
@@ -169,29 +172,42 @@ describe JSON::JWT do
169
172
  end
170
173
 
171
174
  context 'to alg=none' do
172
- let(:malformed_jwt) do
173
- jwt = JSON::JWT.decode jws.to_s, :skip_verification
174
- jwt.header[:alg] = :none
175
- jwt.signature = ''
176
- jwt
175
+ let(:malformed_jwt_string) do
176
+ header, payload, signature = jws.to_s.split('.')
177
+ malformed_header = {alg: :none}.to_json
178
+ [
179
+ UrlSafeBase64.encode64(malformed_header),
180
+ payload,
181
+ ''
182
+ ].join('.')
177
183
  end
178
184
 
179
185
  it 'should fail verification' do
180
186
  expect do
181
- JSON::JWT.decode malformed_jwt.to_s, public_key
187
+ JSON::JWT.decode malformed_jwt_string, public_key
182
188
  end.to raise_error JSON::JWT::UnexpectedAlgorithm
183
189
  end
184
190
  end
185
191
 
186
192
  context 'to alg=HS256' do
187
- let(:malformed_jwt) do
188
- jwt = JSON::JWT.decode jws.to_s, :skip_verification
189
- jwt.sign public_key.to_s, :HS256
193
+ let(:malformed_jwt_string) do
194
+ header, payload, signature = jws.to_s.split('.')
195
+ malformed_header = {alg: :HS256}.to_json
196
+ malformed_signature = OpenSSL::HMAC.digest(
197
+ OpenSSL::Digest.new('SHA256'),
198
+ public_key.to_s,
199
+ [malformed_header, payload].join('.')
200
+ )
201
+ [
202
+ UrlSafeBase64.encode64(malformed_header),
203
+ payload,
204
+ UrlSafeBase64.encode64(malformed_signature)
205
+ ].join('.')
190
206
  end
191
207
 
192
208
  it 'should fail verification' do
193
209
  expect do
194
- JSON::JWT.decode malformed_jwt.to_s, public_key
210
+ JSON::JWT.decode malformed_jwt_string, public_key
195
211
  end.to raise_error JSON::JWS::UnexpectedAlgorithm
196
212
  end
197
213
  end
@@ -206,6 +222,52 @@ describe JSON::JWT do
206
222
  end.not_to raise_error
207
223
  end
208
224
  end
225
+
226
+ context 'when JSON Serialization given' do
227
+ let(:signed) { JSON::JWT.new(claims).sign('secret') }
228
+
229
+ shared_examples_for :json_serialization_parser do
230
+ context 'when proper secret given' do
231
+ it { JSON::JWT.decode(serialized, 'secret').should == signed }
232
+ end
233
+
234
+ context 'when verification skipped' do
235
+ it { JSON::JWT.decode(serialized, :skip_verification).should == signed }
236
+ end
237
+
238
+ context 'when wrong secret given' do
239
+ it do
240
+ expect do
241
+ JSON::JWT.decode serialized, 'wrong'
242
+ end.to raise_error JSON::JWT::VerificationFailed
243
+ end
244
+ end
245
+ end
246
+
247
+ context 'when general' do
248
+ let(:serialized) do
249
+ {
250
+ payload: UrlSafeBase64.encode64(claims.to_json),
251
+ signatures: [{
252
+ protected: UrlSafeBase64.encode64(signed.header.to_json),
253
+ signature: UrlSafeBase64.encode64(signed.signature)
254
+ }]
255
+ }
256
+ end
257
+ it_behaves_like :json_serialization_parser
258
+ end
259
+
260
+ context 'when flattened' do
261
+ let(:serialized) do
262
+ {
263
+ protected: UrlSafeBase64.encode64(signed.header.to_json),
264
+ payload: UrlSafeBase64.encode64(claims.to_json),
265
+ signature: UrlSafeBase64.encode64(signed.signature)
266
+ }
267
+ end
268
+ it_behaves_like :json_serialization_parser
269
+ end
270
+ end
209
271
  end
210
272
 
211
273
  context 'when encrypted' do
@@ -213,7 +275,7 @@ describe JSON::JWT do
213
275
  let(:shared_key) { SecureRandom.hex 16 } # default shared key is too short
214
276
 
215
277
  it 'should decryptable' do
216
- JSON::JWT.decode(input, private_key).should be_instance_of JSON::JWT
278
+ JSON::JWT.decode(input, private_key).should be_instance_of JSON::JWE
217
279
  end
218
280
 
219
281
  context 'when :skip_decryption given as secret/key' 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.3.1
4
+ version: 1.4.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: 2015-08-14 00:00:00.000000000 Z
11
+ date: 2015-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_json