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:
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;