tweetnacl 0.0.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|