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.
- data/.gitignore +4 -0
- data/.travis.yml +27 -0
- data/Gemfile +9 -0
- data/README.md +111 -0
- data/Rakefile +3 -0
- data/VERSION +1 -0
- data/config/nacl_ffi.yml +90 -0
- data/lib/sodium.rb +24 -0
- data/lib/sodium/auth.rb +52 -0
- data/lib/sodium/box.rb +127 -0
- data/lib/sodium/buffer.rb +141 -0
- data/lib/sodium/delegate.rb +58 -0
- data/lib/sodium/ffi.rb +9 -0
- data/lib/sodium/ffi/crypto.rb +106 -0
- data/lib/sodium/ffi/lib_c.rb +9 -0
- data/lib/sodium/ffi/random.rb +11 -0
- data/lib/sodium/hash.rb +23 -0
- data/lib/sodium/one_time_auth.rb +52 -0
- data/lib/sodium/random.rb +16 -0
- data/lib/sodium/secret_box.rb +65 -0
- data/lib/sodium/sign.rb +75 -0
- data/lib/sodium/version.rb +5 -0
- data/sodium.gemspec +9 -3
- data/sodium.pub.gpg +37 -0
- data/tasks/libsodium.rake +70 -0
- data/tasks/test.rake +6 -0
- data/tasks/version.rake +3 -0
- data/test/sodium/auth/hmacsha256_test.rb +54 -0
- data/test/sodium/auth/hmacsha512256_test.rb +53 -0
- data/test/sodium/auth_test.rb +49 -0
- data/test/sodium/box/curve25519xsalsa20poly1305_test.rb +79 -0
- data/test/sodium/box_test.rb +109 -0
- data/test/sodium/buffer_test.rb +120 -0
- data/test/sodium/delegate_test.rb +44 -0
- data/test/sodium/hash/sha256_test.rb +31 -0
- data/test/sodium/hash/sha512_test.rb +35 -0
- data/test/sodium/hash_test.rb +35 -0
- data/test/sodium/one_time_auth/poly1305_test.rb +54 -0
- data/test/sodium/one_time_auth_test.rb +49 -0
- data/test/sodium/random_test.rb +25 -0
- data/test/sodium/secret_box/xsalsa20poly1305_test.rb +50 -0
- data/test/sodium/secret_box_test.rb +56 -0
- data/test/sodium/sign/ed25519_test.rb +52 -0
- data/test/sodium/sign_test.rb +58 -0
- data/test/test_helper.rb +44 -0
- metadata +117 -8
- 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
|
data/test/test_helper.rb
ADDED
@@ -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.
|
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-
|
12
|
-
dependencies:
|
13
|
-
|
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:
|
149
|
+
rubygems_version: 1.8.25
|
41
150
|
signing_key:
|
42
|
-
specification_version:
|
43
|
-
summary:
|
151
|
+
specification_version: 3
|
152
|
+
summary: A Ruby binding to the easy-to-use high-speed crypto library libsodium
|
44
153
|
test_files: []
|