change some parameters in the library to meet the needs of the website httpbin.org

Fork of MiniTLS-GPL by Donatien Garnier

Committer:
shiyilei
Date:
Fri Feb 06 06:17:33 2015 +0000
Revision:
5:95f70ebfe61f
Parent:
2:527a66d0a1a9
change some parameters in the library to meet the needs of httpbin.org

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MiniTLS 2:527a66d0a1a9 1 /*
MiniTLS 2:527a66d0a1a9 2 MiniTLS - A super trimmed down TLS/SSL Library for embedded devices
MiniTLS 2:527a66d0a1a9 3 Author: Donatien Garnier
MiniTLS 2:527a66d0a1a9 4 Copyright (C) 2013-2014 AppNearMe Ltd
MiniTLS 2:527a66d0a1a9 5
MiniTLS 2:527a66d0a1a9 6 This program is free software; you can redistribute it and/or
MiniTLS 2:527a66d0a1a9 7 modify it under the terms of the GNU General Public License
MiniTLS 2:527a66d0a1a9 8 as published by the Free Software Foundation; either version 2
MiniTLS 2:527a66d0a1a9 9 of the License, or (at your option) any later version.
MiniTLS 2:527a66d0a1a9 10
MiniTLS 2:527a66d0a1a9 11 This program is distributed in the hope that it will be useful,
MiniTLS 2:527a66d0a1a9 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
MiniTLS 2:527a66d0a1a9 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
MiniTLS 2:527a66d0a1a9 14 GNU General Public License for more details.
MiniTLS 2:527a66d0a1a9 15
MiniTLS 2:527a66d0a1a9 16 You should have received a copy of the GNU General Public License
MiniTLS 2:527a66d0a1a9 17 along with this program; if not, write to the Free Software
MiniTLS 2:527a66d0a1a9 18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
MiniTLS 2:527a66d0a1a9 19 *//**
MiniTLS 2:527a66d0a1a9 20 * \file TLSSocket.cpp
MiniTLS 2:527a66d0a1a9 21 * \copyright Copyright (c) AppNearMe Ltd 2013
MiniTLS 2:527a66d0a1a9 22 * \author Donatien Garnier
MiniTLS 2:527a66d0a1a9 23 */
MiniTLS 2:527a66d0a1a9 24
MiniTLS 2:527a66d0a1a9 25 #define __DEBUG__ 0//4
MiniTLS 2:527a66d0a1a9 26 #ifndef __MODULE__
MiniTLS 2:527a66d0a1a9 27 #define __MODULE__ "TLSSocket.cpp"
MiniTLS 2:527a66d0a1a9 28 #endif
MiniTLS 2:527a66d0a1a9 29
MiniTLS 2:527a66d0a1a9 30 #include "core/fwk.h"
MiniTLS 2:527a66d0a1a9 31 #include "TLSSocket.h"
MiniTLS 2:527a66d0a1a9 32
MiniTLS 2:527a66d0a1a9 33
MiniTLS 2:527a66d0a1a9 34 #include "tls/minitls.h"
MiniTLS 2:527a66d0a1a9 35 #include "tls/tls_socket.h"
MiniTLS 2:527a66d0a1a9 36
MiniTLS 2:527a66d0a1a9 37 /** Instantiate a TLS socket
MiniTLS 2:527a66d0a1a9 38 *
MiniTLS 2:527a66d0a1a9 39 */
MiniTLS 2:527a66d0a1a9 40 TLSSocket::TLSSocket(MiniTLS* pMiniTLS) : m_pMiniTLS(pMiniTLS)
MiniTLS 2:527a66d0a1a9 41 {
MiniTLS 2:527a66d0a1a9 42
MiniTLS 2:527a66d0a1a9 43 }
MiniTLS 2:527a66d0a1a9 44
MiniTLS 2:527a66d0a1a9 45 TLSSocket::~TLSSocket()
MiniTLS 2:527a66d0a1a9 46 {
MiniTLS 2:527a66d0a1a9 47
MiniTLS 2:527a66d0a1a9 48 }
MiniTLS 2:527a66d0a1a9 49
MiniTLS 2:527a66d0a1a9 50 /** Initialize socket
MiniTLS 2:527a66d0a1a9 51 * \return MINITLS_OK on success, MINITLS_ERR_* error code otherwise
MiniTLS 2:527a66d0a1a9 52 */
MiniTLS 2:527a66d0a1a9 53 minitls_err_t TLSSocket::init()
MiniTLS 2:527a66d0a1a9 54 {
MiniTLS 2:527a66d0a1a9 55 int ret = tls_socket_init(&m_sock, &m_pMiniTLS->m_minitls, m_writeBuf, sizeof(m_writeBuf), m_readBuf, sizeof(m_readBuf));
MiniTLS 2:527a66d0a1a9 56 if(ret)
MiniTLS 2:527a66d0a1a9 57 {
MiniTLS 2:527a66d0a1a9 58 ERR("Could not init socket: error %d", ret);
MiniTLS 2:527a66d0a1a9 59 return ret;
MiniTLS 2:527a66d0a1a9 60 }
MiniTLS 2:527a66d0a1a9 61 return MINITLS_OK;
MiniTLS 2:527a66d0a1a9 62 }
MiniTLS 2:527a66d0a1a9 63
MiniTLS 2:527a66d0a1a9 64
MiniTLS 2:527a66d0a1a9 65 /** Connect to server
MiniTLS 2:527a66d0a1a9 66 * \param hostname server to connect to
MiniTLS 2:527a66d0a1a9 67 * \param port port to connect to
MiniTLS 2:527a66d0a1a9 68 * \param timeout timeout in ms
MiniTLS 2:527a66d0a1a9 69 * \return MINITLS_OK on success, MINITLS_ERR_* error code otherwise
MiniTLS 2:527a66d0a1a9 70 */
MiniTLS 2:527a66d0a1a9 71 minitls_err_t TLSSocket::connect(const char* hostname, uint16_t port, int timeout)
MiniTLS 2:527a66d0a1a9 72 {
MiniTLS 2:527a66d0a1a9 73 minitls_err_t ret = tls_socket_connect(&m_sock, hostname, port, timeout);
MiniTLS 2:527a66d0a1a9 74 if(ret)
MiniTLS 2:527a66d0a1a9 75 {
MiniTLS 2:527a66d0a1a9 76 return ret;
MiniTLS 2:527a66d0a1a9 77 }
MiniTLS 2:527a66d0a1a9 78 return MINITLS_OK;
MiniTLS 2:527a66d0a1a9 79 }
MiniTLS 2:527a66d0a1a9 80
MiniTLS 2:527a66d0a1a9 81 /** Read data from server
MiniTLS 2:527a66d0a1a9 82 * \param buf buffer to read bytes to
MiniTLS 2:527a66d0a1a9 83 * \param minLength minimum number of bytes to read (will block before this number of bytes are read)
MiniTLS 2:527a66d0a1a9 84 * \param maxLength maximum number of bytes to read
MiniTLS 2:527a66d0a1a9 85 * \param readLength will receive actual number of bytes read
MiniTLS 2:527a66d0a1a9 86 * \param timeout timeout in ms
MiniTLS 2:527a66d0a1a9 87 * \return MINITLS_OK on success, MINITLS_ERR_* error code otherwise
MiniTLS 2:527a66d0a1a9 88 */
MiniTLS 2:527a66d0a1a9 89 minitls_err_t TLSSocket::read(uint8_t* buf, size_t minLength, size_t maxLength, size_t* readLength, int timeout)
MiniTLS 2:527a66d0a1a9 90 {
MiniTLS 2:527a66d0a1a9 91 if(minLength > maxLength)
MiniTLS 2:527a66d0a1a9 92 {
MiniTLS 2:527a66d0a1a9 93 return MINITLS_ERR_PARAMETERS;
MiniTLS 2:527a66d0a1a9 94 }
MiniTLS 2:527a66d0a1a9 95
MiniTLS 2:527a66d0a1a9 96 *readLength = 0;
MiniTLS 2:527a66d0a1a9 97
MiniTLS 2:527a66d0a1a9 98 minitls_err_t ret;
MiniTLS 2:527a66d0a1a9 99 while( *readLength < minLength )
MiniTLS 2:527a66d0a1a9 100 {
MiniTLS 2:527a66d0a1a9 101 ret = tls_socket_flush_read(&m_sock, timeout);
MiniTLS 2:527a66d0a1a9 102 if(ret == MINITLS_ERR_SOCKET_CLOSED)
MiniTLS 2:527a66d0a1a9 103 {
MiniTLS 2:527a66d0a1a9 104 return MINITLS_OK;
MiniTLS 2:527a66d0a1a9 105 }
MiniTLS 2:527a66d0a1a9 106 else if(ret)
MiniTLS 2:527a66d0a1a9 107 {
MiniTLS 2:527a66d0a1a9 108 return ret;
MiniTLS 2:527a66d0a1a9 109 }
MiniTLS 2:527a66d0a1a9 110
MiniTLS 2:527a66d0a1a9 111 size_t bytesRead = 0;
MiniTLS 2:527a66d0a1a9 112 ret = tls_socket_read(&m_sock, buf + *readLength, maxLength - *readLength, &bytesRead);
MiniTLS 2:527a66d0a1a9 113 if(ret)
MiniTLS 2:527a66d0a1a9 114 {
MiniTLS 2:527a66d0a1a9 115 return ret;
MiniTLS 2:527a66d0a1a9 116 }
MiniTLS 2:527a66d0a1a9 117
MiniTLS 2:527a66d0a1a9 118 *readLength += bytesRead;
MiniTLS 2:527a66d0a1a9 119 }
MiniTLS 2:527a66d0a1a9 120
MiniTLS 2:527a66d0a1a9 121 return MINITLS_OK;
MiniTLS 2:527a66d0a1a9 122 }
MiniTLS 2:527a66d0a1a9 123
MiniTLS 2:527a66d0a1a9 124 /** Write data to server
MiniTLS 2:527a66d0a1a9 125 * \param buf buffer to write bytes from
MiniTLS 2:527a66d0a1a9 126 * \param length number of bytes to write
MiniTLS 2:527a66d0a1a9 127 * \param writtenLength will receive actual number of bytes written
MiniTLS 2:527a66d0a1a9 128 * \param timeout timeout in ms
MiniTLS 2:527a66d0a1a9 129 * \return MINITLS_OK on success, MINITLS_ERR_* error code otherwise
MiniTLS 2:527a66d0a1a9 130 */
MiniTLS 2:527a66d0a1a9 131 minitls_err_t TLSSocket::write(uint8_t* buf, size_t length, size_t* writtenLength, int timeout)
MiniTLS 2:527a66d0a1a9 132 {
MiniTLS 2:527a66d0a1a9 133 *writtenLength = 0;
MiniTLS 2:527a66d0a1a9 134
MiniTLS 2:527a66d0a1a9 135 minitls_err_t ret;
MiniTLS 2:527a66d0a1a9 136 while( *writtenLength < length )
MiniTLS 2:527a66d0a1a9 137 {
MiniTLS 2:527a66d0a1a9 138 size_t bytesToWrite = length - *writtenLength;
MiniTLS 2:527a66d0a1a9 139 size_t bytesWritten = 0;
MiniTLS 2:527a66d0a1a9 140 ret = tls_socket_write(&m_sock, buf + *writtenLength, bytesToWrite, &bytesWritten);
MiniTLS 2:527a66d0a1a9 141 if(ret == MINITLS_ERR_SOCKET_CLOSED)
MiniTLS 2:527a66d0a1a9 142 {
MiniTLS 2:527a66d0a1a9 143 return MINITLS_OK;
MiniTLS 2:527a66d0a1a9 144 }
MiniTLS 2:527a66d0a1a9 145 else if(ret)
MiniTLS 2:527a66d0a1a9 146 {
MiniTLS 2:527a66d0a1a9 147 return ret;
MiniTLS 2:527a66d0a1a9 148 }
MiniTLS 2:527a66d0a1a9 149
MiniTLS 2:527a66d0a1a9 150 *writtenLength += bytesWritten;
MiniTLS 2:527a66d0a1a9 151
MiniTLS 2:527a66d0a1a9 152 //Flush only if needed
MiniTLS 2:527a66d0a1a9 153 if( bytesWritten < bytesToWrite )
MiniTLS 2:527a66d0a1a9 154 {
MiniTLS 2:527a66d0a1a9 155 ret = tls_socket_flush_write(&m_sock, timeout);
MiniTLS 2:527a66d0a1a9 156 if(ret)
MiniTLS 2:527a66d0a1a9 157 {
MiniTLS 2:527a66d0a1a9 158 return ret;
MiniTLS 2:527a66d0a1a9 159 }
MiniTLS 2:527a66d0a1a9 160 }
MiniTLS 2:527a66d0a1a9 161 }
MiniTLS 2:527a66d0a1a9 162
MiniTLS 2:527a66d0a1a9 163 return MINITLS_OK;
MiniTLS 2:527a66d0a1a9 164 }
MiniTLS 2:527a66d0a1a9 165
MiniTLS 2:527a66d0a1a9 166 /** Call to ensure transmission of bytes written using write
MiniTLS 2:527a66d0a1a9 167 * \param timeout timeout in ms
MiniTLS 2:527a66d0a1a9 168 * \return MINITLS_OK on success, MINITLS_ERR_* error code otherwise
MiniTLS 2:527a66d0a1a9 169 */
MiniTLS 2:527a66d0a1a9 170 minitls_err_t TLSSocket::flush(int timeout)
MiniTLS 2:527a66d0a1a9 171 {
MiniTLS 2:527a66d0a1a9 172 minitls_err_t ret = tls_socket_flush_write(&m_sock, timeout);
MiniTLS 2:527a66d0a1a9 173 if(ret)
MiniTLS 2:527a66d0a1a9 174 {
MiniTLS 2:527a66d0a1a9 175 return ret;
MiniTLS 2:527a66d0a1a9 176 }
MiniTLS 2:527a66d0a1a9 177 return MINITLS_OK;
MiniTLS 2:527a66d0a1a9 178 }
MiniTLS 2:527a66d0a1a9 179
MiniTLS 2:527a66d0a1a9 180 /** Tear down TLS connection and close socket
MiniTLS 2:527a66d0a1a9 181 * \return MINITLS_OK on success, MINITLS_ERR_* error code otherwise
MiniTLS 2:527a66d0a1a9 182 */
MiniTLS 2:527a66d0a1a9 183 minitls_err_t TLSSocket::close()
MiniTLS 2:527a66d0a1a9 184 {
MiniTLS 2:527a66d0a1a9 185 minitls_err_t ret = tls_socket_close(&m_sock);
MiniTLS 2:527a66d0a1a9 186 if(ret)
MiniTLS 2:527a66d0a1a9 187 {
MiniTLS 2:527a66d0a1a9 188 return ret;
MiniTLS 2:527a66d0a1a9 189 }
MiniTLS 2:527a66d0a1a9 190 return MINITLS_OK;
MiniTLS 2:527a66d0a1a9 191 }
MiniTLS 2:527a66d0a1a9 192