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