nacl 0.1 → 0.2

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 (2) hide show
  1. data/ext/nacl/nacl.c +53 -1
  2. metadata +2 -2
@@ -1,6 +1,7 @@
1
1
  #include <ruby.h>
2
2
  #include <crypto_box.h>
3
3
  #include <crypto_sign.h>
4
+ #include <crypto_secretbox.h>
4
5
  #include <crypto_hash.h>
5
6
  #include <crypto_hash_sha256.h>
6
7
  #include <crypto_hash_sha512.h>
@@ -47,7 +48,6 @@ VALUE method_crypto_box(VALUE self, VALUE message, VALUE nonce, VALUE pk, VALUE
47
48
  int n;
48
49
 
49
50
  Check_Type(message, T_STRING);
50
- Check_Type(nonce, T_STRING);
51
51
  CHECK_STRING_LENGTH(nonce, crypto_box_NONCEBYTES);
52
52
  CHECK_STRING_LENGTH(pk, crypto_box_PUBLICKEYBYTES);
53
53
  CHECK_STRING_LENGTH(sk, crypto_box_SECRETKEYBYTES);
@@ -138,6 +138,52 @@ VALUE method_crypto_sign_open(VALUE self, VALUE signed_message, VALUE pk) {
138
138
  return return_value;
139
139
  }
140
140
 
141
+ /**********************************************************************************/
142
+
143
+ VALUE method_crypto_secretbox(VALUE self, VALUE message, VALUE nonce, VALUE key) {
144
+ char *padded_message, *result;
145
+ VALUE return_value;
146
+ unsigned long long mlen;
147
+ int n;
148
+
149
+ Check_Type(message, T_STRING);
150
+ CHECK_STRING_LENGTH(nonce, crypto_secretbox_NONCEBYTES);
151
+ CHECK_STRING_LENGTH(key, crypto_secretbox_KEYBYTES);
152
+
153
+ mlen = allocate_and_prepend_zeros(message, crypto_secretbox_ZEROBYTES, &padded_message, &result);
154
+ n = crypto_secretbox(result, padded_message, mlen, RSTRING_PTR(nonce), RSTRING_PTR(key));
155
+
156
+ if (n == 0) return_value = rb_str_new(result + crypto_secretbox_BOXZEROBYTES, mlen - crypto_secretbox_BOXZEROBYTES);
157
+ memset(padded_message, 0, mlen);
158
+ free(result);
159
+ free(padded_message);
160
+ if (n != 0) rb_raise(rb_eRuntimeError, "crypto_secretbox failed");
161
+ return return_value;
162
+ }
163
+
164
+ VALUE method_crypto_secretbox_open(VALUE self, VALUE ciphertext, VALUE nonce, VALUE key) {
165
+ char *p, *padded_ciphertext, *result;
166
+ VALUE return_value;
167
+ unsigned long long mlen;
168
+ int n;
169
+
170
+ Check_Type(ciphertext, T_STRING);
171
+ if (RSTRING_LEN(ciphertext) < crypto_secretbox_ZEROBYTES - crypto_secretbox_BOXZEROBYTES) rb_raise(rb_eArgError, "ciphertext must be at least %d bytes long", crypto_secretbox_ZEROBYTES - crypto_secretbox_BOXZEROBYTES);
172
+ CHECK_STRING_LENGTH(nonce, crypto_secretbox_NONCEBYTES);
173
+ CHECK_STRING_LENGTH(key, crypto_secretbox_KEYBYTES);
174
+
175
+ mlen = allocate_and_prepend_zeros(ciphertext, crypto_secretbox_BOXZEROBYTES, &padded_ciphertext, &result);
176
+ n = crypto_secretbox_open(result, padded_ciphertext, mlen, RSTRING_PTR(nonce), RSTRING_PTR(key));
177
+
178
+ if (n == 0) return_value = rb_str_new(result + crypto_secretbox_ZEROBYTES, mlen - crypto_secretbox_ZEROBYTES);
179
+ memset(result, 0, mlen);
180
+ free(padded_ciphertext);
181
+ free(result);
182
+ if (n != 0) rb_raise(OpenError, "crypto_secretbox_open failed");
183
+ return return_value;
184
+ }
185
+
186
+
141
187
  /**********************************************************************************/
142
188
 
143
189
  VALUE method_crypto_hash(VALUE self, VALUE data) {
@@ -167,11 +213,17 @@ void Init_nacl() {
167
213
  rb_define_module_function(NaCl, "crypto_box_keypair", method_crypto_box_keypair, 0);
168
214
  rb_define_module_function(NaCl, "crypto_box", method_crypto_box, 4);
169
215
  rb_define_module_function(NaCl, "crypto_box_open", method_crypto_box_open, 4);
216
+ rb_define_const(NaCl, "BOX_NONCE_LENGTH", INT2FIX(crypto_box_NONCEBYTES));
170
217
 
171
218
  rb_define_module_function(NaCl, "crypto_sign_keypair", method_crypto_sign_keypair, 0);
172
219
  rb_define_module_function(NaCl, "crypto_sign", method_crypto_sign, 2);
173
220
  rb_define_module_function(NaCl, "crypto_sign_open", method_crypto_sign_open, 2);
174
221
 
222
+ rb_define_module_function(NaCl, "crypto_secretbox", method_crypto_secretbox, 3);
223
+ rb_define_module_function(NaCl, "crypto_secretbox_open", method_crypto_secretbox_open, 3);
224
+ rb_define_const(NaCl, "SECRETBOX_NONCE_LENGTH", INT2FIX(crypto_secretbox_NONCEBYTES));
225
+ rb_define_const(NaCl, "SECRETBOX_KEY_LENGTH", INT2FIX(crypto_secretbox_KEYBYTES));
226
+
175
227
  rb_define_module_function(NaCl, "crypto_hash", method_crypto_hash, 1);
176
228
  rb_define_module_function(NaCl, "crypto_hash_sha256", method_crypto_hash_sha256, 1);
177
229
  rb_define_module_function(NaCl, "crypto_hash_sha512", method_crypto_hash_sha512, 1);
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nacl
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.1'
4
+ version: '0.2'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-09 00:00:00.000000000 Z
12
+ date: 2012-06-10 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description:
15
15
  email: roger@seriousorange.com