quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

commit ae1e872ae0f09f86fd435dffe287dfbc5d023b54
parent 60aa552c12207f7ef379d685a27fce336e6c26bb
Author: Florian Dold <dold@taler.net>
Date:   Sun,  9 Aug 2026 21:19:54 +0200

tart: clear transient secret material

Diffstat:
Mtart_module.c | 27++++++++++++++++++++-------
1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/tart_module.c b/tart_module.c @@ -597,8 +597,9 @@ static JSValue js_talercrypto_hash_argon2id(JSContext *ctx, JSValue this_val, goto exception; } ret_val = make_js_ta_copy(ctx, hash, hash_len); - done: +done: if (NULL != hash) { + sodium_memzero(hash, hash_len); free(hash); } return ret_val; @@ -673,22 +674,24 @@ static JSValue js_talercrypto_eddsa_sign(JSContext *ctx, JSValue this_val, unsigned char pk[crypto_sign_PUBLICKEYBYTES]; unsigned char sig[64]; int res; + JSValue ret = JS_EXCEPTION; data = JS_GetArrayBuffer(ctx, &data_size, argv[0]); if (!data) { - return JS_EXCEPTION; + goto done; } seed = JS_GetArrayBuffer(ctx, &seed_size, argv[1]); if (!seed) { - return JS_EXCEPTION; + goto done; } if (seed_size != 32) { - return JS_ThrowTypeError(ctx, "invalid private key seed size"); + ret = JS_ThrowTypeError(ctx, "invalid private key seed size"); + goto done; } if (0 != crypto_sign_seed_keypair(pk, sk, seed)) { - return JS_EXCEPTION; + goto done; } res = crypto_sign_detached((uint8_t *)sig, @@ -697,9 +700,12 @@ static JSValue js_talercrypto_eddsa_sign(JSContext *ctx, JSValue this_val, data_size, sk); if (res != 0) { - return JS_EXCEPTION; + goto done; } - return make_js_ta_copy(ctx, sig, 64); + ret = make_js_ta_copy(ctx, sig, 64); +done: + sodium_memzero(sk, sizeof sk); + return ret; } /** @@ -844,6 +850,7 @@ static JSValue js_talercrypto_kdf(JSContext *ctx, JSValue this_val, ret_val = make_js_ta_copy(ctx, okm, okm_len); done: if (NULL != okm) { + sodium_memzero(okm, okm_len); free(okm); } return ret_val; @@ -883,6 +890,8 @@ static JSValue js_talercrypto_kx_ecdh_eddsa(JSContext *ctx, JSValue this_val, } ret_val = make_js_ta_copy(ctx, key_material, crypto_hash_BYTES); done: + sodium_memzero(p, sizeof p); + sodium_memzero(key_material, sizeof key_material); return ret_val; exception: ret_val = JS_EXCEPTION; @@ -916,6 +925,10 @@ static JSValue js_talercrypto_kx_eddsa_ecdh(JSContext *ctx, JSValue this_val, crypto_hash(key_material, p, crypto_scalarmult_BYTES); ret_val = make_js_ta_copy(ctx, key_material, crypto_hash_BYTES); done: + sodium_memzero(hc, sizeof hc); + sodium_memzero(a, sizeof a); + sodium_memzero(p, sizeof p); + sodium_memzero(key_material, sizeof key_material); return ret_val; exception: ret_val = JS_EXCEPTION;