mbed-os5 only for TYBLE16
Dependents: TYBLE16_simple_data_logger TYBLE16_MP3_Air
features/netsocket/TLSSocket.cpp@1:9db0e321a9f4, 2019-12-31 (annotated)
- Committer:
- kenjiArai
- Date:
- Tue Dec 31 06:02:27 2019 +0000
- Revision:
- 1:9db0e321a9f4
- Parent:
- 0:5b88d5760320
updated based on mbed-os5.15.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 0:5b88d5760320 | 1 | /* |
kenjiArai | 0:5b88d5760320 | 2 | * Copyright (c) 2018 ARM Limited |
kenjiArai | 0:5b88d5760320 | 3 | * SPDX-License-Identifier: Apache-2.0 |
kenjiArai | 0:5b88d5760320 | 4 | * |
kenjiArai | 0:5b88d5760320 | 5 | * Licensed under the Apache License, Version 2.0 (the "License"); |
kenjiArai | 0:5b88d5760320 | 6 | * you may not use this file except in compliance with the License. |
kenjiArai | 0:5b88d5760320 | 7 | * You may obtain a copy of the License at |
kenjiArai | 0:5b88d5760320 | 8 | * |
kenjiArai | 0:5b88d5760320 | 9 | * http://www.apache.org/licenses/LICENSE-2.0 |
kenjiArai | 0:5b88d5760320 | 10 | * |
kenjiArai | 0:5b88d5760320 | 11 | * Unless required by applicable law or agreed to in writing, software |
kenjiArai | 0:5b88d5760320 | 12 | * distributed under the License is distributed on an "AS IS" BASIS, |
kenjiArai | 0:5b88d5760320 | 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
kenjiArai | 0:5b88d5760320 | 14 | * See the License for the specific language governing permissions and |
kenjiArai | 0:5b88d5760320 | 15 | * limitations under the License. |
kenjiArai | 0:5b88d5760320 | 16 | */ |
kenjiArai | 0:5b88d5760320 | 17 | |
kenjiArai | 0:5b88d5760320 | 18 | #include "TLSSocket.h" |
kenjiArai | 0:5b88d5760320 | 19 | |
kenjiArai | 0:5b88d5760320 | 20 | #define TRACE_GROUP "TLSS" |
kenjiArai | 0:5b88d5760320 | 21 | #include "mbed-trace/mbed_trace.h" |
kenjiArai | 0:5b88d5760320 | 22 | |
kenjiArai | 1:9db0e321a9f4 | 23 | #if !defined(MBED_CONF_NSAPI_OFFLOAD_TLSSOCKET) || !(MBED_CONF_NSAPI_OFFLOAD_TLSSOCKET) |
kenjiArai | 1:9db0e321a9f4 | 24 | |
kenjiArai | 0:5b88d5760320 | 25 | // This class requires Mbed TLS SSL/TLS client code |
kenjiArai | 0:5b88d5760320 | 26 | #if defined(MBEDTLS_SSL_CLI_C) |
kenjiArai | 0:5b88d5760320 | 27 | |
kenjiArai | 0:5b88d5760320 | 28 | nsapi_error_t TLSSocket::connect(const char *host, uint16_t port) |
kenjiArai | 0:5b88d5760320 | 29 | { |
kenjiArai | 0:5b88d5760320 | 30 | nsapi_error_t ret = NSAPI_ERROR_OK; |
kenjiArai | 0:5b88d5760320 | 31 | if (!is_handshake_started()) { |
kenjiArai | 0:5b88d5760320 | 32 | ret = tcp_socket.connect(host, port); |
kenjiArai | 0:5b88d5760320 | 33 | if (ret == NSAPI_ERROR_OK || ret == NSAPI_ERROR_IN_PROGRESS) { |
kenjiArai | 0:5b88d5760320 | 34 | set_hostname(host); |
kenjiArai | 0:5b88d5760320 | 35 | } |
kenjiArai | 0:5b88d5760320 | 36 | if (ret != NSAPI_ERROR_OK && ret != NSAPI_ERROR_IS_CONNECTED) { |
kenjiArai | 0:5b88d5760320 | 37 | return ret; |
kenjiArai | 0:5b88d5760320 | 38 | } |
kenjiArai | 0:5b88d5760320 | 39 | } |
kenjiArai | 0:5b88d5760320 | 40 | return TLSSocketWrapper::start_handshake(ret == NSAPI_ERROR_OK); |
kenjiArai | 0:5b88d5760320 | 41 | } |
kenjiArai | 0:5b88d5760320 | 42 | |
kenjiArai | 0:5b88d5760320 | 43 | TLSSocket::~TLSSocket() |
kenjiArai | 0:5b88d5760320 | 44 | { |
kenjiArai | 0:5b88d5760320 | 45 | /* Transport is a member of TLSSocket which is derived from TLSSocketWrapper. |
kenjiArai | 0:5b88d5760320 | 46 | * Make sure that TLSSocketWrapper::close() is called before the transport is |
kenjiArai | 0:5b88d5760320 | 47 | * destroyed. |
kenjiArai | 0:5b88d5760320 | 48 | */ |
kenjiArai | 0:5b88d5760320 | 49 | close(); |
kenjiArai | 0:5b88d5760320 | 50 | } |
kenjiArai | 1:9db0e321a9f4 | 51 | #endif // MBEDTLS_SSL_CLI_C |
kenjiArai | 0:5b88d5760320 | 52 | |
kenjiArai | 1:9db0e321a9f4 | 53 | #else // MBED_CONF_NSAPI_OFFLOAD_TLSSOCKET |
kenjiArai | 1:9db0e321a9f4 | 54 | |
kenjiArai | 1:9db0e321a9f4 | 55 | TLSSocket::TLSSocket() |
kenjiArai | 1:9db0e321a9f4 | 56 | { |
kenjiArai | 1:9db0e321a9f4 | 57 | } |
kenjiArai | 1:9db0e321a9f4 | 58 | |
kenjiArai | 1:9db0e321a9f4 | 59 | TLSSocket::~TLSSocket() |
kenjiArai | 1:9db0e321a9f4 | 60 | { |
kenjiArai | 1:9db0e321a9f4 | 61 | } |
kenjiArai | 1:9db0e321a9f4 | 62 | |
kenjiArai | 1:9db0e321a9f4 | 63 | |
kenjiArai | 1:9db0e321a9f4 | 64 | nsapi_error_t TLSSocket::set_hostname(const char *hostname) |
kenjiArai | 1:9db0e321a9f4 | 65 | { |
kenjiArai | 1:9db0e321a9f4 | 66 | return setsockopt(NSAPI_TLSSOCKET_LEVEL, NSAPI_TLSSOCKET_SET_HOSTNAME, hostname, strlen(hostname)); |
kenjiArai | 1:9db0e321a9f4 | 67 | } |
kenjiArai | 1:9db0e321a9f4 | 68 | |
kenjiArai | 1:9db0e321a9f4 | 69 | nsapi_error_t TLSSocket::set_root_ca_cert(const void *root_ca, size_t len) |
kenjiArai | 1:9db0e321a9f4 | 70 | { |
kenjiArai | 1:9db0e321a9f4 | 71 | return setsockopt(NSAPI_TLSSOCKET_LEVEL, NSAPI_TLSSOCKET_SET_CACERT, root_ca, len); |
kenjiArai | 1:9db0e321a9f4 | 72 | } |
kenjiArai | 1:9db0e321a9f4 | 73 | |
kenjiArai | 1:9db0e321a9f4 | 74 | nsapi_error_t TLSSocket::set_root_ca_cert(const char *root_ca_pem) |
kenjiArai | 1:9db0e321a9f4 | 75 | { |
kenjiArai | 1:9db0e321a9f4 | 76 | return set_root_ca_cert(root_ca_pem, strlen(root_ca_pem)); |
kenjiArai | 1:9db0e321a9f4 | 77 | } |
kenjiArai | 1:9db0e321a9f4 | 78 | |
kenjiArai | 1:9db0e321a9f4 | 79 | nsapi_error_t TLSSocket::set_client_cert_key(const void *client_cert, size_t client_cert_len, |
kenjiArai | 1:9db0e321a9f4 | 80 | const void *client_private_key_pem, size_t client_private_key_len) |
kenjiArai | 1:9db0e321a9f4 | 81 | { |
kenjiArai | 1:9db0e321a9f4 | 82 | nsapi_error_t ret = setsockopt(NSAPI_TLSSOCKET_LEVEL, NSAPI_TLSSOCKET_SET_CLCERT, client_cert, client_cert_len); |
kenjiArai | 1:9db0e321a9f4 | 83 | if (ret == NSAPI_ERROR_OK) { |
kenjiArai | 1:9db0e321a9f4 | 84 | ret = setsockopt(NSAPI_TLSSOCKET_LEVEL, NSAPI_TLSSOCKET_SET_CLKEY, client_private_key_pem, client_private_key_len); |
kenjiArai | 1:9db0e321a9f4 | 85 | } |
kenjiArai | 1:9db0e321a9f4 | 86 | return ret; |
kenjiArai | 1:9db0e321a9f4 | 87 | } |
kenjiArai | 1:9db0e321a9f4 | 88 | |
kenjiArai | 1:9db0e321a9f4 | 89 | nsapi_error_t TLSSocket::set_client_cert_key(const char *client_cert_pem, const char *client_private_key_pem) |
kenjiArai | 1:9db0e321a9f4 | 90 | { |
kenjiArai | 1:9db0e321a9f4 | 91 | return set_client_cert_key(client_cert_pem, strlen(client_cert_pem), client_private_key_pem, strlen(client_private_key_pem)); |
kenjiArai | 1:9db0e321a9f4 | 92 | } |
kenjiArai | 1:9db0e321a9f4 | 93 | |
kenjiArai | 1:9db0e321a9f4 | 94 | nsapi_error_t TLSSocket::connect(const char *host, uint16_t port) |
kenjiArai | 1:9db0e321a9f4 | 95 | { |
kenjiArai | 1:9db0e321a9f4 | 96 | nsapi_error_t ret = enable_tlssocket(); |
kenjiArai | 1:9db0e321a9f4 | 97 | if (ret == NSAPI_ERROR_OK) { |
kenjiArai | 1:9db0e321a9f4 | 98 | ret = TCPSocket::connect(host, port); |
kenjiArai | 1:9db0e321a9f4 | 99 | } |
kenjiArai | 1:9db0e321a9f4 | 100 | return ret; |
kenjiArai | 1:9db0e321a9f4 | 101 | } |
kenjiArai | 1:9db0e321a9f4 | 102 | |
kenjiArai | 1:9db0e321a9f4 | 103 | nsapi_error_t TLSSocket::connect(const SocketAddress &address) |
kenjiArai | 1:9db0e321a9f4 | 104 | { |
kenjiArai | 1:9db0e321a9f4 | 105 | nsapi_error_t ret = enable_tlssocket(); |
kenjiArai | 1:9db0e321a9f4 | 106 | if (ret == NSAPI_ERROR_OK) { |
kenjiArai | 1:9db0e321a9f4 | 107 | ret = TCPSocket::connect(address); |
kenjiArai | 1:9db0e321a9f4 | 108 | } |
kenjiArai | 1:9db0e321a9f4 | 109 | return ret; |
kenjiArai | 1:9db0e321a9f4 | 110 | } |
kenjiArai | 1:9db0e321a9f4 | 111 | |
kenjiArai | 1:9db0e321a9f4 | 112 | nsapi_error_t TLSSocket::enable_tlssocket() |
kenjiArai | 1:9db0e321a9f4 | 113 | { |
kenjiArai | 1:9db0e321a9f4 | 114 | bool enabled = true; |
kenjiArai | 1:9db0e321a9f4 | 115 | return setsockopt(NSAPI_TLSSOCKET_LEVEL, NSAPI_TLSSOCKET_ENABLE, &enabled, sizeof(enabled)); |
kenjiArai | 1:9db0e321a9f4 | 116 | } |
kenjiArai | 1:9db0e321a9f4 | 117 | |
kenjiArai | 1:9db0e321a9f4 | 118 | #endif // MBED_CONF_NSAPI_OFFLOAD_TLSSOCKET |