diff options
author | Igor Opaniuk <igor.opaniuk@linaro.org> | 2018-12-12 19:31:59 +0200 |
---|---|---|
committer | Jérôme Forissier <jerome.forissier@linaro.org> | 2018-12-21 17:26:47 +0100 |
commit | 275d9d31f0808778c3b970ae02a40db5d1083bfa (patch) | |
tree | eff722273d7a49d65d0dbbab4d6892c6822de3ed /ta/avb | |
parent | d8265859f026e7bbdadcbf1e4f25cf281623d927 (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.c | 153 | ||||
-rw-r--r-- | ta/avb/include/ta_avb.h | 16 |
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*/ |