summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/2lib/2secdata.c19
-rw-r--r--firmware/2lib/include/2return_codes.h6
-rw-r--r--tests/vb2_secdata_tests.c17
3 files changed, 26 insertions, 16 deletions
diff --git a/firmware/2lib/2secdata.c b/firmware/2lib/2secdata.c
index 0c5a34e4..c2983e71 100644
--- a/firmware/2lib/2secdata.c
+++ b/firmware/2lib/2secdata.c
@@ -42,27 +42,22 @@ int vb2_secdata_create(struct vb2_context *ctx)
int vb2_secdata_init(struct vb2_context *ctx)
{
struct vb2_shared_data *sd = vb2_get_sd(ctx);
- struct vb2_secdata *sec = (struct vb2_secdata *)ctx->secdata;
int rv;
- /* Data must be new enough to have a CRC */
- if (sec->struct_version < 2)
- return VB2_ERROR_SECDATA_VERSION;
-
rv = vb2_secdata_check_crc(ctx);
if (rv)
return rv;
+ /* Set status flag */
+ sd->status |= VB2_SD_STATUS_SECDATA_INIT;
+ // TODO: unit test for that
+
/* Read this now to make sure crossystem has it even in rec mode. */
rv = vb2_secdata_get(ctx, VB2_SECDATA_VERSIONS,
&sd->fw_version_secdata);
if (rv)
return rv;
- /* Set status flag */
- sd->status |= VB2_SD_STATUS_SECDATA_INIT;
- // TODO: unit test for that
-
return VB2_SUCCESS;
}
@@ -72,6 +67,9 @@ int vb2_secdata_get(struct vb2_context *ctx,
{
struct vb2_secdata *sec = (struct vb2_secdata *)ctx->secdata;
+ if (!(vb2_get_sd(ctx)->status & VB2_SD_STATUS_SECDATA_INIT))
+ return VB2_ERROR_SECDATA_GET_UNINITIALIZED;
+
switch(param) {
case VB2_SECDATA_FLAGS:
*dest = sec->flags;
@@ -93,6 +91,9 @@ int vb2_secdata_set(struct vb2_context *ctx,
struct vb2_secdata *sec = (struct vb2_secdata *)ctx->secdata;
uint32_t now;
+ if (!(vb2_get_sd(ctx)->status & VB2_SD_STATUS_SECDATA_INIT))
+ return VB2_ERROR_SECDATA_SET_UNINITIALIZED;
+
/* If not changing the value, don't regenerate the CRC. */
if (vb2_secdata_get(ctx, param, &now) == VB2_SUCCESS && now == value)
return VB2_SUCCESS;
diff --git a/firmware/2lib/include/2return_codes.h b/firmware/2lib/include/2return_codes.h
index 4f56bdb0..0c368ded 100644
--- a/firmware/2lib/include/2return_codes.h
+++ b/firmware/2lib/include/2return_codes.h
@@ -102,6 +102,12 @@ enum vb2_return_code {
/* Invalid flags passed to vb2_secdata_set() */
VB2_ERROR_SECDATA_SET_FLAGS,
+ /* Called vb2_secdata_get() with uninitialized secdata */
+ VB2_ERROR_SECDATA_GET_UNINITIALIZED,
+
+ /* Called vb2_secdata_set() with uninitialized secdata */
+ VB2_ERROR_SECDATA_SET_UNINITIALIZED,
+
/**********************************************************************
* Common code errors
*/
diff --git a/tests/vb2_secdata_tests.c b/tests/vb2_secdata_tests.c
index 51283317..ca2a1ec9 100644
--- a/tests/vb2_secdata_tests.c
+++ b/tests/vb2_secdata_tests.c
@@ -15,6 +15,7 @@
#include "2common.h"
#include "2api.h"
+#include "2misc.h"
#include "2secdata.h"
static void test_changed(struct vb2_context *ctx, int changed, const char *why)
@@ -35,7 +36,6 @@ static void secdata_test(void)
.workbuf = workbuf,
.workbuf_size = sizeof(workbuf),
};
- struct vb2_secdata *s = (struct vb2_secdata *)c.secdata;
uint32_t v = 1;
/* Blank data is invalid */
@@ -58,12 +58,6 @@ static void secdata_test(void)
TEST_EQ(vb2_secdata_init(&c),
VB2_ERROR_SECDATA_CRC, "Init invalid CRC");
- /* Version 1 didn't have a CRC, so init should reject it */
- vb2_secdata_create(&c);
- s->struct_version = 1;
- TEST_EQ(vb2_secdata_init(&c),
- VB2_ERROR_SECDATA_VERSION, "Init old version");
-
vb2_secdata_create(&c);
c.flags = 0;
@@ -101,6 +95,15 @@ static void secdata_test(void)
TEST_EQ(vb2_secdata_set(&c, -1, 456),
VB2_ERROR_SECDATA_SET_PARAM, "Set invalid");
test_changed(&c, 0, "Set invalid field doesn't change data");
+
+ /* Read/write uninitialized data fails */
+ vb2_get_sd(&c)->status &= ~VB2_SD_STATUS_SECDATA_INIT;
+ TEST_EQ(vb2_secdata_get(&c, VB2_SECDATA_VERSIONS, &v),
+ VB2_ERROR_SECDATA_GET_UNINITIALIZED, "Get uninitialized");
+ test_changed(&c, 0, "Get uninitialized doesn't change data");
+ TEST_EQ(vb2_secdata_set(&c, VB2_SECDATA_VERSIONS, 0x123456ff),
+ VB2_ERROR_SECDATA_SET_UNINITIALIZED, "Set uninitialized");
+ test_changed(&c, 0, "Set uninitialized doesn't change data");
}
int main(int argc, char* argv[])