Skip to content

Commit

Permalink
core: encode UUID big endian
Browse files Browse the repository at this point in the history
When encoding a UUID as a sequence of bytes, the spec
(https://www.ietf.org/rfc/rfc4122.txt) says that the u32, and two u16s
should be represented big endian.

Before this patch OPTEE always treated them natively. With this patch
UUIDs are always converted to/from big endian when communicating with
normal world.

Reviewed-by: Jerome Forissier <jerome.forissier@linaro.org>
Fixes: OP-TEE#858
Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
  • Loading branch information
jenswi-linaro committed Dec 9, 2016
1 parent 239e85a commit 77b4246
Show file tree
Hide file tree
Showing 5 changed files with 114 additions and 10 deletions.
15 changes: 8 additions & 7 deletions core/arch/arm/kernel/user_ta.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,27 +29,28 @@
#include <assert.h>
#include <compiler.h>
#include <keep.h>
#include <types_ext.h>
#include <stdlib.h>
#include <kernel/panic.h>
#include <kernel/tee_ta_manager.h>
#include <kernel/thread.h>
#include <kernel/user_ta.h>
#include <mm/core_memprot.h>
#include <mm/core_mmu.h>
#include <mm/pgt_cache.h>
#include <mm/tee_mm.h>
#include <mm/tee_mmu.h>
#include <mm/tee_pager.h>
#include <mm/pgt_cache.h>
#include <signed_hdr.h>
#include <stdlib.h>
#include <ta_pub_key.h>
#include <tee/tee_cryp_provider.h>
#include <tee/tee_cryp_utl.h>
#include <tee/tee_obj.h>
#include <tee/tee_svc_cryp.h>
#include <tee/tee_svc.h>
#include <tee/tee_svc_storage.h>
#include <signed_hdr.h>
#include <ta_pub_key.h>
#include <tee/uuid.h>
#include <trace.h>
#include <types_ext.h>
#include <utee_defines.h>
#include <util.h>

Expand Down Expand Up @@ -673,7 +674,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(&params[0].u.value, uuid, sizeof(TEE_UUID));
tee_uuid_to_octets((void *)&params[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;
Expand All @@ -695,7 +696,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(&params[0].u.value, uuid, sizeof(TEE_UUID));
tee_uuid_to_octets((void *)&params[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;
Expand Down
7 changes: 4 additions & 3 deletions core/arch/arm/tee/entry_std.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include <sm/optee_smc.h>
#include <string.h>
#include <tee/entry_std.h>
#include <tee/uuid.h>
#include <util.h>

#define SHM_CACHE_ATTRS \
Expand Down Expand Up @@ -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, &params[*num_meta].u.value, sizeof(TEE_UUID));
memcpy(&clnt_id->uuid, &params[*num_meta + 1].u.value,
sizeof(TEE_UUID));
tee_uuid_from_octets(uuid, (void *)&params[*num_meta].u.value);
tee_uuid_from_octets(&clnt_id->uuid,
(void *)&params[*num_meta + 1].u.value);
clnt_id->login = params[*num_meta + 1].u.value.c;

(*num_meta) += 2;
Expand Down
49 changes: 49 additions & 0 deletions core/include/tee/uuid.h
Original file line number Diff line number Diff line change
@@ -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 <optee_msg.h>
#include <tee_api_types.h>
#include <types_ext.h>

/**
* 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*/
3 changes: 3 additions & 0 deletions core/tee/sub.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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

50 changes: 50 additions & 0 deletions core/tee/uuid.c
Original file line number Diff line number Diff line change
@@ -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 <tee/uuid.h>
#include <string.h>

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));
}

0 comments on commit 77b4246

Please sign in to comment.