simple-secrets 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: dce15098b369653fbfa4f4f1a5c38123254c4d17
4
+ data.tar.gz: 7b3c14b5e9ce8a62d84eea8f561c5785d647bbe6
5
+ SHA512:
6
+ metadata.gz: 6ded25d7753b56b891fbcdb578e33369bfe8d8a863a9deb2a3af1f16c0be5b76747ab028cd19f51e3fbb5d83901f2c891bc247d98fed72c5b80561920831cb25
7
+ data.tar.gz: f0f34544a1bbacc377633d77167e9cb19fc6ad79481edda31f43d796e16cb30a891209e35b583fa32b225e44734d87551791a10ef7bc5202b421da0e549a1550
data/.travis.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.9.3
4
3
  - 2.0.0
4
+ - 2.2.4
data/README.md CHANGED
@@ -1,9 +1,13 @@
1
1
 
2
- # SimpleSecrets [![Build Status](https://travis-ci.org/timshadel/simple-secrets.rb.png?branch=master)](https://travis-ci.org/timshadel/simple-secrets.rb)
2
+ # simple-secrets.rb [![Build Status](https://travis-ci.org/timshadel/simple-secrets.rb.png?branch=master)](https://travis-ci.org/timshadel/simple-secrets.rb)
3
3
 
4
- A Ruby client for [simple-secrets][simple-secrets], the simple, opinionated library for encrypting small packets of data securely.
4
+ The Ruby implementation of a simple, opinionated library for encrypting small packets of data securely. Designed for exchanging tokens among systems written in a variety of programming languages: [Node.js][simple-secrets], [Ruby][simple-secrets.rb], [Objective-C][SimpleSecrets], [Java][simple-secrets.java], [Erlang][simple_secrets.erl].
5
5
 
6
6
  [simple-secrets]: https://github.com/timshadel/simple-secrets
7
+ [simple-secrets.rb]: https://github.com/timshadel/simple-secrets.rb
8
+ [SimpleSecrets]: https://github.com/timshadel/SimpleSecrets
9
+ [simple-secrets.java]: https://github.com/timshadel/simple-secrets.java
10
+ [simple_secrets.erl]: https://github.com/CamShaft/simple_secrets.erl
7
11
 
8
12
  ## Examples
9
13
 
@@ -12,29 +16,32 @@ A Ruby client for [simple-secrets][simple-secrets], the simple, opinionated libr
12
16
  Send:
13
17
 
14
18
  ```ruby
15
- require('simple-secrets')
19
+ require 'simple-secrets'
20
+
21
+ include SimpleSecrets
16
22
 
17
23
  # Try `head /dev/urandom | shasum -a 256` to make a decent 256-bit key
18
- master_key = new Buffer('<64-char hex string (32 bytes, 256 bits)>', 'hex');
19
- # => <Buffer 71 c8 67 56 23 4b fd 3c 37 ... >
24
+ sender = Packet.new '<64-char hex string master key (32 bytes, 256 bits)>'
25
+ # => #<SimpleSecrets::Packet:0x007fec7c198e60 @master_key="d\xDD\xB5...", @identity="B\xBE...">
20
26
 
21
- var sender = secrets(master_key);
22
- var packet = sender.pack('this is a secret message');
23
- # => 'OqlG6KVMeyFYmunboS3HIXkvN_nXKTxg2yNkQydZOhvJrZvmfov54hUmkkiZCnlhzyrlwOJkbV7XnPPbqvdzZ6TsFOO5YdmxjxRksZmeIhbhLaMiDbfsOuSY1dBn_ZgtYCw-FRIM'
27
+ packet = sender.pack msg: 'this is a secret message'
28
+ # => 'Qr4m7AughkcQIRqQvlyXiB67EwHdBf5n9JD2s_Z9NpO4ksPGvLYjNbDm3HRzvFXFSpV2IqDQw_LTamndMh2c7iOQT0lSp4LstqJPAtoQklU5sb7JHYyTOuf-6W-q7W8gAnq1wCs5'
24
29
  ```
25
30
 
26
31
  Receive:
27
32
 
