ffi-libsodium 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: acfdde4dacfa8c79dbb8c79cc752450016d0b38a
4
- data.tar.gz: 1ad28c3ae30992f427b1c57ee39d99684457f5d3
3
+ metadata.gz: f69721c907579641680a434287394a6bf4167701
4
+ data.tar.gz: aa8032ace5a3f2cd8ac8a7e664c78da9b87605ab
5
5
  SHA512:
6
- metadata.gz: a1ab577ea19b1ae9b5ca0ac4225bbe5cd5192f86d5748f26e501f80d4b082061aa43add2b079956df3ca24e08b5429c58f2259f00c7bdf6206b3e33c9bddf6dd
7
- data.tar.gz: e925c7e55392c1c321b31ec27640a05a9361f763b40a0dccd2d8f5847ca5b19d138f01b00a580c0c2ee6e6b2daa6c41ae60093f113b232e1b359e3ea5d86a471
6
+ metadata.gz: 258b1c21db7bf8e33097284cce68b7ee769336ce68c6522af170dd3026540ccddc3ea9bf62c0d8fab34d34932c76d92cee5454955b77db63c8d69a61667a8bc0
7
+ data.tar.gz: 3b4c31224024845e5aa13c6e80b4844834b7760015ee328c231d586170f5d2edb9d22756da7bb8f5dfcd5b95cdf764af7794a2d56d4145532b45c9d340bd9026
@@ -54,25 +54,24 @@ module Crypto
54
54
  end
55
55
 
56
56
  def decrypt(ciphertext, additional_data, nonce, key, encoding = nil)
57
- ciphertext_len = get_size(ciphertext)
58
- if (decrypted_len = ciphertext_len - ABYTES) >= 0
59
- check_length(nonce, NPUBBYTES, :Nonce)
60
- check_length(key, KEYBYTES, :SecretKey)
61
-
62
- decrypted = zeros(decrypted_len)
63
- key.readonly if key.is_a?(Sodium::SecretBuffer)
64
- if crypto_aead_chacha20poly1305_decrypt(decrypted, nil, nil, ciphertext, ciphertext_len, additional_data, get_size(additional_data), nonce, key) == 0
65
- if encoding
66
- decrypted.force_encoding(encoding)
67
- else
68
- decrypted
69
- end
70
- else
71
- raise Sodium::CryptoError, "Message forged", caller
72
- end
73
- else
57
+ if (decrypted_len = (ciphertext_len = get_size(ciphertext)) - ABYTES) < 0
74
58
  fail Sodium::LengthError, "Ciphertext is too short", caller
75
59
  end
60
+
61
+ check_length(nonce, NPUBBYTES, :Nonce)
62
+ check_length(key, KEYBYTES, :SecretKey)
63
+
64
+ decrypted = zeros(decrypted_len)
65
+ key.readonly if key.is_a?(Sodium::SecretBuffer)
66
+ if crypto_aead_chacha20poly1305_decrypt(decrypted, nil, nil, ciphertext, ciphertext_len, additional_data, get_size(additional_data), nonce, key) == -1
67
+ raise Sodium::CryptoError, "Message forged", caller
68
+ end
69
+
70
+ if encoding
71
+ decrypted.force_encoding(encoding)
72
+ end
73
+
74
+ decrypted
76
75
  ensure
77
76
  key.noaccess if key.is_a?(Sodium::SecretBuffer)
78
77
  end
@@ -25,11 +25,14 @@ module Crypto
25
25
  NONCEBYTES = noncebytes.freeze
26
26
  MACBYTES = macbytes.freeze
27
27
 
28
- attach_function :crypto_box_keypair, [:buffer_out, :buffer_out], :int
29
- attach_function :crypto_box_seed_keypair, [:buffer_out, :buffer_out, :buffer_in], :int
28
+ attach_function :crypto_box_keypair, [:buffer_out, :buffer_out], :int
29
+ attach_function :crypto_box_seed_keypair, [:buffer_out, :buffer_out, :buffer_in], :int
30
30
 
