Mercurial > hg > php_nacl
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 } |