]> git.baikalelectronics.ru Git - arm-tf.git/commitdiff
refactor(auth): replace plat_convert_pk
authorYann Gautier <yann.gautier@foss.st.com>
Tue, 24 Jan 2023 08:39:47 +0000 (09:39 +0100)
committerManish V Badarkhe <Manish.Badarkhe@arm.com>
Fri, 21 Apr 2023 08:46:01 +0000 (09:46 +0100)
Following discussions in the reviews of the patch that introduced
plat_convert_pk() function [1], it was decided to deprecate it to
avoid weak function declaration.
A new optional function pointer convert_pk is added to crypto_lib_desc_t.
A new function crypto_mod_convert_pk() will either call
crypto_lib_desc.convert_pk() if it is defined, or do the same
as what was done by the weak function otherwise.

[1] https://review.trustedfirmware.org/c/TF-A/trusted-firmware-a/+/17174

Signed-off-by: Yann Gautier <yann.gautier@foss.st.com>
Change-Id: I9358867f8bfd5e96b5ee238c066877da368e43c6

docs/design/auth-framework.rst
docs/porting-guide.rst
drivers/auth/auth_mod.c
drivers/auth/crypto_mod.c
drivers/auth/cryptocell/712/cryptocell_crypto.c
drivers/auth/cryptocell/713/cryptocell_crypto.c
drivers/auth/mbedtls/mbedtls_crypto.c
drivers/nxp/crypto/caam/src/auth/nxp_crypto.c
include/drivers/auth/crypto_mod.h
include/plat/common/platform.h
plat/st/common/stm32mp_crypto_lib.c

index 508a82faccd899cc8de202a97ef97f395e3da4fc..597f955ec084e87798cb5bcfa006ff703820fa5b 100644 (file)
@@ -256,7 +256,8 @@ These functions are registered in the CM using the macro:
                         _verify_signature,
                         _calc_hash,
                         _verify_hash,
-                        _auth_decrypt);
+                        _auth_decrypt,
+                        _convert_pk);
 
 ``_name`` must be a string containing the name of the CL. This name is used for
 debugging purposes.
@@ -266,6 +267,25 @@ return the hash of the given data using the provided hash algorithm.
 This function is mainly used in the ``MEASURED_BOOT`` and ``DRTM_SUPPORT``
 features to calculate the hashes of various images/data.
 
+Optionally, a platform function can be provided to convert public key
+(_convert_pk). It is only used if the platform saves a hash of the ROTPK.
+Most platforms save the hash of the ROTPK, but some may save slightly different
+information - e.g the hash of the ROTPK plus some related information.
+Defining this function allows to transform the ROTPK used to verify
+the signature to the buffer (a platform specific public key) which
+hash is saved in OTP.
+
+.. code:: c
+
+    int (*convert_pk)(void *full_pk_ptr, unsigned int full_pk_len,
+                      void **hashed_pk_ptr, unsigned int *hashed_pk_len);
+
+
+-  ``full_pk_ptr``: Pointer to Distinguished Encoding Rules (DER) ROTPK.
+-  ``full_pk_len``: DER ROTPK size.
+-  ``hashed_pk_ptr``: to return a pointer to a buffer, which hash should be the one saved in OTP.
+-  ``hashed_pk_len``: previous buffer size
+
 Image Parser Module (IPM)
 ^^^^^^^^^^^^^^^^^^^^^^^^^
 
index bc9c00f3c569a4cfdf331f0eed92a0eae105a2c5..25b55e8135d2be3e96a178a60caedb6a139a16ab 100644 (file)
@@ -894,34 +894,6 @@ The function returns 0 on success. Any other value means the counter value
 either could not be updated or the authentication image descriptor indicates
 that it is not allowed to be updated.
 