31
- attach_function :crypto_box_easy, [:buffer_out, :buffer_in, :ulong_long, :buffer_in, :buffer_in, :buffer_in], :int
32
- attach_function :crypto_box_open_easy, [:buffer_out, :buffer_in, :ulong_long, :buffer_in, :buffer_in, :buffer_in], :int
31
+ attach_function :crypto_box_easy, [:buffer_out, :buffer_in, :ulong_long, :buffer_in, :buffer_in, :buffer_in], :int
32
+ attach_function :crypto_box_open_easy, [:buffer_out, :buffer_in, :ulong_long, :buffer_in, :buffer_in, :buffer_in], :int
33
+
34
+ attach_function :crypto_box_detached, [:buffer_out, :buffer_out, :buffer_in, :ulong_long, :buffer_in, :buffer_in, :buffer_in], :int
35
+ attach_function :crypto_box_open_detached, [:buffer_out, :buffer_in, :buffer_in, :ulong_long, :buffer_in, :buffer_in, :buffer_in], :int
33
36
 
34
37
  module_function
35
38
 
@@ -104,15 +107,15 @@ module Crypto
104
107
 
105
108
  decrypted = zeros(ciphertext_len - MACBYTES)
106
109
  secret_key.readonly if secret_key.is_a?(Sodium::SecretBuffer)
107
- if crypto_box_open_easy(decrypted, ciphertext, ciphertext_len, nonce, public_key, secret_key) == 0
108
- if encoding
109
- decrypted.force_encoding(encoding)
110
- else
111
- decrypted
112
- end
113
- else
110
+ if crypto_box_open_easy(decrypted, ciphertext, ciphertext_len, nonce, public_key, secret_key) == -1
114
111
  raise Sodium::CryptoError, "Message forged", caller
115
112
  end
113
+
114
+ if encoding
115
+ decrypted.force_encoding(encoding)
116
+ end
117
+
118
+ decrypted
116
119
  ensure
117
120
  secret_key.noaccess if secret_key.is_a?(Sodium::SecretBuffer)
118
121
  end
@@ -128,7 +131,7 @@ module Crypto
128
131
  secret_key.readonly if secret_key.is_a?(Sodium::SecretBuffer)
129
132
  crypto_box_easy(message, message, message_len, nonce, public_key, secret_key)
130
133
 
131
- message.force_encoding(Encoding::ASCII_8BIT)
134
+ message
132
135
  ensure
133
136
  secret_key.noaccess if secret_key.is_a?(Sodium::SecretBuffer)
134
137
  end
@@ -136,25 +139,95 @@ module Crypto
136
139
  def open!(data, nonce, public_key, secret_key, encoding = nil)
137
140
  ciphertext = String(data)
138
141
  ciphertext_len = ciphertext.bytesize
139
- if (message_len = ciphertext_len - MACBYTES) >= 0
140
- check_length(nonce, NONCEBYTES, :Nonce)
141
- check_length(public_key, PUBLICKEYBYTES, :PublicKey)
142
- check_length(secret_key, SECRETKEYBYTES, :SecretKey)
143
-
144
- secret_key.readonly if secret_key.is_a?(Sodium::SecretBuffer)
145
- if crypto_box_open_easy(ciphertext, ciphertext, ciphertext_len, nonce, public_key, secret_key) == 0
146
- ciphertext.slice!(message_len..-1)
147
- if encoding
148
- ciphertext.force_encoding(encoding)
149
- else
150
- ciphertext
151
- end
152
- else
153
- raise Sodium::CryptoError, "Message forged", caller
154
- end
155
- else
142
+ if (message_len = ciphertext_len - MACBYTES) < 0
156
143
  fail Sodium::LengthError, "Ciphertext is too short", caller
157
144
  end
