Merge bitcoin-core/secp256k1#1579: Clear sensitive memory without getting optimized out (revival of #636)
765ef53335Clear _gej instances after point multiplication to avoid potential leaks (Sebastian Falbesoner)349e6ab916Introduce separate _clear functions for hash module (Tim Ruffing)99cc9fd6d0Don't rely on memset to set signed integers to 0 (Tim Ruffing)97c57f42baImplement various _clear() functions with secp256k1_memclear() (Tim Ruffing)9bb368d146Use secp256k1_memclear() to clear stack memory instead of memset() (Tim Ruffing)e3497bbf00Separate between clearing memory and setting to zero in tests (Tim Ruffing)d79a6ccd43Separate secp256k1_fe_set_int( . , 0 ) from secp256k1_fe_clear() (Tim Ruffing)1c08126222Add secp256k1_memclear() for clearing secret data (Tim Ruffing)e7d384488eDon't clear secrets in pippenger implementation (Tim Ruffing) Pull request description: This PR picks up #636 (which in turn picked up #448, so this is take number three) and is essentially a rebase on master. Some changes to the original PR: * the clearing function now has the `secp256k1_` prefix again, since the related helper `_memczero` got it as well (see PR #835 / commite89278f211) * the original commit b17a7df8145a6a86d49c354c7e7b59a432ea5346 ("Make _set_fe_int( . , 0 ) set magnitude to 0") is not needed anymore, since it was already applied in PR #943 (commitd49011f54c) * clearing of stack memory with `secp256k1_memclear` is now also done on modules that have been newly introduced since then, i.e. schnorr and ellswift (of course, there is still no guarantee that all places where clearing is necessary are covered) So far I haven't looked at any disassembly and possible performance implications yet (there were some concerns expressed in https://github.com/bitcoin-core/secp256k1/pull/636#issuecomment-620118629), happy to go deeper there if this gets Concept ACKed. The proposed method of using a memory barrier to prevent optimizating away the memset is still used in BoringSSL (where it was originally picked up from) and in the Linux Kernel, see e.g.5af122c3df/crypto/mem.c (L335)andd456068672/include/linux/string.h (L348)/d456068672/include/linux/compiler.h (L102)Fixes #185. ACKs for top commit: sipa: reACK765ef53335real-or-random: ACK765ef53335Tree-SHA512: 5a034d5ad14178c06928022459f3d4f0877d06f576b24ab07b86b3608b0b3e9273217b8309a1db606f024f3032731f13013114b1e0828964b578814d1efb2959
This commit is contained in:
13
src/tests.c
13
src/tests.c
@@ -3671,8 +3671,7 @@ static void test_ge(void) {
|
||||
secp256k1_fe zfi2, zfi3;
|
||||
|
||||
secp256k1_gej_set_infinity(&gej[0]);
|
||||
secp256k1_ge_clear(&ge[0]);
|
||||
secp256k1_ge_set_gej_var(&ge[0], &gej[0]);
|
||||
secp256k1_ge_set_infinity(&ge[0]);
|
||||
for (i = 0; i < runs; i++) {
|
||||
int j, k;
|
||||
secp256k1_ge g;
|
||||
@@ -4797,12 +4796,12 @@ static void test_ecmult_multi(secp256k1_scratch *scratch, secp256k1_ecmult_multi
|
||||
testutil_random_ge_test(&pt[ncount]);
|
||||
}
|
||||
|
||||
secp256k1_scalar_clear(&sc[0]);
|
||||
secp256k1_scalar_set_int(&sc[0], 0);
|
||||
CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &secp256k1_scalar_zero, ecmult_multi_callback, &data, 20));
|
||||
secp256k1_scalar_clear(&sc[1]);
|
||||
secp256k1_scalar_clear(&sc[2]);
|
||||
secp256k1_scalar_clear(&sc[3]);
|
||||
secp256k1_scalar_clear(&sc[4]);
|
||||
secp256k1_scalar_set_int(&sc[1], 0);
|
||||
secp256k1_scalar_set_int(&sc[2], 0);
|
||||
secp256k1_scalar_set_int(&sc[3], 0);
|
||||
secp256k1_scalar_set_int(&sc[4], 0);
|
||||
CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &secp256k1_scalar_zero, ecmult_multi_callback, &data, 6));
|
||||
CHECK(ecmult_multi(&CTX->error_callback, scratch, &r, &secp256k1_scalar_zero, ecmult_multi_callback, &data, 5));
|
||||
CHECK(secp256k1_gej_is_infinity(&r));
|
||||
|
||||
Reference in New Issue
Block a user