wolfSSL SSL/TLS library, support up to TLS1.3

Dependents:   CyaSSL-Twitter-OAuth4Tw Example-client-tls-cert TwitterReader TweetTest ... more

Committer:
wolfSSL
Date:
Thu Apr 28 00:57:21 2016 +0000
Revision:
4:1b0d80432c79
wolfSSL 3.9.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfSSL 4:1b0d80432c79 1 /* io.c
wolfSSL 4:1b0d80432c79 2 *
wolfSSL 4:1b0d80432c79 3 * Copyright (C) 2006-2016 wolfSSL Inc.
wolfSSL 4:1b0d80432c79 4 *
wolfSSL 4:1b0d80432c79 5 * This file is part of wolfSSL.
wolfSSL 4:1b0d80432c79 6 *
wolfSSL 4:1b0d80432c79 7 * wolfSSL is free software; you can redistribute it and/or modify
wolfSSL 4:1b0d80432c79 8 * it under the terms of the GNU General Public License as published by
wolfSSL 4:1b0d80432c79 9 * the Free Software Foundation; either version 2 of the License, or
wolfSSL 4:1b0d80432c79 10 * (at your option) any later version.
wolfSSL 4:1b0d80432c79 11 *
wolfSSL 4:1b0d80432c79 12 * wolfSSL is distributed in the hope that it will be useful,
wolfSSL 4:1b0d80432c79 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
wolfSSL 4:1b0d80432c79 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
wolfSSL 4:1b0d80432c79 15 * GNU General Public License for more details.
wolfSSL 4:1b0d80432c79 16 *
wolfSSL 4:1b0d80432c79 17 * You should have received a copy of the GNU General Public License
wolfSSL 4:1b0d80432c79 18 * along with this program; if not, write to the Free Software
wolfSSL 4:1b0d80432c79 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
wolfSSL 4:1b0d80432c79 20 */
wolfSSL 4:1b0d80432c79 21
wolfSSL 4:1b0d80432c79 22
wolfSSL 4:1b0d80432c79 23
wolfSSL 4:1b0d80432c79 24 #ifdef HAVE_CONFIG_H
wolfSSL 4:1b0d80432c79 25 #include <config.h>
wolfSSL 4:1b0d80432c79 26 #endif
wolfSSL 4:1b0d80432c79 27
wolfSSL 4:1b0d80432c79 28 #include <wolfssl/wolfcrypt/settings.h>
wolfSSL 4:1b0d80432c79 29
wolfSSL 4:1b0d80432c79 30 #ifndef WOLFCRYPT_ONLY
wolfSSL 4:1b0d80432c79 31
wolfSSL 4:1b0d80432c79 32 #ifdef _WIN32_WCE
wolfSSL 4:1b0d80432c79 33 /* On WinCE winsock2.h must be included before windows.h for socket stuff */
wolfSSL 4:1b0d80432c79 34 #include <winsock2.h>
wolfSSL 4:1b0d80432c79 35 #endif
wolfSSL 4:1b0d80432c79 36
wolfSSL 4:1b0d80432c79 37 #include <wolfssl/internal.h>
wolfSSL 4:1b0d80432c79 38 #include <wolfssl/error-ssl.h>
wolfSSL 4:1b0d80432c79 39
wolfSSL 4:1b0d80432c79 40
wolfSSL 4:1b0d80432c79 41 /* if user writes own I/O callbacks they can define WOLFSSL_USER_IO to remove
wolfSSL 4:1b0d80432c79 42 automatic setting of default I/O functions EmbedSend() and EmbedReceive()
wolfSSL 4:1b0d80432c79 43 but they'll still need SetCallback xxx() at end of file
wolfSSL 4:1b0d80432c79 44 */
wolfSSL 4:1b0d80432c79 45 #ifndef WOLFSSL_USER_IO
wolfSSL 4:1b0d80432c79 46
wolfSSL 4:1b0d80432c79 47 #ifdef HAVE_LIBZ
wolfSSL 4:1b0d80432c79 48 #include "zlib.h"
wolfSSL 4:1b0d80432c79 49 #endif
wolfSSL 4:1b0d80432c79 50
wolfSSL 4:1b0d80432c79 51 #ifndef USE_WINDOWS_API
wolfSSL 4:1b0d80432c79 52 #ifdef WOLFSSL_LWIP
wolfSSL 4:1b0d80432c79 53 /* lwIP needs to be configured to use sockets API in this mode */
wolfSSL 4:1b0d80432c79 54 /* LWIP_SOCKET 1 in lwip/opt.h or in build */
wolfSSL 4:1b0d80432c79 55 #include "lwip/sockets.h"
wolfSSL 4:1b0d80432c79 56 #include <errno.h>
wolfSSL 4:1b0d80432c79 57 #ifndef LWIP_PROVIDE_ERRNO
wolfSSL 4:1b0d80432c79 58 #define LWIP_PROVIDE_ERRNO 1
wolfSSL 4:1b0d80432c79 59 #endif
wolfSSL 4:1b0d80432c79 60 #elif defined(FREESCALE_MQX)
wolfSSL 4:1b0d80432c79 61 #include <posix.h>
wolfSSL 4:1b0d80432c79 62 #include <rtcs.h>
wolfSSL 4:1b0d80432c79 63 #elif defined(FREESCALE_KSDK_MQX)
wolfSSL 4:1b0d80432c79 64 #include <rtcs.h>
wolfSSL 4:1b0d80432c79 65 #elif defined(WOLFSSL_MDK_ARM) || defined(WOLFSSL_KEIL_TCP_NET)
wolfSSL 4:1b0d80432c79 66 #if !defined(WOLFSSL_MDK_ARM)
wolfSSL 4:1b0d80432c79 67 #include "cmsis_os.h"
wolfSSL 4:1b0d80432c79 68 #include "rl_net.h"
wolfSSL 4:1b0d80432c79 69 #else
wolfSSL 4:1b0d80432c79 70 #include <rtl.h>
wolfSSL 4:1b0d80432c79 71 #endif
wolfSSL 4:1b0d80432c79 72 #include "errno.h"
wolfSSL 4:1b0d80432c79 73 #define SOCKET_T int
wolfSSL 4:1b0d80432c79 74 #elif defined(WOLFSSL_TIRTOS)
wolfSSL 4:1b0d80432c79 75 #include <sys/socket.h>
wolfSSL 4:1b0d80432c79 76 #elif defined(FREERTOS_TCP)
wolfSSL 4:1b0d80432c79 77 #include "FreeRTOS_Sockets.h"
wolfSSL 4:1b0d80432c79 78 #elif defined(WOLFSSL_IAR_ARM)
wolfSSL 4:1b0d80432c79 79 /* nothing */
wolfSSL 4:1b0d80432c79 80 #elif defined(WOLFSSL_VXWORKS)
wolfSSL 4:1b0d80432c79 81 #include <sockLib.h>
wolfSSL 4:1b0d80432c79 82 #include <errno.h>
wolfSSL 4:1b0d80432c79 83 #else
wolfSSL 4:1b0d80432c79 84 #include <sys/types.h>
wolfSSL 4:1b0d80432c79 85 #include <errno.h>
wolfSSL 4:1b0d80432c79 86 #ifndef EBSNET
wolfSSL 4:1b0d80432c79 87 #include <unistd.h>
wolfSSL 4:1b0d80432c79 88 #endif
wolfSSL 4:1b0d80432c79 89 #include <fcntl.h>
wolfSSL 4:1b0d80432c79 90
wolfSSL 4:1b0d80432c79 91 #if defined(HAVE_RTP_SYS)
wolfSSL 4:1b0d80432c79 92 #include <socket.h>
wolfSSL 4:1b0d80432c79 93 #elif defined(EBSNET)
wolfSSL 4:1b0d80432c79 94 #include "rtipapi.h" /* errno */
wolfSSL 4:1b0d80432c79 95 #include "socket.h"
wolfSSL 4:1b0d80432c79 96 #elif !defined(DEVKITPRO) && !defined(WOLFSSL_PICOTCP)
wolfSSL 4:1b0d80432c79 97 #include <sys/socket.h>
wolfSSL 4:1b0d80432c79 98 #include <arpa/inet.h>
wolfSSL 4:1b0d80432c79 99 #include <netinet/in.h>
wolfSSL 4:1b0d80432c79 100 #include <netdb.h>
wolfSSL 4:1b0d80432c79 101 #ifdef __PPU
wolfSSL 4:1b0d80432c79 102 #include <netex/errno.h>
wolfSSL 4:1b0d80432c79 103 #else
wolfSSL 4:1b0d80432c79 104 #include <sys/ioctl.h>
wolfSSL 4:1b0d80432c79 105 #endif
wolfSSL 4:1b0d80432c79 106 #endif
wolfSSL 4:1b0d80432c79 107 #endif
wolfSSL 4:1b0d80432c79 108 #endif /* USE_WINDOWS_API */
wolfSSL 4:1b0d80432c79 109
wolfSSL 4:1b0d80432c79 110 #ifdef __sun
wolfSSL 4:1b0d80432c79 111 #include <sys/filio.h>
wolfSSL 4:1b0d80432c79 112 #endif
wolfSSL 4:1b0d80432c79 113
wolfSSL 4:1b0d80432c79 114 #ifdef USE_WINDOWS_API
wolfSSL 4:1b0d80432c79 115 /* no epipe yet */
wolfSSL 4:1b0d80432c79 116 #ifndef WSAEPIPE
wolfSSL 4:1b0d80432c79 117 #define WSAEPIPE -12345
wolfSSL 4:1b0d80432c79 118 #endif
wolfSSL 4:1b0d80432c79 119 #define SOCKET_EWOULDBLOCK WSAEWOULDBLOCK
wolfSSL 4:1b0d80432c79 120 #define SOCKET_EAGAIN WSAETIMEDOUT
wolfSSL 4:1b0d80432c79 121 #define SOCKET_ECONNRESET WSAECONNRESET
wolfSSL 4:1b0d80432c79 122 #define SOCKET_EINTR WSAEINTR
wolfSSL 4:1b0d80432c79 123 #define SOCKET_EPIPE WSAEPIPE
wolfSSL 4:1b0d80432c79 124 #define SOCKET_ECONNREFUSED WSAENOTCONN
wolfSSL 4:1b0d80432c79 125 #define SOCKET_ECONNABORTED WSAECONNABORTED
wolfSSL 4:1b0d80432c79 126 #define close(s) closesocket(s)
wolfSSL 4:1b0d80432c79 127 #elif defined(__PPU)
wolfSSL 4:1b0d80432c79 128 #define SOCKET_EWOULDBLOCK SYS_NET_EWOULDBLOCK
wolfSSL 4:1b0d80432c79 129 #define SOCKET_EAGAIN SYS_NET_EAGAIN
wolfSSL 4:1b0d80432c79 130 #define SOCKET_ECONNRESET SYS_NET_ECONNRESET
wolfSSL 4:1b0d80432c79 131 #define SOCKET_EINTR SYS_NET_EINTR
wolfSSL 4:1b0d80432c79 132 #define SOCKET_EPIPE SYS_NET_EPIPE
wolfSSL 4:1b0d80432c79 133 #define SOCKET_ECONNREFUSED SYS_NET_ECONNREFUSED
wolfSSL 4:1b0d80432c79 134 #define SOCKET_ECONNABORTED SYS_NET_ECONNABORTED
wolfSSL 4:1b0d80432c79 135 #elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
wolfSSL 4:1b0d80432c79 136 #if MQX_USE_IO_OLD
wolfSSL 4:1b0d80432c79 137 /* RTCS old I/O doesn't have an EWOULDBLOCK */
wolfSSL 4:1b0d80432c79 138 #define SOCKET_EWOULDBLOCK EAGAIN
wolfSSL 4:1b0d80432c79 139 #define SOCKET_EAGAIN EAGAIN
wolfSSL 4:1b0d80432c79 140 #define SOCKET_ECONNRESET RTCSERR_TCP_CONN_RESET
wolfSSL 4:1b0d80432c79 141 #define SOCKET_EINTR EINTR
wolfSSL 4:1b0d80432c79 142 #define SOCKET_EPIPE EPIPE
wolfSSL 4:1b0d80432c79 143 #define SOCKET_ECONNREFUSED RTCSERR_TCP_CONN_REFUSED
wolfSSL 4:1b0d80432c79 144 #define SOCKET_ECONNABORTED RTCSERR_TCP_CONN_ABORTED
wolfSSL 4:1b0d80432c79 145 #else
wolfSSL 4:1b0d80432c79 146 #define SOCKET_EWOULDBLOCK NIO_EWOULDBLOCK
wolfSSL 4:1b0d80432c79 147 #define SOCKET_EAGAIN NIO_EAGAIN
wolfSSL 4:1b0d80432c79 148 #define SOCKET_ECONNRESET NIO_ECONNRESET
wolfSSL 4:1b0d80432c79 149 #define SOCKET_EINTR NIO_EINTR
wolfSSL 4:1b0d80432c79 150 #define SOCKET_EPIPE NIO_EPIPE
wolfSSL 4:1b0d80432c79 151 #define SOCKET_ECONNREFUSED NIO_ECONNREFUSED
wolfSSL 4:1b0d80432c79 152 #define SOCKET_ECONNABORTED NIO_ECONNABORTED
wolfSSL 4:1b0d80432c79 153 #endif
wolfSSL 4:1b0d80432c79 154 #elif defined(WOLFSSL_MDK_ARM)|| defined(WOLFSSL_KEIL_TCP_NET)
wolfSSL 4:1b0d80432c79 155 #if !defined(WOLFSSL_MDK_ARM)
wolfSSL 4:1b0d80432c79 156 #define SOCKET_EWOULDBLOCK BSD_ERROR_WOULDBLOCK
wolfSSL 4:1b0d80432c79 157 #define SOCKET_EAGAIN BSD_ERROR_LOCKED
wolfSSL 4:1b0d80432c79 158 #define SOCKET_ECONNRESET BSD_ERROR_CLOSED
wolfSSL 4:1b0d80432c79 159 #define SOCKET_EINTR BSD_ERROR
wolfSSL 4:1b0d80432c79 160 #define SOCKET_EPIPE BSD_ERROR
wolfSSL 4:1b0d80432c79 161 #define SOCKET_ECONNREFUSED BSD_ERROR
wolfSSL 4:1b0d80432c79 162 #define SOCKET_ECONNABORTED BSD_ERROR
wolfSSL 4:1b0d80432c79 163 #else
wolfSSL 4:1b0d80432c79 164 #define SOCKET_EWOULDBLOCK SCK_EWOULDBLOCK
wolfSSL 4:1b0d80432c79 165 #define SOCKET_EAGAIN SCK_ELOCKED
wolfSSL 4:1b0d80432c79 166 #define SOCKET_ECONNRESET SCK_ECLOSED
wolfSSL 4:1b0d80432c79 167 #define SOCKET_EINTR SCK_ERROR
wolfSSL 4:1b0d80432c79 168 #define SOCKET_EPIPE SCK_ERROR
wolfSSL 4:1b0d80432c79 169 #define SOCKET_ECONNREFUSED SCK_ERROR
wolfSSL 4:1b0d80432c79 170 #define SOCKET_ECONNABORTED SCK_ERROR
wolfSSL 4:1b0d80432c79 171 #endif
wolfSSL 4:1b0d80432c79 172 #elif defined(WOLFSSL_PICOTCP)
wolfSSL 4:1b0d80432c79 173 #define SOCKET_EWOULDBLOCK PICO_ERR_EAGAIN
wolfSSL 4:1b0d80432c79 174 #define SOCKET_EAGAIN PICO_ERR_EAGAIN
wolfSSL 4:1b0d80432c79 175 #define SOCKET_ECONNRESET PICO_ERR_ECONNRESET
wolfSSL 4:1b0d80432c79 176 #define SOCKET_EINTR PICO_ERR_EINTR
wolfSSL 4:1b0d80432c79 177 #define SOCKET_EPIPE PICO_ERR_EIO
wolfSSL 4:1b0d80432c79 178 #define SOCKET_ECONNREFUSED PICO_ERR_ECONNREFUSED
wolfSSL 4:1b0d80432c79 179 #define SOCKET_ECONNABORTED PICO_ERR_ESHUTDOWN
wolfSSL 4:1b0d80432c79 180 #elif defined(FREERTOS_TCP)
wolfSSL 4:1b0d80432c79 181 #define SOCKET_EWOULDBLOCK FREERTOS_EWOULDBLOCK
wolfSSL 4:1b0d80432c79 182 #define SOCKET_EAGAIN FREERTOS_EWOULDBLOCK
wolfSSL 4:1b0d80432c79 183 #define SOCKET_ECONNRESET FREERTOS_SOCKET_ERROR
wolfSSL 4:1b0d80432c79 184 #define SOCKET_EINTR FREERTOS_SOCKET_ERROR
wolfSSL 4:1b0d80432c79 185 #define SOCKET_EPIPE FREERTOS_SOCKET_ERROR
wolfSSL 4:1b0d80432c79 186 #define SOCKET_ECONNREFUSED FREERTOS_SOCKET_ERROR
wolfSSL 4:1b0d80432c79 187 #define SOCKET_ECONNABORTED FREERTOS_SOCKET_ERROR
wolfSSL 4:1b0d80432c79 188 #else
wolfSSL 4:1b0d80432c79 189 #define SOCKET_EWOULDBLOCK EWOULDBLOCK
wolfSSL 4:1b0d80432c79 190 #define SOCKET_EAGAIN EAGAIN
wolfSSL 4:1b0d80432c79 191 #define SOCKET_ECONNRESET ECONNRESET
wolfSSL 4:1b0d80432c79 192 #define SOCKET_EINTR EINTR
wolfSSL 4:1b0d80432c79 193 #define SOCKET_EPIPE EPIPE
wolfSSL 4:1b0d80432c79 194 #define SOCKET_ECONNREFUSED ECONNREFUSED
wolfSSL 4:1b0d80432c79 195 #define SOCKET_ECONNABORTED ECONNABORTED
wolfSSL 4:1b0d80432c79 196 #endif /* USE_WINDOWS_API */
wolfSSL 4:1b0d80432c79 197
wolfSSL 4:1b0d80432c79 198
wolfSSL 4:1b0d80432c79 199 #ifdef DEVKITPRO
wolfSSL 4:1b0d80432c79 200 /* from network.h */
wolfSSL 4:1b0d80432c79 201 int net_send(int, const void*, int, unsigned int);
wolfSSL 4:1b0d80432c79 202 int net_recv(int, void*, int, unsigned int);
wolfSSL 4:1b0d80432c79 203 #define SEND_FUNCTION net_send
wolfSSL 4:1b0d80432c79 204 #define RECV_FUNCTION net_recv
wolfSSL 4:1b0d80432c79 205 #elif defined(WOLFSSL_LWIP)
wolfSSL 4:1b0d80432c79 206 #define SEND_FUNCTION lwip_send
wolfSSL 4:1b0d80432c79 207 #define RECV_FUNCTION lwip_recv
wolfSSL 4:1b0d80432c79 208 #elif defined(WOLFSSL_PICOTCP)
wolfSSL 4:1b0d80432c79 209 #define SEND_FUNCTION pico_send
wolfSSL 4:1b0d80432c79 210 #define RECV_FUNCTION pico_recv
wolfSSL 4:1b0d80432c79 211 #elif defined(FREERTOS_TCP)
wolfSSL 4:1b0d80432c79 212 #define RECV_FUNCTION(a,b,c,d) FreeRTOS_recv((Socket_t)(a),(void*)(b), (size_t)(c), (BaseType_t)(d))
wolfSSL 4:1b0d80432c79 213 #define SEND_FUNCTION(a,b,c,d) FreeRTOS_send((Socket_t)(a),(void*)(b), (size_t)(c), (BaseType_t)(d))
wolfSSL 4:1b0d80432c79 214 #else
wolfSSL 4:1b0d80432c79 215 #define SEND_FUNCTION send
wolfSSL 4:1b0d80432c79 216 #define RECV_FUNCTION recv
wolfSSL 4:1b0d80432c79 217 #endif
wolfSSL 4:1b0d80432c79 218
wolfSSL 4:1b0d80432c79 219
wolfSSL 4:1b0d80432c79 220 /* Translates return codes returned from
wolfSSL 4:1b0d80432c79 221 * send() and recv() if need be.
wolfSSL 4:1b0d80432c79 222 */
wolfSSL 4:1b0d80432c79 223 static INLINE int TranslateReturnCode(int old, int sd)
wolfSSL 4:1b0d80432c79 224 {
wolfSSL 4:1b0d80432c79 225 (void)sd;
wolfSSL 4:1b0d80432c79 226
wolfSSL 4:1b0d80432c79 227 #if defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX)
wolfSSL 4:1b0d80432c79 228 if (old == 0) {
wolfSSL 4:1b0d80432c79 229 errno = SOCKET_EWOULDBLOCK;
wolfSSL 4:1b0d80432c79 230 return -1; /* convert to BSD style wouldblock as error */
wolfSSL 4:1b0d80432c79 231 }
wolfSSL 4:1b0d80432c79 232
wolfSSL 4:1b0d80432c79 233 if (old < 0) {
wolfSSL 4:1b0d80432c79 234 errno = RTCS_geterror(sd);
wolfSSL 4:1b0d80432c79 235 if (errno == RTCSERR_TCP_CONN_CLOSING)
wolfSSL 4:1b0d80432c79 236 return 0; /* convert to BSD style closing */
wolfSSL 4:1b0d80432c79 237 if (errno == RTCSERR_TCP_CONN_RLSD)
wolfSSL 4:1b0d80432c79 238 errno = SOCKET_ECONNRESET;
wolfSSL 4:1b0d80432c79 239 if (errno == RTCSERR_TCP_TIMED_OUT)
wolfSSL 4:1b0d80432c79 240 errno = SOCKET_EAGAIN;
wolfSSL 4:1b0d80432c79 241 }
wolfSSL 4:1b0d80432c79 242 #endif
wolfSSL 4:1b0d80432c79 243
wolfSSL 4:1b0d80432c79 244 return old;
wolfSSL 4:1b0d80432c79 245 }
wolfSSL 4:1b0d80432c79 246
wolfSSL 4:1b0d80432c79 247 static INLINE int LastError(void)
wolfSSL 4:1b0d80432c79 248 {
wolfSSL 4:1b0d80432c79 249 #ifdef USE_WINDOWS_API
wolfSSL 4:1b0d80432c79 250 return WSAGetLastError();
wolfSSL 4:1b0d80432c79 251 #elif defined(EBSNET)
wolfSSL 4:1b0d80432c79 252 return xn_getlasterror();
wolfSSL 4:1b0d80432c79 253 #else
wolfSSL 4:1b0d80432c79 254 return errno;
wolfSSL 4:1b0d80432c79 255 #endif
wolfSSL 4:1b0d80432c79 256 }
wolfSSL 4:1b0d80432c79 257
wolfSSL 4:1b0d80432c79 258 /* The receive embedded callback
wolfSSL 4:1b0d80432c79 259 * return : nb bytes read, or error
wolfSSL 4:1b0d80432c79 260 */
wolfSSL 4:1b0d80432c79 261 int EmbedReceive(WOLFSSL *ssl, char *buf, int sz, void *ctx)
wolfSSL 4:1b0d80432c79 262 {
wolfSSL 4:1b0d80432c79 263 int recvd;
wolfSSL 4:1b0d80432c79 264 int err;
wolfSSL 4:1b0d80432c79 265 int sd = *(int*)ctx;
wolfSSL 4:1b0d80432c79 266
wolfSSL 4:1b0d80432c79 267 #ifdef WOLFSSL_DTLS
wolfSSL 4:1b0d80432c79 268 {
wolfSSL 4:1b0d80432c79 269 int dtls_timeout = wolfSSL_dtls_get_current_timeout(ssl);
wolfSSL 4:1b0d80432c79 270 if (wolfSSL_dtls(ssl)
wolfSSL 4:1b0d80432c79 271 && !wolfSSL_get_using_nonblock(ssl)
wolfSSL 4:1b0d80432c79 272 && dtls_timeout != 0) {
wolfSSL 4:1b0d80432c79 273 #ifdef USE_WINDOWS_API
wolfSSL 4:1b0d80432c79 274 DWORD timeout = dtls_timeout * 1000;
wolfSSL 4:1b0d80432c79 275 #else
wolfSSL 4:1b0d80432c79 276 struct timeval timeout;
wolfSSL 4:1b0d80432c79 277 XMEMSET(&timeout, 0, sizeof(timeout));
wolfSSL 4:1b0d80432c79 278 timeout.tv_sec = dtls_timeout;
wolfSSL 4:1b0d80432c79 279 #endif
wolfSSL 4:1b0d80432c79 280 if (setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout,
wolfSSL 4:1b0d80432c79 281 sizeof(timeout)) != 0) {
wolfSSL 4:1b0d80432c79 282 WOLFSSL_MSG("setsockopt rcvtimeo failed");
wolfSSL 4:1b0d80432c79 283 }
wolfSSL 4:1b0d80432c79 284 }
wolfSSL 4:1b0d80432c79 285 }
wolfSSL 4:1b0d80432c79 286 #endif
wolfSSL 4:1b0d80432c79 287
wolfSSL 4:1b0d80432c79 288 recvd = (int)RECV_FUNCTION(sd, buf, sz, ssl->rflags);
wolfSSL 4:1b0d80432c79 289
wolfSSL 4:1b0d80432c79 290 recvd = TranslateReturnCode(recvd, sd);
wolfSSL 4:1b0d80432c79 291
wolfSSL 4:1b0d80432c79 292 if (recvd < 0) {
wolfSSL 4:1b0d80432c79 293 err = LastError();
wolfSSL 4:1b0d80432c79 294 WOLFSSL_MSG("Embed Receive error");
wolfSSL 4:1b0d80432c79 295
wolfSSL 4:1b0d80432c79 296 if (err == SOCKET_EWOULDBLOCK || err == SOCKET_EAGAIN) {
wolfSSL 4:1b0d80432c79 297 if (!wolfSSL_dtls(ssl) || wolfSSL_get_using_nonblock(ssl)) {
wolfSSL 4:1b0d80432c79 298 WOLFSSL_MSG(" Would block");
wolfSSL 4:1b0d80432c79 299 return WOLFSSL_CBIO_ERR_WANT_READ;
wolfSSL 4:1b0d80432c79 300 }
wolfSSL 4:1b0d80432c79 301 else {
wolfSSL 4:1b0d80432c79 302 WOLFSSL_MSG(" Socket timeout");
wolfSSL 4:1b0d80432c79 303 return WOLFSSL_CBIO_ERR_TIMEOUT;
wolfSSL 4:1b0d80432c79 304 }
wolfSSL 4:1b0d80432c79 305 }
wolfSSL 4:1b0d80432c79 306 else if (err == SOCKET_ECONNRESET) {
wolfSSL 4:1b0d80432c79 307 WOLFSSL_MSG(" Connection reset");
wolfSSL 4:1b0d80432c79 308 return WOLFSSL_CBIO_ERR_CONN_RST;
wolfSSL 4:1b0d80432c79 309 }
wolfSSL 4:1b0d80432c79 310 else if (err == SOCKET_EINTR) {
wolfSSL 4:1b0d80432c79 311 WOLFSSL_MSG(" Socket interrupted");
wolfSSL 4:1b0d80432c79 312 return WOLFSSL_CBIO_ERR_ISR;
wolfSSL 4:1b0d80432c79 313 }
wolfSSL 4:1b0d80432c79 314 else if (err == SOCKET_ECONNREFUSED) {
wolfSSL 4:1b0d80432c79 315 WOLFSSL_MSG(" Connection refused");
wolfSSL 4:1b0d80432c79 316 return WOLFSSL_CBIO_ERR_WANT_READ;
wolfSSL 4:1b0d80432c79 317 }
wolfSSL 4:1b0d80432c79 318 else if (err == SOCKET_ECONNABORTED) {
wolfSSL 4:1b0d80432c79 319 WOLFSSL_MSG(" Connection aborted");
wolfSSL 4:1b0d80432c79 320 return WOLFSSL_CBIO_ERR_CONN_CLOSE;
wolfSSL 4:1b0d80432c79 321 }
wolfSSL 4:1b0d80432c79 322 else {
wolfSSL 4:1b0d80432c79 323 WOLFSSL_MSG(" General error");
wolfSSL 4:1b0d80432c79 324 return WOLFSSL_CBIO_ERR_GENERAL;
wolfSSL 4:1b0d80432c79 325 }
wolfSSL 4:1b0d80432c79 326 }
wolfSSL 4:1b0d80432c79 327 else if (recvd == 0) {
wolfSSL 4:1b0d80432c79 328 WOLFSSL_MSG("Embed receive connection closed");
wolfSSL 4:1b0d80432c79 329 return WOLFSSL_CBIO_ERR_CONN_CLOSE;
wolfSSL 4:1b0d80432c79 330 }
wolfSSL 4:1b0d80432c79 331
wolfSSL 4:1b0d80432c79 332 return recvd;
wolfSSL 4:1b0d80432c79 333 }
wolfSSL 4:1b0d80432c79 334
wolfSSL 4:1b0d80432c79 335 /* The send embedded callback
wolfSSL 4:1b0d80432c79 336 * return : nb bytes sent, or error
wolfSSL 4:1b0d80432c79 337 */
wolfSSL 4:1b0d80432c79 338 int EmbedSend(WOLFSSL* ssl, char *buf, int sz, void *ctx)
wolfSSL 4:1b0d80432c79 339 {
wolfSSL 4:1b0d80432c79 340 int sd = *(int*)ctx;
wolfSSL 4:1b0d80432c79 341 int sent;
wolfSSL 4:1b0d80432c79 342 int len = sz;
wolfSSL 4:1b0d80432c79 343 int err;
wolfSSL 4:1b0d80432c79 344
wolfSSL 4:1b0d80432c79 345 sent = (int)SEND_FUNCTION(sd, &buf[sz - len], len, ssl->wflags);
wolfSSL 4:1b0d80432c79 346
wolfSSL 4:1b0d80432c79 347 sent = TranslateReturnCode(sent, sd);
wolfSSL 4:1b0d80432c79 348
wolfSSL 4:1b0d80432c79 349 if (sent < 0) {
wolfSSL 4:1b0d80432c79 350 err = LastError();
wolfSSL 4:1b0d80432c79 351 WOLFSSL_MSG("Embed Send error");
wolfSSL 4:1b0d80432c79 352
wolfSSL 4:1b0d80432c79 353 if (err == SOCKET_EWOULDBLOCK || err == SOCKET_EAGAIN) {
wolfSSL 4:1b0d80432c79 354 WOLFSSL_MSG(" Would Block");
wolfSSL 4:1b0d80432c79 355 return WOLFSSL_CBIO_ERR_WANT_WRITE;
wolfSSL 4:1b0d80432c79 356 }
wolfSSL 4:1b0d80432c79 357 else if (err == SOCKET_ECONNRESET) {
wolfSSL 4:1b0d80432c79 358 WOLFSSL_MSG(" Connection reset");
wolfSSL 4:1b0d80432c79 359 return WOLFSSL_CBIO_ERR_CONN_RST;
wolfSSL 4:1b0d80432c79 360 }
wolfSSL 4:1b0d80432c79 361 else if (err == SOCKET_EINTR) {
wolfSSL 4:1b0d80432c79 362 WOLFSSL_MSG(" Socket interrupted");
wolfSSL 4:1b0d80432c79 363 return WOLFSSL_CBIO_ERR_ISR;
wolfSSL 4:1b0d80432c79 364 }
wolfSSL 4:1b0d80432c79 365 else if (err == SOCKET_EPIPE) {
wolfSSL 4:1b0d80432c79 366 WOLFSSL_MSG(" Socket EPIPE");
wolfSSL 4:1b0d80432c79 367 return WOLFSSL_CBIO_ERR_CONN_CLOSE;
wolfSSL 4:1b0d80432c79 368 }
wolfSSL 4:1b0d80432c79 369 else {
wolfSSL 4:1b0d80432c79 370 WOLFSSL_MSG(" General error");
wolfSSL 4:1b0d80432c79 371 return WOLFSSL_CBIO_ERR_GENERAL;
wolfSSL 4:1b0d80432c79 372 }
wolfSSL 4:1b0d80432c79 373 }
wolfSSL 4:1b0d80432c79 374
wolfSSL 4:1b0d80432c79 375 return sent;
wolfSSL 4:1b0d80432c79 376 }
wolfSSL 4:1b0d80432c79 377
wolfSSL 4:1b0d80432c79 378
wolfSSL 4:1b0d80432c79 379 #ifdef WOLFSSL_DTLS
wolfSSL 4:1b0d80432c79 380
wolfSSL 4:1b0d80432c79 381 #include <wolfssl/wolfcrypt/sha.h>
wolfSSL 4:1b0d80432c79 382
wolfSSL 4:1b0d80432c79 383 #ifdef USE_WINDOWS_API
wolfSSL 4:1b0d80432c79 384 #define XSOCKLENT int
wolfSSL 4:1b0d80432c79 385 #else
wolfSSL 4:1b0d80432c79 386 #define XSOCKLENT socklen_t
wolfSSL 4:1b0d80432c79 387 #endif
wolfSSL 4:1b0d80432c79 388
wolfSSL 4:1b0d80432c79 389 #define SENDTO_FUNCTION sendto
wolfSSL 4:1b0d80432c79 390 #define RECVFROM_FUNCTION recvfrom
wolfSSL 4:1b0d80432c79 391
wolfSSL 4:1b0d80432c79 392
wolfSSL 4:1b0d80432c79 393 /* The receive embedded callback
wolfSSL 4:1b0d80432c79 394 * return : nb bytes read, or error
wolfSSL 4:1b0d80432c79 395 */
wolfSSL 4:1b0d80432c79 396 int EmbedReceiveFrom(WOLFSSL *ssl, char *buf, int sz, void *ctx)
wolfSSL 4:1b0d80432c79 397 {
wolfSSL 4:1b0d80432c79 398 WOLFSSL_DTLS_CTX* dtlsCtx = (WOLFSSL_DTLS_CTX*)ctx;
wolfSSL 4:1b0d80432c79 399 int recvd;
wolfSSL 4:1b0d80432c79 400 int err;
wolfSSL 4:1b0d80432c79 401 int sd = dtlsCtx->fd;
wolfSSL 4:1b0d80432c79 402 int dtls_timeout = wolfSSL_dtls_get_current_timeout(ssl);
wolfSSL 4:1b0d80432c79 403 struct sockaddr_storage peer;
wolfSSL 4:1b0d80432c79 404 XSOCKLENT peerSz = sizeof(peer);
wolfSSL 4:1b0d80432c79 405
wolfSSL 4:1b0d80432c79 406 WOLFSSL_ENTER("EmbedReceiveFrom()");
wolfSSL 4:1b0d80432c79 407
wolfSSL 4:1b0d80432c79 408 if (ssl->options.handShakeDone)
wolfSSL 4:1b0d80432c79 409 dtls_timeout = 0;
wolfSSL 4:1b0d80432c79 410
wolfSSL 4:1b0d80432c79 411 if (!wolfSSL_get_using_nonblock(ssl)) {
wolfSSL 4:1b0d80432c79 412 #ifdef USE_WINDOWS_API
wolfSSL 4:1b0d80432c79 413 DWORD timeout = dtls_timeout * 1000;
wolfSSL 4:1b0d80432c79 414 #else
wolfSSL 4:1b0d80432c79 415 struct timeval timeout;
wolfSSL 4:1b0d80432c79 416 XMEMSET(&timeout, 0, sizeof(timeout));
wolfSSL 4:1b0d80432c79 417 timeout.tv_sec = dtls_timeout;
wolfSSL 4:1b0d80432c79 418 #endif
wolfSSL 4:1b0d80432c79 419 if (setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout,
wolfSSL 4:1b0d80432c79 420 sizeof(timeout)) != 0) {
wolfSSL 4:1b0d80432c79 421 WOLFSSL_MSG("setsockopt rcvtimeo failed");
wolfSSL 4:1b0d80432c79 422 }
wolfSSL 4:1b0d80432c79 423 }
wolfSSL 4:1b0d80432c79 424
wolfSSL 4:1b0d80432c79 425 recvd = (int)RECVFROM_FUNCTION(sd, buf, sz, ssl->rflags,
wolfSSL 4:1b0d80432c79 426 (struct sockaddr*)&peer, &peerSz);
wolfSSL 4:1b0d80432c79 427
wolfSSL 4:1b0d80432c79 428 recvd = TranslateReturnCode(recvd, sd);
wolfSSL 4:1b0d80432c79 429
wolfSSL 4:1b0d80432c79 430 if (recvd < 0) {
wolfSSL 4:1b0d80432c79 431 err = LastError();
wolfSSL 4:1b0d80432c79 432 WOLFSSL_MSG("Embed Receive From error");
wolfSSL 4:1b0d80432c79 433
wolfSSL 4:1b0d80432c79 434 if (err == SOCKET_EWOULDBLOCK || err == SOCKET_EAGAIN) {
wolfSSL 4:1b0d80432c79 435 if (wolfSSL_get_using_nonblock(ssl)) {
wolfSSL 4:1b0d80432c79 436 WOLFSSL_MSG(" Would block");
wolfSSL 4:1b0d80432c79 437 return WOLFSSL_CBIO_ERR_WANT_READ;
wolfSSL 4:1b0d80432c79 438 }
wolfSSL 4:1b0d80432c79 439 else {
wolfSSL 4:1b0d80432c79 440 WOLFSSL_MSG(" Socket timeout");
wolfSSL 4:1b0d80432c79 441 return WOLFSSL_CBIO_ERR_TIMEOUT;
wolfSSL 4:1b0d80432c79 442 }
wolfSSL 4:1b0d80432c79 443 }
wolfSSL 4:1b0d80432c79 444 else if (err == SOCKET_ECONNRESET) {
wolfSSL 4:1b0d80432c79 445 WOLFSSL_MSG(" Connection reset");
wolfSSL 4:1b0d80432c79 446 return WOLFSSL_CBIO_ERR_CONN_RST;
wolfSSL 4:1b0d80432c79 447 }
wolfSSL 4:1b0d80432c79 448 else if (err == SOCKET_EINTR) {
wolfSSL 4:1b0d80432c79 449 WOLFSSL_MSG(" Socket interrupted");
wolfSSL 4:1b0d80432c79 450 return WOLFSSL_CBIO_ERR_ISR;
wolfSSL 4:1b0d80432c79 451 }
wolfSSL 4:1b0d80432c79 452 else if (err == SOCKET_ECONNREFUSED) {
wolfSSL 4:1b0d80432c79 453 WOLFSSL_MSG(" Connection refused");
wolfSSL 4:1b0d80432c79 454 return WOLFSSL_CBIO_ERR_WANT_READ;
wolfSSL 4:1b0d80432c79 455 }
wolfSSL 4:1b0d80432c79 456 else {
wolfSSL 4:1b0d80432c79 457 WOLFSSL_MSG(" General error");
wolfSSL 4:1b0d80432c79 458 return WOLFSSL_CBIO_ERR_GENERAL;
wolfSSL 4:1b0d80432c79 459 }
wolfSSL 4:1b0d80432c79 460 }
wolfSSL 4:1b0d80432c79 461 else {
wolfSSL 4:1b0d80432c79 462 if (dtlsCtx->peer.sz > 0
wolfSSL 4:1b0d80432c79 463 && peerSz != (XSOCKLENT)dtlsCtx->peer.sz
wolfSSL 4:1b0d80432c79 464 && memcmp(&peer, dtlsCtx->peer.sa, peerSz) != 0) {
wolfSSL 4:1b0d80432c79 465 WOLFSSL_MSG(" Ignored packet from invalid peer");
wolfSSL 4:1b0d80432c79 466 return WOLFSSL_CBIO_ERR_WANT_READ;
wolfSSL 4:1b0d80432c79 467 }
wolfSSL 4:1b0d80432c79 468 }
wolfSSL 4:1b0d80432c79 469
wolfSSL 4:1b0d80432c79 470 return recvd;
wolfSSL 4:1b0d80432c79 471 }
wolfSSL 4:1b0d80432c79 472
wolfSSL 4:1b0d80432c79 473
wolfSSL 4:1b0d80432c79 474 /* The send embedded callback
wolfSSL 4:1b0d80432c79 475 * return : nb bytes sent, or error
wolfSSL 4:1b0d80432c79 476 */
wolfSSL 4:1b0d80432c79 477 int EmbedSendTo(WOLFSSL* ssl, char *buf, int sz, void *ctx)
wolfSSL 4:1b0d80432c79 478 {
wolfSSL 4:1b0d80432c79 479 WOLFSSL_DTLS_CTX* dtlsCtx = (WOLFSSL_DTLS_CTX*)ctx;
wolfSSL 4:1b0d80432c79 480 int sd = dtlsCtx->fd;
wolfSSL 4:1b0d80432c79 481 int sent;
wolfSSL 4:1b0d80432c79 482 int len = sz;
wolfSSL 4:1b0d80432c79 483 int err;
wolfSSL 4:1b0d80432c79 484
wolfSSL 4:1b0d80432c79 485 WOLFSSL_ENTER("EmbedSendTo()");
wolfSSL 4:1b0d80432c79 486
wolfSSL 4:1b0d80432c79 487 sent = (int)SENDTO_FUNCTION(sd, &buf[sz - len], len, ssl->wflags,
wolfSSL 4:1b0d80432c79 488 (const struct sockaddr*)dtlsCtx->peer.sa,
wolfSSL 4:1b0d80432c79 489 dtlsCtx->peer.sz);
wolfSSL 4:1b0d80432c79 490
wolfSSL 4:1b0d80432c79 491 sent = TranslateReturnCode(sent, sd);
wolfSSL 4:1b0d80432c79 492
wolfSSL 4:1b0d80432c79 493 if (sent < 0) {
wolfSSL 4:1b0d80432c79 494 err = LastError();
wolfSSL 4:1b0d80432c79 495 WOLFSSL_MSG("Embed Send To error");
wolfSSL 4:1b0d80432c79 496
wolfSSL 4:1b0d80432c79 497 if (err == SOCKET_EWOULDBLOCK || err == SOCKET_EAGAIN) {
wolfSSL 4:1b0d80432c79 498 WOLFSSL_MSG(" Would Block");
wolfSSL 4:1b0d80432c79 499 return WOLFSSL_CBIO_ERR_WANT_WRITE;
wolfSSL 4:1b0d80432c79 500 }
wolfSSL 4:1b0d80432c79 501 else if (err == SOCKET_ECONNRESET) {
wolfSSL 4:1b0d80432c79 502 WOLFSSL_MSG(" Connection reset");
wolfSSL 4:1b0d80432c79 503 return WOLFSSL_CBIO_ERR_CONN_RST;
wolfSSL 4:1b0d80432c79 504 }
wolfSSL 4:1b0d80432c79 505 else if (err == SOCKET_EINTR) {
wolfSSL 4:1b0d80432c79 506 WOLFSSL_MSG(" Socket interrupted");
wolfSSL 4:1b0d80432c79 507 return WOLFSSL_CBIO_ERR_ISR;
wolfSSL 4:1b0d80432c79 508 }
wolfSSL 4:1b0d80432c79 509 else if (err == SOCKET_EPIPE) {
wolfSSL 4:1b0d80432c79 510 WOLFSSL_MSG(" Socket EPIPE");
wolfSSL 4:1b0d80432c79 511 return WOLFSSL_CBIO_ERR_CONN_CLOSE;
wolfSSL 4:1b0d80432c79 512 }
wolfSSL 4:1b0d80432c79 513 else {
wolfSSL 4:1b0d80432c79 514 WOLFSSL_MSG(" General error");
wolfSSL 4:1b0d80432c79 515 return WOLFSSL_CBIO_ERR_GENERAL;
wolfSSL 4:1b0d80432c79 516 }
wolfSSL 4:1b0d80432c79 517 }
wolfSSL 4:1b0d80432c79 518
wolfSSL 4:1b0d80432c79 519 return sent;
wolfSSL 4:1b0d80432c79 520 }
wolfSSL 4:1b0d80432c79 521
wolfSSL 4:1b0d80432c79 522
wolfSSL 4:1b0d80432c79 523 /* The DTLS Generate Cookie callback
wolfSSL 4:1b0d80432c79 524 * return : number of bytes copied into buf, or error
wolfSSL 4:1b0d80432c79 525 */
wolfSSL 4:1b0d80432c79 526 int EmbedGenerateCookie(WOLFSSL* ssl, byte *buf, int sz, void *ctx)
wolfSSL 4:1b0d80432c79 527 {
wolfSSL 4:1b0d80432c79 528 int sd = ssl->wfd;
wolfSSL 4:1b0d80432c79 529 struct sockaddr_storage peer;
wolfSSL 4:1b0d80432c79 530 XSOCKLENT peerSz = sizeof(peer);
wolfSSL 4:1b0d80432c79 531 byte digest[SHA_DIGEST_SIZE];
wolfSSL 4:1b0d80432c79 532 int ret = 0;
wolfSSL 4:1b0d80432c79 533
wolfSSL 4:1b0d80432c79 534 (void)ctx;
wolfSSL 4:1b0d80432c79 535
wolfSSL 4:1b0d80432c79 536 XMEMSET(&peer, 0, sizeof(peer));
wolfSSL 4:1b0d80432c79 537 if (getpeername(sd, (struct sockaddr*)&peer, &peerSz) != 0) {
wolfSSL 4:1b0d80432c79 538 WOLFSSL_MSG("getpeername failed in EmbedGenerateCookie");
wolfSSL 4:1b0d80432c79 539 return GEN_COOKIE_E;
wolfSSL 4:1b0d80432c79 540 }
wolfSSL 4:1b0d80432c79 541
wolfSSL 4:1b0d80432c79 542 ret = wc_ShaHash((byte*)&peer, peerSz, digest);
wolfSSL 4:1b0d80432c79 543 if (ret != 0)
wolfSSL 4:1b0d80432c79 544 return ret;
wolfSSL 4:1b0d80432c79 545
wolfSSL 4:1b0d80432c79 546 if (sz > SHA_DIGEST_SIZE)
wolfSSL 4:1b0d80432c79 547 sz = SHA_DIGEST_SIZE;
wolfSSL 4:1b0d80432c79 548 XMEMCPY(buf, digest, sz);
wolfSSL 4:1b0d80432c79 549
wolfSSL 4:1b0d80432c79 550 return sz;
wolfSSL 4:1b0d80432c79 551 }
wolfSSL 4:1b0d80432c79 552
wolfSSL 4:1b0d80432c79 553 #endif /* WOLFSSL_DTLS */
wolfSSL 4:1b0d80432c79 554
wolfSSL 4:1b0d80432c79 555 #ifdef HAVE_OCSP
wolfSSL 4:1b0d80432c79 556
wolfSSL 4:1b0d80432c79 557 #include <stdlib.h> /* atoi() */
wolfSSL 4:1b0d80432c79 558
wolfSSL 4:1b0d80432c79 559
wolfSSL 4:1b0d80432c79 560 static int Word16ToString(char* d, word16 number)
wolfSSL 4:1b0d80432c79 561 {
wolfSSL 4:1b0d80432c79 562 int i = 0;
wolfSSL 4:1b0d80432c79 563
wolfSSL 4:1b0d80432c79 564 if (d != NULL) {
wolfSSL 4:1b0d80432c79 565 word16 order = 10000;
wolfSSL 4:1b0d80432c79 566 word16 digit;
wolfSSL 4:1b0d80432c79 567
wolfSSL 4:1b0d80432c79 568 if (number == 0) {
wolfSSL 4:1b0d80432c79 569 d[i++] = '0';
wolfSSL 4:1b0d80432c79 570 }
wolfSSL 4:1b0d80432c79 571 else {
wolfSSL 4:1b0d80432c79 572 while (order) {
wolfSSL 4:1b0d80432c79 573 digit = number / order;
wolfSSL 4:1b0d80432c79 574 if (i > 0 || digit != 0) {
wolfSSL 4:1b0d80432c79 575 d[i++] = (char)digit + '0';
wolfSSL 4:1b0d80432c79 576 }
wolfSSL 4:1b0d80432c79 577 if (digit != 0)
wolfSSL 4:1b0d80432c79 578 number %= digit * order;
wolfSSL 4:1b0d80432c79 579 if (order > 1)
wolfSSL 4:1b0d80432c79 580 order /= 10;
wolfSSL 4:1b0d80432c79 581 else
wolfSSL 4:1b0d80432c79 582 order = 0;
wolfSSL 4:1b0d80432c79 583 }
wolfSSL 4:1b0d80432c79 584 }
wolfSSL 4:1b0d80432c79 585 d[i] = 0;
wolfSSL 4:1b0d80432c79 586 }
wolfSSL 4:1b0d80432c79 587
wolfSSL 4:1b0d80432c79 588 return i;
wolfSSL 4:1b0d80432c79 589 }
wolfSSL 4:1b0d80432c79 590
wolfSSL 4:1b0d80432c79 591
wolfSSL 4:1b0d80432c79 592 static int tcp_connect(SOCKET_T* sockfd, const char* ip, word16 port)
wolfSSL 4:1b0d80432c79 593 {
wolfSSL 4:1b0d80432c79 594 struct sockaddr_storage addr;
wolfSSL 4:1b0d80432c79 595 int sockaddr_len = sizeof(struct sockaddr_in);
wolfSSL 4:1b0d80432c79 596 XMEMSET(&addr, 0, sizeof(addr));
wolfSSL 4:1b0d80432c79 597
wolfSSL 4:1b0d80432c79 598 #ifdef HAVE_GETADDRINFO
wolfSSL 4:1b0d80432c79 599 {
wolfSSL 4:1b0d80432c79 600 struct addrinfo hints;
wolfSSL 4:1b0d80432c79 601 struct addrinfo* answer = NULL;
wolfSSL 4:1b0d80432c79 602 char strPort[6];
wolfSSL 4:1b0d80432c79 603
wolfSSL 4:1b0d80432c79 604 XMEMSET(&hints, 0, sizeof(hints));
wolfSSL 4:1b0d80432c79 605 hints.ai_family = AF_UNSPEC;
wolfSSL 4:1b0d80432c79 606 hints.ai_socktype = SOCK_STREAM;
wolfSSL 4:1b0d80432c79 607 hints.ai_protocol = IPPROTO_TCP;
wolfSSL 4:1b0d80432c79 608
wolfSSL 4:1b0d80432c79 609 if (Word16ToString(strPort, port) == 0) {
wolfSSL 4:1b0d80432c79 610 WOLFSSL_MSG("invalid port number for OCSP responder");
wolfSSL 4:1b0d80432c79 611 return -1;
wolfSSL 4:1b0d80432c79 612 }
wolfSSL 4:1b0d80432c79 613
wolfSSL 4:1b0d80432c79 614 if (getaddrinfo(ip, strPort, &hints, &answer) < 0 || answer == NULL) {
wolfSSL 4:1b0d80432c79 615 WOLFSSL_MSG("no addr info for OCSP responder");
wolfSSL 4:1b0d80432c79 616 return -1;
wolfSSL 4:1b0d80432c79 617 }
wolfSSL 4:1b0d80432c79 618
wolfSSL 4:1b0d80432c79 619 sockaddr_len = answer->ai_addrlen;
wolfSSL 4:1b0d80432c79 620 XMEMCPY(&addr, answer->ai_addr, sockaddr_len);
wolfSSL 4:1b0d80432c79 621 freeaddrinfo(answer);
wolfSSL 4:1b0d80432c79 622
wolfSSL 4:1b0d80432c79 623 }
wolfSSL 4:1b0d80432c79 624 #else /* HAVE_GETADDRINFO */
wolfSSL 4:1b0d80432c79 625 {
wolfSSL 4:1b0d80432c79 626 struct hostent* entry = gethostbyname(ip);
wolfSSL 4:1b0d80432c79 627 struct sockaddr_in *sin = (struct sockaddr_in *)&addr;
wolfSSL 4:1b0d80432c79 628
wolfSSL 4:1b0d80432c79 629 if (entry) {
wolfSSL 4:1b0d80432c79 630 sin->sin_family = AF_INET;
wolfSSL 4:1b0d80432c79 631 sin->sin_port = htons(port);
wolfSSL 4:1b0d80432c79 632 XMEMCPY(&sin->sin_addr.s_addr, entry->h_addr_list[0],
wolfSSL 4:1b0d80432c79 633 entry->h_length);
wolfSSL 4:1b0d80432c79 634 }
wolfSSL 4:1b0d80432c79 635 else {
wolfSSL 4:1b0d80432c79 636 WOLFSSL_MSG("no addr info for OCSP responder");
wolfSSL 4:1b0d80432c79 637 return -1;
wolfSSL 4:1b0d80432c79 638 }
wolfSSL 4:1b0d80432c79 639 }
wolfSSL 4:1b0d80432c79 640 #endif /* HAVE_GETADDRINFO */
wolfSSL 4:1b0d80432c79 641
wolfSSL 4:1b0d80432c79 642 *sockfd = (SOCKET_T)socket(addr.ss_family, SOCK_STREAM, 0);
wolfSSL 4:1b0d80432c79 643
wolfSSL 4:1b0d80432c79 644 #ifdef USE_WINDOWS_API
wolfSSL 4:1b0d80432c79 645 if (*sockfd == INVALID_SOCKET) {
wolfSSL 4:1b0d80432c79 646 WOLFSSL_MSG("bad socket fd, out of fds?");
wolfSSL 4:1b0d80432c79 647 return -1;
wolfSSL 4:1b0d80432c79 648 }
wolfSSL 4:1b0d80432c79 649 #else
wolfSSL 4:1b0d80432c79 650 if (*sockfd < 0) {
wolfSSL 4:1b0d80432c79 651 WOLFSSL_MSG("bad socket fd, out of fds?");
wolfSSL 4:1b0d80432c79 652 return -1;
wolfSSL 4:1b0d80432c79 653 }
wolfSSL 4:1b0d80432c79 654 #endif
wolfSSL 4:1b0d80432c79 655
wolfSSL 4:1b0d80432c79 656 if (connect(*sockfd, (struct sockaddr *)&addr, sockaddr_len) != 0) {
wolfSSL 4:1b0d80432c79 657 WOLFSSL_MSG("OCSP responder tcp connect failed");
wolfSSL 4:1b0d80432c79 658 return -1;
wolfSSL 4:1b0d80432c79 659 }
wolfSSL 4:1b0d80432c79 660
wolfSSL 4:1b0d80432c79 661 return 0;
wolfSSL 4:1b0d80432c79 662 }
wolfSSL 4:1b0d80432c79 663
wolfSSL 4:1b0d80432c79 664
wolfSSL 4:1b0d80432c79 665 static int build_http_request(const char* domainName, const char* path,
wolfSSL 4:1b0d80432c79 666 int ocspReqSz, byte* buf, int bufSize)
wolfSSL 4:1b0d80432c79 667 {
wolfSSL 4:1b0d80432c79 668 word32 domainNameLen, pathLen, ocspReqSzStrLen, completeLen;
wolfSSL 4:1b0d80432c79 669 char ocspReqSzStr[6];
wolfSSL 4:1b0d80432c79 670
wolfSSL 4:1b0d80432c79 671 domainNameLen = (word32)XSTRLEN(domainName);
wolfSSL 4:1b0d80432c79 672 pathLen = (word32)XSTRLEN(path);
wolfSSL 4:1b0d80432c79 673 ocspReqSzStrLen = Word16ToString(ocspReqSzStr, (word16)ocspReqSz);
wolfSSL 4:1b0d80432c79 674
wolfSSL 4:1b0d80432c79 675 completeLen = domainNameLen + pathLen + ocspReqSzStrLen + 84;
wolfSSL 4:1b0d80432c79 676 if (completeLen > (word32)bufSize)
wolfSSL 4:1b0d80432c79 677 return 0;
wolfSSL 4:1b0d80432c79 678
wolfSSL 4:1b0d80432c79 679 XSTRNCPY((char*)buf, "POST ", 5);
wolfSSL 4:1b0d80432c79 680 buf += 5;
wolfSSL 4:1b0d80432c79 681 XSTRNCPY((char*)buf, path, pathLen);
wolfSSL 4:1b0d80432c79 682 buf += pathLen;
wolfSSL 4:1b0d80432c79 683 XSTRNCPY((char*)buf, " HTTP/1.1\r\nHost: ", 17);
wolfSSL 4:1b0d80432c79 684 buf += 17;
wolfSSL 4:1b0d80432c79 685 XSTRNCPY((char*)buf, domainName, domainNameLen);
wolfSSL 4:1b0d80432c79 686 buf += domainNameLen;
wolfSSL 4:1b0d80432c79 687 XSTRNCPY((char*)buf, "\r\nContent-Length: ", 18);
wolfSSL 4:1b0d80432c79 688 buf += 18;
wolfSSL 4:1b0d80432c79 689 XSTRNCPY((char*)buf, ocspReqSzStr, ocspReqSzStrLen);
wolfSSL 4:1b0d80432c79 690 buf += ocspReqSzStrLen;
wolfSSL 4:1b0d80432c79 691 XSTRNCPY((char*)buf,
wolfSSL 4:1b0d80432c79 692 "\r\nContent-Type: application/ocsp-request\r\n\r\n", 44);
wolfSSL 4:1b0d80432c79 693
wolfSSL 4:1b0d80432c79 694 return completeLen;
wolfSSL 4:1b0d80432c79 695 }
wolfSSL 4:1b0d80432c79 696
wolfSSL 4:1b0d80432c79 697
wolfSSL 4:1b0d80432c79 698 static int decode_url(const char* url, int urlSz,
wolfSSL 4:1b0d80432c79 699 char* outName, char* outPath, word16* outPort)
wolfSSL 4:1b0d80432c79 700 {
wolfSSL 4:1b0d80432c79 701 int result = -1;
wolfSSL 4:1b0d80432c79 702
wolfSSL 4:1b0d80432c79 703 if (outName != NULL && outPath != NULL && outPort != NULL)
wolfSSL 4:1b0d80432c79 704 {
wolfSSL 4:1b0d80432c79 705 if (url == NULL || urlSz == 0)
wolfSSL 4:1b0d80432c79 706 {
wolfSSL 4:1b0d80432c79 707 *outName = 0;
wolfSSL 4:1b0d80432c79 708 *outPath = 0;
wolfSSL 4:1b0d80432c79 709 *outPort = 0;
wolfSSL 4:1b0d80432c79 710 }
wolfSSL 4:1b0d80432c79 711 else
wolfSSL 4:1b0d80432c79 712 {
wolfSSL 4:1b0d80432c79 713 int i, cur;
wolfSSL 4:1b0d80432c79 714
wolfSSL 4:1b0d80432c79 715 /* need to break the url down into scheme, address, and port */
wolfSSL 4:1b0d80432c79 716 /* "http://example.com:8080/" */
wolfSSL 4:1b0d80432c79 717 /* "http://[::1]:443/" */
wolfSSL 4:1b0d80432c79 718 if (XSTRNCMP(url, "http://", 7) == 0) {
wolfSSL 4:1b0d80432c79 719 cur = 7;
wolfSSL 4:1b0d80432c79 720 } else cur = 0;
wolfSSL 4:1b0d80432c79 721
wolfSSL 4:1b0d80432c79 722 i = 0;
wolfSSL 4:1b0d80432c79 723 if (url[cur] == '[') {
wolfSSL 4:1b0d80432c79 724 cur++;
wolfSSL 4:1b0d80432c79 725 /* copy until ']' */
wolfSSL 4:1b0d80432c79 726 while (url[cur] != 0 && url[cur] != ']' && cur < urlSz) {
wolfSSL 4:1b0d80432c79 727 outName[i++] = url[cur++];
wolfSSL 4:1b0d80432c79 728 }
wolfSSL 4:1b0d80432c79 729 cur++; /* skip ']' */
wolfSSL 4:1b0d80432c79 730 }
wolfSSL 4:1b0d80432c79 731 else {
wolfSSL 4:1b0d80432c79 732 while (url[cur] != 0 && url[cur] != ':' &&
wolfSSL 4:1b0d80432c79 733 url[cur] != '/' && cur < urlSz) {
wolfSSL 4:1b0d80432c79 734 outName[i++] = url[cur++];
wolfSSL 4:1b0d80432c79 735 }
wolfSSL 4:1b0d80432c79 736 }
wolfSSL 4:1b0d80432c79 737 outName[i] = 0;
wolfSSL 4:1b0d80432c79 738 /* Need to pick out the path after the domain name */
wolfSSL 4:1b0d80432c79 739
wolfSSL 4:1b0d80432c79 740 if (cur < urlSz && url[cur] == ':') {
wolfSSL 4:1b0d80432c79 741 char port[6];
wolfSSL 4:1b0d80432c79 742 int j;
wolfSSL 4:1b0d80432c79 743 word32 bigPort = 0;
wolfSSL 4:1b0d80432c79 744 i = 0;
wolfSSL 4:1b0d80432c79 745 cur++;
wolfSSL 4:1b0d80432c79 746 while (cur < urlSz && url[cur] != 0 && url[cur] != '/' &&
wolfSSL 4:1b0d80432c79 747 i < 6) {
wolfSSL 4:1b0d80432c79 748 port[i++] = url[cur++];
wolfSSL 4:1b0d80432c79 749 }
wolfSSL 4:1b0d80432c79 750
wolfSSL 4:1b0d80432c79 751 for (j = 0; j < i; j++) {
wolfSSL 4:1b0d80432c79 752 if (port[j] < '0' || port[j] > '9') return -1;
wolfSSL 4:1b0d80432c79 753 bigPort = (bigPort * 10) + (port[j] - '0');
wolfSSL 4:1b0d80432c79 754 }
wolfSSL 4:1b0d80432c79 755 *outPort = (word16)bigPort;
wolfSSL 4:1b0d80432c79 756 }
wolfSSL 4:1b0d80432c79 757 else
wolfSSL 4:1b0d80432c79 758 *outPort = 80;
wolfSSL 4:1b0d80432c79 759
wolfSSL 4:1b0d80432c79 760 if (cur < urlSz && url[cur] == '/') {
wolfSSL 4:1b0d80432c79 761 i = 0;
wolfSSL 4:1b0d80432c79 762 while (cur < urlSz && url[cur] != 0 && i < 80) {
wolfSSL 4:1b0d80432c79 763 outPath[i++] = url[cur++];
wolfSSL 4:1b0d80432c79 764 }
wolfSSL 4:1b0d80432c79 765 outPath[i] = 0;
wolfSSL 4:1b0d80432c79 766 }
wolfSSL 4:1b0d80432c79 767 else {
wolfSSL 4:1b0d80432c79 768 outPath[0] = '/';
wolfSSL 4:1b0d80432c79 769 outPath[1] = 0;
wolfSSL 4:1b0d80432c79 770 }
wolfSSL 4:1b0d80432c79 771 result = 0;
wolfSSL 4:1b0d80432c79 772 }
wolfSSL 4:1b0d80432c79 773 }
wolfSSL 4:1b0d80432c79 774
wolfSSL 4:1b0d80432c79 775 return result;
wolfSSL 4:1b0d80432c79 776 }
wolfSSL 4:1b0d80432c79 777
wolfSSL 4:1b0d80432c79 778
wolfSSL 4:1b0d80432c79 779 /* return: >0 OCSP Response Size
wolfSSL 4:1b0d80432c79 780 * -1 error */
wolfSSL 4:1b0d80432c79 781 static int process_http_response(int sfd, byte** respBuf,
wolfSSL 4:1b0d80432c79 782 byte* httpBuf, int httpBufSz)
wolfSSL 4:1b0d80432c79 783 {
wolfSSL 4:1b0d80432c79 784 int result;
wolfSSL 4:1b0d80432c79 785 int len = 0;
wolfSSL 4:1b0d80432c79 786 char *start, *end;
wolfSSL 4:1b0d80432c79 787 byte *recvBuf = NULL;
wolfSSL 4:1b0d80432c79 788 int recvBufSz = 0;
wolfSSL 4:1b0d80432c79 789 enum phr_state { phr_init, phr_http_start, phr_have_length,
wolfSSL 4:1b0d80432c79 790 phr_have_type, phr_wait_end, phr_http_end
wolfSSL 4:1b0d80432c79 791 } state = phr_init;
wolfSSL 4:1b0d80432c79 792
wolfSSL 4:1b0d80432c79 793 start = end = NULL;
wolfSSL 4:1b0d80432c79 794 do {
wolfSSL 4:1b0d80432c79 795 if (end == NULL) {
wolfSSL 4:1b0d80432c79 796 result = (int)recv(sfd, (char*)httpBuf+len, httpBufSz-len-1, 0);
wolfSSL 4:1b0d80432c79 797 if (result > 0) {
wolfSSL 4:1b0d80432c79 798 len += result;
wolfSSL 4:1b0d80432c79 799 start = (char*)httpBuf;
wolfSSL 4:1b0d80432c79 800 start[len] = 0;
wolfSSL 4:1b0d80432c79 801 }
wolfSSL 4:1b0d80432c79 802 else {
wolfSSL 4:1b0d80432c79 803 WOLFSSL_MSG("process_http_response recv http from peer failed");
wolfSSL 4:1b0d80432c79 804 return -1;
wolfSSL 4:1b0d80432c79 805 }
wolfSSL 4:1b0d80432c79 806 }
wolfSSL 4:1b0d80432c79 807 end = XSTRSTR(start, "\r\n");
wolfSSL 4:1b0d80432c79 808
wolfSSL 4:1b0d80432c79 809 if (end == NULL) {
wolfSSL 4:1b0d80432c79 810 if (len != 0)
wolfSSL 4:1b0d80432c79 811 XMEMMOVE(httpBuf, start, len);
wolfSSL 4:1b0d80432c79 812 start = end = NULL;
wolfSSL 4:1b0d80432c79 813 }
wolfSSL 4:1b0d80432c79 814 else if (end == start) {
wolfSSL 4:1b0d80432c79 815 if (state == phr_wait_end) {
wolfSSL 4:1b0d80432c79 816 state = phr_http_end;
wolfSSL 4:1b0d80432c79 817 len -= 2;
wolfSSL 4:1b0d80432c79 818 start += 2;
wolfSSL 4:1b0d80432c79 819 }
wolfSSL 4:1b0d80432c79 820 else {
wolfSSL 4:1b0d80432c79 821 WOLFSSL_MSG("process_http_response header ended early");
wolfSSL 4:1b0d80432c79 822 return -1;
wolfSSL 4:1b0d80432c79 823 }
wolfSSL 4:1b0d80432c79 824 }
wolfSSL 4:1b0d80432c79 825 else {
wolfSSL 4:1b0d80432c79 826 *end = 0;
wolfSSL 4:1b0d80432c79 827 len -= (int)(end - start) + 2;
wolfSSL 4:1b0d80432c79 828 /* adjust len to remove the first line including the /r/n */
wolfSSL 4:1b0d80432c79 829
wolfSSL 4:1b0d80432c79 830 if (XSTRNCASECMP(start, "HTTP/1", 6) == 0) {
wolfSSL 4:1b0d80432c79 831 start += 9;
wolfSSL 4:1b0d80432c79 832 if (XSTRNCASECMP(start, "200 OK", 6) != 0 ||
wolfSSL 4:1b0d80432c79 833 state != phr_init) {
wolfSSL 4:1b0d80432c79 834 WOLFSSL_MSG("process_http_response not OK");
wolfSSL 4:1b0d80432c79 835 return -1;
wolfSSL 4:1b0d80432c79 836 }
wolfSSL 4:1b0d80432c79 837 state = phr_http_start;
wolfSSL 4:1b0d80432c79 838 }
wolfSSL 4:1b0d80432c79 839 else if (XSTRNCASECMP(start, "Content-Type:", 13) == 0) {
wolfSSL 4:1b0d80432c79 840 start += 13;
wolfSSL 4:1b0d80432c79 841 while (*start == ' ' && *start != '\0') start++;
wolfSSL 4:1b0d80432c79 842 if (XSTRNCASECMP(start, "application/ocsp-response", 25) != 0) {
wolfSSL 4:1b0d80432c79 843 WOLFSSL_MSG("process_http_response not ocsp-response");
wolfSSL 4:1b0d80432c79 844 return -1;
wolfSSL 4:1b0d80432c79 845 }
wolfSSL 4:1b0d80432c79 846
wolfSSL 4:1b0d80432c79 847 if (state == phr_http_start) state = phr_have_type;
wolfSSL 4:1b0d80432c79 848 else if (state == phr_have_length) state = phr_wait_end;
wolfSSL 4:1b0d80432c79 849 else {
wolfSSL 4:1b0d80432c79 850 WOLFSSL_MSG("process_http_response type invalid state");
wolfSSL 4:1b0d80432c79 851 return -1;
wolfSSL 4:1b0d80432c79 852 }
wolfSSL 4:1b0d80432c79 853 }
wolfSSL 4:1b0d80432c79 854 else if (XSTRNCASECMP(start, "Content-Length:", 15) == 0) {
wolfSSL 4:1b0d80432c79 855 start += 15;
wolfSSL 4:1b0d80432c79 856 while (*start == ' ' && *start != '\0') start++;
wolfSSL 4:1b0d80432c79 857 recvBufSz = atoi(start);
wolfSSL 4:1b0d80432c79 858
wolfSSL 4:1b0d80432c79 859 if (state == phr_http_start) state = phr_have_length;
wolfSSL 4:1b0d80432c79 860 else if (state == phr_have_type) state = phr_wait_end;
wolfSSL 4:1b0d80432c79 861 else {
wolfSSL 4:1b0d80432c79 862 WOLFSSL_MSG("process_http_response length invalid state");
wolfSSL 4:1b0d80432c79 863 return -1;
wolfSSL 4:1b0d80432c79 864 }
wolfSSL 4:1b0d80432c79 865 }
wolfSSL 4:1b0d80432c79 866
wolfSSL 4:1b0d80432c79 867 start = end + 2;
wolfSSL 4:1b0d80432c79 868 }
wolfSSL 4:1b0d80432c79 869 } while (state != phr_http_end);
wolfSSL 4:1b0d80432c79 870
wolfSSL 4:1b0d80432c79 871 recvBuf = (byte*)XMALLOC(recvBufSz, NULL, DYNAMIC_TYPE_OCSP);
wolfSSL 4:1b0d80432c79 872 if (recvBuf == NULL) {
wolfSSL 4:1b0d80432c79 873 WOLFSSL_MSG("process_http_response couldn't create response buffer");
wolfSSL 4:1b0d80432c79 874 return -1;
wolfSSL 4:1b0d80432c79 875 }
wolfSSL 4:1b0d80432c79 876
wolfSSL 4:1b0d80432c79 877 /* copy the remainder of the httpBuf into the respBuf */
wolfSSL 4:1b0d80432c79 878 if (len != 0)
wolfSSL 4:1b0d80432c79 879 XMEMCPY(recvBuf, start, len);
wolfSSL 4:1b0d80432c79 880
wolfSSL 4:1b0d80432c79 881 /* receive the OCSP response data */
wolfSSL 4:1b0d80432c79 882 do {
wolfSSL 4:1b0d80432c79 883 result = (int)recv(sfd, (char*)recvBuf+len, recvBufSz-len, 0);
wolfSSL 4:1b0d80432c79 884 if (result > 0)
wolfSSL 4:1b0d80432c79 885 len += result;
wolfSSL 4:1b0d80432c79 886 else {
wolfSSL 4:1b0d80432c79 887 WOLFSSL_MSG("process_http_response recv ocsp from peer failed");
wolfSSL 4:1b0d80432c79 888 return -1;
wolfSSL 4:1b0d80432c79 889 }
wolfSSL 4:1b0d80432c79 890 } while (len != recvBufSz);
wolfSSL 4:1b0d80432c79 891
wolfSSL 4:1b0d80432c79 892 *respBuf = recvBuf;
wolfSSL 4:1b0d80432c79 893 return recvBufSz;
wolfSSL 4:1b0d80432c79 894 }
wolfSSL 4:1b0d80432c79 895
wolfSSL 4:1b0d80432c79 896
wolfSSL 4:1b0d80432c79 897 #define SCRATCH_BUFFER_SIZE 512
wolfSSL 4:1b0d80432c79 898
wolfSSL 4:1b0d80432c79 899 int EmbedOcspLookup(void* ctx, const char* url, int urlSz,
wolfSSL 4:1b0d80432c79 900 byte* ocspReqBuf, int ocspReqSz, byte** ocspRespBuf)
wolfSSL 4:1b0d80432c79 901 {
wolfSSL 4:1b0d80432c79 902 SOCKET_T sfd = 0;
wolfSSL 4:1b0d80432c79 903 word16 port;
wolfSSL 4:1b0d80432c79 904 int ret = -1;
wolfSSL 4:1b0d80432c79 905 #ifdef WOLFSSL_SMALL_STACK
wolfSSL 4:1b0d80432c79 906 char* path;
wolfSSL 4:1b0d80432c79 907 char* domainName;
wolfSSL 4:1b0d80432c79 908 #else
wolfSSL 4:1b0d80432c79 909 char path[80];
wolfSSL 4:1b0d80432c79 910 char domainName[80];
wolfSSL 4:1b0d80432c79 911 #endif
wolfSSL 4:1b0d80432c79 912
wolfSSL 4:1b0d80432c79 913 #ifdef WOLFSSL_SMALL_STACK
wolfSSL 4:1b0d80432c79 914 path = (char*)XMALLOC(80, NULL, DYNAMIC_TYPE_TMP_BUFFER);
wolfSSL 4:1b0d80432c79 915 if (path == NULL)
wolfSSL 4:1b0d80432c79 916 return -1;
wolfSSL 4:1b0d80432c79 917
wolfSSL 4:1b0d80432c79 918 domainName = (char*)XMALLOC(80, NULL, DYNAMIC_TYPE_TMP_BUFFER);
wolfSSL 4:1b0d80432c79 919 if (domainName == NULL) {
wolfSSL 4:1b0d80432c79 920 XFREE(path, NULL, DYNAMIC_TYPE_TMP_BUFFER);
wolfSSL 4:1b0d80432c79 921 return -1;
wolfSSL 4:1b0d80432c79 922 }
wolfSSL 4:1b0d80432c79 923 #endif
wolfSSL 4:1b0d80432c79 924
wolfSSL 4:1b0d80432c79 925 (void)ctx;
wolfSSL 4:1b0d80432c79 926
wolfSSL 4:1b0d80432c79 927 if (ocspReqBuf == NULL || ocspReqSz == 0) {
wolfSSL 4:1b0d80432c79 928 WOLFSSL_MSG("OCSP request is required for lookup");
wolfSSL 4:1b0d80432c79 929 }
wolfSSL 4:1b0d80432c79 930 else if (ocspRespBuf == NULL) {
wolfSSL 4:1b0d80432c79 931 WOLFSSL_MSG("Cannot save OCSP response");
wolfSSL 4:1b0d80432c79 932 }
wolfSSL 4:1b0d80432c79 933 else if (decode_url(url, urlSz, domainName, path, &port) < 0) {
wolfSSL 4:1b0d80432c79 934 WOLFSSL_MSG("Unable to decode OCSP URL");
wolfSSL 4:1b0d80432c79 935 }
wolfSSL 4:1b0d80432c79 936 else {
wolfSSL 4:1b0d80432c79 937 /* Note, the library uses the EmbedOcspRespFree() callback to
wolfSSL 4:1b0d80432c79 938 * free this buffer. */
wolfSSL 4:1b0d80432c79 939 int httpBufSz = SCRATCH_BUFFER_SIZE;
wolfSSL 4:1b0d80432c79 940 byte* httpBuf = (byte*)XMALLOC(httpBufSz, NULL,
wolfSSL 4:1b0d80432c79 941 DYNAMIC_TYPE_OCSP);
wolfSSL 4:1b0d80432c79 942
wolfSSL 4:1b0d80432c79 943 if (httpBuf == NULL) {
wolfSSL 4:1b0d80432c79 944 WOLFSSL_MSG("Unable to create OCSP response buffer");
wolfSSL 4:1b0d80432c79 945 }
wolfSSL 4:1b0d80432c79 946 else {
wolfSSL 4:1b0d80432c79 947 httpBufSz = build_http_request(domainName, path, ocspReqSz,
wolfSSL 4:1b0d80432c79 948 httpBuf, httpBufSz);
wolfSSL 4:1b0d80432c79 949
wolfSSL 4:1b0d80432c79 950 if ((tcp_connect(&sfd, domainName, port) != 0) || (sfd <= 0)) {
wolfSSL 4:1b0d80432c79 951 WOLFSSL_MSG("OCSP Responder connection failed");
wolfSSL 4:1b0d80432c79 952 }
wolfSSL 4:1b0d80432c79 953 else if ((int)send(sfd, (char*)httpBuf, httpBufSz, 0) !=
wolfSSL 4:1b0d80432c79 954 httpBufSz) {
wolfSSL 4:1b0d80432c79 955 WOLFSSL_MSG("OCSP http request failed");
wolfSSL 4:1b0d80432c79 956 }
wolfSSL 4:1b0d80432c79 957 else if ((int)send(sfd, (char*)ocspReqBuf, ocspReqSz, 0) !=
wolfSSL 4:1b0d80432c79 958 ocspReqSz) {
wolfSSL 4:1b0d80432c79 959 WOLFSSL_MSG("OCSP ocsp request failed");
wolfSSL 4:1b0d80432c79 960 }
wolfSSL 4:1b0d80432c79 961 else {
wolfSSL 4:1b0d80432c79 962 ret = process_http_response(sfd, ocspRespBuf, httpBuf,
wolfSSL 4:1b0d80432c79 963 SCRATCH_BUFFER_SIZE);
wolfSSL 4:1b0d80432c79 964 }
wolfSSL 4:1b0d80432c79 965
wolfSSL 4:1b0d80432c79 966 close(sfd);
wolfSSL 4:1b0d80432c79 967 XFREE(httpBuf, NULL, DYNAMIC_TYPE_OCSP);
wolfSSL 4:1b0d80432c79 968 }
wolfSSL 4:1b0d80432c79 969 }
wolfSSL 4:1b0d80432c79 970
wolfSSL 4:1b0d80432c79 971 #ifdef WOLFSSL_SMALL_STACK
wolfSSL 4:1b0d80432c79 972 XFREE(path, NULL, DYNAMIC_TYPE_TMP_BUFFER);
wolfSSL 4:1b0d80432c79 973 XFREE(domainName, NULL, DYNAMIC_TYPE_TMP_BUFFER);
wolfSSL 4:1b0d80432c79 974 #endif
wolfSSL 4:1b0d80432c79 975
wolfSSL 4:1b0d80432c79 976 return ret;
wolfSSL 4:1b0d80432c79 977 }
wolfSSL 4:1b0d80432c79 978
wolfSSL 4:1b0d80432c79 979
wolfSSL 4:1b0d80432c79 980 void EmbedOcspRespFree(void* ctx, byte *resp)
wolfSSL 4:1b0d80432c79 981 {
wolfSSL 4:1b0d80432c79 982 (void)ctx;
wolfSSL 4:1b0d80432c79 983
wolfSSL 4:1b0d80432c79 984 if (resp)
wolfSSL 4:1b0d80432c79 985 XFREE(resp, NULL, DYNAMIC_TYPE_OCSP);
wolfSSL 4:1b0d80432c79 986 }
wolfSSL 4:1b0d80432c79 987
wolfSSL 4:1b0d80432c79 988
wolfSSL 4:1b0d80432c79 989 #endif
wolfSSL 4:1b0d80432c79 990
wolfSSL 4:1b0d80432c79 991 #endif /* WOLFSSL_USER_IO */
wolfSSL 4:1b0d80432c79 992
wolfSSL 4:1b0d80432c79 993 WOLFSSL_API void wolfSSL_SetIORecv(WOLFSSL_CTX *ctx, CallbackIORecv CBIORecv)
wolfSSL 4:1b0d80432c79 994 {
wolfSSL 4:1b0d80432c79 995 ctx->CBIORecv = CBIORecv;
wolfSSL 4:1b0d80432c79 996 }
wolfSSL 4:1b0d80432c79 997
wolfSSL 4:1b0d80432c79 998
wolfSSL 4:1b0d80432c79 999 WOLFSSL_API void wolfSSL_SetIOSend(WOLFSSL_CTX *ctx, CallbackIOSend CBIOSend)
wolfSSL 4:1b0d80432c79 1000 {
wolfSSL 4:1b0d80432c79 1001 ctx->CBIOSend = CBIOSend;
wolfSSL 4:1b0d80432c79 1002 }
wolfSSL 4:1b0d80432c79 1003
wolfSSL 4:1b0d80432c79 1004
wolfSSL 4:1b0d80432c79 1005 WOLFSSL_API void wolfSSL_SetIOReadCtx(WOLFSSL* ssl, void *rctx)
wolfSSL 4:1b0d80432c79 1006 {
wolfSSL 4:1b0d80432c79 1007 ssl->IOCB_ReadCtx = rctx;
wolfSSL 4:1b0d80432c79 1008 }
wolfSSL 4:1b0d80432c79 1009
wolfSSL 4:1b0d80432c79 1010
wolfSSL 4:1b0d80432c79 1011 WOLFSSL_API void wolfSSL_SetIOWriteCtx(WOLFSSL* ssl, void *wctx)
wolfSSL 4:1b0d80432c79 1012 {
wolfSSL 4:1b0d80432c79 1013 ssl->IOCB_WriteCtx = wctx;
wolfSSL 4:1b0d80432c79 1014 }
wolfSSL 4:1b0d80432c79 1015
wolfSSL 4:1b0d80432c79 1016
wolfSSL 4:1b0d80432c79 1017 WOLFSSL_API void* wolfSSL_GetIOReadCtx(WOLFSSL* ssl)
wolfSSL 4:1b0d80432c79 1018 {
wolfSSL 4:1b0d80432c79 1019 if (ssl)
wolfSSL 4:1b0d80432c79 1020 return ssl->IOCB_ReadCtx;
wolfSSL 4:1b0d80432c79 1021
wolfSSL 4:1b0d80432c79 1022 return NULL;
wolfSSL 4:1b0d80432c79 1023 }
wolfSSL 4:1b0d80432c79 1024
wolfSSL 4:1b0d80432c79 1025
wolfSSL 4:1b0d80432c79 1026 WOLFSSL_API void* wolfSSL_GetIOWriteCtx(WOLFSSL* ssl)
wolfSSL 4:1b0d80432c79 1027 {
wolfSSL 4:1b0d80432c79 1028 if (ssl)
wolfSSL 4:1b0d80432c79 1029 return ssl->IOCB_WriteCtx;
wolfSSL 4:1b0d80432c79 1030
wolfSSL 4:1b0d80432c79 1031 return NULL;
wolfSSL 4:1b0d80432c79 1032 }
wolfSSL 4:1b0d80432c79 1033
wolfSSL 4:1b0d80432c79 1034
wolfSSL 4:1b0d80432c79 1035 WOLFSSL_API void wolfSSL_SetIOReadFlags(WOLFSSL* ssl, int flags)
wolfSSL 4:1b0d80432c79 1036 {
wolfSSL 4:1b0d80432c79 1037 ssl->rflags = flags;
wolfSSL 4:1b0d80432c79 1038 }
wolfSSL 4:1b0d80432c79 1039
wolfSSL 4:1b0d80432c79 1040
wolfSSL 4:1b0d80432c79 1041 WOLFSSL_API void wolfSSL_SetIOWriteFlags(WOLFSSL* ssl, int flags)
wolfSSL 4:1b0d80432c79 1042 {
wolfSSL 4:1b0d80432c79 1043 ssl->wflags = flags;
wolfSSL 4:1b0d80432c79 1044 }
wolfSSL 4:1b0d80432c79 1045
wolfSSL 4:1b0d80432c79 1046
wolfSSL 4:1b0d80432c79 1047 #ifdef WOLFSSL_DTLS
wolfSSL 4:1b0d80432c79 1048
wolfSSL 4:1b0d80432c79 1049 WOLFSSL_API void wolfSSL_CTX_SetGenCookie(WOLFSSL_CTX* ctx, CallbackGenCookie cb)
wolfSSL 4:1b0d80432c79 1050 {
wolfSSL 4:1b0d80432c79 1051 ctx->CBIOCookie = cb;
wolfSSL 4:1b0d80432c79 1052 }
wolfSSL 4:1b0d80432c79 1053
wolfSSL 4:1b0d80432c79 1054
wolfSSL 4:1b0d80432c79 1055 WOLFSSL_API void wolfSSL_SetCookieCtx(WOLFSSL* ssl, void *ctx)
wolfSSL 4:1b0d80432c79 1056 {
wolfSSL 4:1b0d80432c79 1057 ssl->IOCB_CookieCtx = ctx;
wolfSSL 4:1b0d80432c79 1058 }
wolfSSL 4:1b0d80432c79 1059
wolfSSL 4:1b0d80432c79 1060
wolfSSL 4:1b0d80432c79 1061 WOLFSSL_API void* wolfSSL_GetCookieCtx(WOLFSSL* ssl)
wolfSSL 4:1b0d80432c79 1062 {
wolfSSL 4:1b0d80432c79 1063 if (ssl)
wolfSSL 4:1b0d80432c79 1064 return ssl->IOCB_CookieCtx;
wolfSSL 4:1b0d80432c79 1065
wolfSSL 4:1b0d80432c79 1066 return NULL;
wolfSSL 4:1b0d80432c79 1067 }
wolfSSL 4:1b0d80432c79 1068
wolfSSL 4:1b0d80432c79 1069 #endif /* WOLFSSL_DTLS */
wolfSSL 4:1b0d80432c79 1070
wolfSSL 4:1b0d80432c79 1071
wolfSSL 4:1b0d80432c79 1072 #ifdef HAVE_NETX
wolfSSL 4:1b0d80432c79 1073
wolfSSL 4:1b0d80432c79 1074 /* The NetX receive callback
wolfSSL 4:1b0d80432c79 1075 * return : bytes read, or error
wolfSSL 4:1b0d80432c79 1076 */
wolfSSL 4:1b0d80432c79 1077 int NetX_Receive(WOLFSSL *ssl, char *buf, int sz, void *ctx)
wolfSSL 4:1b0d80432c79 1078 {
wolfSSL 4:1b0d80432c79 1079 NetX_Ctx* nxCtx = (NetX_Ctx*)ctx;
wolfSSL 4:1b0d80432c79 1080 ULONG left;
wolfSSL 4:1b0d80432c79 1081 ULONG total;
wolfSSL 4:1b0d80432c79 1082 ULONG copied = 0;
wolfSSL 4:1b0d80432c79 1083 UINT status;
wolfSSL 4:1b0d80432c79 1084
wolfSSL 4:1b0d80432c79 1085 if (nxCtx == NULL || nxCtx->nxSocket == NULL) {
wolfSSL 4:1b0d80432c79 1086 WOLFSSL_MSG("NetX Recv NULL parameters");
wolfSSL 4:1b0d80432c79 1087 return WOLFSSL_CBIO_ERR_GENERAL;
wolfSSL 4:1b0d80432c79 1088 }
wolfSSL 4:1b0d80432c79 1089
wolfSSL 4:1b0d80432c79 1090 if (nxCtx->nxPacket == NULL) {
wolfSSL 4:1b0d80432c79 1091 status = nx_tcp_socket_receive(nxCtx->nxSocket, &nxCtx->nxPacket,
wolfSSL 4:1b0d80432c79 1092 nxCtx->nxWait);
wolfSSL 4:1b0d80432c79 1093 if (status != NX_SUCCESS) {
wolfSSL 4:1b0d80432c79 1094 WOLFSSL_MSG("NetX Recv receive error");
wolfSSL 4:1b0d80432c79 1095 return WOLFSSL_CBIO_ERR_GENERAL;
wolfSSL 4:1b0d80432c79 1096 }
wolfSSL 4:1b0d80432c79 1097 }
wolfSSL 4:1b0d80432c79 1098
wolfSSL 4:1b0d80432c79 1099 if (nxCtx->nxPacket) {
wolfSSL 4:1b0d80432c79 1100 status = nx_packet_length_get(nxCtx->nxPacket, &total);
wolfSSL 4:1b0d80432c79 1101 if (status != NX_SUCCESS) {
wolfSSL 4:1b0d80432c79 1102 WOLFSSL_MSG("NetX Recv length get error");
wolfSSL 4:1b0d80432c79 1103 return WOLFSSL_CBIO_ERR_GENERAL;
wolfSSL 4:1b0d80432c79 1104 }
wolfSSL 4:1b0d80432c79 1105
wolfSSL 4:1b0d80432c79 1106 left = total - nxCtx->nxOffset;
wolfSSL 4:1b0d80432c79 1107 status = nx_packet_data_extract_offset(nxCtx->nxPacket, nxCtx->nxOffset,
wolfSSL 4:1b0d80432c79 1108 buf, sz, &copied);
wolfSSL 4:1b0d80432c79 1109 if (status != NX_SUCCESS) {
wolfSSL 4:1b0d80432c79 1110 WOLFSSL_MSG("NetX Recv data extract offset error");
wolfSSL 4:1b0d80432c79 1111 return WOLFSSL_CBIO_ERR_GENERAL;
wolfSSL 4:1b0d80432c79 1112 }
wolfSSL 4:1b0d80432c79 1113
wolfSSL 4:1b0d80432c79 1114 nxCtx->nxOffset += copied;
wolfSSL 4:1b0d80432c79 1115
wolfSSL 4:1b0d80432c79 1116 if (copied == left) {
wolfSSL 4:1b0d80432c79 1117 WOLFSSL_MSG("NetX Recv Drained packet");
wolfSSL 4:1b0d80432c79 1118 nx_packet_release(nxCtx->nxPacket);
wolfSSL 4:1b0d80432c79 1119 nxCtx->nxPacket = NULL;
wolfSSL 4:1b0d80432c79 1120 nxCtx->nxOffset = 0;
wolfSSL 4:1b0d80432c79 1121 }
wolfSSL 4:1b0d80432c79 1122 }
wolfSSL 4:1b0d80432c79 1123
wolfSSL 4:1b0d80432c79 1124 return copied;
wolfSSL 4:1b0d80432c79 1125 }
wolfSSL 4:1b0d80432c79 1126
wolfSSL 4:1b0d80432c79 1127
wolfSSL 4:1b0d80432c79 1128 /* The NetX send callback
wolfSSL 4:1b0d80432c79 1129 * return : bytes sent, or error
wolfSSL 4:1b0d80432c79 1130 */
wolfSSL 4:1b0d80432c79 1131 int NetX_Send(WOLFSSL* ssl, char *buf, int sz, void *ctx)
wolfSSL 4:1b0d80432c79 1132 {
wolfSSL 4:1b0d80432c79 1133 NetX_Ctx* nxCtx = (NetX_Ctx*)ctx;
wolfSSL 4:1b0d80432c79 1134 NX_PACKET* packet;
wolfSSL 4:1b0d80432c79 1135 NX_PACKET_POOL* pool; /* shorthand */
wolfSSL 4:1b0d80432c79 1136 UINT status;
wolfSSL 4:1b0d80432c79 1137
wolfSSL 4:1b0d80432c79 1138 if (nxCtx == NULL || nxCtx->nxSocket == NULL) {
wolfSSL 4:1b0d80432c79 1139 WOLFSSL_MSG("NetX Send NULL parameters");
wolfSSL 4:1b0d80432c79 1140 return WOLFSSL_CBIO_ERR_GENERAL;
wolfSSL 4:1b0d80432c79 1141 }
wolfSSL 4:1b0d80432c79 1142
wolfSSL 4:1b0d80432c79 1143 pool = nxCtx->nxSocket->nx_tcp_socket_ip_ptr->nx_ip_default_packet_pool;
wolfSSL 4:1b0d80432c79 1144 status = nx_packet_allocate(pool, &packet, NX_TCP_PACKET,
wolfSSL 4:1b0d80432c79 1145 nxCtx->nxWait);
wolfSSL 4:1b0d80432c79 1146 if (status != NX_SUCCESS) {
wolfSSL 4:1b0d80432c79 1147 WOLFSSL_MSG("NetX Send packet alloc error");
wolfSSL 4:1b0d80432c79 1148 return WOLFSSL_CBIO_ERR_GENERAL;
wolfSSL 4:1b0d80432c79 1149 }
wolfSSL 4:1b0d80432c79 1150
wolfSSL 4:1b0d80432c79 1151 status = nx_packet_data_append(packet, buf, sz, pool, nxCtx->nxWait);
wolfSSL 4:1b0d80432c79 1152 if (status != NX_SUCCESS) {
wolfSSL 4:1b0d80432c79 1153 nx_packet_release(packet);
wolfSSL 4:1b0d80432c79 1154 WOLFSSL_MSG("NetX Send data append error");
wolfSSL 4:1b0d80432c79 1155 return WOLFSSL_CBIO_ERR_GENERAL;
wolfSSL 4:1b0d80432c79 1156 }
wolfSSL 4:1b0d80432c79 1157
wolfSSL 4:1b0d80432c79 1158 status = nx_tcp_socket_send(nxCtx->nxSocket, packet, nxCtx->nxWait);
wolfSSL 4:1b0d80432c79 1159 if (status != NX_SUCCESS) {
wolfSSL 4:1b0d80432c79 1160 nx_packet_release(packet);
wolfSSL 4:1b0d80432c79 1161 WOLFSSL_MSG("NetX Send socket send error");
wolfSSL 4:1b0d80432c79 1162 return WOLFSSL_CBIO_ERR_GENERAL;
wolfSSL 4:1b0d80432c79 1163 }
wolfSSL 4:1b0d80432c79 1164
wolfSSL 4:1b0d80432c79 1165 return sz;
wolfSSL 4:1b0d80432c79 1166 }
wolfSSL 4:1b0d80432c79 1167
wolfSSL 4:1b0d80432c79 1168
wolfSSL 4:1b0d80432c79 1169 /* like set_fd, but for default NetX context */
wolfSSL 4:1b0d80432c79 1170 void wolfSSL_SetIO_NetX(WOLFSSL* ssl, NX_TCP_SOCKET* nxSocket, ULONG waitOption)
wolfSSL 4:1b0d80432c79 1171 {
wolfSSL 4:1b0d80432c79 1172 if (ssl) {
wolfSSL 4:1b0d80432c79 1173 ssl->nxCtx.nxSocket = nxSocket;
wolfSSL 4:1b0d80432c79 1174 ssl->nxCtx.nxWait = waitOption;
wolfSSL 4:1b0d80432c79 1175 }
wolfSSL 4:1b0d80432c79 1176 }
wolfSSL 4:1b0d80432c79 1177
wolfSSL 4:1b0d80432c79 1178 #endif /* HAVE_NETX */
wolfSSL 4:1b0d80432c79 1179 #endif /* WOLFCRYPT_ONLY */
wolfSSL 4:1b0d80432c79 1180
wolfSSL 4:1b0d80432c79 1181