1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis */ 2 /* SPDX-License-Identifier: Unlicense */ 3 #include "tomcrypt_private.h" 4 5 #ifdef LTC_MPI 6 #include <stdarg.h> 7 8 int ltc_init_multi(void **a, ...) 9 { 10 void **cur = a; 11 int np = 0; 12 va_list args; 13 14 va_start(args, a); 15 while (cur != NULL) { 16 if (mp_init(cur) != CRYPT_OK) { 17 /* failed */ 18 va_list clean_list; 19 20 va_start(clean_list, a); 21 cur = a; 22 while (np--) { 23 mp_clear(*cur); 24 cur = va_arg(clean_list, void**); 25 } 26 va_end(clean_list); 27 va_end(args); 28 return CRYPT_MEM; 29 } 30 ++np; 31 cur = va_arg(args, void**); 32 } 33 va_end(args); 34 return CRYPT_OK; 35 } 36 37 int ltc_init_multi_size(int size_bits, void **a, ...) 38 { 39 void **cur = a; 40 int np = 0; 41 va_list args; 42 43 va_start(args, a); 44 while (cur != NULL) { 45 if (mp_init_size(size_bits, cur) != CRYPT_OK) { 46 /* failed */ 47 va_list clean_list; 48 49 va_start(clean_list, a); 50 cur = a; 51 while (np--) { 52 mp_clear(*cur); 53 cur = va_arg(clean_list, void**); 54 } 55 va_end(clean_list); 56 return CRYPT_MEM; 57 } 58 ++np; 59 cur = va_arg(args, void**); 60 } 61 va_end(args); 62 return CRYPT_OK; 63 } 64 65 void ltc_deinit_multi(void *a, ...) 66 { 67 void *cur = a; 68 va_list args; 69 70 va_start(args, a); 71 while (cur != NULL) { 72 mp_clear(cur); 73 cur = va_arg(args, void *); 74 } 75 va_end(args); 76 } 77 78 void ltc_cleanup_multi(void **a, ...) 79 { 80 void **cur = a; 81 va_list args; 82 83 va_start(args, a); 84 while (cur != NULL) { 85 if (*cur != NULL) { 86 mp_clear(*cur); 87 *cur = NULL; 88 } 89 cur = va_arg(args, void**); 90 } 91 va_end(args); 92 } 93 94 #endif 95