]> granicus.if.org Git - php/commitdiff
sodium ext: add bindings for keygen() functions
authorFrank Denis <jedisct1@php.net>
Wed, 12 Jul 2017 21:29:48 +0000 (23:29 +0200)
committerFrank Denis <jedisct1@php.net>
Wed, 12 Jul 2017 21:29:48 +0000 (23:29 +0200)
This is the recommended way to generate keys correctly for all operations
using a single key, since libsodium 1.0.12.

ext/sodium/libsodium.c
ext/sodium/php_libsodium.h
ext/sodium/tests/crypto_aead.phpt
ext/sodium/tests/crypto_auth.phpt
ext/sodium/tests/crypto_secretbox.phpt
ext/sodium/tests/crypto_stream.phpt

index 6f71946fc18240b70d8835e1dd387d414eafcc52..4bce7605f022a9fa997d0cd2fbf819bf61998782 100644 (file)
@@ -252,6 +252,20 @@ const zend_function_entry sodium_functions[] = {
        PHP_FE(sodium_memcmp, AI_TwoStrings)
        PHP_FE(sodium_memzero, AI_FirstArgByReferenceSecondLength)
 
+#ifdef HAVE_AESGCM
+       PHP_FE(sodium_crypto_aead_aes256gcm_keygen, AI_None)
+#endif
+       PHP_FE(sodium_crypto_aead_chacha20poly1305_keygen, AI_None)
+       PHP_FE(sodium_crypto_aead_chacha20poly1305_ietf_keygen, AI_None)
+#ifdef crypto_aead_xchacha20poly1305_IETF_NPUBBYTES
+       PHP_FE(sodium_crypto_aead_xchacha20poly1305_ietf_keygen, AI_None)
+#endif
+       PHP_FE(sodium_crypto_auth_keygen, AI_None)
+       PHP_FE(sodium_crypto_generichash_keygen, AI_None)
+       PHP_FE(sodium_crypto_secretbox_keygen, AI_None)
+       PHP_FE(sodium_crypto_shorthash_keygen, AI_None)
+       PHP_FE(sodium_crypto_stream_keygen, AI_None)
+
        PHP_FALIAS(sodium_crypto_scalarmult_base, sodium_crypto_box_publickey_from_secretkey, AI_TwoStrings)
 
        PHP_FE_END
@@ -2794,6 +2808,73 @@ PHP_FUNCTION(sodium_compare)
 }
 #endif
 
