sodium 0.0.0 → 0.5.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.
Files changed (47) hide show
  1. data/.gitignore +4 -0
  2. data/.travis.yml +27 -0
  3. data/Gemfile +9 -0
  4. data/README.md +111 -0
  5. data/Rakefile +3 -0
  6. data/VERSION +1 -0
  7. data/config/nacl_ffi.yml +90 -0
  8. data/lib/sodium.rb +24 -0
  9. data/lib/sodium/auth.rb +52 -0
  10. data/lib/sodium/box.rb +127 -0
  11. data/lib/sodium/buffer.rb +141 -0
  12. data/lib/sodium/delegate.rb +58 -0
  13. data/lib/sodium/ffi.rb +9 -0
  14. data/lib/sodium/ffi/crypto.rb +106 -0
  15. data/lib/sodium/ffi/lib_c.rb +9 -0
  16. data/lib/sodium/ffi/random.rb +11 -0
  17. data/lib/sodium/hash.rb +23 -0
  18. data/lib/sodium/one_time_auth.rb +52 -0
  19. data/lib/sodium/random.rb +16 -0
  20. data/lib/sodium/secret_box.rb +65 -0
  21. data/lib/sodium/sign.rb +75 -0
  22. data/lib/sodium/version.rb +5 -0
  23. data/sodium.gemspec +9 -3
  24. data/sodium.pub.gpg +37 -0
  25. data/tasks/libsodium.rake +70 -0
  26. data/tasks/test.rake +6 -0
  27. data/tasks/version.rake +3 -0
  28. data/test/sodium/auth/hmacsha256_test.rb +54 -0
  29. data/test/sodium/auth/hmacsha512256_test.rb +53 -0
  30. data/test/sodium/auth_test.rb +49 -0
  31. data/test/sodium/box/curve25519xsalsa20poly1305_test.rb +79 -0
  32. data/test/sodium/box_test.rb +109 -0
  33. data/test/sodium/buffer_test.rb +120 -0
  34. data/test/sodium/delegate_test.rb +44 -0
  35. data/test/sodium/hash/sha256_test.rb +31 -0
  36. data/test/sodium/hash/sha512_test.rb +35 -0
  37. data/test/sodium/hash_test.rb +35 -0
  38. data/test/sodium/one_time_auth/poly1305_test.rb +54 -0
  39. data/test/sodium/one_time_auth_test.rb +49 -0
  40. data/test/sodium/random_test.rb +25 -0
  41. data/test/sodium/secret_box/xsalsa20poly1305_test.rb +50 -0
  42. data/test/sodium/secret_box_test.rb +56 -0
  43. data/test/sodium/sign/ed25519_test.rb +52 -0
  44. data/test/sodium/sign_test.rb +58 -0
  45. data/test/test_helper.rb +44 -0
  46. metadata +117 -8
  47. checksums.yaml +0 -7
