aboutsummaryrefslogtreecommitdiff
path: root/ta/avb
diff options
context:
space:
mode:
authorIgor Opaniuk <igor.opaniuk@linaro.org>2018-12-12 19:31:59 +0200
committerJérôme Forissier <jerome.forissier@linaro.org>2018-12-21 17:26:47 +0100
commit275d9d31f0808778c3b970ae02a40db5d1083bfa (patch)
treeeff722273d7a49d65d0dbbab4d6892c6822de3ed /ta/avb
parentd8265859f026e7bbdadcbf1e4f25cf281623d927 (diff)
ta: avb: add support for named persistent values
Introduce support for named persistent values [1], that are mainly used to store persistent digests. Link: [1] https://android.googlesource.com/platform/external/avb/+/master/README.md#Named-Persistent-Values Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org> Signed-off-by: Igor Opaniuk <igor.opaniuk@linaro.org>
Diffstat (limited to 'ta/avb')
-rw-r--r--ta/avb/entry.c153
-rw-r--r--ta/avb/include/ta_avb.h16
2 files changed, 154 insertions, 15 deletions
diff --git a/ta/avb/entry.c b/ta/avb/entry.c
index 2e22518d..8f69e155 100644
--- a/ta/avb/entry.c
+++ b/ta/avb/entry.c
@@ -5,10 +5,14 @@
#include <tee_internal_api.h>
#include <tee_internal_api_extensions.h>
+#include <string.h>
+#include <util.h>
+
#define DEFAULT_LOCK_STATE 0
static const uint32_t storageid = TEE_STORAGE_PRIVATE_RPMB;
-static const char obj_name[] = "rb_state";
+static const char rb_obj_name[] = "rb_state";
+static const char *named_value_prefix = "named_value_";
static TEE_Result get_slot_offset(size_t slot, size_t *offset)
{
@@ -19,28 +23,51 @@ static TEE_Result get_slot_offset(size_t slot, size_t *offset)
return TEE_SUCCESS;
}
-static TEE_Result create_state(uint32_t lock_state, TEE_ObjectHandle *h)
+static TEE_Result create_rb_state(uint32_t lock_state, TEE_ObjectHandle *h)
{
const uint32_t flags = TEE_DATA_FLAG_ACCESS_READ |
TEE_DATA_FLAG_ACCESS_WRITE |
TEE_DATA_FLAG_OVERWRITE;
- return TEE_CreatePersistentObject(storageid, obj_name, sizeof(obj_name),
- flags, NULL, &lock_state,
- sizeof(lock_state), h);
+ return TEE_CreatePersistentObject(storageid, rb_obj_name,
+ sizeof(rb_obj_name), flags, NULL,
+ &lock_state, sizeof(lock_state), h);
}
-static TEE_Result open_state(uint32_t default_lock_state, TEE_ObjectHandle *h)
+static TEE_Result open_rb_state(uint32_t default_lock_state,
+ TEE_ObjectHandle *h)
{
- uint32_t flags = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE;
+ uint32_t flags = TEE_DATA_FLAG_ACCESS_READ |
+ TEE_DATA_FLAG_ACCESS_WRITE;
TEE_Result res;
- res = TEE_OpenPersistentObject(storageid, obj_name,
- sizeof(obj_name), flags, h);
+ res = TEE_OpenPersistentObject(storageid, rb_obj_name,
+ sizeof(rb_obj_name), flags, h);
if (!res)
return TEE_SUCCESS;
- return create_state(default_lock_state, h);
+ return create_rb_state(default_lock_state, h);
+}
+
+static TEE_Result get_named_object_name(char *name_orig,
+ uint32_t name_orig_size,
+ char *name, uint32_t *name_size)
+{
+ size_t pref_len = strlen(named_value_prefix);
+
+ if (name_orig_size + pref_len >
+ TEE_OBJECT_ID_MAX_LEN)
+ return TEE_ERROR_BAD_PARAMETERS;
+
+ /* Start with prefix */
+ TEE_MemMove(name, named_value_prefix, pref_len);
+
+ /* Concatenate provided object name */
+ TEE_MemMove(name + pref_len, name_orig, name_orig_size);
+
+ *name_size = name_orig_size + pref_len;
+
+ return TEE_SUCCESS;
}
static TEE_Result read_rb_idx(uint32_t pt, TEE_Param params[TEE_NUM_PARAMS])
@@ -62,7 +89,7 @@ static TEE_Result read_rb_idx(uint32_t pt, TEE_Param params[TEE_NUM_PARAMS])
if (res)
return res;
- res = open_state(DEFAULT_LOCK_STATE, &h);
+ res = open_rb_state(DEFAULT_LOCK_STATE, &h);
if (res)
return res;
@@ -119,7 +146,7 @@ static TEE_Result write_rb_idx(uint32_t pt, TEE_Param params[TEE_NUM_PARAMS])
return res;
widx = ((uint64_t)params[1].value.a << 32) | params[1].value.b;
- res = open_state(DEFAULT_LOCK_STATE, &h);
+ res = open_rb_state(DEFAULT_LOCK_STATE, &h);
if (res)
return res;
@@ -162,7 +189,7 @@ static TEE_Result read_lock_state(uint32_t pt, TEE_Param params[TEE_NUM_PARAMS])
if (pt != exp_pt)
return TEE_ERROR_BAD_PARAMETERS;
- res = open_state(DEFAULT_LOCK_STATE, &h);
+ res = open_rb_state(DEFAULT_LOCK_STATE, &h);
if (res)
return res;
@@ -202,7 +229,7 @@ static TEE_Result write_lock_state(uint32_t pt,
wlock_state = params[0].value.a;
- res = open_state(wlock_state, &h);
+ res = open_rb_state(wlock_state, &h);
if (res)
return res;
@@ -212,9 +239,101 @@ static TEE_Result write_lock_state(uint32_t pt,
if (count == sizeof(lock_state) && lock_state == wlock_state)
goto out;
- res = create_state(wlock_state, &h);
+ res = create_rb_state(wlock_state, &h);
+out:
+ TEE_CloseObject(h);
+ return res;
+}
+
+static TEE_Result write_persist_value(uint32_t pt,
+ TEE_Param params[TEE_NUM_PARAMS])
+{
+ const uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
+ TEE_PARAM_TYPE_MEMREF_INPUT,
+ TEE_PARAM_TYPE_NONE,
+ TEE_PARAM_TYPE_NONE);
+ const uint32_t flags = TEE_DATA_FLAG_ACCESS_READ |
+ TEE_DATA_FLAG_ACCESS_WRITE |
+ TEE_DATA_FLAG_OVERWRITE;
+ TEE_Result res;
+ TEE_ObjectHandle h;
+
+ char name_full[TEE_OBJECT_ID_MAX_LEN];
+ uint32_t name_full_sz;
+
+ if (pt != exp_pt)
+ return TEE_ERROR_BAD_PARAMETERS;
+
+ char *name_buf = params[0].memref.buffer;
+ uint32_t name_buf_sz = params[0].memref.size;
+
+ char *value = params[1].memref.buffer;
+ uint32_t value_sz = params[1].memref.size;
+
+ res = get_named_object_name(name_buf, name_buf_sz,
+ name_full, &name_full_sz);
+ if (res)
+ return res;
+
+ res = TEE_CreatePersistentObject(storageid, name_full,
+ name_full_sz,
+ flags, NULL, value,
+ value_sz, &h);
+ if (res)
+ EMSG("Can't create named object value, res = 0x%x", res);
+
+ TEE_CloseObject(h);
+
+ return res;
+}
+
+static TEE_Result read_persist_value(uint32_t pt,
+ TEE_Param params[TEE_NUM_PARAMS])
+{
+ const uint32_t exp_pt = TEE_PARAM_TYPES(TEE_PARAM_TYPE_MEMREF_INPUT,
+ TEE_PARAM_TYPE_MEMREF_INOUT,
+ TEE_PARAM_TYPE_NONE,
+ TEE_PARAM_TYPE_NONE);
+ uint32_t flags = TEE_DATA_FLAG_ACCESS_READ |
+ TEE_DATA_FLAG_ACCESS_WRITE;
+ TEE_Result res;
+ TEE_ObjectHandle h;
+
+ char name_full[TEE_OBJECT_ID_MAX_LEN];
+ uint32_t name_full_sz;
+ uint32_t count;
+
+ if (pt != exp_pt)
+ return TEE_ERROR_BAD_PARAMETERS;
+
+ char *name_buf = params[0].memref.buffer;
+ uint32_t name_buf_sz = params[0].memref.size;
+
+ char *value = params[1].memref.buffer;
+ uint32_t value_sz = params[1].memref.size;
+
+ res = get_named_object_name(name_buf, name_buf_sz,
+ name_full, &name_full_sz);
+ if (res)
+ return res;
+
+ res = TEE_OpenPersistentObject(storageid, name_full,
+ name_full_sz, flags, &h);
+ if (res) {
+ EMSG("Can't open named object value, res = 0x%x", res);
+ return res;
+ }
+
+ res = TEE_ReadObjectData(h, value, value_sz, &count);
+ if (res) {
+ EMSG("Can't read named object value, res = 0x%x", res);
+ goto out;
+ }
+
+ params[1].memref.size = count;
out:
TEE_CloseObject(h);
+
return res;
}
@@ -251,6 +370,10 @@ TEE_Result TA_InvokeCommandEntryPoint(void *sess __unused, uint32_t cmd,
return read_lock_state(pt, params);
case TA_AVB_CMD_WRITE_LOCK_STATE:
return write_lock_state(pt, params);
+ case TA_AVB_CMD_READ_PERSIST_VALUE:
+ return read_persist_value(pt, params);
+ case TA_AVB_CMD_WRITE_PERSIST_VALUE:
+ return write_persist_value(pt, params);
default:
EMSG("Command ID 0x%x is not supported", cmd);
return TEE_ERROR_NOT_SUPPORTED;
diff --git a/ta/avb/include/ta_avb.h b/ta/avb/include/ta_avb.h
index 0e1da084..45521f75 100644
--- a/ta/avb/include/ta_avb.h
+++ b/ta/avb/include/ta_avb.h
@@ -45,4 +45,20 @@
*/
#define TA_AVB_CMD_WRITE_LOCK_STATE 3
+/*
+ * Reads a persistent value corresponding to the given name.
+ *
+ * in params[0].memref: persistent value name
+ * out params[1].memref: read persistent value buffer
+ */
+#define TA_AVB_CMD_READ_PERSIST_VALUE 4
+
+/*
+ * Writes a persistent value corresponding to the given name.
+ *
+ * in params[0].memref: persistent value name
+ * in params[1].memref: persistent value buffer to write
+ */
+#define TA_AVB_CMD_WRITE_PERSIST_VALUE 5
+
#endif /*__TA_AVB_H*/