-Function: plat_convert_pk()
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-::
-
-    Argument : void *, unsigned int, void **, unsigned int *
-    Return   : int
-
-This function is optional when Trusted Board Boot is enabled, and only
-used if the platform saves a hash of the ROTPK.
-First argument is the Distinguished Encoding Rules (DER) ROTPK.
-Second argument is its size.
-Third argument is used to return a pointer to a buffer, which hash should
-be the one saved in OTP.
-Fourth argument is a pointer to return its size.
-
-Most platforms save the hash of the ROTPK, but some may save slightly different
-information - e.g the hash of the ROTPK plus some related information.
-Defining this function allows to transform the ROTPK used to verify
-the signature to the buffer (a platform specific public key) which
-hash is saved in OTP.
-
-The default implementation copies the input key and length to the output without
-modification.
-
-The function returns 0 on success. Any other value means the expected
-public key buffer cannot be extracted.
-
 Dynamic Root of Trust for Measurement support (in BL31)
 -------------------------------------------------------
 
index f153065375bf232e250dcb7599ecef0fb6fdb049..7a9cca8e33f50d9f33bde9c6ec00962f42ca21b1 100644 (file)
@@ -31,7 +31,6 @@
        } while (0)
 
 #pragma weak plat_set_nv_ctr2
-#pragma weak plat_convert_pk
 
 static int cmp_auth_param_type_desc(const auth_param_type_desc_t *a,
                const auth_param_type_desc_t *b)
@@ -209,7 +208,7 @@ static int auth_signature(const auth_method_param_sig_t *param,
                         * platform may store the hash of a prefixed,
                         * suffixed or modified pk
                         */
-                       rc = plat_convert_pk(pk_ptr, pk_len, &pk_ptr, &pk_len);
+                       rc = crypto_mod_convert_pk(pk_ptr, pk_len, &pk_ptr, &pk_len);
                        return_if_error(rc);
 
                        /*
@@ -330,15 +329,6 @@ int plat_set_nv_ctr2(void *cookie, const auth_img_desc_t *img_desc __unused,
        return plat_set_nv_ctr(cookie, nv_ctr);
 }
 
-int plat_convert_pk(void *full_pk_ptr, unsigned int full_pk_len,
-                   void **hashed_pk_ptr, unsigned int *hashed_pk_len)
-{
-       *hashed_pk_ptr = full_pk_ptr;
-       *hashed_pk_len = full_pk_len;
-
-       return 0;
-}
-
 /*
  * Return the parent id in the output parameter '*parent_id'
  *
index fa1adb4f7769c29910812743beb0234f4091106e..e36b2858ac441fc72cdcff30ab37328145603445 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2022, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2015-2023, Arm Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -142,6 +142,20 @@ int crypto_mod_calc_hash(enum crypto_md_algo alg, void *data_ptr,
 #endif /* CRYPTO_SUPPORT == CRYPTO_HASH_CALC_ONLY || \
          CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC */
 
+int crypto_mod_convert_pk(void *full_pk_ptr, unsigned int full_pk_len,
+                         void **hashed_pk_ptr, unsigned int *hashed_pk_len)
+{
+       if (crypto_lib_desc.convert_pk != NULL) {
+               return crypto_lib_desc.convert_pk(full_pk_ptr, full_pk_len,
+                                                 hashed_pk_ptr, hashed_pk_len);
+       }
+
+       *hashed_pk_ptr = full_pk_ptr;
+       *hashed_pk_len = full_pk_len;
+
+       return 0;
+}
+
 /*
  * Authenticated decryption of data
  *
index e2b189bb5aeefee76141f1ee4faa4b655e7102d3..b6a3f7bdad1b1ec0810af9ba1f5930f0077d638b 100644 (file)
@@ -330,5 +330,5 @@ static int verify_hash(void *data_ptr, unsigned int data_len,
 /*
  * Register crypto library descriptor
  */
-REGISTER_CRYPTO_LIB(LIB_NAME, init, verify_signature, verify_hash, NULL);
+REGISTER_CRYPTO_LIB(LIB_NAME, init, verify_signature, verify_hash, NULL, NULL);
 
index 388264ed305b6bca59ce8dcc1eccc7ff078bb93b..506cf1cf595e665717983a5c73ef011b26e9d789 100644 (file)
@@ -302,4 +302,4 @@ static int verify_hash(void *data_ptr, unsigned int data_len,
 /*
  * Register crypto library descriptor
  */
-REGISTER_CRYPTO_LIB(LIB_NAME, init, verify_signature, verify_hash, NULL);
+REGISTER_CRYPTO_LIB(LIB_NAME, init, verify_signature, verify_hash, NULL, NULL);
index 4241d2161afb2dbdd07bc905dc67212af3b3ccc8..df4763d9b7361ca718b09d94c17509446211a51f 100644 (file)
@@ -396,17 +396,17 @@ static int auth_decrypt(enum crypto_dec_algo dec_algo, void *data_ptr,
 #if CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC
 #if TF_MBEDTLS_USE_AES_GCM
 REGISTER_CRYPTO_LIB(LIB_NAME, init, verify_signature, verify_hash, calc_hash,
-                   auth_decrypt);
+                   auth_decrypt, NULL);
 #else
 REGISTER_CRYPTO_LIB(LIB_NAME, init, verify_signature, verify_hash, calc_hash,
-                   NULL);
+                   NULL, NULL);
 #endif
 #elif CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_ONLY
 #if TF_MBEDTLS_USE_AES_GCM
 REGISTER_CRYPTO_LIB(LIB_NAME, init, verify_signature, verify_hash,
-                   auth_decrypt);
+                   auth_decrypt, NULL);
 #else
