From b40dc58a831284dce9f85104409c73f4574d6d0d Mon Sep 17 00:00:00 2001 From: Hanno Becker Date: Wed, 20 Feb 2019 09:38:45 +0000 Subject: [PATCH] Introduce a helper macro to check for ASN.1 string tags This commit introduces a macro `MBEDTLS_ASN1_IS_STRING_TAG` that can be used to check if an ASN.1 tag is among the list of string tags: - MBEDTLS_ASN1_BMP_STRING - MBEDTLS_ASN1_UTF8_STRING - MBEDTLS_ASN1_T61_STRING - MBEDTLS_ASN1_IA5_STRING - MBEDTLS_ASN1_UNIVERSAL_STRING - MBEDTLS_ASN1_PRINTABLE_STRING - MBEDTLS_ASN1_BIT_STRING --- include/mbedtls/asn1.h | 12 ++++++++++++ library/x509.c | 7 +++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/include/mbedtls/asn1.h b/include/mbedtls/asn1.h index 96c1c9a8a..2fb6de0a5 100644 --- a/include/mbedtls/asn1.h +++ b/include/mbedtls/asn1.h @@ -89,6 +89,18 @@ #define MBEDTLS_ASN1_CONSTRUCTED 0x20 #define MBEDTLS_ASN1_CONTEXT_SPECIFIC 0x80 +/* Slightly smaller way to check if tag is a string tag + * compared to canonical implementation. */ +#define MBEDTLS_ASN1_IS_STRING_TAG( tag ) \ + ( ( tag ) < 32u && ( \ + ( ( 1u << ( tag ) ) & ( ( 1u << MBEDTLS_ASN1_BMP_STRING ) | \ + ( 1u << MBEDTLS_ASN1_UTF8_STRING ) | \ + ( 1u << MBEDTLS_ASN1_T61_STRING ) | \ + ( 1u << MBEDTLS_ASN1_IA5_STRING ) | \ + ( 1u << MBEDTLS_ASN1_UNIVERSAL_STRING ) | \ + ( 1u << MBEDTLS_ASN1_PRINTABLE_STRING ) | \ + ( 1u << MBEDTLS_ASN1_BIT_STRING ) ) ) != 0 ) ) + /* * Bit masks for each of the components of an ASN.1 tag as specified in * ITU X.690 (08/2015), section 8.1 "General rules for encoding", diff --git a/library/x509.c b/library/x509.c index 2e7bd5710..9d9db2341 100644 --- a/library/x509.c +++ b/library/x509.c @@ -375,12 +375,11 @@ static int x509_get_attr_type_value( unsigned char **p, return( MBEDTLS_ERR_X509_INVALID_NAME + MBEDTLS_ERR_ASN1_OUT_OF_DATA ); - if( **p != MBEDTLS_ASN1_BMP_STRING && **p != MBEDTLS_ASN1_UTF8_STRING && - **p != MBEDTLS_ASN1_T61_STRING && **p != MBEDTLS_ASN1_PRINTABLE_STRING && - **p != MBEDTLS_ASN1_IA5_STRING && **p != MBEDTLS_ASN1_UNIVERSAL_STRING && - **p != MBEDTLS_ASN1_BIT_STRING ) + if( !MBEDTLS_ASN1_IS_STRING_TAG( **p ) ) + { return( MBEDTLS_ERR_X509_INVALID_NAME + MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ); + } val = &cur->val; val->tag = *(*p)++;