+#ifdef HAVE_AESGCM
+PHP_FUNCTION(sodium_crypto_aead_aes256gcm_keygen)
+{
+       unsigned char key[crypto_aead_aes256gcm_KEYBYTES];
+       randombytes_buf(key, sizeof key);
+       RETURN_STRINGL((const char *) key, sizeof key);
+}
+#endif
+
+PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_keygen)
+{
+       unsigned char key[crypto_aead_chacha20poly1305_KEYBYTES];
+       randombytes_buf(key, sizeof key);
+       RETURN_STRINGL((const char *) key, sizeof key);
+}
+
+PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_ietf_keygen)
+{
+       unsigned char key[crypto_aead_chacha20poly1305_ietf_KEYBYTES];
+       randombytes_buf(key, sizeof key);
+       RETURN_STRINGL((const char *) key, sizeof key);
+}
+
+#ifdef crypto_aead_xchacha20poly1305_IETF_NPUBBYTES
+PHP_FUNCTION(sodium_crypto_aead_xchacha20poly1305_ietf_keygen)
+{
+       unsigned char key[crypto_aead_xchacha20poly1305_ietf_KEYBYTES];
+       randombytes_buf(key, sizeof key);
+       RETURN_STRINGL((const char *) key, sizeof key);
+}
+#endif
+
+PHP_FUNCTION(sodium_crypto_auth_keygen)
+{
+       unsigned char key[crypto_auth_KEYBYTES];
+       randombytes_buf(key, sizeof key);
+       RETURN_STRINGL((const char *) key, sizeof key);
+}
+
+PHP_FUNCTION(sodium_crypto_generichash_keygen)
+{
+       unsigned char key[crypto_generichash_KEYBYTES];
+       randombytes_buf(key, sizeof key);
+       RETURN_STRINGL((const char *) key, sizeof key);
+}
+
+PHP_FUNCTION(sodium_crypto_secretbox_keygen)
+{
+       unsigned char key[crypto_secretbox_KEYBYTES];
+       randombytes_buf(key, sizeof key);
+       RETURN_STRINGL((const char *) key, sizeof key);
+}
+
+PHP_FUNCTION(sodium_crypto_shorthash_keygen)
+{
+       unsigned char key[crypto_shorthash_KEYBYTES];
+       randombytes_buf(key, sizeof key);
+       RETURN_STRINGL((const char *) key, sizeof key);
+}
+
+PHP_FUNCTION(sodium_crypto_stream_keygen)
+{
+       unsigned char key[crypto_stream_KEYBYTES];
+       randombytes_buf(key, sizeof key);
+       RETURN_STRINGL((const char *) key, sizeof key);
+}
+
 /*
  * Local variables:
  * tab-width: 4
index 52a19cc1329aceb127c0aaa8b660a03680ee70f3..a4713e2370acb18ed73c8475d4e56f680d8d0034 100644 (file)
@@ -40,13 +40,18 @@ PHP_FUNCTION(sodium_compare);
 PHP_FUNCTION(sodium_crypto_aead_aes256gcm_decrypt);
 PHP_FUNCTION(sodium_crypto_aead_aes256gcm_encrypt);
 PHP_FUNCTION(sodium_crypto_aead_aes256gcm_is_available);
+PHP_FUNCTION(sodium_crypto_aead_aes256gcm_keygen);
 PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_decrypt);
 PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_encrypt);
+PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_keygen);
 PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_ietf_decrypt);
 PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_ietf_encrypt);
+PHP_FUNCTION(sodium_crypto_aead_chacha20poly1305_ietf_keygen);
 PHP_FUNCTION(sodium_crypto_aead_xchacha20poly1305_ietf_decrypt);
 PHP_FUNCTION(sodium_crypto_aead_xchacha20poly1305_ietf_encrypt);
+PHP_FUNCTION(sodium_crypto_aead_xchacha20poly1305_ietf_keygen);
 PHP_FUNCTION(sodium_crypto_auth);
+PHP_FUNCTION(sodium_crypto_auth_keygen);
 PHP_FUNCTION(sodium_crypto_auth_verify);
 PHP_FUNCTION(sodium_crypto_box);
 PHP_FUNCTION(sodium_crypto_box_keypair);
@@ -61,6 +66,7 @@ PHP_FUNCTION(sodium_crypto_box_seed_keypair);
 PHP_FUNCTION(sodium_crypto_generichash);
 PHP_FUNCTION(sodium_crypto_generichash_final);
 PHP_FUNCTION(sodium_crypto_generichash_init);
+PHP_FUNCTION(sodium_crypto_generichash_keygen);
 PHP_FUNCTION(sodium_crypto_generichash_update);
 PHP_FUNCTION(sodium_crypto_kx_client_session_keys);
 PHP_FUNCTION(sodium_crypto_kx_keypair);
@@ -77,8 +83,10 @@ PHP_FUNCTION(sodium_crypto_pwhash_str_verify);
 PHP_FUNCTION(sodium_crypto_scalarmult);
 PHP_FUNCTION(sodium_crypto_scalarmult_base);
 PHP_FUNCTION(sodium_crypto_secretbox);
+PHP_FUNCTION(sodium_crypto_secretbox_keygen);
 PHP_FUNCTION(sodium_crypto_secretbox_open);
 PHP_FUNCTION(sodium_crypto_shorthash);
+PHP_FUNCTION(sodium_crypto_shorthash_keygen);
 PHP_FUNCTION(sodium_crypto_sign);
 PHP_FUNCTION(sodium_crypto_sign_detached);
 PHP_FUNCTION(sodium_crypto_sign_ed25519_pk_to_curve25519);
@@ -92,6 +100,7 @@ PHP_FUNCTION(sodium_crypto_sign_secretkey);
 PHP_FUNCTION(sodium_crypto_sign_seed_keypair);
 PHP_FUNCTION(sodium_crypto_sign_verify_detached);
 PHP_FUNCTION(sodium_crypto_stream);
+PHP_FUNCTION(sodium_crypto_stream_keygen);
 PHP_FUNCTION(sodium_crypto_stream_xor);
 PHP_FUNCTION(sodium_hex2bin);
 PHP_FUNCTION(sodium_increment);
index 5c4a51d32c5bfd234879d51db299c05c3747da2f..059eefbde845be4f07a6f9630775fb0b17cbafab 100644 (file)
@@ -11,7 +11,7 @@ echo "aead_chacha20poly1305:\n";
 
 $msg = random_bytes(random_int(1, 1000));
 $nonce = random_bytes(SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES);
-$key = random_bytes(SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES);
+$key = sodium_crypto_aead_chacha20poly1305_keygen();
 $ad = random_bytes(random_int(1, 1000));
 
 $ciphertext = sodium_crypto_aead_chacha20poly1305_encrypt($msg, $ad, $nonce, $key);
@@ -34,7 +34,7 @@ if (SODIUM_LIBRARY_MAJOR_VERSION > 7 ||
         SODIUM_LIBRARY_MINOR_VERSION >= 6)) {
        $msg = random_bytes(random_int(1, 1000));
        $nonce = random_bytes(SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES);
-       $key = random_bytes(SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES);
+       $key = sodium_crypto_aead_chacha20poly1305_ietf_keygen();
        $ad = random_bytes(random_int(1, 1000));
 
        $ciphertext = sodium_crypto_aead_chacha20poly1305_ietf_encrypt($msg, $ad, $nonce, $key);
@@ -63,7 +63,7 @@ if (SODIUM_LIBRARY_MAJOR_VERSION > 9 ||
         SODIUM_LIBRARY_MINOR_VERSION >= 4)) {
        $msg = random_bytes(random_int(1, 1000));
        $nonce = random_bytes(SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES);
-       $key = random_bytes(SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES);
+       $key = sodium_crypto_aead_xchacha20poly1305_ietf_keygen();
        $ad = random_bytes(random_int(1, 1000));
 
        $ciphertext = sodium_crypto_aead_xchacha20poly1305_ietf_encrypt($msg, $ad, $nonce, $key);
@@ -87,12 +87,11 @@ if (SODIUM_LIBRARY_MAJOR_VERSION > 9 ||
 
 echo "aead_aes256gcm:\n";
 
-$msg = random_bytes(random_int(1, 1000));
-$nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES);
-$key = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES);
-$ad = random_bytes(random_int(1, 1000));
-
 if (sodium_crypto_aead_aes256gcm_is_available()) {
+       $msg = random_bytes(random_int(1, 1000));
+       $nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES);
+       $ad = random_bytes(random_int(1, 1000));
+       $key = sodium_crypto_aead_aes256gcm_keygen();
        $ciphertext = sodium_crypto_aead_aes256gcm_encrypt($msg, $ad, $nonce, $key);
        $msg2 = sodium_crypto_aead_aes256gcm_decrypt($ciphertext, $ad, $nonce, $key);
        var_dump($ciphertext !== $msg);
index b201758066961fea5d6ba679f62a6d5666f9c38e..067903cbb21b4f9cf750fdeff8f681a5f278939b 100644 (file)
@@ -5,7 +5,7 @@ Check for libsodium auth
 --FILE--
 <?php
 $msg = random_bytes(1000);
-$key = random_bytes(SODIUM_CRYPTO_AUTH_KEYBYTES);
+$key = sodium_crypto_auth_keygen();
 $mac = sodium_crypto_auth($msg, $key);
 
 // This should validate
index f4bf53ec617902984e3327e5b8f4ee7c93ac0798..ac34ea65ef199333c06a6c811f5c30ca95625aa9 100644 (file)
@@ -5,7 +5,7 @@ Check for libsodium secretbox
 --FILE--
 <?php
 $nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
-$key = random_bytes(SODIUM_CRYPTO_SECRETBOX_KEYBYTES);
+$key = sodium_crypto_secretbox_keygen();
 
 $a = sodium_crypto_secretbox('test', $nonce, $key);
 $x = sodium_crypto_secretbox_open($a, $nonce, $key);
index 7439e289b8e0c4bea802c4050901fb3e3135a331..0bf481b73e68a7a3224a696962639430e9f90c77 100644 (file)
@@ -5,7 +5,7 @@ Check for libsodium stream
 --FILE--
 <?php
 $nonce = random_bytes(SODIUM_CRYPTO_STREAM_NONCEBYTES);
-$key = random_bytes(SODIUM_CRYPTO_STREAM_KEYBYTES);
+$key = sodium_crypto_stream_keygen();
 
 $len = 100;
 $stream = sodium_crypto_stream($len, $nonce, $key);
@@ -16,7 +16,7 @@ $stream2 = sodium_crypto_stream($len, $nonce, $key);
 $nonce = random_bytes(SODIUM_CRYPTO_STREAM_NONCEBYTES);
 $stream3 = sodium_crypto_stream($len, $nonce, $key);
 
-$key = random_bytes(SODIUM_CRYPTO_STREAM_KEYBYTES);
+$key = sodium_crypto_stream_keygen();
 $stream4 = sodium_crypto_stream($len, $nonce, $key);
 
 var_dump($stream === $stream2);