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