@@ -865,9 +865,10 @@ static bool libspdm_verify_leaf_cert_spdm_eku(const uint8_t *cert, size_t cert_s
865
865
bool status ;
866
866
uint8_t eku [256 ];
867
867
size_t eku_size ;
868
- size_t index ;
869
868
bool req_auth_oid_find_success ;
870
869
bool rsp_auth_oid_find_success ;
870
+ uint8_t * ptr ;
871
+ size_t obj_len ;
871
872
872
873
/* SPDM defined OID */
873
874
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
882
883
return false;
883
884
}
884
885
886
+ ptr = eku ;
887
+ obj_len = 0 ;
885
888
req_auth_oid_find_success = false;
886
889
rsp_auth_oid_find_success = false;
887
890
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;
894
895
}
895
896
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 )))) {
899
911
rsp_auth_oid_find_success = true;
900
- break ;
901
912
}
913
+
914
+ ptr += obj_len ;
915
+ }
916
+
917
+ if (ptr != eku + eku_size ) {
918
+ return false;
902
919
}
903
920
904
921
if (is_requester_cert ) {
@@ -934,11 +951,12 @@ static bool libspdm_verify_leaf_cert_spdm_extension(const uint8_t *cert, size_t
934
951
bool status ;
935
952
bool find_sucessful ;
936
953
uint8_t spdm_extension [LIBSPDM_MAX_EXTENSION_LEN ];
937
- size_t index ;
938
954
size_t len ;
955
+ uint8_t * ptr ;
956
+ uint8_t * temptr ;
957
+ size_t obj_len ;
939
958
940
959
/* SPDM defined OID */
941
-
942
960
uint8_t oid_spdm_extension [] = SPDM_OID_DMTF_SPDM_EXTENSION ;
943
961
uint8_t hardware_identity_oid [] = SPDM_OID_DMTF_HARDWARE_IDENTITY ;
944
962
@@ -953,7 +971,6 @@ static bool libspdm_verify_leaf_cert_spdm_extension(const uint8_t *cert, size_t
953
971
sizeof (oid_spdm_extension ),
954
972
spdm_extension ,
955
973
& len );
956
-
957
974
if (len == 0 ) {
958
975
return true;
959
976
} else if (!status ) {
@@ -962,12 +979,41 @@ static bool libspdm_verify_leaf_cert_spdm_extension(const uint8_t *cert, size_t
962
979
963
980
/*find the spdm hardware identity OID*/
964
981
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 )))) {
968
1010
find_sucessful = true;
969
- break ;
970
1011
}
1012
+ ptr = temptr ;
1013
+ }
1014
+
1015
+ if (ptr != spdm_extension + len ) {
1016
+ return false;
971
1017
}
972
1018
973
1019
/* Responder does not determine Requester's certificate model */
0 commit comments