145
+
146
+ check_length(nonce, NONCEBYTES, :Nonce)
147
+ check_length(public_key, PUBLICKEYBYTES, :PublicKey)
148
+ check_length(secret_key, SECRETKEYBYTES, :SecretKey)
149
+
150
+ secret_key.readonly if secret_key.is_a?(Sodium::SecretBuffer)
151
+ if crypto_box_open_easy(ciphertext, ciphertext, ciphertext_len, nonce, public_key, secret_key) == -1
152
+ raise Sodium::CryptoError, "Message forged", caller
153
+ end
154
+
155
+ ciphertext.slice!(message_len..-1)
156
+ if encoding
157
+ ciphertext.force_encoding(encoding)
158
+ end
159
+
160
+ ciphertext
161
+ ensure
162
+ secret_key.noaccess if secret_key.is_a?(Sodium::SecretBuffer)
163
+ end
164
+
165
+ def detached(message, nonce, public_key, secret_key)
166
+ message_len = get_size(message)
167
+ check_length(nonce, NONCEBYTES, :Nonce)
168
+ check_length(public_key, PUBLICKEYBYTES, :PublicKey)
169
+ check_length(secret_key, SECRETKEYBYTES, :SecretKey)
170
+
171
+ ciphertext = zeros(message_len)
172
+ mac = zeros(MACBYTES)
173
+ secret_key.readonly if secret_key.is_a?(Sodium::SecretBuffer)
174
+ crypto_box_detached(ciphertext, mac, message, message_len, nonce, public_key, secret_key)
175
+ [ciphertext, mac]
176
+ ensure
177
+ secret_key.noaccess if secret_key.is_a?(Sodium::SecretBuffer)
178
+ end
179
+
180
+ def open_detached(ciphertext, mac, nonce, public_key, secret_key, encoding = nil)
181
+ ciphertext_len = get_size(ciphertext)
182
+ check_length(mac, MACBYTES, :Mac)
183
+ check_length(nonce, NONCEBYTES, :Nonce)
184
+ check_length(public_key, PUBLICKEYBYTES, :PublicKey)
185
+ check_length(secret_key, SECRETKEYBYTES, :SecretKey)
186
+
187
+ decrypted = zeros(ciphertext_len)
188
+ secret_key.readonly if secret_key.is_a?(Sodium::SecretBuffer)
189
+ if crypto_box_open_detached(decrypted, ciphertext, mac, ciphertext_len, nonce, public_key, secret_key) == -1
190
+ raise Sodium::CryptoError, "Message forged", caller
191
+ end
192
+
193
+ if encoding
194
+ decrypted.force_encoding(encoding)
195
+ end
196
+
197
+ decrypted
198
+ ensure
199
+ secret_key.noaccess if secret_key.is_a?(Sodium::SecretBuffer)
200
+ end
201
+
202
+ def detached!(message, nonce, public_key, secret_key)
203
+ check_length(nonce, NONCEBYTES, :Nonce)
204
+ check_length(public_key, PUBLICKEYBYTES, :PublicKey)
205
+ check_length(secret_key, SECRETKEYBYTES, :SecretKey)
206
+
207
+ mac = zeros(MACBYTES)
208
+ secret_key.readonly if secret_key.is_a?(Sodium::SecretBuffer)
209
+ crypto_box_detached(message, mac, message, get_size(message), nonce, public_key, secret_key)
210
+ [message, mac]
211
+ ensure
212
+ secret_key.noaccess if secret_key.is_a?(Sodium::SecretBuffer)
213
+ end
214
+
215
+ def open_detached!(ciphertext, mac, nonce, public_key, secret_key, encoding = nil)
216
+ check_length(mac, MACBYTES, :Mac)
217
+ check_length(nonce, NONCEBYTES, :Nonce)
218
+ check_length(public_key, PUBLICKEYBYTES, :PublicKey)
219
+ check_length(secret_key, SECRETKEYBYTES, :SecretKey)
220
+
221
+ secret_key.readonly if secret_key.is_a?(Sodium::SecretBuffer)
222
+ if crypto_box_open_detached(ciphertext, ciphertext, mac, get_size(ciphertext), nonce, public_key, secret_key) == -1
223
+ raise Sodium::CryptoError, "Message forged", caller
224
+ end
225
+
226
+ if encoding && ciphertext.respond_to?(:force_encoding)
227
+ ciphertext.force_encoding(encoding)
228
+ end
229
+
230
+ ciphertext
158
231
  ensure
