1 // SPDX-License-Identifier: BSD-2-Clause
2 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
3  *
4  * LibTomCrypt is a library that provides various cryptographic
5  * algorithms in a highly modular and flexible manner.
6  *
7  * The library is free for all purposes without any express
8  * guarantee it works.
9  */
10 #include "tomcrypt_private.h"
11 
12 #ifdef LTC_MPI
13 #include <stdarg.h>
14 
ltc_init_multi(void ** a,...)15 int ltc_init_multi(void **a, ...)
16 {
17    void    **cur = a;
18    int       np  = 0;
19    va_list   args;
20 
21    va_start(args, a);
22    while (cur != NULL) {
23        if (mp_init(cur) != CRYPT_OK) {
24           /* failed */
25           va_list clean_list;
26 
27           va_start(clean_list, a);
28           cur = a;
29           while (np--) {
30               mp_clear(*cur);
31               cur = va_arg(clean_list, void**);
32           }
33           va_end(clean_list);
34           va_end(args);
35           return CRYPT_MEM;
36        }
37        ++np;
38        cur = va_arg(args, void**);
39    }
40    va_end(args);
41    return CRYPT_OK;
42 }
43 
ltc_init_multi_size(int size_bits,void ** a,...)44 int ltc_init_multi_size(int size_bits, void **a, ...)
45 {
46    void    **cur = a;
47    int       np  = 0;
48    va_list   args;
49 
50    va_start(args, a);
51    while (cur != NULL) {
52        if (mp_init_size(size_bits, cur) != CRYPT_OK) {
53           /* failed */
54           va_list clean_list;
55 
56           va_start(clean_list, a);
57           cur = a;
58           while (np--) {
59               mp_clear(*cur);
60               cur = va_arg(clean_list, void**);
61           }
62           va_end(clean_list);
63           return CRYPT_MEM;
64        }
65        ++np;
66        cur = va_arg(args, void**);
67    }
68    va_end(args);
69    return CRYPT_OK;
70 }
71 
ltc_deinit_multi(void * a,...)72 void ltc_deinit_multi(void *a, ...)
73 {
74    void     *cur = a;
75    va_list   args;
76 
77    va_start(args, a);
78    while (cur != NULL) {
79        mp_clear(cur);
80        cur = va_arg(args, void *);
81    }
82    va_end(args);
83 }
84 
ltc_cleanup_multi(void ** a,...)85 void ltc_cleanup_multi(void **a, ...)
86 {
87    void **cur = a;
88    va_list args;
89 
90    va_start(args, a);
91    while (cur != NULL) {
92       if (*cur != NULL) {
93          mp_clear(*cur);
94          *cur = NULL;
95       }
96       cur = va_arg(args, void**);
97    }
98    va_end(args);
99 }
100 
101 #endif
102 
103 /* ref:         $Format:%D$ */
104 /* git commit:  $Format:%H$ */
105 /* commit time: $Format:%ai$ */
106