diff options
Diffstat (limited to 'libtommath/bn_mp_init_multi.c')
| -rw-r--r-- | libtommath/bn_mp_init_multi.c | 55 | 
1 files changed, 55 insertions, 0 deletions
| diff --git a/libtommath/bn_mp_init_multi.c b/libtommath/bn_mp_init_multi.c new file mode 100644 index 0000000..44e3fe6 --- /dev/null +++ b/libtommath/bn_mp_init_multi.c @@ -0,0 +1,55 @@ +#include <tommath.h> +#ifdef BN_MP_INIT_MULTI_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://math.libtomcrypt.com + */ +#include <stdarg.h> + +int mp_init_multi(mp_int *mp, ...)  +{ +    mp_err res = MP_OKAY;      /* Assume ok until proven otherwise */ +    int n = 0;                 /* Number of ok inits */ +    mp_int* cur_arg = mp; +    va_list args; + +    va_start(args, mp);        /* init args to next argument from caller */ +    while (cur_arg != NULL) { +        if (mp_init(cur_arg) != MP_OKAY) { +            /* Oops - error! Back-track and mp_clear what we already +               succeeded in init-ing, then return error. +            */ +            va_list clean_args; +             +            /* end the current list */ +            va_end(args); +             +            /* now start cleaning up */             +            cur_arg = mp; +            va_start(clean_args, mp); +            while (n--) { +                mp_clear(cur_arg); +                cur_arg = va_arg(clean_args, mp_int*); +            } +            va_end(clean_args); +            res = MP_MEM; +            break; +        } +        n++; +        cur_arg = va_arg(args, mp_int*); +    } +    va_end(args); +    return res;                /* Assumed ok, if error flagged above. */ +} + +#endif | 
