⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bignum.c

📁 WLAN无线网络管理的最新程序
💻 C
字号:
/* * Big number math * Copyright (c) 2006, Jouni Malinen <j@w1.fi> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Alternatively, this software may be distributed under the terms of BSD * license. * * See README and COPYING for more details. */#include "includes.h"#include "common.h"#include "bignum.h"#ifdef CONFIG_INTERNAL_LIBTOMMATH#include "libtommath.c"#else /* CONFIG_INTERNAL_LIBTOMMATH */#include <tommath.h>#endif /* CONFIG_INTERNAL_LIBTOMMATH *//* * The current version is just a wrapper for LibTomMath library, so * struct bignum is just typecast to mp_int. *//** * bignum_init - Allocate memory for bignum * Returns: Pointer to allocated bignum or %NULL on failure */struct bignum * bignum_init(void){	struct bignum *n = os_zalloc(sizeof(mp_int));	if (n == NULL)		return NULL;	if (mp_init((mp_int *) n) != MP_OKAY) {		os_free(n);		n = NULL;	}	return n;}/** * bignum_deinit - Free bignum * @n: Bignum from bignum_init() */void bignum_deinit(struct bignum *n){	if (n) {		mp_clear((mp_int *) n);		os_free(n);	}}/** * bignum_get_unsigned_bin - Get length of bignum as an unsigned binary buffer * @n: Bignum from bignum_init() * Returns: Length of n if written to a binary buffer */size_t bignum_get_unsigned_bin_len(struct bignum *n){	return mp_unsigned_bin_size((mp_int *) n);}/** * bignum_get_unsigned_bin - Set binary buffer to unsigned bignum * @n: Bignum from bignum_init() * @buf: Buffer for the binary number * @len: Length of the buffer, can be %NULL if buffer is known to be long * enough. Set to used buffer length on success if not %NULL. * Returns: 0 on success, -1 on failure */int bignum_get_unsigned_bin(const struct bignum *n, u8 *buf, size_t *len){	size_t need = mp_unsigned_bin_size((mp_int *) n);	if (len && need > *len) {		*len = need;		return -1;	}	if (mp_to_unsigned_bin((mp_int *) n, buf) != MP_OKAY) {		wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__);		return -1;	}	if (len)		*len = need;	return 0;}/** * bignum_set_unsigned_bin - Set bignum based on unsigned binary buffer * @a: Bignum from bignum_init(); to be set to the given value * @buf: Buffer with unsigned binary value * @len: Length of buf in octets * Returns: 0 on success, -1 on failure */int bignum_set_unsigned_bin(struct bignum *n, const u8 *buf, size_t len){	if (mp_read_unsigned_bin((mp_int *) n, (u8 *) buf, len) != MP_OKAY) {		wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__);		return -1;	}	return 0;}/** * bignum_cmp - Signed comparison * @a: Bignum from bignum_init() * @b: Bignum from bignum_init() * Returns: 0 on success, -1 on failure */int bignum_cmp(const struct bignum *a, const struct bignum *b){	return mp_cmp((mp_int *) a, (mp_int *) b);}/** * bignum_cmd_d - Compare bignum to standard integer * @a: Bignum from bignum_init() * @b: Small integer * Returns: 0 on success, -1 on failure */int bignum_cmp_d(const struct bignum *a, unsigned long b){	return mp_cmp_d((mp_int *) a, b);}/** * bignum_add - c = a + b * @a: Bignum from bignum_init() * @b: Bignum from bignum_init() * @c: Bignum from bignum_init(); used to store the result of a + b * Returns: 0 on success, -1 on failure */int bignum_add(const struct bignum *a, const struct bignum *b,	       struct bignum *c){	if (mp_add((mp_int *) a, (mp_int *) b, (mp_int *) c) != MP_OKAY) {		wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__);		return -1;	}	return 0;}/** * bignum_sub - c = a - b * @a: Bignum from bignum_init() * @b: Bignum from bignum_init() * @c: Bignum from bignum_init(); used to store the result of a - b * Returns: 0 on success, -1 on failure */int bignum_sub(const struct bignum *a, const struct bignum *b,	       struct bignum *c){	if (mp_sub((mp_int *) a, (mp_int *) b, (mp_int *) c) != MP_OKAY) {		wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__);		return -1;	}	return 0;}/** * bignum_mul - c = a * b * @a: Bignum from bignum_init() * @b: Bignum from bignum_init() * @c: Bignum from bignum_init(); used to store the result of a * b * Returns: 0 on success, -1 on failure */int bignum_mul(const struct bignum *a, const struct bignum *b,	       struct bignum *c){	if (mp_mul((mp_int *) a, (mp_int *) b, (mp_int *) c) != MP_OKAY) {		wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__);		return -1;	}	return 0;}/** * bignum_mulmod - d = a * b (mod c) * @a: Bignum from bignum_init() * @b: Bignum from bignum_init() * @c: Bignum from bignum_init(); modulus * @d: Bignum from bignum_init(); used to store the result of a * b (mod c) * Returns: 0 on success, -1 on failure */int bignum_mulmod(const struct bignum *a, const struct bignum *b,		  const struct bignum *c, struct bignum *d){	if (mp_mulmod((mp_int *) a, (mp_int *) b, (mp_int *) c, (mp_int *) d)	    != MP_OKAY) {		wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__);		return -1;	}	return 0;}/** * bignum_exptmod - Modular exponentiation: d = a^b (mod c) * @a: Bignum from bignum_init(); base * @b: Bignum from bignum_init(); exponent * @c: Bignum from bignum_init(); modulus * @d: Bignum from bignum_init(); used to store the result of a^b (mod c) * Returns: 0 on success, -1 on failure */int bignum_exptmod(const struct bignum *a, const struct bignum *b,		   const struct bignum *c, struct bignum *d){	if (mp_exptmod((mp_int *) a, (mp_int *) b, (mp_int *) c, (mp_int *) d)	    != MP_OKAY) {		wpa_printf(MSG_DEBUG, "BIGNUM: %s failed", __func__);		return -1;	}	return 0;}   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -