Remove RSA PKCS#1 v1.5 support from cert_tool
authorJustin Chadwell <justin.chadwell@arm.com>
Mon, 9 Sep 2019 14:24:31 +0000 (15:24 +0100)
committerJustin Chadwell <justin.chadwell@arm.com>
Thu, 12 Sep 2019 14:27:41 +0000 (15:27 +0100)
Support for PKCS#1 v1.5 was deprecated in SHA 1001202 and fully removed
in SHA fe199e3, however, cert_tool is still able to generate
certificates in that form. This patch fully removes the ability for
cert_tool to generate these certificates.

Additionally, this patch also fixes a bug where the issuing certificate
was a RSA and the issued certificate was EcDSA. In this case, the issued
certificate would be signed using PKCS#1 v1.5 instead of RSAPSS per
PKCS#1 v2.1, preventing TF-A from verifying the image signatures. Now
that PKCS#1 v1.5 support is removed, all certificates that are signed
with RSA now use the more modern padding scheme.

Change-Id: Id87d7d915be594a1876a73080528d968e65c4e9a
Signed-off-by: Justin Chadwell <justin.chadwell@arm.com>
docs/getting_started/user-guide.rst
drivers/auth/mbedtls/mbedtls_common.mk
tools/cert_create/include/cert.h
tools/cert_create/include/key.h
tools/cert_create/src/cert.c
tools/cert_create/src/key.c
tools/cert_create/src/main.c

index 89157386e96417d0f973f5036f8e1bdd005c890c..1229e663a77fa9d75cb9490c18b8e02f087bd6f6 100644 (file)
@@ -588,10 +588,8 @@ Common build options
 
 -  ``KEY_ALG``: This build flag enables the user to select the algorithm to be
    used for generating the PKCS keys and subsequent signing of the certificate.
-   It accepts 3 values: ``rsa``, ``rsa_1_5`` and ``ecdsa``. The option
-   ``rsa_1_5`` is the legacy PKCS#1 RSA 1.5 algorithm which is not TBBR
-   compliant and is retained only for compatibility. The default value of this
-   flag is ``rsa`` which is the TBBR compliant PKCS#1 RSA 2.1 scheme.
+   It accepts 2 values: ``rsa`` and ``ecdsa``. The default value of this flag
+   is ``rsa`` which is the TBBR compliant PKCS#1 RSA 2.1 scheme.
 
 -  ``KEY_SIZE``: This build flag enables the user to select the key size for
    the algorithm specified by ``KEY_ALG``. The valid values for ``KEY_SIZE``
index f34d3d000d55c72a734ba59bc056032eb1e43e24..4b83015417b1c3ed1b1b8c8b7938d4bae5d4fce6 100644 (file)
@@ -48,9 +48,9 @@ LIBMBEDTLS_SRCS               := $(addprefix ${MBEDTLS_DIR}/library/, \
                                        )
 
 # The platform may define the variable 'TF_MBEDTLS_KEY_ALG' to select the key
-# algorithm to use. If the variable is not defined, select it based on algorithm
-# used for key generation `KEY_ALG`. If `KEY_ALG` is not defined or is
-# defined to `rsa`/`rsa_1_5`, then set the variable to `rsa`.
+# algorithm to use. If the variable is not defined, select it based on
+# algorithm used for key generation `KEY_ALG`. If `KEY_ALG` is not defined,
+# then it is set to `rsa`.
 ifeq (${TF_MBEDTLS_KEY_ALG},)
     ifeq (${KEY_ALG}, ecdsa)
         TF_MBEDTLS_KEY_ALG             :=      ecdsa
