BN_MOD_MUL_MONTGOMERY(3) | Library Functions Manual | BN_MOD_MUL_MONTGOMERY(3) |

`BN_MONT_CTX_new`

,
`BN_MONT_CTX_init`

,
`BN_MONT_CTX_free`

,
`BN_MONT_CTX_set`

,
`BN_MONT_CTX_copy`

,
`BN_mod_mul_montgomery`

,
`BN_from_montgomery`

,
`BN_to_montgomery`

—
Montgomery multiplication

```
#include
<openssl/bn.h>
```

`BN_MONT_CTX_new`

(`BN_MONT_CTX_init`

(`BN_MONT_CTX_free`

(`BN_MONT_CTX_set`

(`BN_MONT_CTX_copy`

(`BN_mod_mul_montgomery`

(`BN_from_montgomery`

(`BN_to_montgomery`

(`BN_MONT_CTX_new`

() allocates and initializes a
`BN_MONT_CTX_init`

() initializes an existing
uninitialized `BN_MONT_CTX_set`

() sets up the
`BN_MONT_CTX_copy`

() copies the
`BN_MONT_CTX_free`

() frees the components of
the `BN_MONT_CTX_new`

(), also the structure
itself. If `NULL`

pointer, no action occurs.
`BN_mod_mul_montgomery`

() computes
Mont(`a`,
`b`) := `a`
* `b`
* R^-1

and places the result in `BN_from_montgomery`

() performs the Montgomery
reduction
`BN_to_montgomery`

() computes
Mont(`a`,
R^2) = `a`
* R

Note that typedef struct bn_mont_ctx_st { int ri; /* number of bits in R */ BIGNUM RR; /* R^2 (used to convert to Montgomery form) */ BIGNUM N; /* The modulus */ BIGNUM Ni; /* R*(1/R mod N) - N*Ni = 1 * (Ni is only stored for bignum algorithm) */ BN_ULONG n0; /* least significant word of Ni */ int flags; } BN_MONT_CTX;

`BN_to_montgomery`

() is a macro.
`BN_MONT_CTX_new`

() returns the newly allocated
`NULL`

on error.
For the other functions, 1 is returned for success or 0 on error. The error
codes can be obtained by
ERR_get_error(3).
`BN_MONT_CTX_new`

(),
`BN_MONT_CTX_free`

(),
`BN_MONT_CTX_set`

(),
`BN_mod_mul_montgomery`

(),
`BN_from_montgomery`

(), and
`BN_to_montgomery`

() first appeared in SSLeay
0.6.1 and have been available since OpenBSD 2.4.
`BN_MONT_CTX_init`

() and
`BN_MONT_CTX_copy`

() first appeared in SSLeay
0.9.1 and have been available since OpenBSD 2.6.
`BN_MONT_CTX_init`

() must not be called on a
context that was used previously, or memory used by the embedded
`BN_MONT_CTX_new`

(), or the context itself
will likely be leaked later. It can only be used on a static
March 27, 2018 | OpenBSD-current |