1526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/* 2526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Big number math 3526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Copyright (c) 2006, Jouni Malinen <j@w1.fi> 4526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 5526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * This program is free software; you can redistribute it and/or modify 6526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * it under the terms of the GNU General Public License version 2 as 7526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * published by the Free Software Foundation. 8526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 9526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD 10526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * license. 11526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * 12526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * See README and COPYING for more details. 13526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 14526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 15526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "includes.h" 16526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 17526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "common.h" 18526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "bignum.h" 19526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 20526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#ifdef CONFIG_INTERNAL_LIBTOMMATH 21526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include "libtommath.c" 22526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#else /* CONFIG_INTERNAL_LIBTOMMATH */ 23526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include <tommath.h> 24526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#endif /* CONFIG_INTERNAL_LIBTOMMATH */ 25526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 26526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 27526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/* 28526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * The current version is just a wrapper for LibTomMath library, so 29526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * struct bignum is just typecast to mp_int. 30526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 31526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 32526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 33526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * bignum_init - Allocate memory for bignum 34526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: Pointer to allocated bignum or %NULL on failure 35526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 36526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstruct bignum * bignum_init(void) 37526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 38526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct bignum *n = os_zalloc(sizeof(mp_int)); 39526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (n == NULL) 40526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return NULL; 41526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (mp_init((mp_int *) n) != MP_OKAY) { 42526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(n); 43526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt n = NULL; 44526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 45526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return n; 46526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 47526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 48526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 49526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 50526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * bignum_deinit - Free bignum 51526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @n: Bignum from bignum_init() 52526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 53526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid bignum_deinit(struct bignum *n) 54526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 55526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (n) { 56526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt mp_clear((mp_int *) n); 57526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt os_free(n); 58526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 59526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 60526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 61526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 62526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 63526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * bignum_get_unsigned_bin - Get length of bignum as an unsigned binary buffer 64526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @n: Bignum from bignum_init() 65526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: Length of n if written to a binary buffer 66526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 67526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtsize_t bignum_get_unsigned_bin_len(struct bignum *n) 68526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 69526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return mp_unsigned_bin_size((mp_int *) n); 70526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 71526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 72526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 73526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 74526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * bignum_get_unsigned_bin - Set binary buffer to unsigned bignum 75526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @n: Bignum from bignum_init() 76526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @buf: Buffer for the binary number 77526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @len: Length of the buffer, can be %NULL if buffer is known to be long 78526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * enough. Set to used buffer length on success if not %NULL. 79526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 80526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 81526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint bignum_get_unsigned_bin(const struct bignum *n, u8 *buf, size_t *len) 82526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 83526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt size_t need = mp_unsigned_bin_size((mp_int *) n); 84526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (len && need > *len) { 85526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *len = need; 86526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 87526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 88526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (mp_to_unsigned_bin((mp_int *) n, buf) != MP_OKAY) { 89526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__); 90526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 91526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 92526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (len) 93526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt *len = need; 94526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 95526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 96526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 97526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 98526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 99526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * bignum_set_unsigned_bin - Set bignum based on unsigned binary buffer 100526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @n: Bignum from bignum_init(); to be set to the given value 101526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @buf: Buffer with unsigned binary value 102526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @len: Length of buf in octets 103526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 104526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 105526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint bignum_set_unsigned_bin(struct bignum *n, const u8 *buf, size_t len) 106526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 107526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (mp_read_unsigned_bin((mp_int *) n, (u8 *) buf, len) != MP_OKAY) { 108526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__); 109526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 110526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 111526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 112526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 113526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 114526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 115526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 116526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * bignum_cmp - Signed comparison 117526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @a: Bignum from bignum_init() 118526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @b: Bignum from bignum_init() 119526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 120526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 121526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint bignum_cmp(const struct bignum *a, const struct bignum *b) 122526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 123526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return mp_cmp((mp_int *) a, (mp_int *) b); 124526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 125526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 126526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 127526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 128526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * bignum_cmd_d - Compare bignum to standard integer 129526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @a: Bignum from bignum_init() 130526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @b: Small integer 131526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 132526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 133526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint bignum_cmp_d(const struct bignum *a, unsigned long b) 134526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 135526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return mp_cmp_d((mp_int *) a, b); 136526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 137526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 138526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 139526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 140526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * bignum_add - c = a + b 141526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @a: Bignum from bignum_init() 142526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @b: Bignum from bignum_init() 143526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @c: Bignum from bignum_init(); used to store the result of a + b 144526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 145526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 146526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint bignum_add(const struct bignum *a, const struct bignum *b, 147526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct bignum *c) 148526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 149526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (mp_add((mp_int *) a, (mp_int *) b, (mp_int *) c) != MP_OKAY) { 150526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__); 151526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 152526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 153526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 154526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 155526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 156526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 157526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 158526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * bignum_sub - c = a - b 159526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @a: Bignum from bignum_init() 160526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @b: Bignum from bignum_init() 161526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @c: Bignum from bignum_init(); used to store the result of a - b 162526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 163526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 164526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint bignum_sub(const struct bignum *a, const struct bignum *b, 165526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct bignum *c) 166526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 167526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (mp_sub((mp_int *) a, (mp_int *) b, (mp_int *) c) != MP_OKAY) { 168526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__); 169526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 170526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 171526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 172526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 173526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 174526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 175526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 176526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * bignum_mul - c = a * b 177526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @a: Bignum from bignum_init() 178526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @b: Bignum from bignum_init() 179526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @c: Bignum from bignum_init(); used to store the result of a * b 180526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 181526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 182526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint bignum_mul(const struct bignum *a, const struct bignum *b, 183526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt struct bignum *c) 184526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 185526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (mp_mul((mp_int *) a, (mp_int *) b, (mp_int *) c) != MP_OKAY) { 186526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__); 187526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 188526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 189526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 190526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 191526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 192526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 193526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 194526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * bignum_mulmod - d = a * b (mod c) 195526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @a: Bignum from bignum_init() 196526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @b: Bignum from bignum_init() 197526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @c: Bignum from bignum_init(); modulus 198526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @d: Bignum from bignum_init(); used to store the result of a * b (mod c) 199526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 200526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 201526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint bignum_mulmod(const struct bignum *a, const struct bignum *b, 202526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const struct bignum *c, struct bignum *d) 203526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 204526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (mp_mulmod((mp_int *) a, (mp_int *) b, (mp_int *) c, (mp_int *) d) 205526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt != MP_OKAY) { 206526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__); 207526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 208526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 209526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 210526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 211526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 212526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt 213526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/** 214526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * bignum_exptmod - Modular exponentiation: d = a^b (mod c) 215526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @a: Bignum from bignum_init(); base 216526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @b: Bignum from bignum_init(); exponent 217526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @c: Bignum from bignum_init(); modulus 218526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * @d: Bignum from bignum_init(); used to store the result of a^b (mod c) 219526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt * Returns: 0 on success, -1 on failure 220526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt */ 221526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint bignum_exptmod(const struct bignum *a, const struct bignum *b, 222526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt const struct bignum *c, struct bignum *d) 223526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{ 224526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt if (mp_exptmod((mp_int *) a, (mp_int *) b, (mp_int *) c, (mp_int *) d) 225526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt != MP_OKAY) { 226526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__); 227526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return -1; 228526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt } 229526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt return 0; 230526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt} 231