@@ -26,11 +26,17 @@ extern "C" {
2626
2727/** Opaque data structure that holds context information
2828 *
29- * The purpose of context structures is to store the randomization data for
30- * blinding, see secp256k1_context_randomize.
31- *
32- * Do not create a new context object for each operation, as construction is
33- * far slower than all other API calls.
29+ * The primary purpose of context objects is to store randomization data for
30+ * enhanced protection against side-channel leakage. This protection is only
31+ * effective if the context is randomized after its creation. See
32+ * secp256k1_context_create for creation of contexts and
33+ * secp256k1_context_randomize for randomization.
34+ *
35+ * A secondary purpose of context objects is to store pointers to callback
36+ * functions that the library will call when certain error states arise. See
37+ * secp256k1_context_set_error_callback as well as
38+ * secp256k1_context_set_illegal_callback for details. Future library versions
39+ * may use context objects for additional purposes.
3440 *
3541 * A constructed context can safely be used from multiple threads
3642 * simultaneously, but API calls that take a non-const pointer to a context
@@ -43,7 +49,7 @@ extern "C" {
4349 */
4450typedef struct secp256k1_context_struct secp256k1_context ;
4551
46- /** Opaque data structure that holds rewriteable "scratch space"
52+ /** Opaque data structure that holds rewritable "scratch space"
4753 *
4854 * The purpose of this structure is to replace dynamic memory allocations,
4955 * because we target architectures where this may not be available. It is
@@ -265,6 +271,15 @@ SECP256K1_API void secp256k1_selftest(void);
265271 * offered by the library. All other (deprecated) flags will be treated as equivalent
266272 * to the SECP256K1_CONTEXT_NONE flag. Though the flags parameter primarily exists for
267273 * historical reasons, future versions of the library may introduce new flags.
274+ *
275+ * If the context is intended to be used for API functions that perform computations
276+ * involving secret keys, e.g., signing and public key generation, then it is highly
277+ * recommended to call secp256k1_context_randomize on the context before calling
278+ * those API functions. This will provide enhanced protection against side-channel
279+ * leakage, see secp256k1_context_randomize for details.
280+ *
281+ * Do not create a new context object for each operation, as construction and
282+ * randomization can take non-negligible time.
268283 */
269284SECP256K1_API secp256k1_context * secp256k1_context_create (
270285 unsigned int flags
@@ -344,7 +359,10 @@ SECP256K1_API void secp256k1_context_set_illegal_callback(
344359) SECP256K1_ARG_NONNULL (1 );
345360
346361/** Set a callback function to be called when an internal consistency check
347- * fails. The default is crashing.
362+ * fails.
363+ *
364+ * The default callback writes an error message to stderr and calls abort
365+ * to abort the program.
348366 *
349367 * This can only trigger in case of a hardware failure, miscompilation,
350368 * memory corruption, serious bug in the library, or other error would can
@@ -800,30 +818,41 @@ SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul(
800818 const unsigned char * tweak32
801819) SECP256K1_ARG_NONNULL (1 ) SECP256K1_ARG_NONNULL (2 ) SECP256K1_ARG_NONNULL (3 );
802820
803- /** Updates the context randomization to protect against side-channel leakage.
804- * Returns: 1: randomization successfully updated or nothing to randomize
821+ /** Randomizes the context to provide enhanced protection against side-channel leakage.
822+ *
823+ * Returns: 1: randomization successful (or called on copy of secp256k1_context_static)
805824 * 0: error
806825 * Args: ctx: pointer to a context object.
807826 * In: seed32: pointer to a 32-byte random seed (NULL resets to initial state)
808827 *
809- * While secp256k1 code is written to be constant-time no matter what secret
810- * values are, it's possible that a future compiler may output code which isn't ,
828+ * While secp256k1 code is written and tested to be constant-time no matter what
829+ * secret values are, it is possible that a compiler may output code which is not ,
811830 * and also that the CPU may not emit the same radio frequencies or draw the same
812- * amount power for all values.
813- *
814- * This function provides a seed which is combined into the blinding value: that
815- * blinding value is added before each multiplication (and removed afterwards) so
816- * that it does not affect function results, but shields against attacks which
817- * rely on any input-dependent behaviour.
818- *
819- * This function has currently an effect only on contexts initialized for signing
820- * because randomization is currently used only for signing. However, this is not
821- * guaranteed and may change in the future. It is safe to call this function on
822- * contexts not initialized for signing; then it will have no effect and return 1.
823- *
824- * You should call this after secp256k1_context_create or
825- * secp256k1_context_clone (and secp256k1_context_preallocated_create or
826- * secp256k1_context_clone, resp.), and you may call this repeatedly afterwards.
831+ * amount of power for all values. Randomization of the context shields against
832+ * side-channel observations which aim to exploit secret-dependent behaviour in
833+ * certain computations which involve secret keys.
834+ *
835+ * It is highly recommended to call this function on contexts returned from
836+ * secp256k1_context_create or secp256k1_context_clone (or from the corresponding
837+ * functions in secp256k1_preallocated.h) before using these contexts to call API
838+ * functions that perform computations involving secret keys, e.g., signing and
839+ * public key generation. It is possible to call this function more than once on
840+ * the same context, and doing so before every few computations involving secret
841+ * keys is recommended as a defense-in-depth measure.
842+ *
843+ * Currently, the random seed is mainly used for blinding multiplications of a
844+ * secret scalar with the elliptic curve base point. Multiplications of this
845+ * kind are performed by exactly those API functions which are documented to
846+ * require a context that is not the secp256k1_context_static. As a rule of thumb,
847+ * these are all functions which take a secret key (or a keypair) as an input.
848+ * A notable exception to that rule is the ECDH module, which relies on a different
849+ * kind of elliptic curve point multiplication and thus does not benefit from
850+ * enhanced protection against side-channel leakage currently.
851+ *
852+ * It is safe call this function on a copy of secp256k1_context_static in writable
853+ * memory (e.g., obtained via secp256k1_context_clone). In that case, this
854+ * function is guaranteed to return 1, but the call will have no effect because
855+ * the static context (or a copy thereof) is not meant to be randomized.
827856 */
828857SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_context_randomize (
829858 secp256k1_context * ctx ,
0 commit comments