Line data Source code
1 : #include "tommath_private.h"
2 : #ifdef BN_MP_MOD_C
3 : /* LibTomMath, multiple-precision integer library -- Tom St Denis */
4 : /* SPDX-License-Identifier: Unlicense */
5 :
6 : /* c = a mod b, 0 <= c < b if b > 0, b < c <= 0 if b < 0 */
7 495 : mp_err mp_mod(const mp_int *a, const mp_int *b, mp_int *c)
8 : {
9 : mp_int t;
10 : mp_err err;
11 :
12 495 : if ((err = mp_init_size(&t, b->used)) != MP_OKAY) {
13 0 : return err;
14 : }
15 :
16 495 : if ((err = mp_div(a, b, NULL, &t)) != MP_OKAY) {
17 0 : goto LBL_ERR;
18 : }
19 :
20 495 : if (MP_IS_ZERO(&t) || (t.sign == b->sign)) {
21 495 : err = MP_OKAY;
22 495 : mp_exch(&t, c);
23 : } else {
24 0 : err = mp_add(b, &t, c);
25 : }
26 :
27 495 : LBL_ERR:
28 495 : mp_clear(&t);
29 495 : return err;
30 : }
31 : #endif
|