159
232
  secret_key.noaccess if secret_key.is_a?(Sodium::SecretBuffer)
160
233
  end
@@ -53,11 +53,11 @@ module Crypto
53
53
 
54
54
  blake2b = zeros(hash_size)
55
55
  key.readonly if key.is_a?(Sodium::SecretBuffer)
56
- if crypto_generichash(blake2b, hash_size, message, get_size(message), key, key_len) == 0
57
- blake2b
58
- else
56
+ if crypto_generichash(blake2b, hash_size, message, get_size(message), key, key_len) == -1
59
57
  raise Sodium::CryptoError
60
58
  end
59
+
60
+ blake2b
61
61
  ensure
62
62
  key.noaccess if key.is_a?(Sodium::SecretBuffer)
63
63
  end
@@ -71,11 +71,11 @@ module Crypto
71
71
 
72
72
  state = State.new
73
73
  key.readonly if key.is_a?(Sodium::SecretBuffer)
74
- if crypto_generichash_init(state, key, key_len, hash_size) == 0
75
- [state, zeros(hash_size)]
76
- else
74
+ if crypto_generichash_init(state, key, key_len, hash_size) == -1
77
75
  raise Sodium::CryptoError
78
76
  end
77
+
78
+ [state, zeros(hash_size)]
79
79
  ensure
80
80
  key.noaccess if key.is_a?(Sodium::SecretBuffer)
81
81
  end
@@ -85,11 +85,11 @@ module Crypto
85
85
  end
86
86
 
87
87
  def final(state, blake2b)
88
- if crypto_generichash_final(state, blake2b, blake2b.bytesize) == 0
89
- blake2b
90
- else
88
+ if crypto_generichash_final(state, blake2b, blake2b.bytesize) == -1
91
89
  raise Sodium::CryptoError
92
90
  end
91
+
92
+ blake2b
93
93
  end
94
94
  end
95
95
 
@@ -52,21 +52,21 @@ module Crypto
52
52
  check_length(salt, SALTBYTES, :Salt)
53
53
 
54
54
  out = Sodium::SecretBuffer.new(outlen)
55
- if crypto_pwhash_scryptsalsa208sha256(out, outlen, passwd, passwd.bytesize, salt, opslimit, memlimit) == 0
56
- out.noaccess
57
- out
58
- else
55
+ if crypto_pwhash_scryptsalsa208sha256(out, outlen, passwd, passwd.bytesize, salt, opslimit, memlimit) == -1
59
56
  raise NoMemoryError, "Failed to allocate memory max size=#{memlimit} bytes", caller
60
57
  end
58
+
59
+ out.noaccess
60
+ out
61
61
  end
62
62
 
63
63
  def str(passwd, opslimit = OPSLIMIT_INTERACTIVE, memlimit = MEMLIMIT_INTERACTIVE)
64
- hashed_password = zeros(STRBYTES - 1)
65
- if crypto_pwhash_scryptsalsa208sha256_str(hashed_password, passwd, passwd.bytesize, opslimit, memlimit) == 0
66
- hashed_password
67
- else
64
+ hashed_password = zeros(STRBYTES)
65
+ if crypto_pwhash_scryptsalsa208sha256_str(hashed_password, passwd, passwd.bytesize, opslimit, memlimit) == -1
68
66
  raise NoMemoryError, "Failed to allocate memory max size=#{memlimit} bytes", caller
69
67
  end
