comparison nacl.c @ 10:130a6a714966 default tip

Use libsodium instead of libnacl
author Ivo Smits <Ivo@UCIS.nl>
date Thu, 10 Jul 2014 16:34:04 +0000
parents 765303f4f2da
children
comparison
equal deleted inserted replaced
9:765303f4f2da 10:130a6a714966
25 25
26 #ifdef HAVE_CONFIG_H 26 #ifdef HAVE_CONFIG_H
27 #include "config.h" 27 #include "config.h"
28 #endif 28 #endif
29 29
30 #include "nacl/crypto_box_curve25519xsalsa20poly1305.h" 30 #include "sodium/crypto_box_curve25519xsalsa20poly1305.h"
31 #include "nacl/crypto_scalarmult_curve25519.h" 31 #include "sodium/crypto_scalarmult_curve25519.h"
32 #include "nacl/crypto_sign_edwards25519sha512batch.h" 32 #include "sodium/crypto_sign_edwards25519sha512batch.h"
33 #include "sodium/crypto_sign_ed25519.h"
33 34
34 #include "php.h" 35 #include "php.h"
35 #include "php_ini.h" 36 #include "php_ini.h"
36 #include "php_nacl.h" 37 #include "php_nacl.h"
37 38
38 #if !(defined crypto_box_curve25519xsalsa20poly1305_KEYPAIRRANDOMBYTES || defined crypto_sign_edwards25519sha512batch_KEYPAIRRANDOMBYTES)
39 #include "randombytes.c"
40 #endif
41
42 #if defined crypto_box_curve25519xsalsa20poly1305_KEYPAIRRANDOMBYTES
43 ZEND_BEGIN_ARG_INFO_EX(arginfo_nacl_crypto_box_curve25519xsalsa20poly1305_keypair, 0, 0, 2)
44 ZEND_ARG_INFO(1, zsk)
45 ZEND_ARG_INFO(0, rb)
46 ZEND_END_ARG_INFO()
47 #else
48 ZEND_BEGIN_ARG_INFO_EX(arginfo_nacl_crypto_box_curve25519xsalsa20poly1305_keypair, 0, 0, 1) 39 ZEND_BEGIN_ARG_INFO_EX(arginfo_nacl_crypto_box_curve25519xsalsa20poly1305_keypair, 0, 0, 1)
49 ZEND_ARG_INFO(1, zsk) 40 ZEND_ARG_INFO(1, zsk)
50 ZEND_ARG_INFO(0, rb) 41 ZEND_ARG_INFO(0, rb)
51 ZEND_END_ARG_INFO() 42 ZEND_END_ARG_INFO()
52 #endif
53 #if defined crypto_sign_edwards25519sha512batch_KEYPAIRRANDOMBYTES
54 ZEND_BEGIN_ARG_INFO_EX(arginfo_nacl_crypto_sign_edwards25519sha512batch_keypair, 0, 0, 2)
55 ZEND_ARG_INFO(1, zsk)
56 ZEND_ARG_INFO(0, rb)
57 ZEND_END_ARG_INFO()
58 #else
59 ZEND_BEGIN_ARG_INFO_EX(arginfo_nacl_crypto_sign_edwards25519sha512batch_keypair, 0, 0, 1) 43 ZEND_BEGIN_ARG_INFO_EX(arginfo_nacl_crypto_sign_edwards25519sha512batch_keypair, 0, 0, 1)
60 ZEND_ARG_INFO(1, zsk) 44 ZEND_ARG_INFO(1, zsk)
61 ZEND_ARG_INFO(0, rb) 45 ZEND_ARG_INFO(0, rb)
62 ZEND_END_ARG_INFO() 46 ZEND_END_ARG_INFO()
63 #endif 47 ZEND_BEGIN_ARG_INFO_EX(arginfo_nacl_crypto_sign_ed25519_keypair, 0, 0, 1)
64 48 ZEND_ARG_INFO(1, zsk)
65 static function_entry nacl_functions[] = { 49 ZEND_ARG_INFO(0, rb)
50 ZEND_END_ARG_INFO()
51
52 static zend_function_entry nacl_functions[] = {
66 PHP_FE(nacl_crypto_box_curve25519xsalsa20poly1305, NULL) 53 PHP_FE(nacl_crypto_box_curve25519xsalsa20poly1305, NULL)
67 PHP_FE(nacl_crypto_box_curve25519xsalsa20poly1305_open, NULL) 54 PHP_FE(nacl_crypto_box_curve25519xsalsa20poly1305_open, NULL)
68 PHP_FE(nacl_crypto_box_curve25519xsalsa20poly1305_getpublickey, NULL) 55 PHP_FE(nacl_crypto_box_curve25519xsalsa20poly1305_getpublickey, NULL)
69 PHP_FE(nacl_crypto_box_curve25519xsalsa20poly1305_beforenm, NULL) 56 PHP_FE(nacl_crypto_box_curve25519xsalsa20poly1305_beforenm, NULL)
70 PHP_FE(nacl_crypto_box_curve25519xsalsa20poly1305_afternm, NULL) 57 PHP_FE(nacl_crypto_box_curve25519xsalsa20poly1305_afternm, NULL)
71 PHP_FE(nacl_crypto_box_curve25519xsalsa20poly1305_open_afternm, NULL) 58 PHP_FE(nacl_crypto_box_curve25519xsalsa20poly1305_open_afternm, NULL)
72 PHP_FE(nacl_crypto_box_curve25519xsalsa20poly1305_keypair, arginfo_nacl_crypto_box_curve25519xsalsa20poly1305_keypair) 59 PHP_FE(nacl_crypto_box_curve25519xsalsa20poly1305_keypair, arginfo_nacl_crypto_box_curve25519xsalsa20poly1305_keypair)
73 PHP_FE(nacl_crypto_sign_edwards25519sha512batch, NULL) 60 PHP_FE(nacl_crypto_sign_edwards25519sha512batch, NULL)
74 PHP_FE(nacl_crypto_sign_edwards25519sha512batch_open, NULL) 61 PHP_FE(nacl_crypto_sign_edwards25519sha512batch_open, NULL)
75 PHP_FE(nacl_crypto_sign_edwards25519sha512batch_keypair, arginfo_nacl_crypto_sign_edwards25519sha512batch_keypair) 62 PHP_FE(nacl_crypto_sign_edwards25519sha512batch_keypair, arginfo_nacl_crypto_sign_edwards25519sha512batch_keypair)
63 PHP_FE(nacl_crypto_sign_ed25519, NULL)
64 PHP_FE(nacl_crypto_sign_ed25519_open, NULL)
65 PHP_FE(nacl_crypto_sign_ed25519_keypair, arginfo_nacl_crypto_sign_ed25519_keypair)
76 {NULL, NULL, NULL} 66 {NULL, NULL, NULL}
77 }; 67 };
78 68
79 zend_module_entry nacl_module_entry = { 69 zend_module_entry nacl_module_entry = {
80 #if ZEND_MODULE_API_NO >= 20010901 70 #if ZEND_MODULE_API_NO >= 20010901
105 REGISTER_LONG_CONSTANT("NACL_CRYPTO_BOX_curve25519xsalsa20poly1305_ZEROBYTES", crypto_box_curve25519xsalsa20poly1305_ZEROBYTES, CONST_CS | CONST_PERSISTENT); 95 REGISTER_LONG_CONSTANT("NACL_CRYPTO_BOX_curve25519xsalsa20poly1305_ZEROBYTES", crypto_box_curve25519xsalsa20poly1305_ZEROBYTES, CONST_CS | CONST_PERSISTENT);
106 REGISTER_LONG_CONSTANT("NACL_CRYPTO_BOX_curve25519xsalsa20poly1305_BOXZEROBYTES", crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES, CONST_CS | CONST_PERSISTENT); 96 REGISTER_LONG_CONSTANT("NACL_CRYPTO_BOX_curve25519xsalsa20poly1305_BOXZEROBYTES", crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES, CONST_CS | CONST_PERSISTENT);
107 REGISTER_LONG_CONSTANT("NACL_CRYPTO_SIGN_edwards25519sha512batch_BYTES", crypto_sign_edwards25519sha512batch_BYTES, CONST_CS | CONST_PERSISTENT); 97 REGISTER_LONG_CONSTANT("NACL_CRYPTO_SIGN_edwards25519sha512batch_BYTES", crypto_sign_edwards25519sha512batch_BYTES, CONST_CS | CONST_PERSISTENT);
108 REGISTER_LONG_CONSTANT("NACL_CRYPTO_SIGN_edwards25519sha512batch_PUBLICKEYBYTES", crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES, CONST_CS | CONST_PERSISTENT); 98 REGISTER_LONG_CONSTANT("NACL_CRYPTO_SIGN_edwards25519sha512batch_PUBLICKEYBYTES", crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES, CONST_CS | CONST_PERSISTENT);
109 REGISTER_LONG_CONSTANT("NACL_CRYPTO_SIGN_edwards25519sha512batch_SECRETKEYBYTES", crypto_sign_edwards25519sha512batch_SECRETKEYBYTES, CONST_CS | CONST_PERSISTENT); 99 REGISTER_LONG_CONSTANT("NACL_CRYPTO_SIGN_edwards25519sha512batch_SECRETKEYBYTES", crypto_sign_edwards25519sha512batch_SECRETKEYBYTES, CONST_CS | CONST_PERSISTENT);
110 #if defined crypto_box_curve25519xsalsa20poly1305_KEYPAIRRANDOMBYTES 100 REGISTER_LONG_CONSTANT("NACL_CRYPTO_SIGN_ed25519_SECRETKEYBYTES", crypto_sign_ed25519_SECRETKEYBYTES, CONST_CS | CONST_PERSISTENT);
111 REGISTER_LONG_CONSTANT("NACL_CRYPTO_BOX_curve25519xsalsa20poly1305_KEYPAIRRANDOMBYTES", crypto_box_curve25519xsalsa20poly1305_KEYPAIRRANDOMBYTES, CONST_CS | CONST_PERSISTENT); 101 REGISTER_LONG_CONSTANT("NACL_CRYPTO_SIGN_ed25519_PUBLICKEYBYTES", crypto_sign_ed25519_PUBLICKEYBYTES, CONST_CS | CONST_PERSISTENT);
112 #endif 102 REGISTER_LONG_CONSTANT("NACL_CRYPTO_SIGN_ed25519_SEEDBYTES", crypto_sign_ed25519_SEEDBYTES, CONST_CS | CONST_PERSISTENT);
113 #if defined crypto_sign_edwards25519sha512batch_KEYPAIRRANDOMBYTES 103 REGISTER_LONG_CONSTANT("NACL_CRYPTO_SIGN_ed25519_BYTES", crypto_sign_ed25519_BYTES, CONST_CS | CONST_PERSISTENT);
114 REGISTER_LONG_CONSTANT("NACL_CRYPTO_SIGN_edwards25519sha512batch_KEYPAIRRANDOMBYTES", crypto_sign_edwards25519sha512batch_KEYPAIRRANDOMBYTES, CONST_CS | CONST_PERSISTENT);
115 #endif
116 } 104 }
117 105
118 PHP_FUNCTION(nacl_crypto_box_curve25519xsalsa20poly1305) { //(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *,const unsigned char *) 106 PHP_FUNCTION(nacl_crypto_box_curve25519xsalsa20poly1305) { //(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *,const unsigned char *)
119 unsigned char *m, *n, *pk, *sk; 107 unsigned char *m, *n, *pk, *sk;
120 int lm, ln, lpk, lsk; 108 int lm, ln, lpk, lsk;
219 } 207 }
220 PHP_FUNCTION(nacl_crypto_box_curve25519xsalsa20poly1305_keypair) { 208 PHP_FUNCTION(nacl_crypto_box_curve25519xsalsa20poly1305_keypair) {
221 unsigned char *rb; 209 unsigned char *rb;
222 int lrb; 210 int lrb;
223 zval *zsk; 211 zval *zsk;
224 #if defined crypto_box_curve25519xsalsa20poly1305_KEYPAIRRANDOMBYTES
225 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zs", &zsk, &rb, &lrb) == FAILURE) RETURN_NULL();
226 if (!zsk) RETURN_FALSE;
227 if (lrb != crypto_box_curve25519xsalsa20poly1305_KEYPAIRRANDOMBYTES) RETURN_FALSE;
228 unsigned char *spk = emalloc(crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES);
229 unsigned char *ssk = emalloc(crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES);
230 int ret = crypto_box_curve25519xsalsa20poly1305_keypair(spk, ssk, rb);
231 #else
232 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|s", &zsk, &rb, &lrb) == FAILURE) RETURN_NULL(); 212 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|s", &zsk, &rb, &lrb) == FAILURE) RETURN_NULL();
233 if (!zsk) RETURN_FALSE; 213 if (!zsk) RETURN_FALSE;
234 unsigned char *spk = emalloc(crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES); 214 unsigned char *spk = emalloc(crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES);
235 unsigned char *ssk = emalloc(crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES); 215 unsigned char *ssk = emalloc(crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES);
236 int ret = crypto_box_curve25519xsalsa20poly1305_keypair(spk, ssk); 216 int ret;
237 #endif 217 if (rb) {
218 if (lrb < crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES) RETURN_FALSE;
219 unsigned char base[32] = {9};
220 ret = crypto_scalarmult_curve25519(spk, ssk, base);
221 } else {
222 ret = crypto_box_curve25519xsalsa20poly1305_keypair(spk, ssk);
223 }
238 if (ret) RETURN_FALSE; 224 if (ret) RETURN_FALSE;
239 zval_dtor(zsk); 225 zval_dtor(zsk);
240 ZVAL_STRINGL(zsk, (char*)ssk, crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES, 0); 226 ZVAL_STRINGL(zsk, (char*)ssk, crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES, 0);
241 RETURN_STRINGL((char*)spk, crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES, 0); 227 RETURN_STRINGL((char*)spk, crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES, 0);
242 } 228 }
258 PHP_FUNCTION(nacl_crypto_sign_edwards25519sha512batch_open) { //(unsigned char *,unsigned long long *,const unsigned char *,unsigned long long,const unsigned char *); 244 PHP_FUNCTION(nacl_crypto_sign_edwards25519sha512batch_open) { //(unsigned char *,unsigned long long *,const unsigned char *,unsigned long long,const unsigned char *);
259 unsigned char *sm, *pk; 245 unsigned char *sm, *pk;
260 int lsm, lpk; 246 int lsm, lpk;
261 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &sm, &lsm, &pk, &lpk) == FAILURE) RETURN_NULL(); 247 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &sm, &lsm, &pk, &lpk) == FAILURE) RETURN_NULL();
262 if (lpk != crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES) RETURN_FALSE; 248 if (lpk != crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES) RETURN_FALSE;
249 if (lsm < crypto_sign_edwards25519sha512batch_BYTES) RETURN_FALSE;
263 long long unsigned int mlen = lsm; 250 long long unsigned int mlen = lsm;
264 unsigned char* mb = emalloc(mlen); 251 unsigned char* mb = emalloc(mlen);
265 int ret = crypto_sign_edwards25519sha512batch_open(mb, &mlen, sm, lsm, pk); 252 int ret = crypto_sign_edwards25519sha512batch_open(mb, &mlen, sm, lsm, pk);
266 char* m = emalloc(mlen); 253 char* m = emalloc(mlen);
267 memcpy(m, mb, mlen); 254 memcpy(m, mb, mlen);
272 } 259 }
273 PHP_FUNCTION(nacl_crypto_sign_edwards25519sha512batch_keypair) { //(unsigned char *,unsigned char *); 260 PHP_FUNCTION(nacl_crypto_sign_edwards25519sha512batch_keypair) { //(unsigned char *,unsigned char *);
274 unsigned char *rb; 261 unsigned char *rb;
275 int lrb; 262 int lrb;
276 zval *zsk; 263 zval *zsk;
277 #if defined crypto_sign_edwards25519sha512batch_KEYPAIRRANDOMBYTES
278 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zs", &zsk, &rb, &lrb) == FAILURE) RETURN_NULL();
279 if (lrb != crypto_sign_edwards25519sha512batch_KEYPAIRRANDOMBYTES) RETURN_FALSE;
280 if (!zsk) RETURN_FALSE;
281 unsigned char *spk = emalloc(crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES);
282 unsigned char *ssk = emalloc(crypto_sign_edwards25519sha512batch_SECRETKEYBYTES);
283 int ret = crypto_sign_edwards25519sha512batch_keypair(spk, ssk, rb);
284 #else
285 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|s", &zsk, &rb, &lrb) == FAILURE) RETURN_NULL(); 264 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|s", &zsk, &rb, &lrb) == FAILURE) RETURN_NULL();
286 if (!zsk) RETURN_FALSE; 265 if (!zsk) RETURN_FALSE;
287 unsigned char *spk = emalloc(crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES); 266 unsigned char *spk = emalloc(crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES);
288 unsigned char *ssk = emalloc(crypto_sign_edwards25519sha512batch_SECRETKEYBYTES); 267 unsigned char *ssk = emalloc(crypto_sign_edwards25519sha512batch_SECRETKEYBYTES);
289 int ret = crypto_sign_edwards25519sha512batch_keypair(spk, ssk); 268 int ret = crypto_sign_edwards25519sha512batch_keypair(spk, ssk);
290 #endif
291 if (ret) RETURN_FALSE; 269 if (ret) RETURN_FALSE;
292 zval_dtor(zsk); 270 zval_dtor(zsk);
293 ZVAL_STRINGL(zsk, (char*)ssk, crypto_sign_edwards25519sha512batch_SECRETKEYBYTES, 0); 271 ZVAL_STRINGL(zsk, (char*)ssk, crypto_sign_edwards25519sha512batch_SECRETKEYBYTES, 0);
294 RETURN_STRINGL((char*)spk, crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES, 0); 272 RETURN_STRINGL((char*)spk, crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES, 0);
295 } 273 }
274 PHP_FUNCTION(nacl_crypto_sign_ed25519) { //(unsigned char *,unsigned long long *,const unsigned char *,unsigned long long,const unsigned char *);
275 unsigned char *m, *sk;
276 int lm, lsk;
277 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &m, &lm, &sk, &lsk) == FAILURE) RETURN_NULL();
278 if (lsk != crypto_sign_ed25519_SECRETKEYBYTES) RETURN_FALSE;
279 long long unsigned int smlen = lm + crypto_sign_ed25519_BYTES;
280 unsigned char* smb = emalloc(smlen);
281 int ret = crypto_sign_ed25519(smb, &smlen, m, lm, sk);
282 char* sm = emalloc(smlen);
283 memcpy(sm, smb, smlen);
284 efree(smb);
285 if (ret == 0) RETURN_STRINGL(sm, smlen, 0);
286 efree(sm);
287 RETURN_FALSE;
288 }
289 PHP_FUNCTION(nacl_crypto_sign_ed25519_open) { //(unsigned char *,unsigned long long *,const unsigned char *,unsigned long long,const unsigned char *);
290 unsigned char *sm, *pk;
291 int lsm, lpk;
292 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &sm, &lsm, &pk, &lpk) == FAILURE) RETURN_NULL();
293 if (lpk != crypto_sign_ed25519_PUBLICKEYBYTES) RETURN_FALSE;
294 if (lsm < crypto_sign_ed25519_BYTES) RETURN_FALSE;
295 long long unsigned int mlen = lsm;
296 unsigned char* mb = emalloc(mlen);
297 int ret = crypto_sign_ed25519_open(mb, &mlen, sm, lsm, pk);
298 char* m = emalloc(mlen);
299 memcpy(m, mb, mlen);
300 efree(mb);
301 if (ret == 0) RETURN_STRINGL(m, mlen, 0);
302 efree(m);
303 RETURN_FALSE;
304 }
305 PHP_FUNCTION(nacl_crypto_sign_ed25519_keypair) { //(unsigned char *,unsigned char *);
306 unsigned char *rb;
307 int lrb;
308 zval *zsk;
309 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|s", &zsk, &rb, &lrb) == FAILURE) RETURN_NULL();
310 if (!zsk) RETURN_FALSE;
311 unsigned char *spk = emalloc(crypto_sign_ed25519_PUBLICKEYBYTES);
312 unsigned char *ssk = emalloc(crypto_sign_ed25519_SECRETKEYBYTES);
313 int ret;
314 if (rb) {
315 if (lrb < crypto_sign_ed25519_SEEDBYTES) RETURN_FALSE;
316 ret = crypto_sign_ed25519_seed_keypair(spk, ssk, rb);
317 } else {
318 ret = crypto_sign_ed25519_keypair(spk, ssk);
319 }
320 if (ret) RETURN_FALSE;
321 zval_dtor(zsk);
322 ZVAL_STRINGL(zsk, (char*)ssk, crypto_sign_ed25519_SECRETKEYBYTES, 0);
323 RETURN_STRINGL((char*)spk, crypto_sign_ed25519_PUBLICKEYBYTES, 0);
324 }