diff --git a/ChangeLog.d/numeric-oid-overflow.txt b/ChangeLog.d/numeric-oid-overflow.txt new file mode 100644 index 0000000000..996881d56e --- /dev/null +++ b/ChangeLog.d/numeric-oid-overflow.txt @@ -0,0 +1,3 @@ +Bugfix + * Reject numeric OID components that exceed the range of unsigned int + instead of silently encoding a different value. Fixes #10910. diff --git a/library/x509_create.c b/library/x509_create.c index e424cbb47c..92d14c851f 100644 --- a/library/x509_create.c +++ b/library/x509_create.c @@ -287,7 +287,7 @@ static int oid_parse_number(unsigned int *num, const char **p, const char *bound while (*p < bound && **p >= '0' && **p <= '9') { ret = 0; - if (*num > (UINT_MAX / 10)) { + if (*num > (UINT_MAX - (unsigned int) (**p - '0')) / 10) { return MBEDTLS_ERR_ASN1_INVALID_DATA; } *num *= 10; diff --git a/tests/suites/test_suite_x509write.data b/tests/suites/test_suite_x509write.data index 78410b1ff2..538d21abc7 100644 --- a/tests/suites/test_suite_x509write.data +++ b/tests/suites/test_suite_x509write.data @@ -337,3 +337,12 @@ oid_from_numeric_string:"2.4294967215":0:"8FFFFFFF7F" OID from numeric string - OID with overflowing subidentifier oid_from_numeric_string:"2.4294967216":MBEDTLS_ERR_ASN1_INVALID_DATA:"" + +OID from numeric string - numeric component overflows on final digit +oid_from_numeric_string:"2.4294967296":MBEDTLS_ERR_ASN1_INVALID_DATA:"" + +OID from numeric string - numeric component overflows to nonzero value +oid_from_numeric_string:"2.4294967299":MBEDTLS_ERR_ASN1_INVALID_DATA:"" + +OID from numeric string - numeric component continues after overflow +oid_from_numeric_string:"2.42949672966":MBEDTLS_ERR_ASN1_INVALID_DATA:""