28
- ```js
29
- var secrets = require('simple-secrets');
33
+ ```ruby
34
+ require 'simple-secrets'
35
+
36
+ include SimpleSecrets
37
+
38
+ # Same shared key
39
+ sender = Packet.new '<64-char hex string master key (32 bytes, 256 bits)>'
40
+ # Read data from somewhere
41
+ packet = 'OqlG6KVMeyFYmunboS3HIXkvN_nXKTxg2yNkQydZOhvJrZvmfov54hUmkkiZCnlhzyrlwOJkbV7XnPPbqvdzZ6TsFOO5YdmxjxRksZmeIhbhLaMiDbfsOuSY1dBn_ZgtYCw-FRIM'
30
42
 
31
- // Same shared key
32
- var master_key = new Buffer('<shared-key-hex>', 'hex');
33
- var sender = secrets(master_key);
34
- var packet = new Buffer('<read data from somewhere>');
35
- // => 'OqlG6KVMeyFYmunboS3HIXkvN_nXKTxg2yNkQydZOhvJrZvmfov54hUmkkiZCnlhzyrlwOJkbV7XnPPbqvdzZ6TsFOO5YdmxjxRksZmeIhbhLaMiDbfsOuSY1dBn_ZgtYCw-FRIM'
36
- var secret_message = sender.unpack(packet);
37
- // => 'this is a secret message'
43
+ secret_message = sender.unpack(packet);
44
+ # => {"msg"=>"this is a secret message"}
38
45
  ```
39
46
 
40
47
 
@@ -0,0 +1,31 @@
1
+ if RUBY_PLATFORM == 'java'
2
+ class Array
3
+ def to_msgpack
4
+ MessagePack.pack self
5
+ end
6
+ end
7
+
8
+ class String
9
+ def to_msgpack
10
+ MessagePack.pack self
11
+ end
12
+ end
13
+
14
+ class Fixnum
15
+ def to_msgpack
16
+ MessagePack.pack self
17
+ end
18
+ end
19
+
20
+ class NilClass
21
+ def to_msgpack
22
+ MessagePack.pack self
23
+ end
24
+ end
25
+
26
+ class Hash
27
+ def to_msgpack
28
+ MessagePack.pack self
29
+ end
30
+ end
31
+ end
@@ -1,6 +1,7 @@
1
1
  require 'openssl'
2
2
  require 'base64'
3
3
  require 'msgpack'
4
+ require 'msgpack_extensions'
4
5
 
5
6
  module SimpleSecrets
6
7
 
@@ -121,7 +122,7 @@ module SimpleSecrets
121
122
  cipher = OpenSSL::Cipher::AES256.new(:CBC)
122
123
  cipher.encrypt
123
124
  cipher.key = key
124
- iv = cipher.random_iv
125
+ iv = cipher.iv = OpenSSL::Random.random_bytes(16)
125
126
 
126
127
  encrypted = ''.force_encoding('BINARY')
127
128
  encrypted << iv
@@ -360,7 +361,7 @@ private
360
361
  end
361
362
 
362
363
  def self.assert256BitBinary binary
363
- raise '256-bit binary string required.' unless binary.size == 32
364
+ raise "256-bit binary string required. '#{binary.unpack("H*")}'" unless binary.size == 32
364
365
  end
365
366
 
366
367
  def self.assert128BitBinary binary
@@ -1,3 +1,3 @@
1
1
  module SimpleSecrets
2
- VERSION = "1.0.0"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -17,8 +17,13 @@ Gem::Specification.new do |spec|
17
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
+ spec.required_ruby_version = '>= 2.0'
20
21
 
21
- spec.add_dependency "msgpack"
22
+ if RUBY_PLATFORM == 'java'
23
+ spec.add_dependency "msgpack-jruby", "~> 1.4.0"
24
+ else
25
+ spec.add_dependency "msgpack", "~> 0.7.1"
26
+ end
22
27
 
23
28
  spec.add_development_dependency "bundler", "~> 1.3"
24
29
  spec.add_development_dependency "rake"
@@ -0,0 +1,112 @@
1
+ require 'spec_helper'
2
+
3
+ include SimpleSecrets
4
+
5
+ describe 'the Ruby implementation should handle the compatibility standard items' do
6
+
7
+ let(:master_key){ 'eda00b0f46f6518d4c77944480a0b9b0a7314ad45e124521e490263c2ea217ad' }
8
+ let(:iv){ Util.hex_to_bin '7f3333233ce9235860ef902e6d0fcf35' }
9
+ let(:nonce){ Util.hex_to_bin '83dcf5916c0b5c4bc759e44f9f5c8c50' }
10
+
11
+ subject{ Packet.new master_key }
12
+
13
+ before(:each) do
14
+ allow(Primitives).to receive(:nonce) { nonce }
15
+ allow(OpenSSL::Random).to receive(:random_bytes) { iv }
16
+ end
17
+
18
+ describe 'string' do
19
+ let(:string){ 'This is the simple-secrets compatibility standard string.' }
20
+ let(:websafe_msgpack1){ 'W7l1PJaffzMzIzzpI1hg75AubQ_PNSjEUycoH1Z7GEwonPVW7yMqhBNKylbt-R7lByBe6fmIZdLIH2C2BPyYOtA-z2oGxclL_nZ0Ylo8e_gkf3bXzMn04l61i4dRsVCMJ5pL72suwuJMURy81n73eZEu2ASoVqSSVsnJo9WODLLmvsF_Mu0' }
21
+ let(:websafe_msgpack5){ 'W7l1PJaffzMzIzzpI1hg75AubQ_PNSjEUycoH1Z7GEwonPVW7yNp54eHe8KRY2JqOo9H8bi3Hnm4G0-r5SNlXXhIW9S99qTxTwibKW7mLkaNMTeZ1ktDwx-4sjCpCnXPIyZe7-l6-o6XjIqazRdhGD6AH5ZS9UFqLpaqIowSUQ9CeiQeFBQ' }
22
+
23
+ it 'creates' do
24
+ expect(subject.pack(string)).to eq websafe_msgpack5
25
+ end
26
+
27
+ it 'recovers' do
28
+ expect(subject.unpack(websafe_msgpack1)).to eq string
29
+ expect(subject.unpack(websafe_msgpack5)).to eq string
30
+ end
31
+ end
32
+
33
+ describe 'binary' do
34
+ let(:binary){ "32".hex_to_bin(10) }
35
+ let(:websafe_msgpack1){ 'W7l1PJaffzMzIzzpI1hg75AubQ_PNSjEUycoH1Z7GEwonPVW7yOnGuj4lHrhU_Uv8rMbpjXQJiqd3OMdktrw1asMDXy6jyLrVe9Ea-W09XC90Dgaxlk' }
36
+ let(:websafe_msgpack5){ 'W7l1PJaffzMzIzzpI1hg75AubQ_PNSjEUycoH1Z7GEwonPVW7yMVgYX8jn_wUmumA0aJMLlWffSYU0oaJsyJsVjxxF96Ia6mZgAalv5iywbsKORqxtQ' }
37
+
38
+ it 'creates' do
39
+ expect(subject.pack(binary)).to eq websafe_msgpack5
40
+ end
41
+
42
+ it 'recovers' do
43
+ expect(subject.unpack(websafe_msgpack1)).to eq binary
44
+ expect(subject.unpack(websafe_msgpack5)).to eq binary
45
+ end
46
+ end
47
+
48
+ describe 'numbers' do
49
+ let(:number){ 65234 }
50
+ let(:websafe_msgpack1){ 'W7l1PJaffzMzIzzpI1hg75AubQ_PNSjEUycoH1Z7GEwonPVW7yN5I1SH6a75Y_qQlQIclwrVyOk6jJJnMrjeOm6D27_wD0DxwIY9cxSw8boQDgEsLKg' }
51
+
52
+ it 'creates' do
53
+ expect(subject.pack(number)).to eq websafe_msgpack1
54
+ end
55
+
56
+ it 'recovers' do
57
+ expect(subject.unpack(websafe_msgpack1)).to eq number
58
+ end
59
+ end
60
+
61
+ describe 'nil' do
62
+ let(:null){ nil }
63
+ let(:websafe_msgpack1){ 'W7l1PJaffzMzIzzpI1hg75AubQ_PNSjEUycoH1Z7GEwonPVW7yPYBCYpYMU-4WChi6L1O1GCEApGRhWlg13kVPLTb90cXcEN9vpYgvttgcBJBh6Tjv8' }
64
+
65
+ it 'creates' do
66
+ expect(subject.pack(null)).to eq websafe_msgpack1
67
+ end
68
+
69
+ it 'recovers' do
70
+ expect(subject.unpack(websafe_msgpack1)).to eq nil
71
+ end
72
+ end
73
+
74
+ describe 'array' do
75
+ let(:array){ ['This is the simple-secrets compatibility standard array.','This is the simple-secrets compatibility standard array.'] }
76
+ let(:websafe_msgpack1){ 'W7l1PJaffzMzIzzpI1hg75AubQ_PNSjEUycoH1Z7GEwonPVW7yMKAFsDUUYwc2fKvPhP_RHYhDOUfJ58li1gJgg9sVeaKx9yC0vFkpxuTmzJP6hZjn6XXlrG6A7-EeNgyzvP547booi2LUi0ALyAzbCaR8abXqnzoNwITRz7TL0J_NkP2gfxbpwUvyBo8ZT0cxGRr9jGnW5F5s6D0jmKZTl209nDJEpXDFRDXCo5y08tmvMNogs7rsZYz74mAap3mrBS-J7W' }
77
+ let(:websafe_msgpack5){ 'W7l1PJaffzMzIzzpI1hg75AubQ_PNSjEUycoH1Z7GEwonPVW7yP5Au9NtEbC-uoWkSPKgnAjODduuH_a2tH-zXaPNdqScWNR8snsQK2OufCVnb2OFk8O7VwgrObvx5gnGgC3pOsmk2Z5CasmOAfzn0B6uEnaBpiMOs74d0d70t07J4MdCRs1aDai9SJqxMpbjz5KJpVmSWqnT3n5KhzEdTLQwCuXQhSA0JKFaAlwQHh5tzq6ToWZZVR34REAGdAo7RMLSSi3' }
78
+
79
+ it 'creates' do
80
+ expect(subject.pack(array)).to eq websafe_msgpack5
81
+ end
82
+
83
+ it 'recovers' do
84
+ expect(subject.unpack(websafe_msgpack1)).to eq array
85
+ expect(subject.unpack(websafe_msgpack5)).to eq array
86
+ end
87
+ end
88
+
89
+ describe 'map' do
90
+ let(:map){ {'compatibility-key' => 'This is the simple-secrets compatibility standard map.'} }
91
+ let(:websafe_msgpack1){ 'W7l1PJaffzMzIzzpI1hg75AubQ_PNSjEUycoH1Z7GEwonPVW7yNR4q6kPij6WINZKHgOqKHXYKrvvhyLbyFTsndgOx5M5yockEUwdSgv6jG_JYpAiU5R37Y7OIZnF3IN2EWtaFSuJko0ajcvoYgDPeLMvjAJdRyBUYIKcvR-g56_p4O7Uef3yJRnfCprG6jUdMyDBai_' }
92
+ let(:websafe_msgpack5){ 'W7l1PJaffzMzIzzpI1hg75AubQ_PNSjEUycoH1Z7GEwonPVW7yNR4q6kPij6WINZKHgOqKHXsI6Zwegq5A48uq2i-l13bNQWLY9Ho-lG_s6PzwQhjGz6BnCwAK66YsDBlTqflM-X1mviccZbvUV7K6i2ZPOs8gDUtMIVnu-ByDFopGwZUHjelkUZiLZcRKWXIYSLWyKp' }
93
+
94
+ it 'creates' do
95
+ expect(subject.pack(map)).to eq websafe_msgpack5
96
+ end
97
+
98
+ it 'recovers' do
99
+ expect(subject.unpack(websafe_msgpack1)).to eq map
100
+ expect(subject.unpack(websafe_msgpack5)).to eq map
101
+ end
102
+ end
103
+
104
+ end
105
+
106
+ class Util
107
+ def self.hex_to_bin string
108
+ b = [string].pack('H*')
109
+ b.force_encoding 'BINARY'
110
+ b
111
+ end
112
+ end
data/spec/packet_spec.rb CHANGED
@@ -17,26 +17,26 @@ describe Packet do
17
17
  describe '#initialize' do
18
18
  it 'sets its master key' do
19
19
  its_key = subject.instance_variable_get(:@master_key)
20
- its_key.unpack('H*').first.should eq master_key
21
- its_key.encoding.should eq Encoding::ASCII_8BIT
20
+ expect(its_key.unpack('H*').first).to eq(master_key)
21
+ expect(its_key.encoding).to eq(Encoding::ASCII_8BIT)
22
22
  end
23
23
 
24
24
  it 'sets its identity' do
25
25
  identity = Primitives.identify subject.instance_variable_get(:@master_key)
26
- subject.instance_variable_get(:@identity).should eq identity
26
+ expect(subject.instance_variable_get(:@identity)).to eq(identity)
27
27
  end
28
28
  end
29
29
 
30
30
  describe '#build_body' do
31
31
  it 'concatenates the serialized body with a nonce' do
32
- Primitives.should_receive(:nonce){ nonce }
33
- subject.build_body(data).should eq test_body
32
+ expect(Primitives).to receive(:nonce) { nonce }
33
+ expect(subject.build_body(data)).to eq(test_body)
34
34
  end
35
35
  end
36
36
 
37
37
  describe '#body_to_data' do
38
38
  it 'it splits out the nonce and deserializes the body' do
39
- subject.body_to_data(test_body).should eq data
39
+ expect(subject.body_to_data(test_body)).to eq(data)
40
40
  end
41
41
  end
42
42
 
@@ -46,9 +46,9 @@ describe Packet do
46
46
 
47
47
  cipher_data = subject.encrypt_body test_body, key
48
48
  decrypted_body = subject.decrypt_body cipher_data, key
49
- test_body.should_not eq cipher_data
50
- cipher_data.should_not eq decrypted_body
51
- decrypted_body.should eq test_body
49
+ expect(test_body).not_to eq(cipher_data)
50
+ expect(cipher_data).not_to eq(decrypted_body)
51
+ expect(decrypted_body).to eq(test_body)
52
52
  end
53
53
  end
54
54
 
@@ -59,7 +59,7 @@ describe Packet do
59
59
 
60
60
  packet = subject.authenticate test_body, key, id
61
61
  data = subject.verify packet, key, id
62
- data.should eq test_body
62
+ expect(data).to eq(test_body)
63
63
  end
64
64
 
65
65
  it 'returns nil if the key identity does not match' do
@@ -68,7 +68,7 @@ describe Packet do
68
68
 
69
69
  packet = subject.authenticate test_body, key, bad_id
70
70
  data = subject.verify packet, key, id
71
- data.should be_nil
71
+ expect(data).to be_nil
72
72
  end
73
73
 
74
74
  it 'returns nil if the MAC does not match' do
@@ -79,17 +79,17 @@ describe Packet do
79
79
  packet = "#{packet[0...-32]}#{bad_mac}"
80
80
 
81
81
  data = subject.verify packet, key, id
82
- data.should be_nil
82
+ expect(data).to be_nil
83
83
  end
84
84
  end
85
85
 
86
86
  describe '.pack and .unpack' do
87
87
  it 'encrypts and signs data into web-safe string, then verifies and decrypts it back' do
88
88
  packed_data = subject.pack data
89
- packed_data.should_not eq data
89
+ expect(packed_data).not_to eq(data)
90
90
 
91
91
  unpacked_data = subject.unpack packed_data
92
- unpacked_data.should eq data
92
+ expect(unpacked_data).to eq(data)
93
93
  end
94
94
  end
95
95
  end
@@ -213,9 +213,9 @@ describe Primitives do
213
213
  b = "12".hex_to_bin
214
214
  c = "11".hex_to_bin
215
215
 
216
- expect(Primitives.compare(a,a)).to be_true
217
- expect(Primitives.compare(a,b)).to be_false
218
- expect(Primitives.compare(a,c)).to be_true
216
+ expect(Primitives.compare(a,a)).to be true
217
+ expect(Primitives.compare(a,b)).to be false
218
+ expect(Primitives.compare(a,c)).to be true
219
219
  end
220
220
 
221
221
  # Timing test, in progress from node.js version
@@ -330,6 +330,14 @@ describe Primitives do
330
330
  expect(Primitives.deserialize(Primitives.serialize('abcd'))).to eq('abcd')
331
331
  expect(Primitives.deserialize(Primitives.serialize([]))).to eq([])
332
332
  expect(Primitives.deserialize(Primitives.serialize({}))).to eq({})
333
+ buf = "32".hex_to_bin(10)
334
+ out = Primitives.deserialize(Primitives.serialize(buf))
335
+ expect(out).to eq(buf)
336
+ # msgpack bug: data is correctly extracted, but tagged with incorrect
337
+ # encoding. Make sure it can be coerced back.
338
+ if out.encoding != buf.encoding
339
+ expect(out.force_encoding(buf.encoding)).to eq(buf)
340
+ end
333
341
  end
334
342
  end
335
343
 
@@ -2,6 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  describe SimpleSecrets do
4
4
  it 'should have a version number' do
5
- SimpleSecrets::VERSION.should_not be_nil
5
+ expect(SimpleSecrets::VERSION).not_to be_nil
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,78 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple-secrets
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
5
- prerelease:
4
+ version: 2.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Tim Shadel
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-05-11 00:00:00.000000000 Z
11
+ date: 2016-01-01 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: msgpack
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: '0'
19
+ version: 0.7.1
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: '0'
26
+ version: 0.7.1
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: bundler
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ~>
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
33
  version: '1.3'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ~>
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
40
  version: '1.3'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rake
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: rspec
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - ">="
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - ">="
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
69
  description: A Ruby client for simple-secrets, the simple, opinionated library for
@@ -83,19 +74,21 @@ executables: []
83
74
  extensions: []
84
75
  extra_rdoc_files: []
85
76
  files:
86
- - .gitignore
87
- - .rspec
88
- - .travis.yml
77
+ - ".gitignore"
78
+ - ".rspec"
79
+ - ".travis.yml"
89
80
  - Gemfile
90
81
  - LICENSE.txt
91
82
  - README.md
92
83
  - Rakefile
84
+ - lib/msgpack_extensions.rb
93
85
  - lib/simple-secrets.rb
94
86
  - lib/simple_secrets.rb
95
87
  - lib/simple_secrets/packet.rb
96
88
  - lib/simple_secrets/primitives.rb
97
89
  - lib/simple_secrets/version.rb
98
90
  - simple_secrets.gemspec
91
+ - spec/compatibility_spec.rb
99
92
  - spec/packet_spec.rb
100
93
  - spec/primitives_spec.rb
101
94
  - spec/simple_secrets_spec.rb
@@ -103,30 +96,30 @@ files:
103
96
  homepage: https://github.com/timshadel/simple-secrets.rb
104
97
  licenses:
105
98
  - MIT
99
+ metadata: {}
106
100
  post_install_message:
107
101
  rdoc_options: []
108
102
  require_paths:
109
103
  - lib
110
104
  required_ruby_version: !ruby/object:Gem::Requirement
111
- none: false
112
105
  requirements:
113
- - - ! '>='
106
+ - - ">="
114
107
  - !ruby/object:Gem::Version
115
- version: '0'
108
+ version: '2.0'
116
109
  required_rubygems_version: !ruby/object:Gem::Requirement
117
- none: false
118
110
  requirements:
119
- - - ! '>='
111
+ - - ">="
120
112
  - !ruby/object:Gem::Version
121
113
  version: '0'
122
114
  requirements: []
123
115
  rubyforge_project:
124
- rubygems_version: 1.8.23
116
+ rubygems_version: 2.4.5
125
117
  signing_key:
126
- specification_version: 3
118
+ specification_version: 4
127
119
  summary: A Ruby client for simple-secrets, the simple, opinionated library for encrypting
128
120
  small packets of data securely.
129
121
  test_files:
122
+ - spec/compatibility_spec.rb
130
123
  - spec/packet_spec.rb
131
124
  - spec/primitives_spec.rb
132
125
  - spec/simple_secrets_spec.rb