Skip to content

Commit 33c5d58

Browse files
itsManjeetjyao1
authored andcommitted
Fixes: Coverity CID 900514
Coverity reported a potential array overrun in get_evp_compatible_public_key() when converting a raw EC public key (X || Y) into the SEC1 uncompressed format required by OpenSSL EVP (0x04 || X || Y). The conversion intentionally increases the public key size by one byte to prepend the 0x04 uncompressed point prefix. This size adjustment may have triggered a false positive analysis warning. Signed-off-by: Manjeet Singh <itsmanjeet1998@gmail.com>
1 parent 3bb8fe4 commit 33c5d58

1 file changed

Lines changed: 7 additions & 13 deletions

File tree

  • os_stub/cryptlib_openssl/pk

os_stub/cryptlib_openssl/pk/ec.c

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ bool libspdm_ec_set_pub_key(void *ec_context, const uint8_t *public_key,
191191
char curve_name[64];
192192
size_t curve_name_len = 0;
193193

194-
if (ec_context == NULL || public_key == NULL) {
194+
if (ec_context == NULL || public_key == NULL || public_key_size + 1 > sizeof(oct_key)) {
195195
return false;
196196
}
197197
evp_pkey = ((libspdm_key_context *)ec_context)->evp_pkey;
@@ -208,13 +208,7 @@ bool libspdm_ec_set_pub_key(void *ec_context, const uint8_t *public_key,
208208
return false;
209209
}
210210

211-
/* Build uncompressed octet: 0x04 || X || Y */
212-
if (public_key_size + 1 > sizeof(oct_key)) {
213-
return false;
214-
}
215-
oct_key[0] = 0x04;
216-
memcpy(oct_key + 1, public_key, public_key_size);
217-
oct_len = public_key_size + 1;
211+
get_evp_compatible_public_key(evp_pkey, public_key, public_key_size, oct_key, &oct_len);
218212

219213
if (EVP_PKEY_set1_encoded_public_key(evp_pkey, oct_key, oct_len) > 0) {
220214
pctx = EVP_PKEY_CTX_new_from_pkey(NULL, evp_pkey, NULL);
@@ -1390,16 +1384,16 @@ EVP_PKEY *import_peer_pubkey(const char* curve_name, const unsigned char *pub, s
13901384
void get_evp_compatible_public_key(EVP_PKEY *evp_pkey,
13911385
const uint8_t *public_key, size_t public_key_size,
13921386
uint8_t *compatible_key, size_t *comptable_key_size) {
1393-
int half_size;
1387+
size_t half_size;
13941388
/* EVP compatible public key hack
1395-
* EVP expect public key [0] = 0x04 for uncompressed followed by key data */
1389+
* EVP expect public key [0] = 0x04 for uncompressed flag followed by key data */
13961390
half_size = evp_pkey_get_half_size(evp_pkey);
13971391
if (half_size * 2 == public_key_size) {
1398-
public_key_size += 1;
13991392
compatible_key[0] = 0x04;
1400-
memcpy(compatible_key+1, public_key, public_key_size-1);
1393+
memcpy(compatible_key + 1, public_key, public_key_size);
1394+
*comptable_key_size = 1 + public_key_size;
14011395
} else {
14021396
memcpy(compatible_key, public_key, public_key_size);
1397+
*comptable_key_size = public_key_size;
14031398
}
1404-
*comptable_key_size = public_key_size;
14051399
}

0 commit comments

Comments
 (0)