tweetnacl 0.0.1 → 0.2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/README.md +7 -2
- data/ext/tweetnacl/rbext.c +59 -1
- data/ext/tweetnacl/tweetnacl.c +0 -2
- data/test/tweetnacl_crypto_box_curve25519xsalsa20poly1305_keypair_test.rb +16 -0
- data/test/tweetnacl_crypto_box_curve25519xsalsa20poly1305_open_test.rb +49 -0
- data/test/tweetnacl_crypto_box_curve25519xsalsa20poly1305_test.rb +64 -0
- data/test/tweetnacl_crypto_box_open_test.rb +0 -5
- data/tweetnacl.gemspec +8 -9
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: deaf1ed99efeefb3138a1b0c78e43e7cb1c1699e
|
4
|
+
data.tar.gz: 73a15e0587d64171ef60723f879ed0f7e65631e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 048804948082736c35a551cfe6c54a1756330f8603ac2bc4eef8f9c31fdf3c42b2a7a2c48775132a4a99d0e899136aa5ce8ba44e23718183f61d847f7d28e4bc
|
7
|
+
data.tar.gz: 378798dffd4d8761e4f43447379ae7a2c14acc26f1d01efded7cddd50c99dd97c283c5d934d8862a8a659e2cbbcd03ce1991bb277003da92a609c7c55b215e1d
|
data/CHANGELOG.md
ADDED
data/README.md
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# TweetNaCl for Ruby
|
2
2
|
|
3
|
-
|
3
|
+
## SUMMARY
|
4
4
|
|
5
5
|
TweetNaCl is a C-extension for Ruby built on top of the official TweetNacl
|
6
6
|
distribution. It exposes the basic functions using Ruby objects.
|
7
7
|
|
8
8
|
For a detailed explanation of TweetNaCl, [here's the research paper associated with it][paper]
|
9
9
|
|
10
|
-
|
10
|
+
## INSTALL
|
11
11
|
|
12
12
|
gem install tweetnacl
|
13
13
|
|
@@ -16,6 +16,8 @@ For a detailed explanation of TweetNaCl, [here's the research paper associated w
|
|
16
16
|
input = "<text to cipher>"
|
17
17
|
nonce = "<a 24-char string>"
|
18
18
|
|
19
|
+
@t = TweetNaCl.new
|
20
|
+
|
19
21
|
pk, sk = @t.crypto_box_keypair # This generates a pair of public and secret keys
|
20
22
|
|
21
23
|
cipher = @t.crypto_box(input, nonce, pk, sk) # Encrypt !
|
@@ -43,6 +45,9 @@ Decrypt and verify the signature of the ciphered message given the other paramet
|
|
43
45
|
* [x] crypto_box_keypair
|
44
46
|
* [x] crypto_box
|
45
47
|
* [x] crypto_box_open
|
48
|
+
* [x] crypto_box_curve25519xsalsa20poly1305_keypair
|
49
|
+
* [x] crypto_box_curve25519xsalsa20poly1305
|
50
|
+
* [x] crypto_box_curve25519xsalsa20poly1305_open
|
46
51
|
* [ ] All the other functions !
|
47
52
|
* [ ] Use high-level objects
|
48
53
|
|
data/ext/tweetnacl/rbext.c
CHANGED
@@ -76,7 +76,62 @@ VALUE m_crypto_box_open(VALUE self, VALUE _c, VALUE _n, VALUE _pk, VALUE _sk) {
|
|
76
76
|
char * message = calloc(padded_mlen, sizeof(char));
|
77
77
|
|
78
78
|
int res = crypto_box_open(message, c, padded_mlen, nonce, pk, sk);
|
79
|
-
if (0 != res) { rb_raise(rb_eRuntimeError, "
|
79
|
+
if (0 != res) { rb_raise(rb_eRuntimeError, "crypto_box_open did not work"); }
|
80
|
+
|
81
|
+
return rb_str_new2(message + PADDING_LEN);
|
82
|
+
}
|
83
|
+
|
84
|
+
VALUE m_crypto_box_curve25519xsalsa20poly1305_keypair(VALUE self) {
|
85
|
+
VALUE ary = rb_ary_new2(2);
|
86
|
+
char *pk = calloc(crypto_box_curve25519xsalsa20poly1305_tweet_PUBLICKEYBYTES, sizeof(unsigned char));
|
87
|
+
char *sk = calloc(crypto_box_curve25519xsalsa20poly1305_tweet_SECRETKEYBYTES, sizeof(unsigned char));
|
88
|
+
int res = crypto_box_curve25519xsalsa20poly1305_keypair(pk, sk);
|
89
|
+
pk[crypto_box_curve25519xsalsa20poly1305_tweet_PUBLICKEYBYTES] = 0;
|
90
|
+
sk[crypto_box_curve25519xsalsa20poly1305_tweet_SECRETKEYBYTES] = 0;
|
91
|
+
rb_ary_store(ary, 0, rb_str_new(pk, crypto_box_curve25519xsalsa20poly1305_tweet_PUBLICKEYBYTES));
|
92
|
+
rb_ary_store(ary, 1, rb_str_new(sk, crypto_box_curve25519xsalsa20poly1305_tweet_SECRETKEYBYTES));
|
93
|
+
return ary;
|
94
|
+
}
|
95
|
+
|
96
|
+
VALUE m_crypto_box_curve25519xsalsa20poly1305(VALUE self, VALUE _m, VALUE _n, VALUE _pk, VALUE _sk) {
|
97
|
+
if(_m == Qnil) { rb_raise(rb_eArgError, "A message should have been given"); }
|
98
|
+
if(_pk == Qnil) { rb_raise(rb_eArgError, "Public key should have been given"); }
|
99
|
+
if(_sk == Qnil) { rb_raise(rb_eArgError, "Secret key should have been given"); }
|
100
|
+
if (RSTRING_LEN(_n) != 24) { rb_raise(rb_eArgError, "nonce should be 24-byte long"); }
|
101
|
+
if (RSTRING_LEN(_pk) != 32) { rb_raise(rb_eArgError, "public key should be 24-byte long"); }
|
102
|
+
if (RSTRING_LEN(_sk) != 32) { rb_raise(rb_eArgError, "secret key should be 24-byte long"); }
|
103
|
+
|
104
|
+
char * message = RSTRING_PTR(_m);
|
105
|
+
char * nonce = RSTRING_PTR(_n);
|
106
|
+
char * pk = RSTRING_PTR(_pk);
|
107
|
+
char * sk = RSTRING_PTR(_sk);
|
108
|
+
int len = strlen(message);
|
109
|
+
char * padded_message = (char*)calloc(sizeof(char), len + PADDING_LEN);
|
110
|
+
memcpy(padded_message + PADDING_LEN, message, strlen(message));
|
111
|
+
char * c = malloc(strlen(message) + PADDING_LEN);
|
112
|
+
int res = crypto_box_curve25519xsalsa20poly1305(c, padded_message, len + PADDING_LEN, nonce, pk, sk);
|
113
|
+
if (0 != res) { fprintf(stderr, "Something went wrong\n"); exit(res); }
|
114
|
+
VALUE ret = rb_str_new(c, len + PADDING_LEN);
|
115
|
+
return ret;
|
116
|
+
}
|
117
|
+
|
118
|
+
VALUE m_crypto_box_curve25519xsalsa20poly1305_open(VALUE self, VALUE _c, VALUE _n, VALUE _pk, VALUE _sk) {
|
119
|
+
if(_c == Qnil) { rb_raise(rb_eArgError, "A cipher should have been given"); }
|
120
|
+
if(_pk == Qnil) { rb_raise(rb_eArgError, "Public key should have been given"); }
|
121
|
+
if(_sk == Qnil) { rb_raise(rb_eArgError, "Secret key should have been given"); }
|
122
|
+
if (RSTRING_LEN(_n) != 24) { rb_raise(rb_eArgError, "nonce should be 24-byte long"); }
|
123
|
+
if (RSTRING_LEN(_pk) != 32) { rb_raise(rb_eArgError, "public key should be 24-byte long"); }
|
124
|
+
if (RSTRING_LEN(_sk) != 32) { rb_raise(rb_eArgError, "secret key should be 24-byte long"); }
|
125
|
+
|
126
|
+
unsigned char * c = RSTRING_PTR(_c);
|
127
|
+
char * nonce = RSTRING_PTR(_n);
|
128
|
+
char * pk = RSTRING_PTR(_pk);
|
129
|
+
char * sk = RSTRING_PTR(_sk);
|
130
|
+
int padded_mlen = rb_str_strlen(_c);
|
131
|
+
char * message = calloc(padded_mlen, sizeof(char));
|
132
|
+
|
133
|
+
int res = crypto_box_curve25519xsalsa20poly1305_open(message, c, padded_mlen, nonce, pk, sk);
|
134
|
+
if (0 != res) { rb_raise(rb_eRuntimeError, "crypto_box_open did not work"); }
|
80
135
|
|
81
136
|
return rb_str_new2(message + PADDING_LEN);
|
82
137
|
}
|
@@ -89,4 +144,7 @@ void Init_tweetnacl() {
|
|
89
144
|
rb_define_method(c, "crypto_box_keypair", RUBY_METHOD_FUNC(m_crypto_box_keypair), 0);
|
90
145
|
rb_define_method(c, "crypto_box", RUBY_METHOD_FUNC(m_crypto_box), 4);
|
91
146
|
rb_define_method(c, "crypto_box_open", RUBY_METHOD_FUNC(m_crypto_box_open), 4);
|
147
|
+
rb_define_method(c, "crypto_box_curve25519xsalsa20poly1305_keypair", RUBY_METHOD_FUNC(m_crypto_box_curve25519xsalsa20poly1305_keypair), 0);
|
148
|
+
rb_define_method(c, "crypto_box_curve25519xsalsa20poly1305", RUBY_METHOD_FUNC(m_crypto_box_curve25519xsalsa20poly1305), 4);
|
149
|
+
rb_define_method(c, "crypto_box_curve25519xsalsa20poly1305_open", RUBY_METHOD_FUNC(m_crypto_box_curve25519xsalsa20poly1305_open), 4);
|
92
150
|
}
|
data/ext/tweetnacl/tweetnacl.c
CHANGED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TweetNaClCryptoBoxCurve25519XSalsa20Poly1305KeyPairTest < MiniTest::Test
|
4
|
+
def setup
|
5
|
+
@t = TweetNaCl.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def teardown; end
|
9
|
+
|
10
|
+
def test_generate_a_keypair
|
11
|
+
pk, sk = @t.crypto_box_curve25519xsalsa20poly1305_keypair
|
12
|
+
|
13
|
+
assert_equal 32, pk.length
|
14
|
+
assert_equal 32, sk.length
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TweetNaClCryptoBoxCurve25519XSalsa20Poly1305OpenTest < MiniTest::Test
|
4
|
+
def setup
|
5
|
+
@t = TweetNaCl.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def teardown; end
|
9
|
+
|
10
|
+
def test_crypto_box_curve25519xsalsa20poly1305_open_require_cipher_to_decrypt
|
11
|
+
set = false
|
12
|
+
begin
|
13
|
+
@t.crypto_box_curve25519xsalsa20poly1305_open(nil, nil, nil, nil)
|
14
|
+
rescue Exception => e
|
15
|
+
set = true
|
16
|
+
end
|
17
|
+
assert set, "A cipher is required"
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_crypto_box_curve25519xsalsa20poly1305_open_require_public_key
|
21
|
+
set = false
|
22
|
+
begin
|
23
|
+
@t.crypto_box_curve25519xsalsa20poly1305_open("foo", nil, "foo", nil)
|
24
|
+
rescue ArgumentError => e
|
25
|
+
set = true
|
26
|
+
end
|
27
|
+
assert set, "A public key is required"
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_crypto_box_curve25519xsalsa20poly1305_open_require_secret_key
|
31
|
+
set = false
|
32
|
+
begin
|
33
|
+
@t.crypto_box_curve25519xsalsa20poly1305_open("foo", "foo", "foo", nil)
|
34
|
+
rescue ArgumentError => e
|
35
|
+
set = true
|
36
|
+
end
|
37
|
+
assert set, "A secret key is required"
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_crypto_box_curve25519xsalsa20poly1305_open_nonce_not_correct_length
|
41
|
+
set = false
|
42
|
+
begin
|
43
|
+
@t.crypto_box_curve25519xsalsa20poly1305_open("foo", "bar", "pk", "sk")
|
44
|
+
rescue ArgumentError => e
|
45
|
+
set = true
|
46
|
+
end
|
47
|
+
assert set, "Incorrect nonce length should have raised ArgumentError"
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TweetNaClCryptoBoxCurve25519XSalsa20Poly1305Test < MiniTest::Test
|
4
|
+
def setup
|
5
|
+
@t = TweetNaCl.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def teardown; end
|
9
|
+
|
10
|
+
def test_crypto_box_curve25519xsalsa20poly1305
|
11
|
+
input = "hello world"
|
12
|
+
nonce = "*" * 24
|
13
|
+
expected_cipher = "0000000000000000FBC937C3F136E09FA8A45C58C15E801394F5BB74CE8D538FE3D726"
|
14
|
+
pk = "\x60\xF0\x23\x07\xDF\xB6\x8B\xBB\x15\xE2\x92\x59\x05\x1B\x2D\xF8\xC8\x59\xDB\x5B\xDE\x97\xFA\xE8\x9B\x5F\xE5\x62\x63\x11\xD6\x56"
|
15
|
+
sk = "\xBE\x38\x7C\x59\xD1\x81\x0B\xCC\x8E\xD8\x90\xDB\x3D\xF9\x80\x63\x9E\xD2\x54\x44\xFB\x4D\xD1\x92\xB6\xC6\x75\x53\xF9\x76\x9F\xCF"
|
16
|
+
|
17
|
+
cipher = @t.crypto_box_curve25519xsalsa20poly1305(input, nonce, pk, sk)
|
18
|
+
|
19
|
+
output = @t.crypto_box_curve25519xsalsa20poly1305_open(cipher, nonce, pk, sk)
|
20
|
+
|
21
|
+
assert_equal input, output
|
22
|
+
assert_equal expected_cipher, cipher.hd
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_crypto_box_curve25519xsalsa20poly1305_require_message_to_cipher
|
26
|
+
set = false
|
27
|
+
begin
|
28
|
+
@t.crypto_box_curve25519xsalsa20poly1305(nil, "bar", "pk", "sk")
|
29
|
+
rescue ArgumentError => e
|
30
|
+
set = true
|
31
|
+
end
|
32
|
+
assert set, "A message is required"
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_crypto_box_curve25519xsalsa20poly1305_require_public_key
|
36
|
+
set = false
|
37
|
+
begin
|
38
|
+
@t.crypto_box_curve25519xsalsa20poly1305("foo", "bar", nil, "sk")
|
39
|
+
rescue ArgumentError => e
|
40
|
+
set = true
|
41
|
+
end
|
42
|
+
assert set, "A public key is required"
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_crypto_box_curve25519xsalsa20poly1305_require_secret_key
|
46
|
+
set = false
|
47
|
+
begin
|
48
|
+
@t.crypto_box_curve25519xsalsa20poly1305("foo", "bar", "pk", nil)
|
49
|
+
rescue ArgumentError => e
|
50
|
+
set = true
|
51
|
+
end
|
52
|
+
assert set, "A secret key is required"
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_crypto_box_curve25519xsalsa20poly1305_nonce_not_correct_length
|
56
|
+
set = false
|
57
|
+
begin
|
58
|
+
@t.crypto_box_curve25519xsalsa20poly1305("foo", "bar", "pk", "sk")
|
59
|
+
rescue ArgumentError => e
|
60
|
+
set = true
|
61
|
+
end
|
62
|
+
assert set, "Incorrect nonce length should have raised ArgumentError"
|
63
|
+
end
|
64
|
+
end
|
data/tweetnacl.gemspec
CHANGED
@@ -1,20 +1,19 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
$:<< 'lib'
|
3
3
|
Gem::Specification.new do |spec|
|
4
|
-
spec.name
|
5
|
-
spec.version
|
6
|
-
spec.authors
|
7
|
-
spec.email
|
8
|
-
spec.homepage
|
9
|
-
spec.license
|
4
|
+
spec.name = "tweetnacl"
|
5
|
+
spec.version = "0.2.0"
|
6
|
+
spec.authors = ["Franck Verrot"]
|
7
|
+
spec.email = ["franck@verrot.fr"]
|
8
|
+
spec.homepage = "https://github.com/franckverrot/tweetnacl"
|
9
|
+
spec.license = "GPLv3"
|
10
10
|
|
11
|
-
spec.summary
|
11
|
+
spec.summary = "TweetNaCl for Ruby"
|
12
12
|
spec.description = "TweetNaCl is a C-extension built on top of the official TweetNaCl distribution"
|
13
|
-
spec.files
|
13
|
+
spec.files = `git ls-files -z`.split("\x0")
|
14
14
|
|
15
15
|
spec.extensions << "ext/tweetnacl/extconf.rb"
|
16
16
|
|
17
|
-
|
18
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
18
|
spec.require_paths = ["lib"]
|
20
19
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tweetnacl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Franck Verrot
|
@@ -76,6 +76,7 @@ extra_rdoc_files: []
|
|
76
76
|
files:
|
77
77
|
- ".gitignore"
|
78
78
|
- ".travis.yml"
|
79
|
+
- CHANGELOG.md
|
79
80
|
- Gemfile
|
80
81
|
- LICENSE.txt
|
81
82
|
- README.md
|
@@ -87,11 +88,14 @@ files:
|
|
87
88
|
- ext/tweetnacl/tweetnacl.c
|
88
89
|
- ext/tweetnacl/tweetnacl.h
|
89
90
|
- test/test_helper.rb
|
91
|
+
- test/tweetnacl_crypto_box_curve25519xsalsa20poly1305_keypair_test.rb
|
92
|
+
- test/tweetnacl_crypto_box_curve25519xsalsa20poly1305_open_test.rb
|
93
|
+
- test/tweetnacl_crypto_box_curve25519xsalsa20poly1305_test.rb
|
90
94
|
- test/tweetnacl_crypto_box_key_pair_test.rb
|
91
95
|
- test/tweetnacl_crypto_box_open_test.rb
|
92
96
|
- test/tweetnacl_crypto_box_test.rb
|
93
97
|
- tweetnacl.gemspec
|
94
|
-
homepage: https://github.com/franckverrot/
|
98
|
+
homepage: https://github.com/franckverrot/tweetnacl
|
95
99
|
licenses:
|
96
100
|
- GPLv3
|
97
101
|
metadata: {}
|
@@ -117,6 +121,9 @@ specification_version: 4
|
|
117
121
|
summary: TweetNaCl for Ruby
|
118
122
|
test_files:
|
119
123
|
- test/test_helper.rb
|
124
|
+
- test/tweetnacl_crypto_box_curve25519xsalsa20poly1305_keypair_test.rb
|
125
|
+
- test/tweetnacl_crypto_box_curve25519xsalsa20poly1305_open_test.rb
|
126
|
+
- test/tweetnacl_crypto_box_curve25519xsalsa20poly1305_test.rb
|
120
127
|
- test/tweetnacl_crypto_box_key_pair_test.rb
|
121
128
|
- test/tweetnacl_crypto_box_open_test.rb
|
122
129
|
- test/tweetnacl_crypto_box_test.rb
|