]> granicus.if.org Git - php/commitdiff
sodium ext: clear the hash state after we're done hashing
authorFrank Denis <github@pureftpd.org>
Thu, 20 Jul 2017 18:17:52 +0000 (20:17 +0200)
committerFrank Denis <github@pureftpd.org>
Fri, 21 Jul 2017 12:02:26 +0000 (14:02 +0200)
ext/sodium/libsodium.c

index 2a3c8eb2a6ec7f07e90aadd1c732e8fcccb6ab13..e0b5b91127a0a777e478401272634f27c74c8f33 100644 (file)
@@ -852,6 +852,7 @@ PHP_FUNCTION(sodium_crypto_generichash_update)
        memcpy(&state_tmp, state, sizeof state_tmp);
        if (crypto_generichash_update((void *) &state_tmp, msg,
                                                                  (unsigned long long) msg_len) != 0) {
+               sodium_memzero(&state_tmp, sizeof state_tmp);
                zend_throw_exception(sodium_exception_ce, "internal error", 0);
                return;
        }
@@ -896,10 +897,12 @@ PHP_FUNCTION(sodium_crypto_generichash_final)
        if (crypto_generichash_final((void *) &state_tmp,
                                                                 (unsigned char *) ZSTR_VAL(hash),
                                                                 (size_t) hash_len) != 0) {
+               sodium_memzero(&state_tmp, sizeof state_tmp);
                zend_string_free(hash);
                zend_throw_exception(sodium_exception_ce, "internal error", 0);
                return;
        }
+       sodium_memzero(&state_tmp, sizeof state_tmp);
        sodium_memzero(state, state_len);
        convert_to_null(state_zv);
        ZSTR_VAL(hash)[hash_len] = 0;
@@ -2640,6 +2643,7 @@ PHP_FUNCTION(sodium_crypto_kx_client_session_keys)
        crypto_generichash_update(&h, client_pk, crypto_kx_PUBLICKEYBYTES);
        crypto_generichash_update(&h, server_pk, crypto_kx_PUBLICKEYBYTES);
        crypto_generichash_final(&h, session_keys, 2 * crypto_kx_SESSIONKEYBYTES);
+       sodium_memzero(&h, sizeof h);
        array_init(return_value);
        add_next_index_stringl(return_value,
                                                   (const char *) session_keys,
@@ -2688,6 +2692,7 @@ PHP_FUNCTION(sodium_crypto_kx_server_session_keys)
        crypto_generichash_update(&h, client_pk, crypto_kx_PUBLICKEYBYTES);
        crypto_generichash_update(&h, server_pk, crypto_kx_PUBLICKEYBYTES);
        crypto_generichash_final(&h, session_keys, 2 * crypto_kx_SESSIONKEYBYTES);
+       sodium_memzero(&h, sizeof h);
        array_init(return_value);
        add_next_index_stringl(return_value,
                                                   (const char *) session_keys + crypto_kx_SESSIONKEYBYTES,