mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-29 13:59:24 +01:00
sae: fix usage of compressed points (after ELL is fixed)
SAE was also relying on the ELL bug which was incorrectly performing a subtraction on the Y coordinate based on the compressed point type. Correct this and make the point type more clear (rather than something like "is_odd + 2").
This commit is contained in:
parent
06ad1ace00
commit
dfb76edda8
24
src/sae.c
24
src/sae.c
@ -511,7 +511,29 @@ static struct l_ecc_point *sae_compute_pwe(const struct l_ecc_curve *curve,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
pwe = l_ecc_point_from_data(curve, !is_odd + 2, x, bytes);
|
/*
|
||||||
|
* The 802.11 spec requires the point be solved unambiguously (since
|
||||||
|
* solving for Y results in two solutions). The correct Y value
|
||||||
|
* is chosen based on the LSB of the pwd-seed:
|
||||||
|
*
|
||||||
|
* if (LSB(y) == LSB(pwd-seed))
|
||||||
|
* then
|
||||||
|
* PWE = (x, y)
|
||||||
|
* else
|
||||||
|
* PWE = (x, p-y)
|
||||||
|
*
|
||||||
|
* The ELL API (somewhat hidden from view here) automatically
|
||||||
|
* performs a subtraction (P - Y) when:
|
||||||
|
* - Y is even and BIT1
|
||||||
|
* - Y is odd and BIT0
|
||||||
|
*
|
||||||
|
* So we choose the point type which matches the parity of
|
||||||
|
* pwd-seed. This means a subtraction will be performed (P - Y)
|
||||||
|
* if the parity of pwd-seed and the computed Y do not match.
|
||||||
|
*/
|
||||||
|
pwe = l_ecc_point_from_data(curve,
|
||||||
|
is_odd ? L_ECC_POINT_TYPE_COMPRESSED_BIT1 :
|
||||||
|
L_ECC_POINT_TYPE_COMPRESSED_BIT0, x, bytes);
|
||||||
if (!pwe)
|
if (!pwe)
|
||||||
l_error("computing y failed, was x quadratic residue?");
|
l_error("computing y failed, was x quadratic residue?");
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user