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 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 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 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 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