68
+
69
+ hashed_password.chop!
70
70
  end
71
71
 
72
72
  def str_verify(str, passwd)
@@ -24,6 +24,9 @@ module Crypto
24
24
  attach_function :crypto_secretbox_easy, [:buffer_out, :buffer_in, :ulong_long, :buffer_in, :buffer_in], :int
25
25
  attach_function :crypto_secretbox_open_easy, [:buffer_out, :buffer_in, :ulong_long, :buffer_in, :buffer_in], :int
26
26
 
27
+ attach_function :crypto_secretbox_detached, [:buffer_out, :buffer_out, :buffer_in, :ulong_long, :buffer_in, :buffer_in], :int
28
+ attach_function :crypto_secretbox_open_detached, [:buffer_out, :buffer_out, :buffer_in, :ulong_long, :buffer_in, :buffer_in], :int
29
+
27
30
  module_function
28
31
 
29
32
  def nonce
@@ -51,15 +54,15 @@ module Crypto
51
54
 
52
55
  decrypted = zeros(ciphertext_len - MACBYTES)
53
56
  key.readonly if key.is_a?(Sodium::SecretBuffer)
54
- if crypto_secretbox_open_easy(decrypted, ciphertext, ciphertext_len, nonce, key) == 0
55
- if encoding
56
- decrypted.force_encoding(encoding)
57
- else
58
- decrypted
59
- end
60
- else
57
+ if crypto_secretbox_open_easy(decrypted, ciphertext, ciphertext_len, nonce, key) == -1
61
58
  raise Sodium::CryptoError, "Message forged", caller
62
59
  end
60
+
61
+ if encoding
62
+ decrypted.force_encoding(encoding)
63
+ end
64
+
65
+ decrypted
63
66
  ensure
64
67
  key.noaccess if key.is_a?(Sodium::SecretBuffer)
65
68
  end
@@ -81,25 +84,93 @@ module Crypto
81
84
 
82
85
  def open!(data, nonce, key, encoding = nil)
83
86
  ciphertext = String(data)
84
- ciphertext_len = ciphertext.bytesize
85
- if (message_len = ciphertext_len - MACBYTES) >= 0
86
- check_length(nonce, NONCEBYTES, :Nonce)
87
- check_length(key, KEYBYTES, :SecretKey)
88
-
89
- key.readonly if key.is_a?(Sodium::SecretBuffer)
90
- if crypto_secretbox_open_easy(ciphertext, ciphertext, ciphertext_len, nonce, key) == 0
91
- ciphertext.slice!(message_len..-1)
92
- if encoding
93
- ciphertext.force_encoding(encoding)
94
- else
95
- ciphertext
96
- end
97
- else
98
- raise Sodium::CryptoError, "Message forged", caller
99
- end
100
- else
87
+
88
+ if (message_len = (ciphertext_len = ciphertext.bytesize) - MACBYTES) < 0
101
89
  fail Sodium::LengthError, "Ciphertext is too short", caller
102
90
  end
