BN_BLINDING_NEW(3ossl)
π BN_BLINDING_NEW β the blinding glow-up for BIGNUM (3ossl) π
okay bestie, welcome to the OpenSSL section of the group chat β this one's a 3ossl page and it's all about blinding, which is genuinely one of the most underrated hyped things in crypto. lowkey iconic. let's get into it π«Ά
β¨ 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 β the blinding-related BIGNUM functions, aka the whole squad π
πΈ SYNOPSIS πΈ
#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);
no cap, that last one is a whole paragraph of a function signature but we move π
π¦ DESCRIPTION π¦
so. BN_BLINDING_new() is the main character here β it allocates a fresh BN_BLINDING structure and copies the A and Ai values right on into the newly created BN_BLINDING object. she's born ready β¨
BN_BLINDING_free() frees the BN_BLINDING structure. and if b is NULL? nothing happens. nothing. zero. she just vibes π
BN_BLINDING_update() updates the BN_BLINDING parameters by squaring the A and Ai β or, after a specific number of uses and if the necessary parameters are set, by re-creating the blinding parameters. glow-up either way π
BN_BLINDING_convert_ex() multiplies n with the blinding factor A. and here's the cute part β if r is not NULL, a copy of the inverse blinding factor Ai gets returned in r. (this is lowkey useful if an RSA object is shared among several threads, iykyk π§΅). then BN_BLINDING_invert_ex() multiplies n with the inverse blinding factor Ai. and if r is not NULL, it gets used as the inverse blinding.
BN_BLINDING_convert() and BN_BLINDING_invert() are just wrapper functions for BN_BLINDING_convert_ex() and BN_BLINDING_invert_ex() with r set to NULL. short kings, still valid π
BN_BLINDING_is_current_thread() returns whether the BN_BLINDING structure is owned by the current thread. why do we care? because it helps users provide proper locking if needed for multi-threaded use. bestie, if needed is doing a lot of work in that sentence, keep it in mind π«Ά
BN_BLINDING_set_current_thread() sets the current thread as the owner of the BN_BLINDING structure. claim your territory π
BN_BLINDING_lock() locks the BN_BLINDING structure.
BN_BLINDING_unlock() unlocks the BN_BLINDING structure. (they're a matching set, it's giving coordinated outfit π)
BN_BLINDING_get_flags() returns the BN_BLINDING flags. currently there are two supported flags: BN_BLINDING_NO_UPDATE and BN_BLINDING_NO_RECREATE. let me spell it out:
BN_BLINDING_NO_UPDATEinhibits the automatic update of theBN_BLINDINGparameters after each useBN_BLINDING_NO_RECREATEinhibits the automatic re-creation of theBN_BLINDINGparameters after a fixed number of uses (currently 32)
and in newly allocated BN_BLINDING objects, no flags are set β blank slate energy πΈ
BN_BLINDING_set_flags() sets the BN_BLINDING parameters flags. slay.
BN_BLINDING_create_param() creates new BN_BLINDING parameters using the exponent e and the modulus m. bn_mod_exp and m_ctx can be used to pass special functions for exponentiation (normally BN_mod_exp_mont() and BN_MONT_CTX).
π₯ RETURN VALUES π₯
okay so what do these actually hand back:
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 occurredBN_BLINDING_is_current_thread()returns1if the current thread owns theBN_BLINDINGobject,0otherwiseBN_BLINDING_set_current_thread()doesn't return anything. nothing. void. ghosted πBN_BLINDING_lock(),BN_BLINDING_unlock()return1if the operation succeeded or0on errorBN_BLINDING_get_flags()returns the currently setBN_BLINDINGflags (anunsigned longvalue)BN_BLINDING_create_param()returns the newly createdBN_BLINDINGparameters orNULLon error
π HISTORY π
storytime: 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(). out with the old, in with the new, periodt π
π 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 page bestie π«Ά this one's from OpenSSL 3.5.6, dated 2026-04-07 β go blind some BIGNUMs responsibly, mwah πβ¨
π¦ where this page comes from
- freebsd 15.1: base 15.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms