1
0
mirror of https://github.com/ARMmbed/mbedtls.git synced 2025-05-10 17:01:41 +08:00

Reduce code size in mbedtls_asn1_write_len

Signed-off-by: Dave Rodgman <dave.rodgman@arm.com>
This commit is contained in:
Dave Rodgman 2023-09-11 15:47:00 +01:00
parent 82fe0828b2
commit 9f366b07ea

View File

@ -30,66 +30,33 @@
int mbedtls_asn1_write_len(unsigned char **p, const unsigned char *start, size_t len) int mbedtls_asn1_write_len(unsigned char **p, const unsigned char *start, size_t len)
{ {
if (len < 0x80) {
if (*p - start < 1) {
return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL;
}
*--(*p) = (unsigned char) len;
return 1;
}
if (len <= 0xFF) {
if (*p - start < 2) {
return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL;
}
*--(*p) = (unsigned char) len;
*--(*p) = 0x81;
return 2;
}
if (len <= 0xFFFF) {
if (*p - start < 3) {
return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL;
}
*--(*p) = MBEDTLS_BYTE_0(len);
*--(*p) = MBEDTLS_BYTE_1(len);
*--(*p) = 0x82;
return 3;
}
if (len <= 0xFFFFFF) {
if (*p - start < 4) {
return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL;
}
*--(*p) = MBEDTLS_BYTE_0(len);
*--(*p) = MBEDTLS_BYTE_1(len);
*--(*p) = MBEDTLS_BYTE_2(len);
*--(*p) = 0x83;
return 4;
}
int len_is_valid = 1;
#if SIZE_MAX > 0xFFFFFFFF #if SIZE_MAX > 0xFFFFFFFF
len_is_valid = (len <= 0xFFFFFFFF); if (len > 0xFFFFFFFF) return MBEDTLS_ERR_ASN1_INVALID_LENGTH;
#endif #endif
if (len_is_valid) {
if (*p - start < 5) {
return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL;
}
*--(*p) = MBEDTLS_BYTE_0(len); int required = 1;
*--(*p) = MBEDTLS_BYTE_1(len); if (len < 0x80) {
*--(*p) = MBEDTLS_BYTE_2(len); required = 1;
*--(*p) = MBEDTLS_BYTE_3(len); } else {
*--(*p) = 0x84; for (size_t l = len; l != 0; l >>= 8) {
return 5; required++;
}
} }
return MBEDTLS_ERR_ASN1_INVALID_LENGTH; if (required > (*p - start)) {
return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL;
}
do {
*--(*p) = MBEDTLS_BYTE_0(len);
len >>= 8;
} while (len);
if (required > 1) {
*--(*p) = (unsigned char)(required + 0x7f);
}
return required;
} }
int mbedtls_asn1_write_tag(unsigned char **p, const unsigned char *start, unsigned char tag) int mbedtls_asn1_write_tag(unsigned char **p, const unsigned char *start, unsigned char tag)