1*1bb92983SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause 2a32a96edSJens Wiklander /* 3a32a96edSJens Wiklander * Copyright (c) 2016-2017, Linaro Limited 4a32a96edSJens Wiklander * All rights reserved. 5a32a96edSJens Wiklander * 6a32a96edSJens Wiklander * Redistribution and use in source and binary forms, with or without 7a32a96edSJens Wiklander * modification, are permitted provided that the following conditions are met: 8a32a96edSJens Wiklander * 9a32a96edSJens Wiklander * 1. Redistributions of source code must retain the above copyright notice, 10a32a96edSJens Wiklander * this list of conditions and the following disclaimer. 11a32a96edSJens Wiklander * 12a32a96edSJens Wiklander * 2. Redistributions in binary form must reproduce the above copyright notice, 13a32a96edSJens Wiklander * this list of conditions and the following disclaimer in the documentation 14a32a96edSJens Wiklander * and/or other materials provided with the distribution. 15a32a96edSJens Wiklander * 16a32a96edSJens Wiklander * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17a32a96edSJens Wiklander * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18a32a96edSJens Wiklander * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19a32a96edSJens Wiklander * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20a32a96edSJens Wiklander * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21a32a96edSJens Wiklander * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22a32a96edSJens Wiklander * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23a32a96edSJens Wiklander * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24a32a96edSJens Wiklander * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25a32a96edSJens Wiklander * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26a32a96edSJens Wiklander * POSSIBILITY OF SUCH DAMAGE. 27a32a96edSJens Wiklander */ 28a32a96edSJens Wiklander 29a32a96edSJens Wiklander #include <pta_socket.h> 30a32a96edSJens Wiklander #include <string.h> 31a32a96edSJens Wiklander #include <tee_internal_api.h> 32a32a96edSJens Wiklander #include <__tee_tcpsocket_defines.h> 33a32a96edSJens Wiklander #include <__tee_udpsocket_defines.h> 34a32a96edSJens Wiklander 35a32a96edSJens Wiklander #include "tee_socket_private.h" 36a32a96edSJens Wiklander 37a32a96edSJens Wiklander static TEE_Result invoke_socket_pta(uint32_t cmd_id, uint32_t param_types, 38a32a96edSJens Wiklander TEE_Param params[TEE_NUM_PARAMS]) 39a32a96edSJens Wiklander { 40a32a96edSJens Wiklander static TEE_TASessionHandle sess = TEE_HANDLE_NULL; 41a32a96edSJens Wiklander static const TEE_UUID socket_uuid = PTA_SOCKET_UUID; 42a32a96edSJens Wiklander 43a32a96edSJens Wiklander if (sess == TEE_HANDLE_NULL) { 44a32a96edSJens Wiklander TEE_Result res = TEE_OpenTASession(&socket_uuid, 0, 0, NULL, 45a32a96edSJens Wiklander &sess, NULL); 46a32a96edSJens Wiklander 47a32a96edSJens Wiklander if (res != TEE_SUCCESS) 48a32a96edSJens Wiklander return res; 49a32a96edSJens Wiklander } 50a32a96edSJens Wiklander 51a32a96edSJens Wiklander return TEE_InvokeTACommand(sess, 0, cmd_id, param_types, params, NULL); 52a32a96edSJens Wiklander } 53a32a96edSJens Wiklander 54a32a96edSJens Wiklander TEE_Result __tee_socket_pta_open(TEE_ipSocket_ipVersion ip_vers, 55a32a96edSJens Wiklander const char *addr, uint16_t port, 56a32a96edSJens Wiklander uint32_t protocol, uint32_t *handle) 57a32a96edSJens Wiklander { 58a32a96edSJens Wiklander TEE_Result res; 59a32a96edSJens Wiklander uint32_t param_types; 60a32a96edSJens Wiklander TEE_Param params[TEE_NUM_PARAMS]; 61a32a96edSJens Wiklander 62a32a96edSJens Wiklander param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, 63a32a96edSJens Wiklander TEE_PARAM_TYPE_MEMREF_INPUT, 64a32a96edSJens Wiklander TEE_PARAM_TYPE_VALUE_INPUT, 65a32a96edSJens Wiklander TEE_PARAM_TYPE_VALUE_OUTPUT); 66a32a96edSJens Wiklander memset(params, 0, sizeof(params)); 67a32a96edSJens Wiklander 68a32a96edSJens Wiklander switch (ip_vers) { 69a32a96edSJens Wiklander case TEE_IP_VERSION_DC: 70a32a96edSJens Wiklander case TEE_IP_VERSION_4: 71a32a96edSJens Wiklander case TEE_IP_VERSION_6: 72a32a96edSJens Wiklander params[0].value.a = ip_vers; 73a32a96edSJens Wiklander break; 74a32a96edSJens Wiklander default: 75a32a96edSJens Wiklander return TEE_ERROR_BAD_PARAMETERS; 76a32a96edSJens Wiklander } 77a32a96edSJens Wiklander 78a32a96edSJens Wiklander params[0].value.b = port; 79a32a96edSJens Wiklander 80a32a96edSJens Wiklander if (!addr) 81a32a96edSJens Wiklander return TEE_ERROR_BAD_PARAMETERS; 82a32a96edSJens Wiklander params[1].memref.buffer = (void *)addr; 83a32a96edSJens Wiklander params[1].memref.size = strlen(addr) + 1; 84a32a96edSJens Wiklander 85a32a96edSJens Wiklander switch (protocol) { 86a32a96edSJens Wiklander case TEE_ISOCKET_PROTOCOLID_TCP: 87a32a96edSJens Wiklander case TEE_ISOCKET_PROTOCOLID_UDP: 88a32a96edSJens Wiklander params[2].value.a = protocol; 89a32a96edSJens Wiklander break; 90a32a96edSJens Wiklander default: 91a32a96edSJens Wiklander return TEE_ERROR_BAD_PARAMETERS; 92a32a96edSJens Wiklander } 93a32a96edSJens Wiklander 94a32a96edSJens Wiklander res = invoke_socket_pta(PTA_SOCKET_OPEN, param_types, params); 95a32a96edSJens Wiklander if (res == TEE_SUCCESS) 96a32a96edSJens Wiklander *handle = params[3].value.a; 97a32a96edSJens Wiklander return res; 98a32a96edSJens Wiklander } 99a32a96edSJens Wiklander 100a32a96edSJens Wiklander TEE_Result __tee_socket_pta_close(uint32_t handle) 101a32a96edSJens Wiklander { 102a32a96edSJens Wiklander uint32_t param_types; 103a32a96edSJens Wiklander TEE_Param params[TEE_NUM_PARAMS]; 104a32a96edSJens Wiklander 105a32a96edSJens Wiklander param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, 106a32a96edSJens Wiklander TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE, 107a32a96edSJens Wiklander TEE_PARAM_TYPE_NONE); 108a32a96edSJens Wiklander memset(params, 0, sizeof(params)); 109a32a96edSJens Wiklander 110a32a96edSJens Wiklander params[0].value.a = handle; 111a32a96edSJens Wiklander return invoke_socket_pta(PTA_SOCKET_CLOSE, param_types, params); 112a32a96edSJens Wiklander } 113a32a96edSJens Wiklander 114a32a96edSJens Wiklander TEE_Result __tee_socket_pta_send(uint32_t handle, const void *buf, 115a32a96edSJens Wiklander uint32_t *len, uint32_t timeout) 116a32a96edSJens Wiklander { 117a32a96edSJens Wiklander TEE_Result res; 118a32a96edSJens Wiklander uint32_t param_types; 119a32a96edSJens Wiklander TEE_Param params[TEE_NUM_PARAMS]; 120a32a96edSJens Wiklander 121a32a96edSJens Wiklander param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, 122a32a96edSJens Wiklander TEE_PARAM_TYPE_MEMREF_INPUT, 123a32a96edSJens Wiklander TEE_PARAM_TYPE_VALUE_OUTPUT, 124a32a96edSJens Wiklander TEE_PARAM_TYPE_NONE); 125a32a96edSJens Wiklander memset(params, 0, sizeof(params)); 126a32a96edSJens Wiklander 127a32a96edSJens Wiklander params[0].value.a = handle; 128a32a96edSJens Wiklander params[0].value.b = timeout; 129a32a96edSJens Wiklander 130a32a96edSJens Wiklander params[1].memref.buffer = (void *)buf; 131a32a96edSJens Wiklander params[1].memref.size = *len; 132a32a96edSJens Wiklander 133a32a96edSJens Wiklander res = invoke_socket_pta(PTA_SOCKET_SEND, param_types, params); 134a32a96edSJens Wiklander *len = params[2].value.a; 135a32a96edSJens Wiklander return res; 136a32a96edSJens Wiklander } 137a32a96edSJens Wiklander 138a32a96edSJens Wiklander TEE_Result __tee_socket_pta_recv(uint32_t handle, void *buf, uint32_t *len, 139a32a96edSJens Wiklander uint32_t timeout) 140a32a96edSJens Wiklander 141a32a96edSJens Wiklander { 142a32a96edSJens Wiklander TEE_Result res; 143a32a96edSJens Wiklander uint32_t param_types; 144a32a96edSJens Wiklander TEE_Param params[TEE_NUM_PARAMS]; 145a32a96edSJens Wiklander 146a32a96edSJens Wiklander param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, 147a32a96edSJens Wiklander TEE_PARAM_TYPE_MEMREF_OUTPUT, 148a32a96edSJens Wiklander TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE); 149a32a96edSJens Wiklander memset(params, 0, sizeof(params)); 150a32a96edSJens Wiklander 151a32a96edSJens Wiklander params[0].value.a = handle; 152a32a96edSJens Wiklander params[0].value.b = timeout; 153a32a96edSJens Wiklander 154a32a96edSJens Wiklander params[1].memref.buffer = buf; 155a32a96edSJens Wiklander params[1].memref.size = *len; 156a32a96edSJens Wiklander 157a32a96edSJens Wiklander res = invoke_socket_pta(PTA_SOCKET_RECV, param_types, params); 158a32a96edSJens Wiklander *len = params[1].memref.size; 159a32a96edSJens Wiklander return res; 160a32a96edSJens Wiklander } 161a32a96edSJens Wiklander 162a32a96edSJens Wiklander TEE_Result __tee_socket_pta_ioctl(uint32_t handle, uint32_t command, void *buf, 163a32a96edSJens Wiklander uint32_t *len) 164a32a96edSJens Wiklander { 165a32a96edSJens Wiklander TEE_Result res; 166a32a96edSJens Wiklander uint32_t param_types; 167a32a96edSJens Wiklander TEE_Param params[TEE_NUM_PARAMS]; 168a32a96edSJens Wiklander 169a32a96edSJens Wiklander param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT, 170a32a96edSJens Wiklander TEE_PARAM_TYPE_MEMREF_INOUT, 171a32a96edSJens Wiklander TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE); 172a32a96edSJens Wiklander memset(params, 0, sizeof(params)); 173a32a96edSJens Wiklander 174a32a96edSJens Wiklander params[0].value.a = handle; 175a32a96edSJens Wiklander params[0].value.b = command; 176a32a96edSJens Wiklander 177a32a96edSJens Wiklander params[1].memref.buffer = buf; 178a32a96edSJens Wiklander params[1].memref.size = *len; 179a32a96edSJens Wiklander 180a32a96edSJens Wiklander res = invoke_socket_pta(PTA_SOCKET_IOCTL, param_types, params); 181a32a96edSJens Wiklander *len = params[1].memref.size; 182a32a96edSJens Wiklander return res; 183a32a96edSJens Wiklander } 184