3
0
mirror of https://git.kernel.org/pub/scm/network/wireless/iwd.git synced 2024-12-22 21:22:37 +01:00

dpp-util: fix dpp_point_to_asn1 compressed type

The point type was being hard coded to 0x3 (BIT1) which may have resulted
in the peer subtracting Y from P when reading in the point (depending on
if Y was odd or not).

Instead set the compressed type to whatever avoids the subtraction which
both saves IWD from needing to do it, as well as the peer.
This commit is contained in:
James Prestwood 2022-01-18 11:59:50 -08:00 committed by Denis Kenzior
parent 44a7bc640b
commit 188d09af42

View File

@ -725,6 +725,7 @@ uint8_t *dpp_point_to_asn1(const struct l_ecc_point *p, size_t *len_out)
uint64_t x[L_ECC_MAX_DIGITS]; uint64_t x[L_ECC_MAX_DIGITS];
ssize_t ret; ssize_t ret;
size_t len; size_t len;
uint8_t point_type;
switch (key_size) { switch (key_size) {
case 32: case 32:
@ -745,6 +746,17 @@ uint8_t *dpp_point_to_asn1(const struct l_ecc_point *p, size_t *len_out)
len = 2 + sizeof(ec_oid) + 2 + type_oid_len + 2 + key_size + 4; len = 2 + sizeof(ec_oid) + 2 + type_oid_len + 2 + key_size + 4;
/*
* Set the type to whatever avoids doing p - y when reading in the
* key. Working backwards from l_ecc_point_from_data if Y is odd and
* the type is BIT0 there is no subtraction. Similarly if Y is even
* and the type is BIT1.
*/
if (l_ecc_point_y_isodd(p))
point_type = L_ECC_POINT_TYPE_COMPRESSED_BIT0;
else
point_type = L_ECC_POINT_TYPE_COMPRESSED_BIT1;
if (L_WARN_ON(len > 128)) if (L_WARN_ON(len > 128))
return NULL; return NULL;
@ -774,7 +786,7 @@ uint8_t *dpp_point_to_asn1(const struct l_ecc_point *p, size_t *len_out)
*ptr++ = ASN1_ID_BIT_STRING; *ptr++ = ASN1_ID_BIT_STRING;
*ptr++ = key_size + 2; *ptr++ = key_size + 2;
*ptr++ = 0x00; *ptr++ = 0x00;
*ptr++ = 0x03; *ptr++ = point_type;
memcpy(ptr, x, key_size); memcpy(ptr, x, key_size);
ptr += key_size; ptr += key_size;