BN_MOD_MUL_MONTGOMERY(3ossl)

πŸ“¦
version 15.1 Β· 2 versions
, in freebsd 15.1

πŸ’– BN_MOD_MUL_MONTGOMERY(3ossl) πŸ’–

okay so bestie, this is BN_MOD_MUL_MONTGOMERY(3ossl), aka the OpenSSL manual page for Montgomery multiplication. it’s giving big math energy, but honestly it’s lowkey iconic once you see what each function does. let’s get into it πŸ’…βœ¨


🌸 NAME 🌸

BN_mod_mul_montgomery, BN_MONT_CTX_new, BN_MONT_CTX_free, BN_MONT_CTX_set, BN_MONT_CTX_copy, BN_from_montgomery, BN_to_montgomery β€” Montgomery multiplication πŸŽ€


✨ SYNOPSIS ✨

#include <openssl/bn.h>

BN_MONT_CTX *BN_MONT_CTX_new(void);
void BN_MONT_CTX_free(BN_MONT_CTX *mont);

int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *m, BN_CTX *ctx);
BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to, BN_MONT_CTX *from);

int BN_mod_mul_montgomery(BIGNUM *r, BIGNUM *a, BIGNUM *b,
                          BN_MONT_CTX *mont, BN_CTX *ctx);

int BN_from_montgomery(BIGNUM *r, BIGNUM *a, BN_MONT_CTX *mont,
                       BN_CTX *ctx);

int BN_to_montgomery(BIGNUM *r, BIGNUM *a, BN_MONT_CTX *mont,
                     BN_CTX *ctx);

πŸ¦‹ DESCRIPTION πŸ¦‹

These functions implement Montgomery multiplication. They are used automatically when BN_mod_exp(3) is called with suitable input, but they may be useful when several operations are to be performed using the same modulus. literally the β€œset it up once and keep the vibe going” situation ✨

  • BN_MONT_CTX_new() β€” allocates and initializes a BN_MONT_CTX structure. new struct, fresh start, main character energy πŸ‘‘
  • BN_MONT_CTX_set() β€” sets up the mont structure from the modulus m by precomputing its inverse and a value R. it’s doing the pre-work so future-you can slay faster πŸ’…
  • BN_MONT_CTX_copy() β€” copies the BN_MONT_CTX from from to to. no cap, it’s a copy-paste but for Montgomery context 🫢
  • BN_MONT_CTX_free() β€” frees the components of the BN_MONT_CTX, and, if it was created by BN_MONT_CTX_new(), also the structure itself. If mont is NULL, nothing is done. cleanup era, we love to see it 🧚
  • BN_mod_mul_montgomery() β€” computes Mont(a,b):=a*b*R^-1 and places the result in r. that’s the whole Montgomery mul moment πŸ”₯
  • BN_from_montgomery() β€” performs the Montgomery reduction r = a*R^-1. bringing it back out of Montgomery-land πŸ’«
  • BN_to_montgomery() β€” computes Mont(a,R^2), i.e. a*R. Note that a must be nonnegative and smaller than the modulus. very important, bestie, do not skip that note 😭

For all functions, ctx is a previously allocated BN_CTX used for temporary variables. it’s the little scratchpad helper for the math vibes πŸŽ€


🌈 RETURN VALUES 🌈

  • BN_MONT_CTX_new() β€” returns the newly allocated BN_MONT_CTX, and NULL on error. so if you get NULL, that’s the error signal, periodt πŸ’€
  • BN_MONT_CTX_free() β€” has no return value. it just frees and dips πŸ‘‹
  • For the other functions, 1 is returned for success, 0 on error. The error codes can be obtained by ERR_get_error(3). success = 1, error = 0, and ERR_get_error(3) is the receipts 🧾✨

πŸ‘‘ WARNINGS πŸ‘‘

⚠️ okay bestie, real talk: The inputs must be reduced modulo m, otherwise the result will be outside the expected range. that’s the vibe check. do not skip it, fr fr 😭

πŸ“ SEE ALSO πŸ“

go read those too, iykyk πŸ“šπŸ’–


πŸŽ€ HISTORY πŸŽ€

BN_MONT_CTX_init() was removed in OpenSSL 1.1.0. not me mourning the old function, but she’s gone, bestie πŸ’”


Copyright 2000-2020 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>.


this page is from OpenSSL 3.5.6, dated 2026-04-07 β€” shoutout to the version/date combo, and bye bestie, go do iconic Montgomery math πŸ’–βœ¨πŸ¦‹

πŸ“¦ where this page comes from