@@ -0,0 +1,25 @@
1
+ require 'test_helper'
2
+
3
+ describe Sodium::Random do
4
+ subject { Sodium::Random }
5
+
6
+ it '::bytes must generate a byte string of desired length' do
7
+ subject.bytes( 30).bytesize.must_equal 30
8
+ subject.bytes(400).bytesize.must_equal 400
9
+ end
10
+
11
+ it '::bytes must generate random bytes' do
12
+ 1_000.times.map { subject.bytes(16) }.uniq.length.
13
+ must_equal 1_000
14
+ end
15
+
16
+ it '::integer must generate a single random number' do
17
+ 1_000.times.map { subject.integer }.uniq.length.
18
+ must_equal 1_000
19
+ end
20
+
21
+ it 'must generate random numbers up to a given max' do
22
+ 1_000.times.map { subject.integer(4) }.any? {|n| n >= 4 }.
23
+ must_equal false
24
+ end
25
+ end
@@ -0,0 +1,50 @@
1
+ require 'test_helper'
2
+
3
+ describe Sodium::SecretBox::XSalsa20Poly1305 do
4
+ include SodiumTestHelpers
5
+
6
+ subject { self.klass.new(self.key) }
7
+
8
+ let(:klass) { Sodium::SecretBox::XSalsa20Poly1305 }
9
+ let(:primitive) { :xsalsa20poly1305 }
10
+
11
+ let :constants do
12
+ { :KEYBYTES => 32,
13
+ :NONCEBYTES => 24,
14
+ :ZEROBYTES => 32,
15
+ :BOXZEROBYTES => 16, }
16
+ end
17
+
18
+ let_64(:key) { 'MawdlglK6Ue29vbh+4vJb074PlFShQ6H1Cm6x2LiIP0=' }
19
+ let_64(:nonce) { 'COwsnSeFSTeld0BQESGuuxyaCN4qeIyX' }
20
+ let_64(:ciphertext) { 'LrBMC/PJUh73zZKq+VY0kEXSH0EOaLU=' }
21
+ let_64(:plaintext) { 'bWVzc2FnZQ==' }
22
+
23
+ it '::primitive must be correct' do
24
+ self.klass.primitive.must_equal self.primitive
25
+ end
26
+
27
+ it 'must have correct values for its constants' do
28
+ self.constants.each_pair do |name, value|
29
+ self.klass[name].must_equal value
30
+ end
31
+ end
32
+
33
+ it 'must mint keys' do
34
+ self.klass.key.bytesize.must_equal self.klass[:KEYBYTES]
35
+ end
36
+
37
+ it 'must generate closed secret boxes' do
38
+ self.subject.secret_box(
39
+ self.plaintext,
40
+ self.nonce
41
+ ).to_str.must_equal self.ciphertext
42
+ end
43
+
44
+ it 'must open boxes' do
45
+ self.subject.open(
46
+ self.ciphertext,
47
+ self.nonce
48
+ ).to_str.must_equal self.plaintext
49
+ end
50
+ end
@@ -0,0 +1,56 @@
1
+ require 'test_helper'
2
+
3
+ describe Sodium::SecretBox do
4
+ include SodiumTestHelpers
5
+
6
+ subject { self.klass.new(self.key) }
7
+ let(:klass) { Sodium::SecretBox }
8
+ let(:key) { self.klass.key }
9
+
10
+ it 'must default to the XSalsa20Poly1305 implementation' do
11
+ self.klass.implementation.
12
+ must_equal Sodium::SecretBox::XSalsa20Poly1305
13
+ end
14
+
15
+ it 'must allow access to alternate implementations' do
16
+ self.klass.implementation(:xyz).
17
+ must_equal nil
18
+ end
19
+
20
+ it 'must instantiate the default implementation' do
21
+ self.subject.
22
+ must_be_kind_of Sodium::SecretBox::XSalsa20Poly1305
23
+ end
24
+
25
+ it 'must mint keys from the default implmentation' do
26
+ sodium_mock_default(self.klass) do |klass, mock|
27
+ mock.expect :[], 0, [:KEYBYTES]
28
+
29
+ klass.key.to_str.must_equal ''
30
+ end
31
+ end
32
+
33
+ it 'must raise when instantiating with an invalid key' do
34
+ lambda { self.klass.new(self.key.to_str[0..-2]) }.
35
+ must_raise Sodium::LengthError
36
+ end
37
+
38
+ it 'must raise when receiving an invalid nonce' do
39
+ lambda { self.subject.secret_box('message', self.subject.nonce.to_str[0..-2]) }.
40
+ must_raise Sodium::LengthError
41
+ end
42
+
43
+ it 'must raise when failing to close a box' do
44
+ sodium_stub_failure(self.klass, :nacl) do
45
+ lambda { self.subject.secret_box('message', self.subject.nonce) }.
46
+ must_raise Sodium::CryptoError
47
+ end
48
+ end
49
+
50
+ it 'must raise when failing to open a box' do
51
+ sodium_stub_failure(self.klass, :nacl_open) do
52
+ lambda { self.subject.open('ciphertext', self.subject.nonce) }.
53
+ must_raise Sodium::CryptoError
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,52 @@
1
+ require 'test_helper'
2
+
3
+ describe Sodium::Sign::Ed25519 do
4
+ include SodiumTestHelpers
5
+
6
+ subject { self.klass.new(self.secret_key) }
7
+
8
+ let(:klass) { Sodium::Sign::Ed25519 }
9
+ let(:primitive) { :ed25519 }
10
+
11
+ let :constants do
12
+ { :BYTES => 64,
13
+ :PUBLICKEYBYTES => 32,
14
+ :SECRETKEYBYTES => 64, }
15
+ end
16
+
17
+ let_64(:secret_key) { 'PZstPgy/LfTLN47rK69qHv9FPFRhoNRrIcjrxpIl4U0PhSflLvk7kqOrVPJdefT0Cvdwhx7Nyss0TItOCvPH4g==' }
18
+ let_64(:public_key) { 'D4Un5S75O5Kjq1TyXXn09Ar3cIcezcrLNEyLTgrzx+I=' }
19
+ let_64(:plaintext) { 'bWVzc2FnZQ==' }
20
+ let_64(:signature) do
21
+ %{ gBIV6VdlmL9aicHsrWMYhqGiQg3t1QGWmuj5oUNI2DN6FeaKKIkjPZ/N7vTM
22
+ R7ebY7+C7teQJMSrxlqTnrcnCw== }
23
+ end
24
+
25
+ it '::primitive must be correct' do
26
+ self.klass.primitive.must_equal self.primitive
27
+ end
28
+
29
+ it 'must have correct values for its constants' do
30
+ self.constants.each_pair do |name, value|
31
+ self.klass[name].must_equal value
32
+ end
33
+ end
34
+
35
+ it 'must mint secret keys' do
36
+ self.klass.keypair[0].bytesize.must_equal self.klass[:SECRETKEYBYTES]
37
+ end
38
+
39
+ it 'must mint public keys' do
40
+ self.klass.keypair[1].bytesize.must_equal self.klass[:PUBLICKEYBYTES]
41
+ end
42
+
43
+ it 'must generate message signatures' do
44
+ self.subject.sign(self.plaintext).to_str.
45
+ must_equal self.signature
46
+ end
47
+
48
+ it 'must verify message signatures' do
49
+ self.klass.verify(self.public_key, self.plaintext, self.signature).
50
+ must_equal true
51
+ end
52
+ end
@@ -0,0 +1,58 @@
1
+ require 'test_helper'
2
+
3
+ describe Sodium::Sign do
4
+ include SodiumTestHelpers
5
+
6
+ subject { self.klass.new(self.keypair.first) }
7
+ let(:klass) { Sodium::Sign }
8
+ let(:keypair) { self.klass.keypair }
9
+
10
+ it 'must default to the Ed25519 implementation' do
11
+ self.klass.implementation.
12
+ must_equal Sodium::Sign::Ed25519
13
+ end
14
+
15
+ it 'must allow access to alternate implementations' do
16
+ self.klass.implementation(:xyz).
17
+ must_equal nil
18
+ end
19
+
20
+ it 'must instantiate the default implementation' do
21
+ self.subject.
22
+ must_be_kind_of Sodium::Sign::Ed25519
23
+ end
24
+
25
+ it 'must mint keys from the default implementation' do
26
+ sodium_mock_default(self.klass) do |klass, mock|
27
+ mock.expect :nacl_keypair, true, ['', '']
28
+ mock.expect :[], 0, [:PUBLICKEYBYTES]
29
+ mock.expect :[], 0, [:SECRETKEYBYTES]
30
+
31
+ sk, pk = klass.keypair
32
+
33
+ sk.to_str.must_equal ''
34
+ pk.to_str.must_equal ''
35
+ end
36
+ end
37
+
38
+ it 'must raise when instantiating with an invalid key' do
39
+ secret_key = self.keypair.first
40
+
41
+ lambda { self.klass.new(secret_key.to_str[0..-2]) }.
42
+ must_raise Sodium::LengthError
43
+ end
44
+
45
+ it 'must raise when failing to generate keypairs' do
46
+ sodium_stub_failure(self.klass, :nacl_keypair) do
47
+ lambda { self.keypair }.
48
+ must_raise Sodium::CryptoError
49
+ end
50
+ end
51
+
52
+ it 'must raise when failing to sign a message' do
53
+ sodium_stub_failure(self.klass, :nacl) do
54
+ lambda { self.subject.sign('message') }.
55
+ must_raise Sodium::CryptoError
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,44 @@
1
+ require 'coveralls'
2
+ require 'simplecov'
3
+
4
+ SimpleCov.start do
5
+ add_filter '/test/'
6
+ add_filter '/vendor/'
7
+ end
8
+
9
+ Coveralls.wear! if ENV['TRAVIS']
10
+
11
+ require 'minitest/autorun'
12
+ require 'minitest/spec'
13
+ require 'minitest/pride'
14
+
15
+ require 'sodium'
16
+ require 'base64'
17
+
18
+ module SodiumTestHelpers
19
+ module ClassMethods
20
+ def let_64(name)
21
+ define_method(name) { Base64.decode64 yield }
22
+ end
23
+ end
24
+
25
+ def self.included(subclass)
26
+ subclass.extend ClassMethods
27
+ end
28
+
29
+ def sodium_override_default(klass, implementation)
30
+ klass = klass.dup
31
+ klass.implementation = implementation
32
+ yield klass
33
+ end
34
+
35
+ def sodium_mock_default(klass)
36
+ mock = MiniTest::Mock.new
37
+ sodium_override_default(klass, mock) {|dup| yield dup, mock }
38
+ mock.verify
39
+ end
40
+
41
+ def sodium_stub_failure(klass, method, &block)
42
+ klass.implementation.stub(method, false, &block)
43
+ end
44
+ end
metadata CHANGED
@@ -1,44 +1,153 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sodium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.5.0
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Stephen Touset
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-03-14 00:00:00.000000000 Z
12
- dependencies: []
13
- description: TBD
12
+ date: 2013-06-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: ffi
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '10'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '10'
46
+ - !ruby/object:Gem::Dependency
47
+ name: minitest
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '5'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '5'
62
+ - !ruby/object:Gem::Dependency
63
+ name: version
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '1'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '1'
78
+ description: A library for performing cryptography based on modern ciphers and protocols
14
79
  email: stephen@touset.org
