Add the following tests:
No.15 - verify loaded data witha signature
No.16 - verify loaded data witha signature under signature enforcing

For each test, there are several test cases:
* no signature provided
* valid signature provided
* invalid signature provided

Signed-off-by: AKASHI Takahiro <takahiro.aka...@linaro.org>
Cc: Luis R. Rodriguez <mcg...@suse.com>
---
 lib/test_driver_data.c                          |  56 ++++-
 tools/testing/selftests/firmware/driver_data.sh | 265 +++++++++++++++++++++++-
 2 files changed, 315 insertions(+), 6 deletions(-)

diff --git a/lib/test_driver_data.c b/lib/test_driver_data.c
index 422ea6289396..660cf9ff9ac0 100644
--- a/lib/test_driver_data.c
+++ b/lib/test_driver_data.c
@@ -85,6 +85,9 @@ int num_test_devs;
  * @api_min: API min version to use for the test.
  * @api_max: API max version to use for the test.
  * @api_name_postfix: API name postfix
+ * @no_sig_check: whether or not we wish to verify the driver_data with its
+ *      signature. If CONFIG_FIRMWARE_SIG_ENFORCE, passing the verification
+ *      is mandatory.
  * @test_result: a test may use this to collect the result from the call
  *     of the driver_data_request_async() or driver_data_request_sync() calls
  *     used in their tests. Note that for async calls this typically will be a
@@ -125,6 +128,7 @@ struct test_config {
        u8 api_min;
        u8 api_max;
        char *api_name_postfix;
+       bool no_sig_check;
 
        int test_result;
 };
@@ -345,6 +349,9 @@ static ssize_t config_show(struct device *dev,
        len += snprintf(buf+len, PAGE_SIZE,
                        "keep:\t\t%s\n",
                        config->keep ? "true" : "false");
+       len += snprintf(buf+len, PAGE_SIZE,
+                       "no_sig_check:\t%s\n",
+                       config->no_sig_check ? "true" : "false");
 
        mutex_unlock(&test_dev->config_mutex);
 
@@ -443,6 +450,9 @@ static int config_sync_req_cb(void *context,
 {
        struct driver_data_test_device *test_dev = context;
 
+       if (unused_error)
+               return unused_error;
+
        return config_load_data(test_dev, driver_data);
 }
 
@@ -455,14 +465,19 @@ static int trigger_config_sync(struct 
driver_data_test_device *test_dev)
                                              (config->optional ?
                                               DRIVER_DATA_REQ_OPTIONAL : 0) |
                                              (config->keep ?
-                                              DRIVER_DATA_REQ_KEEP : 0)),
+                                              DRIVER_DATA_REQ_KEEP : 0) |
+                                             (config->no_sig_check ?
+                                              DRIVER_DATA_REQ_NO_SIG_CHECK :
+                                              0)),
        };
        const struct driver_data_req_params req_params_opt_cb = {
                DRIVER_DATA_DEFAULT_SYNC(config_sync_req_cb, test_dev),
                DRIVER_DATA_SYNC_OPT_CB(config_sync_req_default_cb,
                                             test_dev),
                .reqs = (config->optional ? DRIVER_DATA_REQ_OPTIONAL : 0) |
-                       (config->keep ? DRIVER_DATA_REQ_KEEP : 0),
+                       (config->keep ? DRIVER_DATA_REQ_KEEP : 0) |
+                       (config->no_sig_check ? DRIVER_DATA_REQ_NO_SIG_CHECK :
+                                               0),
        };
        const struct driver_data_req_params *req_params;
 
@@ -528,20 +543,26 @@ static int trigger_config_async(struct 
driver_data_test_device *test_dev)
        const struct driver_data_req_params req_params_default = {
                DRIVER_DATA_DEFAULT_ASYNC(config_async_req_cb, test_dev),
                .reqs = (config->optional ? DRIVER_DATA_REQ_OPTIONAL : 0) |
-                       (config->keep ? DRIVER_DATA_REQ_KEEP : 0),
+                       (config->keep ? DRIVER_DATA_REQ_KEEP : 0) |
+                       (config->no_sig_check ? DRIVER_DATA_REQ_NO_SIG_CHECK :
+                                               0),
        };
        const struct driver_data_req_params req_params_opt_cb = {
                DRIVER_DATA_DEFAULT_ASYNC(config_async_req_cb, test_dev),
                DRIVER_DATA_ASYNC_OPT_CB(config_async_req_default_cb, test_dev),
                .reqs = (config->optional ? DRIVER_DATA_REQ_OPTIONAL : 0) |
-                       (config->keep ? DRIVER_DATA_REQ_KEEP : 0),
+                       (config->keep ? DRIVER_DATA_REQ_KEEP : 0) |
+                       (config->no_sig_check ? DRIVER_DATA_REQ_NO_SIG_CHECK :
+                                               0),
        };
        const struct driver_data_req_params req_params_api = {
                DRIVER_DATA_API_CB(config_async_req_api_cb, test_dev),
                DRIVER_DATA_API(config->api_min, config->api_max, 
config->api_name_postfix),
                .reqs = (config->optional ? DRIVER_DATA_REQ_OPTIONAL : 0) |
                        (config->keep ? DRIVER_DATA_REQ_KEEP : 0) |
-                       (config->use_api_versioning ? 
DRIVER_DATA_REQ_USE_API_VERSIONING : 0),
+                       (config->use_api_versioning ? 
DRIVER_DATA_REQ_USE_API_VERSIONING : 0) |
+                       (config->no_sig_check ? DRIVER_DATA_REQ_NO_SIG_CHECK :
+                                               0),
        };
        const struct driver_data_req_params *req_params;
 
