bn_mp_init_multi.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  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. #include <stdarg.h>
  6. mp_err mp_init_multi(mp_int *mp, ...)
  7. {
  8. mp_err err = MP_OKAY; /* Assume ok until proven otherwise */
  9. int n = 0; /* Number of ok inits */
  10. mp_int *cur_arg = mp;
  11. va_list args;
  12. va_start(args, mp); /* init args to next argument from caller */
  13. while (cur_arg != NULL) {
  14. if (mp_init(cur_arg) != MP_OKAY) {
  15. /* Oops - error! Back-track and mp_clear what we already
  16. succeeded in init-ing, then return error.
  17. */
  18. va_list clean_args;
  19. /* now start cleaning up */
  20. cur_arg = mp;
  21. va_start(clean_args, mp);
  22. while (n-- != 0) {
  23. mp_clear(cur_arg);
  24. cur_arg = va_arg(clean_args, mp_int *);
  25. }
  26. va_end(clean_args);
  27. err = MP_MEM;
  28. break;
  29. }
  30. n++;
  31. cur_arg = va_arg(args, mp_int *);
  32. }
  33. va_end(args);
  34. return err; /* Assumed ok, if error flagged above. */
  35. }
  36. #endif