91
+
92
+ check_length(nonce, NONCEBYTES, :Nonce)
93
+ check_length(key, KEYBYTES, :SecretKey)
94
+
95
+ key.readonly if key.is_a?(Sodium::SecretBuffer)
96
+ if crypto_secretbox_open_easy(ciphertext, ciphertext, ciphertext_len, nonce, key) == -1
97
+ raise Sodium::CryptoError, "Message forged", caller
98
+ end
99
+
100
+ ciphertext.slice!(message_len..-1)
101
+ if encoding
102
+ ciphertext.force_encoding(encoding)
103
+ end
104
+
105
+ ciphertext
106
+ ensure
107
+ key.noaccess if key.is_a?(Sodium::SecretBuffer)
108
+ end
109
+
110
+ def detached(message, nonce, key)
111
+ message_len = get_size(message)
112
+ check_length(nonce, NONCEBYTES, :Nonce)
113
+ check_length(key, KEYBYTES, :SecretKey)
114
+
115
+ ciphertext = zeros(message_len)
116
+ mac = zeros(MACBYTES)
117
+ key.readonly if key.is_a?(Sodium::SecretBuffer)
118
+ crypto_secretbox_easy(ciphertext, mac, message, message_len, nonce, key)
119
+
120
+ [ciphertext, mac]
121
+ ensure
122
+ key.noaccess if key.is_a?(Sodium::SecretBuffer)
123
+ end
124
+
125
+ def open_detached(ciphertext, mac, nonce, key, encoding = nil)
126
+ ciphertext_len = get_size(ciphertext)
127
+ check_length(mac, MACBYTES, :Mac)
128
+ check_length(nonce, NONCEBYTES, :Nonce)
129
+ check_length(key, KEYBYTES, :SecretKey)
130
+
131
+ decrypted = zeros(ciphertext_len)
132
+ key.readonly if key.is_a?(Sodium::SecretBuffer)
133
+ if crypto_secretbox_open_easy(decrypted, ciphertext, mac, ciphertext_len, nonce, key) == -1
134
+ raise Sodium::CryptoError, "Message forged", caller
135
+ end
136
+
137
+ if encoding
138
+ decrypted.force_encoding(encoding)
139
+ end
140
+
141
+ decrypted
142
+ ensure
143
+ key.noaccess if key.is_a?(Sodium::SecretBuffer)
144
+ end
145
+
146
+ def detached!(message, nonce, key)
147
+ check_length(nonce, NONCEBYTES, :Nonce)
148
+ check_length(key, KEYBYTES, :SecretKey)
149
+
150
+ mac = zeros(MACBYTES)
151
+ key.readonly if key.is_a?(Sodium::SecretBuffer)
152
+ crypto_secretbox_easy(message, message, mac, get_size(message), nonce, key)
153
+
154
+ [message, mac]
155
+ ensure
156
+ key.noaccess if key.is_a?(Sodium::SecretBuffer)
157
+ end
158
+
159
+ def open_detached!(ciphertext, mac, nonce, key, encoding = nil)
160
+ check_length(mac, MACBYTES, :Mac)
161
+ check_length(nonce, NONCEBYTES, :Nonce)
162
+ check_length(key, KEYBYTES, :SecretKey)
163
+
164
+ key.readonly if key.is_a?(Sodium::SecretBuffer)
165
+ if crypto_secretbox_open_easy(ciphertext, ciphertext, mac, get_size(ciphertext), nonce, key) == -1
166
+ raise Sodium::CryptoError, "Message forged", caller
167
+ end
168
+
169
+ if encoding && ciphertext.respond_to?(:force_encoding)
170
+ ciphertext.force_encoding(encoding)
171
+ end
172
+
173
+ ciphertext
103
174
  ensure
104
175
  key.noaccess if key.is_a?(Sodium::SecretBuffer)
105
176
  end
@@ -28,6 +28,9 @@ module Crypto
28
28
  attach_function :crypto_sign, [:buffer_out, :pointer, :buffer_in, :ulong_long, :buffer_in], :int
29
29
  attach_function :crypto_sign_open, [:buffer_out, :pointer, :buffer_in, :ulong_long, :buffer_in], :int
30
30
 
31
+ attach_function :crypto_sign_detached, [:buffer_out, :pointer, :buffer_in, :ulong_long, :buffer_in], :int
32
+ attach_function :crypto_sign_verify_detached, [:buffer_in, :buffer_in, :ulong_long, :buffer_in], :int
33
+
31
34
  module_function
32
35
 
33
36
  def keypair
@@ -93,11 +96,29 @@ module Crypto
93
96
 
94
97
  unsealed_message = zeros(sealed_message_len - BYTES)
95
98
  unsealed_message_len = FFI::MemoryPointer.new(:ulong_long)