-REGISTER_CRYPTO_LIB(LIB_NAME, init, verify_signature, verify_hash, NULL);
+REGISTER_CRYPTO_LIB(LIB_NAME, init, verify_signature, verify_hash, NULL, NULL);
 #endif
 #elif CRYPTO_SUPPORT == CRYPTO_HASH_CALC_ONLY
 REGISTER_CRYPTO_LIB(LIB_NAME, init, calc_hash);
index 646e981f700ef81ed8124fa75f032b59de81c016..a7fb898b0f29000f2fead6fa4e426141d6cdef0d 100644 (file)
@@ -120,4 +120,4 @@ static int verify_hash(void *data_ptr, unsigned int data_len,
 /*
  * Register crypto library descriptor
  */
-REGISTER_CRYPTO_LIB(LIB_NAME, init, verify_signature, verify_hash, NULL);
+REGISTER_CRYPTO_LIB(LIB_NAME, init, verify_signature, verify_hash, NULL, NULL);
index 3a23df4b7c4d675c5fb5a8540ad234021ab76843..498fdcb7948351891df6854f600c99045aba082a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2022, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2015-2023, Arm Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -74,6 +74,10 @@ CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC
 #endif /* CRYPTO_SUPPORT == CRYPTO_HASH_CALC_ONLY || \
          CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC */
 
+       /* Convert Public key (optional) */
+       int (*convert_pk)(void *full_pk_ptr, unsigned int full_pk_len,
+                         void **hashed_pk_ptr, unsigned int *hashed_pk_len);
+
        /*
         * Authenticated decryption. Return one of the
         * 'enum crypto_ret_value' options.
@@ -119,27 +123,32 @@ int crypto_mod_calc_hash(enum crypto_md_algo alg, void *data_ptr,
 #endif /* CRYPTO_SUPPORT == CRYPTO_HASH_CALC_ONLY || \
          CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC */
 
+int crypto_mod_convert_pk(void *full_pk_ptr, unsigned int full_pk_len,
+                         void **hashed_pk_ptr, unsigned int *hashed_pk_len);
+
 #if CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC
 /* Macro to register a cryptographic library */
 #define REGISTER_CRYPTO_LIB(_name, _init, _verify_signature, _verify_hash, \
-                           _calc_hash, _auth_decrypt) \
+                           _calc_hash, _auth_decrypt, _convert_pk) \
        const crypto_lib_desc_t crypto_lib_desc = { \
                .name = _name, \
                .init = _init, \
                .verify_signature = _verify_signature, \
                .verify_hash = _verify_hash, \
                .calc_hash = _calc_hash, \
-               .auth_decrypt = _auth_decrypt \
+               .auth_decrypt = _auth_decrypt, \
+               .convert_pk = _convert_pk \
        }
 #elif CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_ONLY
 #define REGISTER_CRYPTO_LIB(_name, _init, _verify_signature, _verify_hash, \