@@ -670,6 +691,7 @@ static int __driver_data_config_init(struct test_config 
*config)
        config->use_api_versioning = false;
        config->api_min = 0;
        config->api_max = 0;
+       config->no_sig_check = false;
        config->test_result = 0;
 
        return 0;
@@ -1108,6 +1130,29 @@ static ssize_t config_api_name_postfix_show(struct 
device *dev,
 static DEVICE_ATTR(config_api_name_postfix, 0644, config_api_name_postfix_show,
                   config_api_name_postfix_store);
 
+static ssize_t config_no_sig_check_store(struct device *dev,
+                                        struct device_attribute *attr,
+                                        const char *buf, size_t count)
+{
+       struct driver_data_test_device *test_dev = dev_to_test_dev(dev);
+       struct test_config *config = &test_dev->config;
+
+       return test_dev_config_update_bool(test_dev, buf, count,
+                                          &config->no_sig_check);
+}
+
+static ssize_t config_no_sig_check_show(struct device *dev,
+                                       struct device_attribute *attr,
+                                       char *buf)
+{
+       struct driver_data_test_device *test_dev = dev_to_test_dev(dev);
+       struct test_config *config = &test_dev->config;
+
+       return test_dev_config_show_bool(test_dev, buf, config->no_sig_check);
+}
+static DEVICE_ATTR(config_no_sig_check, 0644, config_no_sig_check_show,
+                  config_no_sig_check_store);
+
 static ssize_t test_result_store(struct device *dev,
                                 struct device_attribute *attr,
                                 const char *buf, size_t count)
@@ -1147,6 +1192,7 @@ static struct attribute *test_dev_attrs[] = {
        TEST_DRIVER_DATA_DEV_ATTR(config_api_min),
        TEST_DRIVER_DATA_DEV_ATTR(config_api_max),
        TEST_DRIVER_DATA_DEV_ATTR(config_api_name_postfix),
+       TEST_DRIVER_DATA_DEV_ATTR(config_no_sig_check),
        TEST_DRIVER_DATA_DEV_ATTR(test_result),
 
        NULL,
diff --git a/tools/testing/selftests/firmware/driver_data.sh 
b/tools/testing/selftests/firmware/driver_data.sh
index bfd0436cce47..f9c52a87b9d0 100755
--- a/tools/testing/selftests/firmware/driver_data.sh
+++ b/tools/testing/selftests/firmware/driver_data.sh
@@ -54,6 +54,10 @@ ALL_TESTS="$ALL_TESTS 0013:1:1"
 # system_wakeupakeup | socat - /dev/pts/7,raw,echo=0,crnl
 #ALL_TESTS="$ALL_TESTS 0014:0:1"
 
+# Before running these tests, we must prepare an appropriate signature.
+#ALL_TESTS="$ALL_TESTS 0015:1:1"
+#ALL_TESTS="$ALL_TESTS 0016:1:1"
+
 test_modprobe()
 {
        if [ ! -d $DIR ]; then
@@ -100,6 +104,10 @@ function allow_user_defaults()
 
        # This is an unlikely real-world firmware content. :)
        echo "ABCD0123" >"$FW"
+
+       # TODO: some set-up is necessary in advance
+       cp ${TEST_DIR}/fwbin/*sig*-*.bin ${FWPATH}
+       cp ${TEST_DIR}/fwbin/*sig*-*.bin.p7s ${FWPATH}
 }
 
 test_reqs()
@@ -133,7 +141,7 @@ test_finish()
 {
        echo -n "$OLD_PATH" >/sys/module/firmware_class/parameters/path
        rm -f "$FW"
-       rmdir "$FWPATH"
+       rm -rf "$FWPATH"
 }
 
 errno_name_to_val()
@@ -147,6 +155,12 @@ errno_name_to_val()
                echo -2;;
        -EINVAL)
                echo -22;;
+       -EBADMSG)
+               echo -74;;
+       -ENOKEY)
+               echo -126;;
+       -EKEYREJECTED)
+               echo -129;;
        -ERR_ANY)
                echo -123456;;
        *)
@@ -164,12 +178,37 @@ errno_val_to_name()
                echo -ENOENT;;
        -22)
                echo -EINVAL;;
+       -74)
+               echo -EBADMSG;;
+       -126)
+               echo -ENOKEY;;
+       -129)
+               echo -EKEYREJECTED;;
        -123456)
                echo -ERR_ANY;;
        *)
                echo invalid;;
        esac
 
+is_not_sig_enforced()
+{
+       if [ "Y" == \
+               $(cat /sys/module/firmware_class/parameters/fw_sig_enforce) ]
+       then
+               echo "$0: Signature enforced. Cannot run this test." >&2
+               exit 1
+       fi
+}
+
+enforce_sig_check()
+{
+       if ! echo -n 1 >/sys/module/firmware_class/parameters/fw_sig_enforce
+       then
+               echo "$0: Unable to set to fw_sig_enforce" >&2
+               exit 1
+       fi
+}
+
 config_set_async()
 {
        if ! echo -n 1 >$DIR/config_async ; then
@@ -202,6 +241,22 @@ config_disable_optional()
        fi
 }
 
+config_set_sig_check()
+{
+       if ! echo -n 0 >$DIR/config_no_sig_check ; then
+               echo "$0: Unable to set to sig_check" >&2
+               exit 1
+       fi
+}
+
+config_disable_sig_check()
+{
+       if ! echo -n 1 >$DIR/config_no_sig_check ; then
+               echo "$0: Unable to disable sig_check" >&2
+               exit 1
+       fi
+}
+
 config_set_keep()
 {
        if ! echo -n 1 >$DIR/config_keep; then
@@ -820,6 +875,212 @@ driver_data_test_0014()
        driver_data_test_0014a
 }
 
+# no signature provided, with driver not requiring it
+driver_data_test_0015_1_1()
+{
+       NAME=nosig-$DEFAULT_DRIVER_DATA
+
+       driver_data_set_sync_defaults
+       config_set_name $NAME
+       config_disable_sig_check
+       config_trigger ${FUNCNAME[0]}
+       config_file_should_match ${FUNCNAME[0]}
+       config_expect_result ${FUNCNAME[0]} SUCCESS
+}
+
+# good signature, with driver not requiring it
+driver_data_test_0015_1_2()
+{
+       NAME=goodsig-$DEFAULT_DRIVER_DATA
+
+       driver_data_set_sync_defaults
+       config_set_name $NAME
+       config_disable_sig_check
+       config_trigger ${FUNCNAME[0]}
+       config_file_should_match ${FUNCNAME[0]}
+       config_expect_result ${FUNCNAME[0]} SUCCESS
+}
+
+# no signature provided (ENOENT)
+driver_data_test_0015_2()
+{
+       NAME=nosig-$DEFAULT_DRIVER_DATA
+
+       driver_data_set_sync_defaults
+       config_set_name $NAME
+       config_set_sig_check
+       config_trigger ${FUNCNAME[0]}
+       config_file_should_match ${FUNCNAME[0]}
+       config_expect_result ${FUNCNAME[0]} SUCCESS
+}
+
+# good signature
+driver_data_test_0015_3()
+{
+       NAME=goodsig-$DEFAULT_DRIVER_DATA
+
+       driver_data_set_sync_defaults
+       config_set_name $NAME
+       config_set_sig_check
+       config_trigger ${FUNCNAME[0]}
+       config_file_should_match ${FUNCNAME[0]}
+       config_expect_result ${FUNCNAME[0]} SUCCESS
+}
+
+# signature not signed with a trusted key (ENOKEY)
+driver_data_test_0015_4()
+{
+       NAME=badsig1-$DEFAULT_DRIVER_DATA
+
+       driver_data_set_sync_defaults
+       config_set_name $NAME
+       config_set_sig_check
+       config_trigger ${FUNCNAME[0]}
+       config_file_should_match ${FUNCNAME[0]}
+       config_expect_result ${FUNCNAME[0]} SUCCESS
+}
+
+# digest doens't match (wrong hash value) (EKEYREJECTED)
+driver_data_test_0015_5()
+{
+       NAME=badsig2-$DEFAULT_DRIVER_DATA
+
+       driver_data_set_sync_defaults
+       config_set_name $NAME
+       config_set_sig_check
+       config_trigger ${FUNCNAME[0]}
+       config_file_should_match ${FUNCNAME[0]}
+       config_expect_result ${FUNCNAME[0]} SUCCESS
+}
+
+# signature corrupted/parsing error (EBADMSG)
+driver_data_test_0015_6()
+{
+       NAME=badsig3-$DEFAULT_DRIVER_DATA
+
+       driver_data_set_sync_defaults
+       config_set_name $NAME
+       config_set_sig_check
+       config_trigger ${FUNCNAME[0]}
+       config_file_should_match ${FUNCNAME[0]}
+       config_expect_result ${FUNCNAME[0]} SUCCESS
+}
+
+driver_data_test_0015()
+{
+       is_not_sig_enforced
+
+       driver_data_test_0015_1_1
+       driver_data_test_0015_1_2
+       driver_data_test_0015_2
+       driver_data_test_0015_3
+       driver_data_test_0015_4
+       driver_data_test_0015_5
+       driver_data_test_0015_6
+}
+
+# no signature provided, with driver not requiring it
+driver_data_test_0016_1_1()
+{
+       NAME=nosig-$DEFAULT_DRIVER_DATA
+
+       driver_data_set_sync_defaults
+       config_set_name $NAME
+       config_disable_sig_check
+       config_trigger ${FUNCNAME[0]}
+       config_file_should_match ${FUNCNAME[0]}
+       config_expect_result ${FUNCNAME[0]} SUCCESS
+}
+
+# good signature, with driver not requiring it
+driver_data_test_0016_1_2()
+{
+       NAME=goodsig-$DEFAULT_DRIVER_DATA
+
+       driver_data_set_sync_defaults
+       config_set_name $NAME
+       config_disable_sig_check
+       config_trigger ${FUNCNAME[0]}
+       config_file_should_match ${FUNCNAME[0]}
+       config_expect_result ${FUNCNAME[0]} SUCCESS
+}
+
+# no signature provided (ENOENT)
+driver_data_test_0016_2()
+{
+       NAME=nosig-$DEFAULT_DRIVER_DATA
+
+       driver_data_set_sync_defaults
+       config_set_name $NAME
+       config_set_sig_check
+       config_trigger_want_fail ${FUNCNAME[0]}
+       config_expect_result ${FUNCNAME[0]} -ENOENT
+}
+
+# good signature
+driver_data_test_0016_3()
+{
+       NAME=goodsig-$DEFAULT_DRIVER_DATA
+
+       driver_data_set_sync_defaults
+       config_set_name $NAME
+       config_set_sig_check
+       config_trigger ${FUNCNAME[0]}
+       config_file_should_match ${FUNCNAME[0]}
+       config_expect_result ${FUNCNAME[0]} SUCCESS
+}
+
+# signature not signed with a trusted key (ENOKEY)
+driver_data_test_0016_4()
+{
+       NAME=badsig1-$DEFAULT_DRIVER_DATA
+
+       driver_data_set_sync_defaults
+       config_set_name $NAME
+       config_set_sig_check
+       config_trigger_want_fail ${FUNCNAME[0]}
+       config_expect_result ${FUNCNAME[0]} -ENOKEY
+}
+
+# digest doens't match (wrong hash value) (EKEYREJECTED)
+driver_data_test_0016_5()
+{
+       NAME=badsig2-$DEFAULT_DRIVER_DATA
+
+       driver_data_set_sync_defaults
+       config_set_name $NAME
+       config_set_sig_check
+       config_trigger_want_fail ${FUNCNAME[0]}
+       config_expect_result ${FUNCNAME[0]} -EKEYREJECTED
+}
+
+# signature corrupted/parsing error (EBADMSG)
+driver_data_test_0016_6()
+{
+       NAME=badsig3-$DEFAULT_DRIVER_DATA
+
+       driver_data_set_sync_defaults
+       config_set_name $NAME
+       config_set_sig_check
+       config_trigger_want_fail ${FUNCNAME[0]}
+       config_expect_result ${FUNCNAME[0]} -EBADMSG
+}
+
+# This test case must be run at the last.
+# Otherwe we must reboot the kernel to reset fw_sig_enforce.
+driver_data_test_0016()
+{
+       enforce_sig_check
+
+       driver_data_test_0016_1_1
+       driver_data_test_0016_1_2
+       driver_data_test_0016_2
+       driver_data_test_0016_3
+       driver_data_test_0016_4
+       driver_data_test_0016_5
+       driver_data_test_0016_6
+}
+
 list_tests()
 {
        echo "Test ID list:"
@@ -842,6 +1103,8 @@ list_tests()
        echo "0012 x $(get_test_count 0012) - Verify api call wills will hunt 
for files, ignore file"
        echo "0013 x $(get_test_count 0013) - Verify api call works"
        echo "0014 x $(get_test_count 0013) - Verify api call works with 
suspend + resume"
+       echo "0015 x $(get_test_count 0015) - Verify loaded data with signature"
+       echo "0016 x $(get_test_count 0016) - Verify loaded data with signature 
under signature enforcing"
 }
 
 test_reqs
-- 
2.11.1

Reply via email to