13333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
23333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler * Use of this source code is governed by a BSD-style license that can be
33333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler * found in the LICENSE file.
43333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler *
53333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler * Tests for firmware secure storage library.
63333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler */
73333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler
83333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler#include <stdint.h>
93333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler#include <stdio.h>
103333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler#include <stdlib.h>
113333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler#include <string.h>
123333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler
133333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler#include "test_common.h"
143333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler#include "vboot_common.h"
153333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler
163333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler#include "2common.h"
173333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler#include "2api.h"
18b550fb180487f161b3f704056f6e05a9cce9d308Julius Werner#include "2misc.h"
193333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler#include "2secdata.h"
203333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler
213333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spanglerstatic void test_changed(struct vb2_context *ctx, int changed, const char *why)
223333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler{
233333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	if (changed)
243333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler		TEST_NEQ(ctx->flags & VB2_CONTEXT_SECDATA_CHANGED, 0, why);
253333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	else
263333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler		TEST_EQ(ctx->flags & VB2_CONTEXT_SECDATA_CHANGED, 0, why);
273333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler
283333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	ctx->flags &= ~VB2_CONTEXT_SECDATA_CHANGED;
293333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler};
303333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler
313333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spanglerstatic void secdata_test(void)
323333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler{
3373e5eb38821d693244f841ce4f0a14546e5b6361Bill Richardson	uint8_t workbuf[VB2_WORKBUF_RECOMMENDED_SIZE]
3473e5eb38821d693244f841ce4f0a14546e5b6361Bill Richardson		__attribute__ ((aligned (VB2_WORKBUF_ALIGN)));
353333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	struct vb2_context c = {
363333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler		.flags = 0,
373333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler		.workbuf = workbuf,
383333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler		.workbuf_size = sizeof(workbuf),
393333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	};
403333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	uint32_t v = 1;
413333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler
423333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	/* Blank data is invalid */
433333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	memset(c.secdata, 0xa6, sizeof(c.secdata));
44b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_EQ(vb2_secdata_check_crc(&c),
45b9be53640efdee92b1b42e60adda274563236301Randall Spangler		VB2_ERROR_SECDATA_CRC, "Check blank CRC");
46b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_EQ(vb2_secdata_init(&c),
47b9be53640efdee92b1b42e60adda274563236301Randall Spangler		 VB2_ERROR_SECDATA_CRC, "Init blank CRC");
483333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler
493333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	/* Create good data */
50b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_SUCC(vb2_secdata_create(&c), "Create");
51b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_SUCC(vb2_secdata_check_crc(&c), "Check created CRC");
52b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_SUCC(vb2_secdata_init(&c), "Init created CRC");
533333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	test_changed(&c, 1, "Create changes data");
543333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler
553333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	/* Now corrupt it */
563333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	c.secdata[2]++;
57b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_EQ(vb2_secdata_check_crc(&c),
58b9be53640efdee92b1b42e60adda274563236301Randall Spangler		VB2_ERROR_SECDATA_CRC, "Check invalid CRC");
59b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_EQ(vb2_secdata_init(&c),
60b9be53640efdee92b1b42e60adda274563236301Randall Spangler		 VB2_ERROR_SECDATA_CRC, "Init invalid CRC");
613333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler
623333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	vb2_secdata_create(&c);
633333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	c.flags = 0;
643333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler
653333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	/* Read/write flags */
66b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_SUCC(vb2_secdata_get(&c, VB2_SECDATA_FLAGS, &v), "Get flags");
673333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	TEST_EQ(v, 0, "Flags created 0");
683333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	test_changed(&c, 0, "Get doesn't change data");
69b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_SUCC(vb2_secdata_set(&c, VB2_SECDATA_FLAGS, 0x12), "Set flags");
703333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	test_changed(&c, 1, "Set changes data");
71b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_SUCC(vb2_secdata_set(&c, VB2_SECDATA_FLAGS, 0x12), "Set flags 2");
723333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	test_changed(&c, 0, "Set again doesn't change data");
73b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_SUCC(vb2_secdata_get(&c, VB2_SECDATA_FLAGS, &v), "Get flags 2");
743333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	TEST_EQ(v, 0x12, "Flags changed");
75b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_EQ(vb2_secdata_set(&c, VB2_SECDATA_FLAGS, 0x100),
76b9be53640efdee92b1b42e60adda274563236301Randall Spangler		VB2_ERROR_SECDATA_SET_FLAGS, "Bad flags");
773333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler
783333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	/* Read/write versions */
79b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_SUCC(vb2_secdata_get(&c, VB2_SECDATA_VERSIONS, &v),
80b9be53640efdee92b1b42e60adda274563236301Randall Spangler		  "Get versions");
813333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	TEST_EQ(v, 0, "Versions created 0");
823333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	test_changed(&c, 0, "Get doesn't change data");
83b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_SUCC(vb2_secdata_set(&c, VB2_SECDATA_VERSIONS, 0x123456ff),
84b9be53640efdee92b1b42e60adda274563236301Randall Spangler		  "Set versions");
853333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	test_changed(&c, 1, "Set changes data");
86b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_SUCC(vb2_secdata_set(&c, VB2_SECDATA_VERSIONS, 0x123456ff),
87b9be53640efdee92b1b42e60adda274563236301Randall Spangler		  "Set versions 2");
883333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	test_changed(&c, 0, "Set again doesn't change data");
89b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_SUCC(vb2_secdata_get(&c, VB2_SECDATA_VERSIONS, &v),
90b9be53640efdee92b1b42e60adda274563236301Randall Spangler		  "Get versions 2");
913333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	TEST_EQ(v, 0x123456ff, "Versions changed");
923333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler
933333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	/* Invalid field fails */
94b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_EQ(vb2_secdata_get(&c, -1, &v),
95b9be53640efdee92b1b42e60adda274563236301Randall Spangler		VB2_ERROR_SECDATA_GET_PARAM, "Get invalid");
96b9be53640efdee92b1b42e60adda274563236301Randall Spangler	TEST_EQ(vb2_secdata_set(&c, -1, 456),
97b9be53640efdee92b1b42e60adda274563236301Randall Spangler		VB2_ERROR_SECDATA_SET_PARAM, "Set invalid");
983333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	test_changed(&c, 0, "Set invalid field doesn't change data");
99b550fb180487f161b3f704056f6e05a9cce9d308Julius Werner
100b550fb180487f161b3f704056f6e05a9cce9d308Julius Werner	/* Read/write uninitialized data fails */
101b550fb180487f161b3f704056f6e05a9cce9d308Julius Werner	vb2_get_sd(&c)->status &= ~VB2_SD_STATUS_SECDATA_INIT;
102b550fb180487f161b3f704056f6e05a9cce9d308Julius Werner	TEST_EQ(vb2_secdata_get(&c, VB2_SECDATA_VERSIONS, &v),
103b550fb180487f161b3f704056f6e05a9cce9d308Julius Werner		VB2_ERROR_SECDATA_GET_UNINITIALIZED, "Get uninitialized");
104b550fb180487f161b3f704056f6e05a9cce9d308Julius Werner	test_changed(&c, 0, "Get uninitialized doesn't change data");
105b550fb180487f161b3f704056f6e05a9cce9d308Julius Werner	TEST_EQ(vb2_secdata_set(&c, VB2_SECDATA_VERSIONS, 0x123456ff),
106b550fb180487f161b3f704056f6e05a9cce9d308Julius Werner		VB2_ERROR_SECDATA_SET_UNINITIALIZED, "Set uninitialized");
107b550fb180487f161b3f704056f6e05a9cce9d308Julius Werner	test_changed(&c, 0, "Set uninitialized doesn't change data");
1083333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler}
1093333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler
1103333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spanglerint main(int argc, char* argv[])
1113333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler{
1123333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	secdata_test();
1133333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler
1143333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler	return gTestSuccess ? 0 : 255;
1153333e578497aafc4eb8c6e1e359f6e2b1dee633aRandall Spangler}
116