-                           _auth_decrypt) \
+                           _auth_decrypt, _convert_pk) \
        const crypto_lib_desc_t crypto_lib_desc = { \
                .name = _name, \
                .init = _init, \
                .verify_signature = _verify_signature, \
                .verify_hash = _verify_hash, \
-               .auth_decrypt = _auth_decrypt \
+               .auth_decrypt = _auth_decrypt, \
+               .convert_pk = _convert_pk \
        }
 #elif CRYPTO_SUPPORT == CRYPTO_HASH_CALC_ONLY
 #define REGISTER_CRYPTO_LIB(_name, _init, _calc_hash) \
index 72d3160184cc5f9069397663d477350138e041b1..d146a29455e397c8a15d7bf1500ac99ef4ae5ccd 100644 (file)
@@ -352,8 +352,6 @@ int plat_get_nv_ctr(void *cookie, unsigned int *nv_ctr);
 int plat_set_nv_ctr(void *cookie, unsigned int nv_ctr);
 int plat_set_nv_ctr2(void *cookie, const struct auth_img_desc_s *img_desc,
                unsigned int nv_ctr);
-int plat_convert_pk(void *full_pk_ptr, unsigned int full_pk_len,
-                   void **hashed_pk_ptr, unsigned int *hash_pk_len);
 int get_mbedtls_heap_helper(void **heap_addr, size_t *heap_size);
 int plat_get_enc_key_info(enum fw_enc_status_t fw_enc_status, uint8_t *key,
                          size_t *key_len, unsigned int *flags,
index 0da00193a5bb47c6cd8493ac8870118800ef6023..373a0081500884732d25e501fe51c5503287179c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, STMicroelectronics - All Rights Reserved
+ * Copyright (c) 2022-2023, STMicroelectronics - All Rights Reserved
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -167,8 +167,8 @@ uint32_t verify_signature(uint8_t *hash_in, uint8_t *pubkey_in,
        return ret;
 }
 
-int plat_convert_pk(void *full_pk_ptr, unsigned int full_pk_len,
-                   void **hashed_pk_ptr, unsigned int *hashed_pk_len)
+static int crypto_convert_pk(void *full_pk_ptr, unsigned int full_pk_len,
+                            void **hashed_pk_ptr, unsigned int *hashed_pk_len)
 {
        return get_plain_pk_from_asn1(full_pk_ptr, full_pk_len, hashed_pk_ptr, hashed_pk_len, NULL);
 }
@@ -220,8 +220,8 @@ static uint32_t verify_signature(uint8_t *hash_in, uint8_t *pubkey_in,
        return 0;
 }
 
-int plat_convert_pk(void *full_pk_ptr, unsigned int full_pk_len,
-                   void **hashed_pk_ptr, unsigned int *hashed_pk_len)
+static int crypto_convert_pk(void *full_pk_ptr, unsigned int full_pk_len,
+                            void **hashed_pk_ptr, unsigned int *hashed_pk_len)
 {
        static uint8_t st_pk[CRYPTO_PUBKEY_MAX_SIZE + sizeof(uint32_t)];
        int ret;
@@ -650,13 +650,14 @@ REGISTER_CRYPTO_LIB("stm32_crypto_lib",
                    crypto_lib_init,
                    crypto_verify_signature,
                    crypto_verify_hash,
-                   crypto_auth_decrypt);
+                   crypto_auth_decrypt,
+                   crypto_convert_pk);
 
 #else /* No decryption support */
 REGISTER_CRYPTO_LIB("stm32_crypto_lib",
                    crypto_lib_init,
                    crypto_verify_signature,
                    crypto_verify_hash,
-                   NULL);
-
+                   NULL,
+                   crypto_convert_pk);
 #endif