1
0
mirror of https://github.com/ARMmbed/mbedtls.git synced 2025-05-11 01:11:42 +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) { int required = 1;
if (len < 0x80) {
required = 1;
} else {
for (size_t l = len; l != 0; l >>= 8) {
required++;
}
}
if (required > (*p - start)) {
return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL; return MBEDTLS_ERR_ASN1_BUF_TOO_SMALL;
} }
do {
*--(*p) = MBEDTLS_BYTE_0(len); *--(*p) = MBEDTLS_BYTE_0(len);
*--(*p) = MBEDTLS_BYTE_1(len); len >>= 8;
*--(*p) = MBEDTLS_BYTE_2(len); } while (len);
*--(*p) = MBEDTLS_BYTE_3(len);
*--(*p) = 0x84; if (required > 1) {
return 5; *--(*p) = (unsigned char)(required + 0x7f);
} }
return MBEDTLS_ERR_ASN1_INVALID_LENGTH; 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)