]> git.baikalelectronics.ru Git - arm-tf.git/commitdiff
refactor(auth): avoid parsing signature algorithm twice
authorDemi Marie Obenour <demiobenour@gmail.com>
Thu, 8 Dec 2022 20:24:23 +0000 (15:24 -0500)
committerDemi Marie Obenour <demiobenour@gmail.com>
Fri, 30 Dec 2022 00:18:22 +0000 (19:18 -0500)
Since the two instances of the signature algorithm in a certificate must
be bitwise identical, it is not necessary to parse both of them.
Instead, it suffices to parse one of them, and then check that the other
fits in the remaining buffer space and is equal to the first.

Change-Id: Id0a0663165f147879ac83b6a540378fd4873b0dd
Signed-off-by: Demi Marie Obenour <demiobenour@gmail.com>
drivers/auth/mbedtls/mbedtls_x509_parser.c

index 244f1c95e52fa24f994bdc950d9bf7288c18885a..f18f6b413013843b62062b6a03e9c8bcde88e44a 100644 (file)
@@ -145,7 +145,7 @@ static int cert_parse(void *img, unsigned int img_len)
        int ret, is_critical;
        size_t len;
        unsigned char *p, *end, *crt_end, *pk_end;
-       mbedtls_asn1_buf sig_alg1, sig_alg2;
+       mbedtls_asn1_buf sig_alg1;
        /*
         * The unique ASN.1 DER encoding of [0] EXPLICIT INTEGER { v3(2} }.
         */
@@ -396,26 +396,15 @@ static int cert_parse(void *img, unsigned int img_len)
         *  -- end of TBSCertificate
         *
         *  signatureAlgorithm   AlgorithmIdentifier
+        *  -- Does not need to be parsed.  Ensuring it is bitwise
+        *  -- identical (including the tag!) with the first signature
+        *  -- algorithm is sufficient.
         */
-       sig_alg2.p = p;
-       ret = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_CONSTRUCTED |
-                                  MBEDTLS_ASN1_SEQUENCE);
-       if (ret != 0) {
-               return IMG_PARSER_ERR_FORMAT;
-       }
-       if ((end - p) < 1) {
-               return IMG_PARSER_ERR_FORMAT;
-       }
-       sig_alg2.len = (p + len) - sig_alg2.p;
-       p += len;
-
-       /* Compare both signature algorithms */
-       if (sig_alg1.len != sig_alg2.len) {
-               return IMG_PARSER_ERR_FORMAT;
-       }
-       if (0 != memcmp(sig_alg1.p, sig_alg2.p, sig_alg1.len)) {
+       if ((sig_alg1.len >= (size_t)(end - p)) ||
+           (0 != memcmp(sig_alg1.p, p, sig_alg1.len))) {
                return IMG_PARSER_ERR_FORMAT;
        }
+       p += sig_alg1.len;
        memcpy(&sig_alg, &sig_alg1, sizeof(sig_alg));
 
        /*