Convert common tests from shell scripts to running directly
So they can run under qemu.
Also, mount /proc and /dev before running qemu in the chroot.
BUG=chromium-os:37916
BRANCH=none
TEST=manual
make runtests
sudo FEATURES=test emerge vboot_reference
FEATURES=test emerge-daisy vboot_reference
FEATURES=test emerge-link vboot_reference
Change-Id: I940ce370bd149621e666250b07cf9219f9e22bac
Signed-off-by: Randall Spangler <rspangler@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/41786
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
diff --git a/tests/vboot_common3_tests.c b/tests/vboot_common3_tests.c
index a63e477..ce818a4 100644
--- a/tests/vboot_common3_tests.c
+++ b/tests/vboot_common3_tests.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
@@ -7,6 +7,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include "cryptolib.h"
#include "file_keys.h"
@@ -254,56 +255,107 @@
free(hdr);
}
+int test_permutation(int signing_key_algorithm, int data_key_algorithm,
+ const char *keys_dir)
+{
+ char filename[1024];
+ int signing_rsa_len = siglen_map[signing_key_algorithm] * 8;;
+ int data_rsa_len = siglen_map[data_key_algorithm] * 8;;
-int main(int argc, char* argv[]) {
- VbPrivateKey* signing_private_key = NULL;
- VbPublicKey* signing_public_key = NULL;
- int signing_key_algorithm;
+ VbPrivateKey* signing_private_key = NULL;
+ VbPublicKey* signing_public_key = NULL;
+ VbPublicKey* data_public_key = NULL;
- VbPublicKey* data_public_key = NULL;
- int data_key_algorithm;
+ printf("***Testing signing algorithm: %s\n",
+ algo_strings[signing_key_algorithm]);
+ printf("***With data key algorithm: %s\n",
+ algo_strings[data_key_algorithm]);
- int error_code = 0;
+ sprintf(filename, "%s/key_rsa%d.pem", keys_dir, signing_rsa_len);
+ signing_private_key = PrivateKeyReadPem(filename,
+ signing_key_algorithm);
+ if (!signing_private_key) {
+ fprintf(stderr, "Error reading signing_private_key: %s\n",
+ filename);
+ return 1;
+ }
- if(argc != 7) {
- fprintf(stderr, "Usage: %s <signing_key_algorithm> <data_key_algorithm>"
- " <signing key> <processed signing pubkey>"
- " <data key> <processed data pubkey>\n", argv[0]);
- return -1;
- }
+ sprintf(filename, "%s/key_rsa%d.keyb", keys_dir, signing_rsa_len);
+ signing_public_key = PublicKeyReadKeyb(filename,
+ signing_key_algorithm, 1);
+ if (!signing_public_key) {
+ fprintf(stderr, "Error reading signing_public_key: %s\n",
+ filename);
+ return 1;
+ }
- /* Read verification keys and create a test image. */
- signing_key_algorithm = atoi(argv[1]);
- data_key_algorithm = atoi(argv[2]);
+ sprintf(filename, "%s/key_rsa%d.keyb", keys_dir, data_rsa_len);
+ data_public_key = PublicKeyReadKeyb(filename,
+ data_key_algorithm, 1);
+ if (!data_public_key) {
+ fprintf(stderr, "Error reading data_public_key: %s\n",
+ filename);
+ return 1;
+ }
- signing_private_key = PrivateKeyReadPem(argv[3], signing_key_algorithm);
- if (!signing_private_key) {
- fprintf(stderr, "Error reading signing_private_key");
- return 1;
- }
+ KeyBlockVerifyTest(signing_public_key, signing_private_key,
+ data_public_key);
+ VerifyFirmwarePreambleTest(signing_public_key, signing_private_key,
+ data_public_key);
- signing_public_key = PublicKeyReadKeyb(argv[4], signing_key_algorithm, 1);
- if (!signing_public_key) {
- fprintf(stderr, "Error reading signing_public_key");
- return 1;
- }
+ if (signing_public_key)
+ free(signing_public_key);
+ if (signing_private_key)
+ free(signing_private_key);
+ if (data_public_key)
+ free(data_public_key);
- data_public_key = PublicKeyReadKeyb(argv[6], data_key_algorithm, 1);
- if (!data_public_key) {
- fprintf(stderr, "Error reading data_public_key");
- return 1;
- }
+ return 0;
+}
- KeyBlockVerifyTest(signing_public_key, signing_private_key, data_public_key);
- VerifyFirmwarePreambleTest(signing_public_key, signing_private_key,
- data_public_key);
+struct test_perm
+{
+ int signing_algorithm;
+ int data_key_algorithm;
+};
- if (signing_public_key)
- free(signing_public_key);
- if (signing_private_key)
- free(signing_private_key);
- if (data_public_key)
- free(data_public_key);
+/*
+ * Permutations of signing and data key algorithms in active use:
+ * 7 (rsa4096 sha256) - 4 (rsa2048 sha256)
+ * 11 (rsa8192 sha512) - 4 (rsa2048 sha256)
+ * 11 (rsa8192 sha512) - 7 (rsa4096 sha256)
+ */
+const struct test_perm test_perms[] = {{7, 4}, {11, 4}, {11, 7}};
- return error_code;
+int main(int argc, char* argv[])
+{
+ if (argc == 2) {
+ /* Test only the algorithms we use */
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(test_perms); i++) {
+ if (test_permutation(test_perms[i].signing_algorithm,
+ test_perms[i].data_key_algorithm,
+ argv[1]))
+ return 1;
+ }
+
+ } else if (argc == 3 && !strcasecmp(argv[2], "--all")) {
+ /* Test all the algorithms */
+ int sign_alg, data_alg;
+
+ for (sign_alg = 0; sign_alg < kNumAlgorithms; sign_alg++) {
+ for (data_alg = 0; data_alg < kNumAlgorithms;
+ data_alg++) {
+ if (test_permutation(sign_alg, data_alg,
+ argv[1]))
+ return 1;
+ }
+ }
+ } else {
+ fprintf(stderr, "Usage: %s <keys_dir> [--all]", argv[0]);
+ return -1;
+ }
+
+ return gTestSuccess ? 0 : 255;
}