96
- if crypto_sign_open(unsealed_message, unsealed_message_len, sealed_message, sealed_message_len, public_key) == 0
97
- unsealed_message
98
- else
99
+ if crypto_sign_open(unsealed_message, unsealed_message_len, sealed_message, sealed_message_len, public_key) == -1
99
100
  raise Sodium::CryptoError, "Incorrect signature", caller
100
101
  end
102
+
103
+ unsealed_message
104
+ end
105
+
106
+ def detached(message, secret_key)
107
+ check_length(secret_key, SECRETKEYBYTES, :SecretKey)
108
+
109
+ signature = zeros(BYTES)
110
+ secret_key.readonly if secret_key.is_a?(Sodium::SecretBuffer)
111
+ crypto_sign_detached(signature, nil, message, get_size(message), secret_key)
112
+
113
+ signature
114
+ ensure
115
+ secret_key.noaccess if secret_key.is_a?(Sodium::SecretBuffer)
116
+ end
117
+
118
+ def verify_detached(signature, message, public_key)
119
+ check_length(signature, BYTES, :Signature)
120
+
121
+ crypto_sign_verify_detached(signature, message, get_size(message), public_key) == 0
101
122
  end
102
123
  end
103
124
 
@@ -22,13 +22,18 @@ module Crypto
22
22
 
23
23
  attach_function :publickeybytes, :crypto_sign_ed25519_publickeybytes, [], :size_t
24
24
  attach_function :secretkeybytes, :crypto_sign_ed25519_secretkeybytes, [], :size_t
25
+ attach_function :seedbytes, :crypto_sign_ed25519_seedbytes, [], :size_t
25
26
 
26
27
  PUBLICKEYBYTES = publickeybytes.freeze
27
28
  SECRETKEYBYTES = secretkeybytes.freeze
29
+ SEEDBYTES = seedbytes.freeze
28
30
 
29
31
  attach_function :crypto_sign_ed25519_pk_to_curve25519, [:buffer_out, :buffer_in], :int
30
32
  attach_function :crypto_sign_ed25519_sk_to_curve25519, [:buffer_out, :buffer_in], :int
31
33
 
34
+ attach_function :crypto_sign_ed25519_sk_to_seed, [:buffer_out, :buffer_in], :int
35
+ attach_function :crypto_sign_ed25519_sk_to_pk, [:buffer_out, :buffer_in], :int
36
+
32
37
  module_function
33
38
 
34
39
  def pk_to_curve25519(public_key)
@@ -52,6 +57,30 @@ module Crypto
52
57
  ensure
53
58
  secret_key.noaccess if secret_key.is_a?(Sodium::SecretBuffer)
54
59
  end
60
+
61
+ def sk_to_seed(secret_key)
62
+ check_length(secret_key, SECRETKEYBYTES, :SecretKey)
63
+
64
+ seed = zeros(SEEDBYTES)
65
+ secret_key.readonly if secret_key.is_a?(Sodium::SecretBuffer)
66
+ crypto_sign_ed25519_sk_to_seed(seed, secret_key)
67
+
68
+ seed
69
+ ensure
70
+ secret_key.noaccess if secret_key.is_a?(Sodium::SecretBuffer)
71
+ end
72
+
73
+ def sk_to_pk(secret_key)
74
+ check_length(secret_key, SECRETKEYBYTES, :SecretKey)
75
+
76
+ public_key = zeros(PUBLICKEYBYTES)
77
+ secret_key.readonly if secret_key.is_a?(Sodium::SecretBuffer)
78
+ crypto_sign_ed25519_sk_to_pk(seed, secret_key)
79
+
80
+ public_key
81
+ ensure
82
+ secret_key.noaccess if secret_key.is_a?(Sodium::SecretBuffer)
83
+ end
55
84
  end
56
85
 
57
86
  Ed25519.freeze
@@ -23,35 +23,35 @@ module Sodium
23
23
  module_function
24
24
 
25
25
  def mlock(addr, len)
