1 | =pod
|
---|
2 |
|
---|
3 | =head1 NAME
|
---|
4 |
|
---|
5 | BN_add, BN_sub, BN_mul, BN_sqr, BN_div, BN_mod, BN_nnmod, BN_mod_add,
|
---|
6 | BN_mod_sub, BN_mod_mul, BN_mod_sqr, BN_exp, BN_mod_exp, BN_gcd -
|
---|
7 | arithmetic operations on BIGNUMs
|
---|
8 |
|
---|
9 | =head1 SYNOPSIS
|
---|
10 |
|
---|
11 | #include <openssl/bn.h>
|
---|
12 |
|
---|
13 | int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
|
---|
14 |
|
---|
15 | int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
|
---|
16 |
|
---|
17 | int BN_mul(BIGNUM *r, BIGNUM *a, BIGNUM *b, BN_CTX *ctx);
|
---|
18 |
|
---|
19 | int BN_sqr(BIGNUM *r, BIGNUM *a, BN_CTX *ctx);
|
---|
20 |
|
---|
21 | int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *a, const BIGNUM *d,
|
---|
22 | BN_CTX *ctx);
|
---|
23 |
|
---|
24 | int BN_mod(BIGNUM *rem, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
|
---|
25 |
|
---|
26 | int BN_nnmod(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
|
---|
27 |
|
---|
28 | int BN_mod_add(BIGNUM *r, BIGNUM *a, BIGNUM *b, const BIGNUM *m,
|
---|
29 | BN_CTX *ctx);
|
---|
30 |
|
---|
31 | int BN_mod_sub(BIGNUM *r, BIGNUM *a, BIGNUM *b, const BIGNUM *m,
|
---|
32 | BN_CTX *ctx);
|
---|
33 |
|
---|
34 | int BN_mod_mul(BIGNUM *r, BIGNUM *a, BIGNUM *b, const BIGNUM *m,
|
---|
35 | BN_CTX *ctx);
|
---|
36 |
|
---|
37 | int BN_mod_sqr(BIGNUM *r, BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
|
---|
38 |
|
---|
39 | int BN_exp(BIGNUM *r, BIGNUM *a, BIGNUM *p, BN_CTX *ctx);
|
---|
40 |
|
---|
41 | int BN_mod_exp(BIGNUM *r, BIGNUM *a, const BIGNUM *p,
|
---|
42 | const BIGNUM *m, BN_CTX *ctx);
|
---|
43 |
|
---|
44 | int BN_gcd(BIGNUM *r, BIGNUM *a, BIGNUM *b, BN_CTX *ctx);
|
---|
45 |
|
---|
46 | =head1 DESCRIPTION
|
---|
47 |
|
---|
48 | BN_add() adds I<a> and I<b> and places the result in I<r> (C<r=a+b>).
|
---|
49 | I<r> may be the same B<BIGNUM> as I<a> or I<b>.
|
---|
50 |
|
---|
51 | BN_sub() subtracts I<b> from I<a> and places the result in I<r> (C<r=a-b>).
|
---|
52 | I<r> may be the same B<BIGNUM> as I<a> or I<b>.
|
---|
53 |
|
---|
54 | BN_mul() multiplies I<a> and I<b> and places the result in I<r> (C<r=a*b>).
|
---|
55 | I<r> may be the same B<BIGNUM> as I<a> or I<b>.
|
---|
56 | For multiplication by powers of 2, use L<BN_lshift(3)>.
|
---|
57 |
|
---|
58 | BN_sqr() takes the square of I<a> and places the result in I<r>
|
---|
59 | (C<r=a^2>). I<r> and I<a> may be the same B<BIGNUM>.
|
---|
60 | This function is faster than BN_mul(r,a,a).
|
---|
61 |
|
---|
62 | BN_div() divides I<a> by I<d> and places the result in I<dv> and the
|
---|
63 | remainder in I<rem> (C<dv=a/d, rem=a%d>). Either of I<dv> and I<rem> may
|
---|
64 | be B<NULL>, in which case the respective value is not returned.
|
---|
65 | The result is rounded towards zero; thus if I<a> is negative, the
|
---|
66 | remainder will be zero or negative.
|
---|
67 | For division by powers of 2, use BN_rshift(3).
|
---|
68 |
|
---|
69 | BN_mod() corresponds to BN_div() with I<dv> set to B<NULL>.
|
---|
70 |
|
---|
71 | BN_nnmod() reduces I<a> modulo I<m> and places the non-negative
|
---|
72 | remainder in I<r>.
|
---|
73 |
|
---|
74 | BN_mod_add() adds I<a> to I<b> modulo I<m> and places the non-negative
|
---|
75 | result in I<r>.
|
---|
76 |
|
---|
77 | BN_mod_sub() subtracts I<b> from I<a> modulo I<m> and places the
|
---|
78 | non-negative result in I<r>.
|
---|
79 |
|
---|
80 | BN_mod_mul() multiplies I<a> by I<b> and finds the non-negative
|
---|
81 | remainder respective to modulus I<m> (C<r=(a*b) mod m>). I<r> may be
|
---|
82 | the same B<BIGNUM> as I<a> or I<b>. For more efficient algorithms for
|
---|
83 | repeated computations using the same modulus, see
|
---|
84 | L<BN_mod_mul_montgomery(3)> and
|
---|
85 | L<BN_mod_mul_reciprocal(3)>.
|
---|
86 |
|
---|
87 | BN_mod_sqr() takes the square of I<a> modulo B<m> and places the
|
---|
88 | result in I<r>.
|
---|
89 |
|
---|
90 | BN_exp() raises I<a> to the I<p>-th power and places the result in I<r>
|
---|
91 | (C<r=a^p>). This function is faster than repeated applications of
|
---|
92 | BN_mul().
|
---|
93 |
|
---|
94 | BN_mod_exp() computes I<a> to the I<p>-th power modulo I<m> (C<r=a^p %
|
---|
95 | m>). This function uses less time and space than BN_exp(). Do not call this
|
---|
96 | function when B<m> is even and any of the parameters have the
|
---|
97 | B<BN_FLG_CONSTTIME> flag set.
|
---|
98 |
|
---|
99 | BN_gcd() computes the greatest common divisor of I<a> and I<b> and
|
---|
100 | places the result in I<r>. I<r> may be the same B<BIGNUM> as I<a> or
|
---|
101 | I<b>.
|
---|
102 |
|
---|
103 | For all functions, I<ctx> is a previously allocated B<BN_CTX> used for
|
---|
104 | temporary variables; see L<BN_CTX_new(3)>.
|
---|
105 |
|
---|
106 | Unless noted otherwise, the result B<BIGNUM> must be different from
|
---|
107 | the arguments.
|
---|
108 |
|
---|
109 | =head1 RETURN VALUES
|
---|
110 |
|
---|
111 | For all functions, 1 is returned for success, 0 on error. The return
|
---|
112 | value should always be checked (e.g., C<if (!BN_add(r,a,b)) goto err;>).
|
---|
113 | The error codes can be obtained by L<ERR_get_error(3)>.
|
---|
114 |
|
---|
115 | =head1 SEE ALSO
|
---|
116 |
|
---|
117 | L<ERR_get_error(3)>, L<BN_CTX_new(3)>,
|
---|
118 | L<BN_add_word(3)>, L<BN_set_bit(3)>
|
---|
119 |
|
---|
120 | =head1 COPYRIGHT
|
---|
121 |
|
---|
122 | Copyright 2000-2018 The OpenSSL Project Authors. All Rights Reserved.
|
---|
123 |
|
---|
124 | Licensed under the OpenSSL license (the "License"). You may not use
|
---|
125 | this file except in compliance with the License. You can obtain a copy
|
---|
126 | in the file LICENSE in the source distribution or at
|
---|
127 | L<https://www.openssl.org/source/license.html>.
|
---|
128 |
|
---|
129 | =cut
|
---|