15
80
  executables: []
16
81
  extensions: []
17
82
  extra_rdoc_files: []
18
83
  files:
84
+ - .gitignore
85
+ - .travis.yml
86
+ - Gemfile
87
+ - README.md
88
+ - Rakefile
89
+ - VERSION
90
+ - config/nacl_ffi.yml
19
91
  - lib/sodium.rb
92
+ - lib/sodium/auth.rb
93
+ - lib/sodium/box.rb
94
+ - lib/sodium/buffer.rb
95
+ - lib/sodium/delegate.rb
96
+ - lib/sodium/ffi.rb
97
+ - lib/sodium/ffi/crypto.rb
98
+ - lib/sodium/ffi/lib_c.rb
99
+ - lib/sodium/ffi/random.rb
100
+ - lib/sodium/hash.rb
101
+ - lib/sodium/one_time_auth.rb
102
+ - lib/sodium/random.rb
103
+ - lib/sodium/secret_box.rb
104
+ - lib/sodium/sign.rb
105
+ - lib/sodium/version.rb
20
106
  - sodium.gemspec
107
+ - sodium.pub.gpg
108
+ - tasks/libsodium.rake
109
+ - tasks/test.rake
110
+ - tasks/version.rake
111
+ - test/sodium/auth/hmacsha256_test.rb
112
+ - test/sodium/auth/hmacsha512256_test.rb
113
+ - test/sodium/auth_test.rb
114
+ - test/sodium/box/curve25519xsalsa20poly1305_test.rb
115
+ - test/sodium/box_test.rb
116
+ - test/sodium/buffer_test.rb
117
+ - test/sodium/delegate_test.rb
118
+ - test/sodium/hash/sha256_test.rb
119
+ - test/sodium/hash/sha512_test.rb
120
+ - test/sodium/hash_test.rb
121
+ - test/sodium/one_time_auth/poly1305_test.rb
122
+ - test/sodium/one_time_auth_test.rb
123
+ - test/sodium/random_test.rb
124
+ - test/sodium/secret_box/xsalsa20poly1305_test.rb
125
+ - test/sodium/secret_box_test.rb
126
+ - test/sodium/sign/ed25519_test.rb
127
+ - test/sodium/sign_test.rb
128
+ - test/test_helper.rb
21
129
  homepage: https://github.com/stouset/sodium
22
130
  licenses: []
23
- metadata: {}
24
131
  post_install_message:
25
132
  rdoc_options: []
26
133
  require_paths:
27
134
  - lib
28
135
  required_ruby_version: !ruby/object:Gem::Requirement
136
+ none: false
29
137
  requirements:
30
138
  - - '>='
31
139
  - !ruby/object:Gem::Version
32
140
  version: '0'
33
141
  required_rubygems_version: !ruby/object:Gem::Requirement
142
+ none: false
34
143
  requirements:
35
144
  - - '>='
36
145
  - !ruby/object:Gem::Version
37
146
  version: '0'
38
147
  requirements: []
39
148
  rubyforge_project:
40
- rubygems_version: 2.0.0
149
+ rubygems_version: 1.8.25
41
150
  signing_key:
42
- specification_version: 4
43
- summary: TBD
151
+ specification_version: 3
152
+ summary: A Ruby binding to the easy-to-use high-speed crypto library libsodium
44
153
  test_files: []