26
- if sodium_mlock(addr, len) == 0
27
- true
28
- else
26
+ if sodium_mlock(addr, len) == -1
29
27
  raise MemoryError, "Could not lock length=#{len} bytes memory at address=#{addr.address}", caller
30
28
  end
29
+
30
+ true
31
31
  end
32
32
 
33
33
  def munlock(addr, len)
34
- if sodium_munlock(addr, len) == 0
35
- true
36
- else
34
+ if sodium_munlock(addr, len) == -1
37
35
  raise MemoryError, "Could not unlock length=#{len} bytes memory at address=#{addr.address}", caller
38
36
  end
37
+
38
+ true
39
39
  end
40
40
 
41
41
  def malloc(size)
42
- unless (mem = sodium_malloc(size)).null?
43
- mem
44
- else
42
+ if (mem = sodium_malloc(size)).null?
45
43
  raise NoMemoryError, "Failed to allocate memory size=#{size} bytes", caller
46
44
  end
45
+
46
+ mem
47
47
  end
48
48
 
49
49
  def allocarray(count, size)
50
- unless (mem = sodium_allocarray(count, size)).null?
51
- mem
52
- else
50
+ if (mem = sodium_allocarray(count, size)).null?
53
51
  raise NoMemoryError, "Failed to allocate memory size=#{count * size} bytes", caller
54
52
  end
53
+
54
+ mem
55
55
  end
56
56
 
57
57
  def bin2hex(bin)
@@ -63,22 +63,21 @@ module Sodium
63
63
  def hex2bin(hex, bin_maxlen, ignore = nil)
64
64
  bin = zeros(bin_maxlen)
65
65
  bin_len = FFI::MemoryPointer.new(:size_t)
66
- if sodium_hex2bin(bin, bin_maxlen, hex, hex.bytesize, ignore, bin_len, nil) == 0
67
- size = bin_len.size == 8 ? bin_len.get_uint64(0) : bin_len.get_uint32(0)
68
- [bin, size]
69
- else
66
+ if sodium_hex2bin(bin, bin_maxlen, hex, hex.bytesize, ignore, bin_len, nil) == -1
70
67
  raise LengthError, "bin_maxlen=#{bin_maxlen} is too short", caller
71
68
  end
69
+ size = bin_len.size == 8 ? bin_len.get_uint64(0) : bin_len.get_uint32(0)
70
+
71
+ [bin, size]
72
72
  end
73
73
 
74
74
  def hex2bin!(hex, bin_maxlen, ignore = nil)
75
75
  bin_len = FFI::MemoryPointer.new(:size_t)
76
- if sodium_hex2bin(hex, bin_maxlen, hex, hex.bytesize, ignore, bin_len, nil) == 0
77
- size = bin_len.size == 8 ? bin_len.get_uint64(0) : bin_len.get_uint32(0)
78
- hex.slice!(size..-1)
79
- hex
80
- else
76
+ if sodium_hex2bin(hex, bin_maxlen, hex, hex.bytesize, ignore, bin_len, nil) == -1
81
77
  raise LengthError, "bin_maxlen=#{bin_maxlen} is too short", caller
82
78
  end
79
+ size = bin_len.size == 8 ? bin_len.get_uint64(0) : bin_len.get_uint32(0)
80
+ hex.slice!(size..-1)
81
+ hex
83
82
  end
84
83
  end
@@ -1,3 +1,3 @@
1
1
  module Sodium
2
- VERSION = Gem::Version.new('0.4.3')
2
+ VERSION = Gem::Version.new('0.4.4')
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffi-libsodium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hendrik Beskow
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-23 00:00:00.000000000 Z
11
+ date: 2014-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -86,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
86
  version: '0'
87
87
  requirements: []
88
88
  rubyforge_project:
89
- rubygems_version: 2.4.2
89
+ rubygems_version: 2.4.5
90
90
  signing_key:
91
91
  specification_version: 4
92
92
  summary: libsodium ffi wrapper