diff --git a/core/arch/arm/kernel/user_ta.c b/core/arch/arm/kernel/user_ta.c index 7e303068142..e1a8b90354f 100644 --- a/core/arch/arm/kernel/user_ta.c +++ b/core/arch/arm/kernel/user_ta.c @@ -29,27 +29,28 @@ #include #include #include -#include -#include #include #include #include #include #include #include +#include #include #include #include -#include +#include +#include +#include #include #include #include #include #include #include -#include -#include +#include #include +#include #include #include @@ -675,7 +676,7 @@ static TEE_Result rpc_load(const TEE_UUID *uuid, struct shdr **ta, memset(params, 0, sizeof(params)); params[0].attr = OPTEE_MSG_ATTR_TYPE_VALUE_INPUT; - memcpy(¶ms[0].u.value, uuid, sizeof(TEE_UUID)); + tee_uuid_to_octets((void *)¶ms[0].u.value, uuid); params[1].attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT; params[1].u.tmem.buf_ptr = 0; params[1].u.tmem.size = 0; @@ -697,7 +698,7 @@ static TEE_Result rpc_load(const TEE_UUID *uuid, struct shdr **ta, *cookie_ta = cta; params[0].attr = OPTEE_MSG_ATTR_TYPE_VALUE_INPUT; - memcpy(¶ms[0].u.value, uuid, sizeof(TEE_UUID)); + tee_uuid_to_octets((void *)¶ms[0].u.value, uuid); params[1].attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT; params[1].u.tmem.buf_ptr = phta; params[1].u.tmem.shm_ref = cta; diff --git a/core/arch/arm/tee/entry_std.c b/core/arch/arm/tee/entry_std.c index 707b63b5ae1..45e85293a75 100644 --- a/core/arch/arm/tee/entry_std.c +++ b/core/arch/arm/tee/entry_std.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #define SHM_CACHE_ATTRS \ @@ -154,9 +155,9 @@ static bool get_open_session_meta(struct optee_msg_arg *arg, params[*num_meta + 1].attr != req_attr) return false; - memcpy(uuid, ¶ms[*num_meta].u.value, sizeof(TEE_UUID)); - memcpy(&clnt_id->uuid, ¶ms[*num_meta + 1].u.value, - sizeof(TEE_UUID)); + tee_uuid_from_octets(uuid, (void *)¶ms[*num_meta].u.value); + tee_uuid_from_octets(&clnt_id->uuid, + (void *)¶ms[*num_meta + 1].u.value); clnt_id->login = params[*num_meta + 1].u.value.c; (*num_meta) += 2; diff --git a/core/include/optee_msg.h b/core/include/optee_msg.h index 8de497666c9..bd3c2eee544 100644 --- a/core/include/optee_msg.h +++ b/core/include/optee_msg.h @@ -27,6 +27,9 @@ #ifndef _OPTEE_MSG_H #define _OPTEE_MSG_H +#include +#include + /* * This file defines the OP-TEE message protocol used to communicate * with an instance of OP-TEE running in secure world. diff --git a/core/include/tee/uuid.h b/core/include/tee/uuid.h new file mode 100644 index 00000000000..b23ffb10525 --- /dev/null +++ b/core/include/tee/uuid.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __TEE_UUID +#define __TEE_UUID + +#include +#include +#include + +/** + * tee_uuid_to_octets() - serialize a TEE_UUID into an octet string + * @dst: pointer to octet string + * @src: pointer TEE_UUID + */ +void tee_uuid_to_octets(uint8_t *dst, const TEE_UUID *src); + +/** + * tee_uuid_from_octets() - de-serialize an octet string into a TEE_UUID + * @dst: pointer TEE_UUID + * @src: pointer to octet string + */ +void tee_uuid_from_octets(TEE_UUID *dst, const uint8_t *src); + +#endif /*__TEE_UUID*/ diff --git a/core/tee/sub.mk b/core/tee/sub.mk index f1acea81931..32f0f981358 100644 --- a/core/tee/sub.mk +++ b/core/tee/sub.mk @@ -41,4 +41,7 @@ srcs-y += tee_time_generic.c endif #CFG_WITH_USER_TA,y +srcs-y += uuid.c + subdirs-$(CFG_SE_API) += se + diff --git a/core/tee/uuid.c b/core/tee/uuid.c new file mode 100644 index 00000000000..bf82777f0b8 --- /dev/null +++ b/core/tee/uuid.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2016, Linaro Limited + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +void tee_uuid_to_octets(uint8_t *d, const TEE_UUID *s) +{ + d[0] = s->timeLow >> 24; + d[1] = s->timeLow >> 16; + d[2] = s->timeLow >> 8; + d[3] = s->timeLow; + d[4] = s->timeMid >> 8; + d[5] = s->timeMid; + d[6] = s->timeHiAndVersion >> 8; + d[7] = s->timeHiAndVersion; + memcpy(d + 8, s->clockSeqAndNode, sizeof(s->clockSeqAndNode)); +} + +void tee_uuid_from_octets(TEE_UUID *d, const uint8_t *s) +{ + d->timeLow = (s[0] << 24) | (s[1] << 16) | (s[2] << 8) | s[3]; + d->timeMid = (s[4] << 8) | s[5]; + d->timeHiAndVersion = (s[6] << 8) | s[7]; + memcpy(d->clockSeqAndNode, s + 8, sizeof(d->clockSeqAndNode)); +} diff --git a/lib/libutils/ext/snprintk.c b/lib/libutils/ext/snprintk.c index eea38a26083..a9e93daec04 100644 --- a/lib/libutils/ext/snprintk.c +++ b/lib/libutils/ext/snprintk.c @@ -80,7 +80,7 @@ #define NOLOCK 0x1000 /* don't acquire a tty lock */ /* max size buffer kprintf needs to print a UUID */ -#define KPRINTF_BUFSIZE 36 +#define KPRINTF_BUFSIZE 37 /* * The following macro is used to remove const cast-away warnings @@ -220,7 +220,7 @@ static int uuid2str(char *dst, size_t size, void *ptr) } *uuid = ptr; return snprintk(dst, size, - "%08x-%04x-%04x-%02x%02x%02x%02x%02x%02x%02x%02x", + "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", uuid->lo, uuid->mid, uuid->hi_ver, uuid->seq_n[0], uuid->seq_n[1], uuid->seq_n[2], uuid->seq_n[3],