Line data Source code
1 : #include "tommath_private.h"
2 : #ifdef BN_MP_INIT_MULTI_C
3 : /* LibTomMath, multiple-precision integer library -- Tom St Denis */
4 : /* SPDX-License-Identifier: Unlicense */
5 :
6 : #include <stdarg.h>
7 :
8 267 : mp_err mp_init_multi(mp_int *mp, ...)
9 : {
10 267 : mp_err err = MP_OKAY; /* Assume ok until proven otherwise */
11 267 : int n = 0; /* Number of ok inits */
12 267 : mp_int *cur_arg = mp;
13 : va_list args;
14 :
15 267 : va_start(args, mp); /* init args to next argument from caller */
16 1754 : while (cur_arg != NULL) {
17 1220 : if (mp_init(cur_arg) != MP_OKAY) {
18 : /* Oops - error! Back-track and mp_clear what we already
19 : succeeded in init-ing, then return error.
20 : */
21 : va_list clean_args;
22 :
23 : /* now start cleaning up */
24 0 : cur_arg = mp;
25 0 : va_start(clean_args, mp);
26 0 : while (n-- != 0) {
27 0 : mp_clear(cur_arg);
28 0 : cur_arg = va_arg(clean_args, mp_int *);
29 : }
30 0 : va_end(clean_args);
31 0 : err = MP_MEM;
32 0 : break;
33 : }
34 1220 : n++;
35 1220 : cur_arg = va_arg(args, mp_int *);
36 : }
37 267 : va_end(args);
38 267 : return err; /* Assumed ok, if error flagged above. */
39 : }
40 :
41 : #endif
|