From 72c0ebbea413a3d05847a849d629082e5408232e Mon Sep 17 00:00:00 2001 From: isle2983 Date: Sun, 29 Jan 2017 14:38:21 -0700 Subject: [PATCH 1/2] Example 1 - avoid optimizing out stack variable clearing by using an __attribute__ --- src/ecmult_gen_impl.h | 2 +- src/group_impl.h | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/ecmult_gen_impl.h b/src/ecmult_gen_impl.h index 35f2546077..4ab9c391a7 100644 --- a/src/ecmult_gen_impl.h +++ b/src/ecmult_gen_impl.h @@ -150,7 +150,7 @@ static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context *ctx, secp25 secp256k1_ge_from_storage(&add, &adds); secp256k1_gej_add_ge(r, r, &add); } - bits = 0; + secp256k1_int_clear(&bits); secp256k1_ge_clear(&add); secp256k1_scalar_clear(&gnb); } diff --git a/src/group_impl.h b/src/group_impl.h index 7d723532ff..ab1c98f342 100644 --- a/src/group_impl.h +++ b/src/group_impl.h @@ -7,6 +7,7 @@ #ifndef _SECP256K1_GROUP_IMPL_H_ #define _SECP256K1_GROUP_IMPL_H_ +#include #include "num.h" #include "field.h" #include "group.h" @@ -213,6 +214,14 @@ static void secp256k1_ge_clear(secp256k1_ge *r) { secp256k1_fe_clear(&r->y); } +static void __attribute__((optimize("O0"))) secp256k1_secure_clear(void *s, size_t n) { + (void) memset(s, 0, n); +} + +static void secp256k1_int_clear(int *r) { + secp256k1_secure_clear(r, sizeof(*r)); +} + static int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x) { secp256k1_fe x2, x3, c; r->x = *x; From cdd46814c4abcd7bc9ce73d616347964ac7ac9be Mon Sep 17 00:00:00 2001 From: isle2983 Date: Sun, 29 Jan 2017 14:39:58 -0700 Subject: [PATCH 2/2] Example 2 - avoid optimizing out stack variable clearing by using the 'volatile' keyword --- src/group_impl.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/group_impl.h b/src/group_impl.h index ab1c98f342..a4d3ddf257 100644 --- a/src/group_impl.h +++ b/src/group_impl.h @@ -214,8 +214,13 @@ static void secp256k1_ge_clear(secp256k1_ge *r) { secp256k1_fe_clear(&r->y); } -static void __attribute__((optimize("O0"))) secp256k1_secure_clear(void *s, size_t n) { - (void) memset(s, 0, n); +typedef void *(*memset_t)(void *, int, size_t); + +static volatile memset_t secure_memset = memset; + +static void secp256k1_secure_clear(void *s, size_t n) { + (void) secure_memset(s, 0, n); + } static void secp256k1_int_clear(int *r) {