index 39b45b58e0ced5c3aa5eb0516f6f04f7497ffe1e..6db9b579d3523129fc77ddf5e7282416f22e135f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2017, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -49,7 +49,6 @@ int cert_init(void);
 cert_t *cert_get_by_opt(const char *opt);
 int cert_add_ext(X509 *issuer, X509 *subject, int nid, char *value);
 int cert_new(
-       int key_alg,
        int md_alg,
        cert_t *cert,
        int days,
index c08beb8b25b99e36ae71c3162b23190d874b2b2f..d96d9839a2a05315591a49ccc062330c7faa429a 100644 (file)
@@ -21,7 +21,6 @@ enum {
 /* Supported key algorithms */
 enum {
        KEY_ALG_RSA,            /* RSA PSS as defined by PKCS#1 v2.1 (default) */
-       KEY_ALG_RSA_1_5,        /* RSA as defined by PKCS#1 v1.5 */
 #ifndef OPENSSL_NO_EC
        KEY_ALG_ECDSA,
 #endif /* OPENSSL_NO_EC */
@@ -42,7 +41,6 @@ enum{
 /* NOTE: the first item in each array is the default key size */
 static const unsigned int KEY_SIZES[KEY_ALG_MAX_NUM][KEY_SIZE_MAX_NUM] = {
        { 2048, 1024, 3072, 4096 },     /* KEY_ALG_RSA */
-       { 2048, 1024, 3072, 4096 },     /* KEY_ALG_RSA_1_5 */
 #ifndef OPENSSL_NO_EC
        {}                              /* KEY_ALG_ECDSA */
 #endif /* OPENSSL_NO_EC */
index 8e8aee699c945d8854945b60a842c73af7213281..c68a265b4337ff417e8fbfeef77b70c3bd55e1fb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2017, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -93,7 +93,6 @@ int cert_add_ext(X509 *issuer, X509 *subject, int nid, char *value)
 }
 
 int cert_new(
-       int key_alg,
        int md_alg,
        cert_t *cert,
        int days,
@@ -143,10 +142,10 @@ int cert_new(
        }
 
        /*
-        * Set additional parameters if algorithm is RSA PSS. This is not
-        * required for RSA 1.5 or ECDSA.
+        * Set additional parameters if issuing public key algorithm is RSA.
+        * This is not required for ECDSA.
         */
-       if (key_alg == KEY_ALG_RSA) {
+       if (EVP_PKEY_base_id(ikey) == EVP_PKEY_RSA) {
                if (!EVP_PKEY_CTX_set_rsa_padding(pKeyCtx, RSA_PKCS1_PSS_PADDING)) {
                        ERR_print_errors_fp(stdout);
                        goto END;
index 93d31f7c347c45239b00980e32550cdc836a1392..0f80cce9b7a7ae0ee32cd6300af8f845994ae8bc 100644 (file)
@@ -112,7 +112,6 @@ err:
 typedef int (*key_create_fn_t)(key_t *key, int key_bits);
 static const key_create_fn_t key_create_fn[KEY_ALG_MAX_NUM] = {
        key_create_rsa,         /* KEY_ALG_RSA */
-       key_create_rsa,         /* KEY_ALG_RSA_1_5 */
 #ifndef OPENSSL_NO_EC
        key_create_ecdsa,       /* KEY_ALG_ECDSA */
 #endif /* OPENSSL_NO_EC */
index 44a65eb982e1745725b00a695f13abb929064b9a..0cbd2196bca447d97696add47292b6af201d0a28 100644 (file)
@@ -92,7 +92,6 @@ static char *strdup(const char *str)
 
 static const char *key_algs_str[] = {
        [KEY_ALG_RSA] = "rsa",
-       [KEY_ALG_RSA_1_5] = "rsa_1_5",
 #ifndef OPENSSL_NO_EC
        [KEY_ALG_ECDSA] = "ecdsa"
 #endif /* OPENSSL_NO_EC */
@@ -277,8 +276,7 @@ static const cmd_opt_t common_cmd_opt[] = {
        },
        {
                { "key-alg", required_argument, NULL, 'a' },
-               "Key algorithm: 'rsa' (default) - RSAPSS scheme as per \
-PKCS#1 v2.1, 'rsa_1_5' - RSA PKCS#1 v1.5, 'ecdsa'"
+               "Key algorithm: 'rsa' (default)- RSAPSS scheme as per PKCS#1 v2.1, 'ecdsa'"
        },
        {
                { "key-size", required_argument, NULL, 'b' },
@@ -545,7 +543,7 @@ int main(int argc, char *argv[])
                }
 
                /* Create certificate. Signed with corresponding key */
-               if (cert->fn && !cert_new(key_alg, hash_alg, cert, VAL_DAYS, 0, sk)) {
+               if (cert->fn && !cert_new(hash_alg, cert, VAL_DAYS, 0, sk)) {
                        ERROR("Cannot create %s\n", cert->cn);
                        exit(1);
                }