BN_BLINDING_NEW(3SSL)
β¨ BN_BLINDING_NEW β¨
okay bestie so this is a page from the OpenSSL manual, and it's filed under 3SSL which is the section for the library functions, not the commands. it's all about the blinding gang β a whole little friend group of BIGNUM-adjacent functions that keep your modular exponentiation from getting side-channel'd, which is iconic of them fr fr π
πΈ NAME πΈ
BN_BLINDING_new, BN_BLINDING_free, BN_BLINDING_update, BN_BLINDING_convert, BN_BLINDING_invert, BN_BLINDING_convert_ex, BN_BLINDING_invert_ex, BN_BLINDING_is_current_thread, BN_BLINDING_set_current_thread, BN_BLINDING_lock, BN_BLINDING_unlock, BN_BLINDING_get_flags, BN_BLINDING_set_flags, BN_BLINDING_create_param β blinding related BIGNUM functions π¦
β¨ SYNOPSIS β¨
bestie, here's the whole cast list in their natural habitat, copy-pasted exactly because we do not mess with signatures:
#include <openssl/bn.h>
BN_BLINDING *BN_BLINDING_new(const BIGNUM *A, const BIGNUM *Ai,
BIGNUM *mod);
void BN_BLINDING_free(BN_BLINDING *b);
int BN_BLINDING_update(BN_BLINDING *b, BN_CTX *ctx);
int BN_BLINDING_convert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx);
int BN_BLINDING_invert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx);
int BN_BLINDING_convert_ex(BIGNUM *n, BIGNUM *r, BN_BLINDING *b,
BN_CTX *ctx);
int BN_BLINDING_invert_ex(BIGNUM *n, const BIGNUM *r, BN_BLINDING *b,
BN_CTX *ctx);
int BN_BLINDING_is_current_thread(BN_BLINDING *b);
void BN_BLINDING_set_current_thread(BN_BLINDING *b);
int BN_BLINDING_lock(BN_BLINDING *b);
int BN_BLINDING_unlock(BN_BLINDING *b);
unsigned long BN_BLINDING_get_flags(const BN_BLINDING *b);
void BN_BLINDING_set_flags(BN_BLINDING *b, unsigned long flags);
BN_BLINDING *BN_BLINDING_create_param(BN_BLINDING *b,
const BIGNUM *e, BIGNUM *m, BN_CTX *ctx,
int (*bn_mod_exp)(BIGNUM *r,
const BIGNUM *a,
const BIGNUM *p,
const BIGNUM *m,
BN_CTX *ctx,
BN_MONT_CTX *m_ctx),
BN_MONT_CTX *m_ctx);
π DESCRIPTION π
let's go function by function, no skips, no cuts, we're doing the full tour π
BN_BLINDING_new()β allocates a brand newBN_BLINDINGstructure and copies theAandAivalues into the freshly createdBN_BLINDINGobject. new object, who dis β¨BN_BLINDING_free()β frees theBN_BLINDINGstructure. and ifbisNULL, literally nothing happens. no drama, no segfault, just vibes π«ΆBN_BLINDING_update()β updates theBN_BLINDINGparameters by squaring theAandAi, or β after a specific number of uses and if the necessary parameters are set β by re-creating the blinding parameters. glow-up round two β¨BN_BLINDING_convert_ex()β multipliesnwith the blinding factorA. ifris notNULL, a copy of the inverse blinding factorAigets returned inr. and bestie, that is super useful when an RSA object is shared across several threads, iykyk π§΅BN_BLINDING_invert_ex()β multipliesnwith the inverse blinding factorAi. ifris notNULL, it'll be used as the inverse blinding.BN_BLINDING_convert()andBN_BLINDING_invert()β these two are wrapper functions forBN_BLINDING_convert_ex()andBN_BLINDING_invert_ex()withrset toNULL. the low-effort besties of the group πBN_BLINDING_is_current_thread()β returns whether theBN_BLINDINGstructure is owned by the current thread. the whole point is to help users provide proper locking if they need it for multi-threaded use. main character checking if it's their turn π₯BN_BLINDING_set_current_thread()β sets the current thread as the owner of theBN_BLINDINGstructure. claiming your man, so to speak.BN_BLINDING_lock()β locks theBN_BLINDINGstructure. πBN_BLINDING_unlock()β unlocks theBN_BLINDINGstructure. πBN_BLINDING_get_flags()β returns theBN_BLINDINGflags. currently there are two supported flags:BN_BLINDING_NO_UPDATEandBN_BLINDING_NO_RECREATE.BN_BLINDING_NO_UPDATEinhibits the automatic update of theBN_BLINDINGparameters after each use, andBN_BLINDING_NO_RECREATEinhibits the automatic re-creation of theBN_BLINDINGparameters after a fixed number of uses β and that number is currently32. in newly allocatedBN_BLINDINGobjects, no flags are set. blank slate energy πBN_BLINDING_set_flags()β sets theBN_BLINDINGparameters flags.BN_BLINDING_create_param()β creates newBN_BLINDINGparameters using the exponenteand the modulusm.bn_mod_expandm_ctxcan be used to pass special functions for exponentiation β normallyBN_mod_exp_mont()andBN_MONT_CTX. fancy custom hooks, obsessed π
π RETURN VALUES π
okay so here's what every function hands back, and bestie we do not skip a single one:
BN_BLINDING_new()β returns the newly allocatedBN_BLINDINGstructure, orNULLin case of an error. πBN_BLINDING_update(),BN_BLINDING_convert(),BN_BLINDING_invert(),BN_BLINDING_convert_ex()andBN_BLINDING_invert_ex()β return1on success and0if an error occurred. classic.BN_BLINDING_is_current_thread()β returns1if the current thread owns theBN_BLINDINGobject,0otherwise.BN_BLINDING_set_current_thread()β doesn't return anything. it's giving void, periodt.BN_BLINDING_lock(),BN_BLINDING_unlock()β return1if the operation succeeded, or0on error.BN_BLINDING_get_flags()β returns the currently setBN_BLINDINGflags, which is anunsigned longvalue.BN_BLINDING_create_param()β returns the newly createdBN_BLINDINGparameters, orNULLon error.
π¦ HISTORY π¦
a lil lore drop: BN_BLINDING_thread_id() was first introduced in OpenSSL 1.0.0, and it deprecates BN_BLINDING_set_thread_id() and BN_BLINDING_get_thread_id(). old names, we don't know them anymore π
π COPYRIGHT π
Copyright 2005-2017 The OpenSSL Project Authors. All Rights Reserved.
Licensed under the Apache License 2.0 (the "License"). You may not use this file except in compliance with the License. You can obtain a copy in the file LICENSE in the source distribution or at <https://www.openssl.org/source/license.html>.
and that's the whole page bestie, slayed β¨ this was version 4.0.3, dated 2026-09-29, and yes that's the BN_BLINDING_NEW page out of 3SSL β go forth and blind responsibly π«Άππ
π¦ where this page comes from
- ubuntu stonking: libssl-doc 4.0.3-1ubuntu1 Β· Apache-2.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms