Skip to content

Commit

Permalink
Merge pull request #6919 from valeriosetti/issue6843-backport
Browse files Browse the repository at this point in the history
Backport: Improve X.509 cert writing serial number management
  • Loading branch information
mpg authored Jan 30, 2023
2 parents 54be0fa + 7ba0037 commit 4b7cb8c
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Bugfix
* mbedtls_x509write_crt_set_serial() now explicitly rejects serial numbers
whose binary representation is longer than 20 bytes. This was already
forbidden by the standard (RFC5280 - section 4.1.2.2) and now it's being
enforced also at code level.
4 changes: 4 additions & 0 deletions library/x509write_crt.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,10 @@ int mbedtls_x509write_crt_set_serial(mbedtls_x509write_cert *ctx,
{
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;

if (mbedtls_mpi_size(serial) > MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN) {
return MBEDTLS_ERR_X509_BAD_INPUT_DATA;
}

if ((ret = mbedtls_mpi_copy(&ctx->serial, serial)) != 0) {
return ret;
}
Expand Down
3 changes: 3 additions & 0 deletions tests/suites/test_suite_x509write.data
Original file line number Diff line number Diff line change
Expand Up @@ -132,3 +132,6 @@ mbedtls_x509_string_to_names:"C=NL, O=Offspark\a Inc., OU=PolarSSL":"":MBEDTLS_E

X509 String to Names #6 (Escape at end)
mbedtls_x509_string_to_names:"C=NL, O=Offspark\":"":MBEDTLS_ERR_X509_INVALID_NAME

Check max serial length
x509_set_serial_check:
20 changes: 20 additions & 0 deletions tests/suites/test_suite_x509write.function
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,26 @@ exit:
}
/* END_CASE */

/* BEGIN_CASE depends_on:MBEDTLS_X509_CRT_WRITE_C */
void x509_set_serial_check()
{
mbedtls_x509write_cert ctx;
mbedtls_mpi serial_mpi;
uint8_t invalid_serial[MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN + 1];

memset(invalid_serial, 0x01, sizeof(invalid_serial));

mbedtls_mpi_init(&serial_mpi);
TEST_EQUAL(mbedtls_mpi_read_binary(&serial_mpi, invalid_serial,
sizeof(invalid_serial)), 0);
TEST_EQUAL(mbedtls_x509write_crt_set_serial(&ctx, &serial_mpi),
MBEDTLS_ERR_X509_BAD_INPUT_DATA);

exit:
mbedtls_mpi_free(&serial_mpi);
}
/* END_CASE */

/* BEGIN_CASE depends_on:MBEDTLS_X509_CREATE_C:MBEDTLS_X509_USE_C */
void mbedtls_x509_string_to_names(char *name, char *parsed_name, int result
)
Expand Down

0 comments on commit 4b7cb8c

Please sign in to comment.