Skip to content

Commit 743f1db

Browse files
Wenxing-houjyao1
authored andcommitted
Improve the OID check logic in cert extension
Fix the issue: #2491 The patch has passed the existing test_spdm_crypt unit_test. Signed-off-by: Wenxing Hou <[email protected]>
1 parent 4ccf4c7 commit 743f1db

File tree

1 file changed

+64
-18
lines changed

1 file changed

+64
-18
lines changed

library/spdm_crypt_lib/libspdm_crypt_cert.c

+64-18
Original file line numberDiff line numberDiff line change
@@ -865,9 +865,10 @@ static bool libspdm_verify_leaf_cert_spdm_eku(const uint8_t *cert, size_t cert_s
865865
bool status;
866866
uint8_t eku[256];
867867
size_t eku_size;
868-
size_t index;
869868
bool req_auth_oid_find_success;
870869
bool rsp_auth_oid_find_success;
870+
uint8_t *ptr;
871+
size_t obj_len;
871872

872873
/* SPDM defined OID */
873874
uint8_t eku_requester_auth_oid[] = SPDM_OID_DMTF_EKU_REQUESTER_AUTH;
@@ -882,23 +883,39 @@ static bool libspdm_verify_leaf_cert_spdm_eku(const uint8_t *cert, size_t cert_s
882883
return false;
883884
}
884885

886+
ptr = eku;
887+
obj_len = 0;
885888
req_auth_oid_find_success = false;
886889
rsp_auth_oid_find_success = false;
887890

888-
for(index = 0; index <= eku_size - sizeof(eku_requester_auth_oid); index++) {
889-
if (libspdm_consttime_is_mem_equal(eku + index, eku_requester_auth_oid,
890-
sizeof(eku_requester_auth_oid))) {
891-
req_auth_oid_find_success = true;
892-
break;
893-
}
891+
status = libspdm_asn1_get_tag(&ptr, eku + eku_size, &obj_len,
892+
LIBSPDM_CRYPTO_ASN1_SEQUENCE | LIBSPDM_CRYPTO_ASN1_CONSTRUCTED);
893+
if (!status) {
894+
return false;
894895
}
895896

896-
for(index = 0; index <= eku_size - sizeof(eku_responder_auth_oid); index++) {
897-
if (libspdm_consttime_is_mem_equal(eku + index, eku_responder_auth_oid,
898-
sizeof(eku_responder_auth_oid))) {
897+
while(ptr < eku + eku_size) {
898+
status = libspdm_asn1_get_tag(&ptr, eku + eku_size, &obj_len, LIBSPDM_CRYPTO_ASN1_OID);
899+
if (!status) {
900+
return false;
901+
}
902+
903+
if ((obj_len == sizeof(eku_requester_auth_oid)) &&
904+
(libspdm_consttime_is_mem_equal(ptr, eku_requester_auth_oid,
905+
sizeof(eku_requester_auth_oid)))) {
906+
req_auth_oid_find_success = true;
907+
}
908+
if ((obj_len == sizeof(eku_responder_auth_oid)) &&
909+
(libspdm_consttime_is_mem_equal(ptr, eku_responder_auth_oid,
910+
sizeof(eku_responder_auth_oid)))) {
899911
rsp_auth_oid_find_success = true;
900-
break;
901912
}
913+
914+
ptr += obj_len;
915+
}
916+
917+
if (ptr != eku + eku_size) {
918+
return false;
902919
}
903920

904921
if (is_requester_cert) {
@@ -934,11 +951,12 @@ static bool libspdm_verify_leaf_cert_spdm_extension(const uint8_t *cert, size_t
934951
bool status;
935952
bool find_sucessful;
936953
uint8_t spdm_extension[LIBSPDM_MAX_EXTENSION_LEN];
937-
size_t index;
938954
size_t len;
955+
uint8_t *ptr;
956+
uint8_t *temptr;
957+
size_t obj_len;
939958

940959
/* SPDM defined OID */
941-
942960
uint8_t oid_spdm_extension[] = SPDM_OID_DMTF_SPDM_EXTENSION;
943961
uint8_t hardware_identity_oid[] = SPDM_OID_DMTF_HARDWARE_IDENTITY;
944962

@@ -953,7 +971,6 @@ static bool libspdm_verify_leaf_cert_spdm_extension(const uint8_t *cert, size_t
953971
sizeof(oid_spdm_extension),
954972
spdm_extension,
955973
&len);
956-
957974
if(len == 0) {
958975
return true;
959976
} else if(!status) {
@@ -962,12 +979,41 @@ static bool libspdm_verify_leaf_cert_spdm_extension(const uint8_t *cert, size_t
962979

963980
/*find the spdm hardware identity OID*/
964981
find_sucessful = false;
965-
for(index = 0; index <= len - sizeof(hardware_identity_oid); index++) {
966-
if (libspdm_consttime_is_mem_equal(spdm_extension + index, hardware_identity_oid,
967-
sizeof(hardware_identity_oid))) {
982+
ptr = spdm_extension;
983+
obj_len = 0;
984+
985+
/*id-spdm-cert-oids ::= SEQUENCE SIZE (1..MAX) OF id-spdm-cert-oid*/
986+
status = libspdm_asn1_get_tag(
987+
&ptr, spdm_extension + len, &obj_len,
988+
LIBSPDM_CRYPTO_ASN1_SEQUENCE | LIBSPDM_CRYPTO_ASN1_CONSTRUCTED);
989+
if (!status) {
990+
return false;
991+
}
992+
993+
while(ptr < spdm_extension + len) {
994+
status = libspdm_asn1_get_tag(
995+
&ptr, spdm_extension + len, &obj_len,
996+
LIBSPDM_CRYPTO_ASN1_SEQUENCE | LIBSPDM_CRYPTO_ASN1_CONSTRUCTED);
997+
if (!status) {
998+
return false;
999+
}
1000+
1001+
temptr = ptr + obj_len;
1002+
status = libspdm_asn1_get_tag(
1003+
&ptr, spdm_extension + len, &obj_len, LIBSPDM_CRYPTO_ASN1_OID);
1004+
if (!status) {
1005+
return false;
1006+
}
1007+
if ((obj_len == sizeof(hardware_identity_oid)) &&
1008+
(libspdm_consttime_is_mem_equal(ptr, hardware_identity_oid,
1009+
sizeof(hardware_identity_oid)))) {
9681010
find_sucessful = true;
969-
break;
9701011
}
1012+
ptr = temptr;
1013+
}
1014+
1015+
if (ptr != spdm_extension + len) {
1016+
return false;
9711017
}
9721018

9731019
/* Responder does not determine Requester's certificate model */

0 commit comments

Comments
 (0)