mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-25 17:59:25 +01:00
0b452b9200
SAE requires checking a values legendre symbol. Also added a helper for computing Y^2, or, calculating the sum for the X side of the equation.
94 lines
2.9 KiB
C
94 lines
2.9 KiB
C
/*
|
|
*
|
|
* Wireless daemon for Linux
|
|
*
|
|
* Copyright (C) 2018 Intel Corporation. All rights reserved.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include <config.h>
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
#include <ell/ell.h>
|
|
|
|
/* 256-bit curve */
|
|
#define ECC_BYTES 32
|
|
|
|
/* Number of uint64_t's needed */
|
|
#define NUM_ECC_DIGITS (ECC_BYTES / 8)
|
|
|
|
#define CURVE_P_32 { 0xFFFFFFFFFFFFFFFFull, 0x00000000FFFFFFFFull, \
|
|
0x0000000000000000ull, 0xFFFFFFFF00000001ull }
|
|
|
|
#define CURVE_G_32 { \
|
|
{ 0xF4A13945D898C296ull, 0x77037D812DEB33A0ull, \
|
|
0xF8BCE6E563A440F2ull, 0x6B17D1F2E12C4247ull }, \
|
|
{ 0xCBB6406837BF51F5ull, 0x2BCE33576B315ECEull, \
|
|
0x8EE7EB4A7C0F9E16ull, 0x4FE342E2FE1A7F9Bull } \
|
|
}
|
|
|
|
#define CURVE_N_32 { 0xF3B9CAC2FC632551ull, 0xBCE6FAADA7179E84ull, \
|
|
0xFFFFFFFFFFFFFFFFull, 0xFFFFFFFF00000000ull }
|
|
|
|
#define CURVE_B_32 { 0x3BCE3C3E27D2604Bull, 0x651D06B0CC53B0F6ull, \
|
|
0xB3EBBD55769886BCull, 0x5AC635D8AA3A93E7ull }
|
|
|
|
struct ecc_point {
|
|
uint64_t x[NUM_ECC_DIGITS];
|
|
uint64_t y[NUM_ECC_DIGITS];
|
|
};
|
|
|
|
void ecc_point_mult(struct ecc_point *result, const struct ecc_point *point,
|
|
uint64_t *scalar, uint64_t *initial_z, int num_bits);
|
|
|
|
void ecc_point_add(struct ecc_point *ret, struct ecc_point *p,
|
|
struct ecc_point *q);
|
|
|
|
bool ecc_valid_point(struct ecc_point *point);
|
|
|
|
void ecc_be2native(uint64_t bytes[NUM_ECC_DIGITS]);
|
|
|
|
void ecc_native2be(uint64_t native[NUM_ECC_DIGITS]);
|
|
|
|
bool ecc_compute_y(uint64_t *y, uint64_t *x);
|
|
|
|
void vli_mod_inv(uint64_t *result, const uint64_t *input, const uint64_t *mod);
|
|
|
|
void vli_mod_sub(uint64_t *result, const uint64_t *left, const uint64_t *right,
|
|
const uint64_t *mod);
|
|
|
|
void vli_mod_add(uint64_t *result, const uint64_t *left, const uint64_t *right,
|
|
const uint64_t *mod);
|
|
|
|
uint64_t vli_sub(uint64_t *result, const uint64_t *left, const uint64_t *right);
|
|
|
|
void vli_mod_mult_fast(uint64_t *result, const uint64_t *left,
|
|
const uint64_t *right);
|
|
|
|
void vli_mod_exp(uint64_t *result, uint64_t *base, uint64_t *exp,
|
|
const uint64_t *mod);
|
|
|
|
int vli_cmp(const uint64_t *left, const uint64_t *right);
|
|
|
|
unsigned int vli_num_bits(const uint64_t *vli);
|
|
|
|
int vli_legendre(uint64_t *val, const uint64_t *p);
|
|
|
|
void ecc_compute_y_sqr(uint64_t *y_sqr, uint64_t *x);
|