| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  | // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Licensed under the Apache License, Version 2.0 (the "License");
 | 
					
						
							|  |  |  | // you may not use this file except in compliance with the License.
 | 
					
						
							|  |  |  | // You may obtain a copy of the License at
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //     http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Unless required by applicable law or agreed to in writing, software
 | 
					
						
							|  |  |  | // distributed under the License is distributed on an "AS IS" BASIS,
 | 
					
						
							|  |  |  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					
						
							|  |  |  | // See the License for the specific language governing permissions and
 | 
					
						
							|  |  |  | // limitations under the License.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | #include "ssl_lib.h"
 | 
					
						
							|  |  |  | #include "ssl_pkey.h"
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  | #include "ssl_x509.h"
 | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | #include "ssl_cert.h"
 | 
					
						
							|  |  |  | #include "ssl_dbg.h"
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  | #include "ssl_port.h"
 | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define SSL_SEND_DATA_MAX_LENGTH 1460
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief create a new SSL session object | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static SSL_SESSION* SSL_SESSION_new(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     SSL_SESSION *session; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     session = ssl_mem_zalloc(sizeof(SSL_SESSION)); | 
					
						
							|  |  |  |     if (!session) { | 
					
						
							|  |  |  |         SSL_DEBUG(SSL_LIB_ERROR_LEVEL, "no enough memory > (session)"); | 
					
						
							|  |  |  |         goto failed1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     session->peer = X509_new(); | 
					
						
							|  |  |  |     if (!session->peer) { | 
					
						
							|  |  |  |        SSL_DEBUG(SSL_LIB_ERROR_LEVEL, "X509_new() return NULL"); | 
					
						
							|  |  |  |        goto failed2; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return session; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | failed2: | 
					
						
							|  |  |  |     ssl_mem_free(session); | 
					
						
							|  |  |  | failed1: | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * @brief free a new SSL session object | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static void SSL_SESSION_free(SSL_SESSION *session) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     X509_free(session->peer); | 
					
						
							|  |  |  |     ssl_mem_free(session); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief Discover whether the current connection is in the error state | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2016-09-21 09:23:29 +08:00
										 |  |  | int ossl_statem_in_error(const SSL *ssl) | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |     if (ssl->statem.state == MSG_FLOW_ERROR) | 
					
						
							|  |  |  |         return 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the SSL specifical statement | 
					
						
							| 
									
										
										
										
											2016-09-21 09:23:29 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_want(const SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     return ssl->rwstate; | 
					
						
							| 
									
										
										
										
											2016-09-21 09:23:29 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief check if SSL want nothing | 
					
						
							| 
									
										
										
										
											2016-09-21 09:23:29 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_want_nothing(const SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 09:23:29 +08:00
										 |  |  |     return (SSL_want(ssl) == SSL_NOTHING); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief check if SSL want to read | 
					
						
							| 
									
										
										
										
											2016-09-21 09:23:29 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_want_read(const SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 09:23:29 +08:00
										 |  |  |     return (SSL_want(ssl) == SSL_READING); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief check if SSL want to write | 
					
						
							| 
									
										
										
										
											2016-09-21 09:23:29 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_want_write(const SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 09:23:29 +08:00
										 |  |  |     return (SSL_want(ssl) == SSL_WRITING); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief check if SSL want to lookup X509 certification | 
					
						
							| 
									
										
										
										
											2016-09-21 09:23:29 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_want_x509_lookup(const SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 09:23:29 +08:00
										 |  |  |     return (SSL_want(ssl) == SSL_WRITING); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get SSL error code | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_get_error(const SSL *ssl, int ret_code) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret = SSL_ERROR_SYSCALL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (ret_code > 0) | 
					
						
							|  |  |  |         ret = SSL_ERROR_NONE; | 
					
						
							|  |  |  |     else if (ret_code < 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (SSL_want_read(ssl)) | 
					
						
							|  |  |  |             ret = SSL_ERROR_WANT_READ; | 
					
						
							|  |  |  |         else if (SSL_want_write(ssl)) | 
					
						
							|  |  |  |             ret = SSL_ERROR_WANT_WRITE; | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             ret = SSL_ERROR_SYSCALL; //unknown
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else // ret_code == 0
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (ssl->shutdown & SSL_RECEIVED_SHUTDOWN) | 
					
						
							|  |  |  |             ret = SSL_ERROR_ZERO_RETURN; | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             ret = SSL_ERROR_SYSCALL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the SSL state | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | OSSL_HANDSHAKE_STATE SSL_get_state(const SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     OSSL_HANDSHAKE_STATE state; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     state = SSL_METHOD_CALL(get_state, ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return state; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief create a SSL context | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | SSL_CTX* SSL_CTX_new(const SSL_METHOD *method) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     SSL_CTX *ctx; | 
					
						
							|  |  |  |     CERT *cert; | 
					
						
							|  |  |  |     X509 *client_ca; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     if (!method) { | 
					
						
							|  |  |  |         SSL_DEBUG(SSL_LIB_ERROR_LEVEL, "no no_method"); | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 14:42:49 +08:00
										 |  |  |     client_ca = X509_new(); | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     if (!client_ca) { | 
					
						
							|  |  |  |         SSL_DEBUG(SSL_LIB_ERROR_LEVEL, "X509_new() return NULL"); | 
					
						
							|  |  |  |         goto failed1; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     cert = ssl_cert_new(); | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     if (!cert) { | 
					
						
							|  |  |  |         SSL_DEBUG(SSL_LIB_ERROR_LEVEL, "ssl_cert_new() return NULL"); | 
					
						
							|  |  |  |         goto failed2; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-01 13:07:10 +08:00
										 |  |  |     ctx = (SSL_CTX *)ssl_mem_zalloc(sizeof(SSL_CTX)); | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     if (!ctx) { | 
					
						
							|  |  |  |         SSL_DEBUG(SSL_LIB_ERROR_LEVEL, "no enough memory > (ctx)"); | 
					
						
							|  |  |  |         goto failed3; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ctx->method = method; | 
					
						
							|  |  |  |     ctx->client_CA = client_ca; | 
					
						
							| 
									
										
										
										
											2016-09-22 14:42:49 +08:00
										 |  |  |     ctx->cert = cert; | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ctx->version = method->version; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return ctx; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  | failed3: | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |     ssl_cert_free(cert); | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  | failed2: | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |     X509_free(client_ca); | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  | failed1: | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |     return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief free a SSL context | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | void SSL_CTX_free(SSL_CTX* ctx) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT3(ctx); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ssl_cert_free(ctx->cert); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     X509_free(ctx->client_CA); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-26 14:13:37 +05:30
										 |  |  |     if (ctx->ssl_alpn.alpn_string) { | 
					
						
							|  |  |  | 	 ssl_mem_free((void *)ctx->ssl_alpn.alpn_string); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-01 13:07:10 +08:00
										 |  |  |     ssl_mem_free(ctx); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief set  the SSL context version | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_CTX_set_ssl_version(SSL_CTX *ctx, const SSL_METHOD *meth) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ctx); | 
					
						
							|  |  |  |     SSL_ASSERT1(meth); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ctx->method = meth; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     ctx->version = meth->version; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the SSL context current method | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | const SSL_METHOD *SSL_CTX_get_ssl_method(SSL_CTX *ctx) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT2(ctx); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ctx->method; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief create a SSL | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | SSL *SSL_new(SSL_CTX *ctx) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-09-22 18:33:55 +08:00
										 |  |  |     int ret = 0; | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |     SSL *ssl; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     if (!ctx) { | 
					
						
							|  |  |  |         SSL_DEBUG(SSL_LIB_ERROR_LEVEL, "no ctx"); | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-01 13:07:10 +08:00
										 |  |  |     ssl = (SSL *)ssl_mem_zalloc(sizeof(SSL)); | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     if (!ssl) { | 
					
						
							|  |  |  |         SSL_DEBUG(SSL_LIB_ERROR_LEVEL, "no enough memory > (ssl)"); | 
					
						
							|  |  |  |         goto failed1; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 18:13:10 +08:00
										 |  |  |     ssl->session = SSL_SESSION_new(); | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     if (!ssl->session) { | 
					
						
							|  |  |  |         SSL_DEBUG(SSL_LIB_ERROR_LEVEL, "SSL_SESSION_new() return NULL"); | 
					
						
							|  |  |  |         goto failed2; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-23 18:13:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-26 11:14:19 +08:00
										 |  |  |     ssl->cert = __ssl_cert_new(ctx->cert); | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     if (!ssl->cert) { | 
					
						
							|  |  |  |         SSL_DEBUG(SSL_LIB_ERROR_LEVEL, "__ssl_cert_new() return NULL"); | 
					
						
							|  |  |  |         goto failed3; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-23 18:47:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-26 11:14:19 +08:00
										 |  |  |     ssl->client_CA = __X509_new(ctx->client_CA); | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     if (!ssl->client_CA) { | 
					
						
							|  |  |  |         SSL_DEBUG(SSL_LIB_ERROR_LEVEL, "__X509_new() return NULL"); | 
					
						
							|  |  |  |         goto failed4; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-23 18:47:09 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |     ssl->ctx = ctx; | 
					
						
							|  |  |  |     ssl->method = ctx->method; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ssl->version = ctx->version; | 
					
						
							|  |  |  |     ssl->options = ctx->options; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 11:41:57 +08:00
										 |  |  |     ssl->verify_mode = ctx->verify_mode; | 
					
						
							| 
									
										
										
										
											2016-09-22 16:41:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     ret = SSL_METHOD_CALL(new, ssl); | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     if (ret) { | 
					
						
							|  |  |  |         SSL_DEBUG(SSL_LIB_ERROR_LEVEL, "SSL_METHOD_CALL(new) return %d", ret); | 
					
						
							|  |  |  |         goto failed5; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     ssl->rwstate = SSL_NOTHING; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |     return ssl; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 18:47:09 +08:00
										 |  |  | failed5: | 
					
						
							|  |  |  |     X509_free(ssl->client_CA); | 
					
						
							|  |  |  | failed4: | 
					
						
							|  |  |  |     ssl_cert_free(ssl->cert); | 
					
						
							| 
									
										
										
										
											2016-09-23 18:13:10 +08:00
										 |  |  | failed3: | 
					
						
							|  |  |  |     SSL_SESSION_free(ssl->session); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | failed2: | 
					
						
							| 
									
										
										
										
											2016-11-01 13:07:10 +08:00
										 |  |  |     ssl_mem_free(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | failed1: | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief free the SSL | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | void SSL_free(SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT3(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     SSL_METHOD_CALL(free, ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 18:47:09 +08:00
										 |  |  |     X509_free(ssl->client_CA); | 
					
						
							| 
									
										
										
										
											2016-09-23 18:13:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 18:47:09 +08:00
										 |  |  |     ssl_cert_free(ssl->cert); | 
					
						
							| 
									
										
										
										
											2016-09-23 10:33:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 18:47:09 +08:00
										 |  |  |     SSL_SESSION_free(ssl->session); | 
					
						
							| 
									
										
										
										
											2016-09-23 10:33:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-01 13:07:10 +08:00
										 |  |  |     ssl_mem_free(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief perform the SSL handshake | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_do_handshake(SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     ret = SSL_METHOD_CALL(handshake, ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief connect to the remote SSL server | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_connect(SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return SSL_do_handshake(ssl); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief accept the remote connection | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_accept(SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return SSL_do_handshake(ssl); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief shutdown the connection | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_shutdown(SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-01 13:07:10 +08:00
										 |  |  |     if (SSL_get_state(ssl) != TLS_ST_OK) return 1; | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     ret = SSL_METHOD_CALL(shutdown, ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief reset the SSL | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_clear(SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ret = SSL_shutdown(ssl); | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     if (1 != ret) { | 
					
						
							|  |  |  |         SSL_DEBUG(SSL_LIB_ERROR_LEVEL, "SSL_shutdown return %d", ret); | 
					
						
							|  |  |  |         goto failed1; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     SSL_METHOD_CALL(free, ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     ret = SSL_METHOD_CALL(new, ssl); | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     if (!ret) { | 
					
						
							|  |  |  |         SSL_DEBUG(SSL_LIB_ERROR_LEVEL, "SSL_METHOD_CALL(new) return %d", ret); | 
					
						
							|  |  |  |         goto failed1; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  | failed1: | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief read data from to remote | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_read(SSL *ssl, void *buffer, int len) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							|  |  |  |     SSL_ASSERT1(buffer); | 
					
						
							|  |  |  |     SSL_ASSERT1(len); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     ssl->rwstate = SSL_READING; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ret = SSL_METHOD_CALL(read, ssl, buffer, len); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-09 19:18:18 +08:00
										 |  |  |     if (ret == len) | 
					
						
							|  |  |  |         ssl->rwstate = SSL_NOTHING; | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief send the data to remote | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_write(SSL *ssl, const void *buffer, int len) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret; | 
					
						
							|  |  |  |     int send_bytes; | 
					
						
							|  |  |  |     const unsigned char *pbuf; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							|  |  |  |     SSL_ASSERT1(buffer); | 
					
						
							|  |  |  |     SSL_ASSERT1(len); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     ssl->rwstate = SSL_WRITING; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |     send_bytes = len; | 
					
						
							|  |  |  |     pbuf = (const unsigned char *)buffer; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     do { | 
					
						
							|  |  |  |         int bytes; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (send_bytes > SSL_SEND_DATA_MAX_LENGTH) | 
					
						
							|  |  |  |             bytes = SSL_SEND_DATA_MAX_LENGTH; | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             bytes = send_bytes; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-24 17:36:32 +08:00
										 |  |  |         ret = SSL_METHOD_CALL(send, ssl, pbuf, bytes); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |         if (ret > 0) { | 
					
						
							|  |  |  |             pbuf += ret; | 
					
						
							|  |  |  |             send_bytes -= ret; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } while (ret > 0 && send_bytes); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-09 19:18:18 +08:00
										 |  |  |     if (ret >= 0) { | 
					
						
							|  |  |  |         ret = len - send_bytes; | 
					
						
							|  |  |  |         ssl->rwstate = SSL_NOTHING; | 
					
						
							|  |  |  |     } else | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |         ret = -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get SSL context of the SSL | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT2(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ssl->ctx; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the SSL current method | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | const SSL_METHOD *SSL_get_ssl_method(SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT2(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ssl->method; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief set the SSL method | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_set_ssl_method(SSL *ssl, const SSL_METHOD *method) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							|  |  |  |     SSL_ASSERT1(method); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (ssl->version != method->version) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         ret = SSL_shutdown(ssl); | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |         if (1 != ret) { | 
					
						
							|  |  |  |             SSL_DEBUG(SSL_LIB_ERROR_LEVEL, "SSL_shutdown return %d", ret); | 
					
						
							|  |  |  |             goto failed1; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |         SSL_METHOD_CALL(free, ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         ssl->method = method; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |         ret = SSL_METHOD_CALL(new, ssl); | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |         if (!ret) { | 
					
						
							|  |  |  |             SSL_DEBUG(SSL_LIB_ERROR_LEVEL, "SSL_METHOD_CALL(new) return %d", ret); | 
					
						
							|  |  |  |             goto failed1; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |     } else { | 
					
						
							|  |  |  |         ssl->method = method; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  | failed1: | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get SSL shutdown mode | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_get_shutdown(const SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ssl->shutdown; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief set SSL shutdown mode | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | void SSL_set_shutdown(SSL *ssl, int mode) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT3(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ssl->shutdown = mode; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the number of the bytes to be read | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_pending(const SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     ret = SSL_METHOD_CALL(pending, ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief check if some data can be read | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_has_pending(const SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (SSL_pending(ssl)) | 
					
						
							|  |  |  |         ret = 1; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         ret = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief clear the SSL context option bit of "op" | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | unsigned long SSL_CTX_clear_options(SSL_CTX *ctx, unsigned long op) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ctx); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |     return ctx->options &= ~op; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the SSL context option | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | unsigned long SSL_CTX_get_options(SSL_CTX *ctx) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ctx); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |     return ctx->options; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief set the option of the SSL context | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | unsigned long SSL_CTX_set_options(SSL_CTX *ctx, unsigned long opt) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ctx); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |     return ctx->options |= opt; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief clear SSL option | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | unsigned long SSL_clear_options(SSL *ssl, unsigned long op) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ssl->options & ~op; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get SSL option | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | unsigned long SSL_get_options(SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ssl->options; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief clear SSL option | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | unsigned long SSL_set_options(SSL *ssl, unsigned long op) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ssl->options |= op; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the socket handle of the SSL | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_get_fd(const SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     ret = SSL_METHOD_CALL(get_fd, ssl, 0); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the read only socket handle of the SSL | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_get_rfd(const SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     ret = SSL_METHOD_CALL(get_fd, ssl, 0); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the write only socket handle of the SSL | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_get_wfd(const SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     ret = SSL_METHOD_CALL(get_fd, ssl, 0); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief bind the socket file description into the SSL | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_set_fd(SSL *ssl, int fd) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							|  |  |  |     SSL_ASSERT1(fd >= 0); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     SSL_METHOD_CALL(set_fd, ssl, fd, 0); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief bind the read only socket file description into the SSL | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_set_rfd(SSL *ssl, int fd) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							|  |  |  |     SSL_ASSERT1(fd >= 0); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     SSL_METHOD_CALL(set_fd, ssl, fd, 0); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief bind the write only socket file description into the SSL | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_set_wfd(SSL *ssl, int fd) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							|  |  |  |     SSL_ASSERT1(fd >= 0); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     SSL_METHOD_CALL(set_fd, ssl, fd, 0); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-02 14:00:13 +05:30
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief SET TLS Hostname | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | int SSL_set_tlsext_host_name(SSL* ssl, const char *hostname) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |      SSL_ASSERT1(ssl); | 
					
						
							|  |  |  |      SSL_ASSERT1(hostname); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      SSL_METHOD_CALL(set_hostname, ssl, hostname); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get SSL version | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_version(const SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ssl->version; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the SSL version string | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | static const char* ssl_protocol_to_string(int version) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const char *str; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (version == TLS1_2_VERSION) | 
					
						
							|  |  |  |         str = "TLSv1.2"; | 
					
						
							|  |  |  |     else if (version == TLS1_1_VERSION) | 
					
						
							|  |  |  |         str = "TLSv1.1"; | 
					
						
							|  |  |  |     else if (version == TLS1_VERSION) | 
					
						
							|  |  |  |         str = "TLSv1"; | 
					
						
							|  |  |  |     else if (version == SSL3_VERSION) | 
					
						
							|  |  |  |         str = "SSLv3"; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         str = "unknown"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return str; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the SSL current version | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | const char *SSL_get_version(const SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT2(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ssl_protocol_to_string(SSL_version(ssl)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get alert description string | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | const char* SSL_alert_desc_string(int value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const char *str; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch (value & 0xff) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         case SSL3_AD_CLOSE_NOTIFY: | 
					
						
							|  |  |  |             str = "CN"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_UNEXPECTED_MESSAGE: | 
					
						
							|  |  |  |             str = "UM"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_BAD_RECORD_MAC: | 
					
						
							|  |  |  |             str = "BM"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_DECOMPRESSION_FAILURE: | 
					
						
							|  |  |  |             str = "DF"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_HANDSHAKE_FAILURE: | 
					
						
							|  |  |  |             str = "HF"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_NO_CERTIFICATE: | 
					
						
							|  |  |  |             str = "NC"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_BAD_CERTIFICATE: | 
					
						
							|  |  |  |             str = "BC"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_UNSUPPORTED_CERTIFICATE: | 
					
						
							|  |  |  |             str = "UC"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_CERTIFICATE_REVOKED: | 
					
						
							|  |  |  |             str = "CR"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_CERTIFICATE_EXPIRED: | 
					
						
							|  |  |  |             str = "CE"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_CERTIFICATE_UNKNOWN: | 
					
						
							|  |  |  |             str = "CU"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_ILLEGAL_PARAMETER: | 
					
						
							|  |  |  |             str = "IP"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_DECRYPTION_FAILED: | 
					
						
							|  |  |  |             str = "DC"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_RECORD_OVERFLOW: | 
					
						
							|  |  |  |             str = "RO"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_UNKNOWN_CA: | 
					
						
							|  |  |  |             str = "CA"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_ACCESS_DENIED: | 
					
						
							|  |  |  |             str = "AD"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_DECODE_ERROR: | 
					
						
							|  |  |  |             str = "DE"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_DECRYPT_ERROR: | 
					
						
							|  |  |  |             str = "CY"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_EXPORT_RESTRICTION: | 
					
						
							|  |  |  |             str = "ER"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_PROTOCOL_VERSION: | 
					
						
							|  |  |  |             str = "PV"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_INSUFFICIENT_SECURITY: | 
					
						
							|  |  |  |             str = "IS"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_INTERNAL_ERROR: | 
					
						
							|  |  |  |             str = "IE"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_USER_CANCELLED: | 
					
						
							|  |  |  |             str = "US"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_NO_RENEGOTIATION: | 
					
						
							|  |  |  |             str = "NR"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_UNSUPPORTED_EXTENSION: | 
					
						
							|  |  |  |             str = "UE"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_CERTIFICATE_UNOBTAINABLE: | 
					
						
							|  |  |  |             str = "CO"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_UNRECOGNIZED_NAME: | 
					
						
							|  |  |  |             str = "UN"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE: | 
					
						
							|  |  |  |             str = "BR"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_BAD_CERTIFICATE_HASH_VALUE: | 
					
						
							|  |  |  |             str = "BH"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_UNKNOWN_PSK_IDENTITY: | 
					
						
							|  |  |  |             str = "UP"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             str = "UK"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return str; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get alert description long string | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | const char* SSL_alert_desc_string_long(int value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const char *str; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch (value & 0xff) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         case SSL3_AD_CLOSE_NOTIFY: | 
					
						
							|  |  |  |             str = "close notify"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_UNEXPECTED_MESSAGE: | 
					
						
							|  |  |  |             str = "unexpected_message"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_BAD_RECORD_MAC: | 
					
						
							|  |  |  |             str = "bad record mac"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_DECOMPRESSION_FAILURE: | 
					
						
							|  |  |  |             str = "decompression failure"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_HANDSHAKE_FAILURE: | 
					
						
							|  |  |  |             str = "handshake failure"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_NO_CERTIFICATE: | 
					
						
							|  |  |  |             str = "no certificate"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_BAD_CERTIFICATE: | 
					
						
							|  |  |  |             str = "bad certificate"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_UNSUPPORTED_CERTIFICATE: | 
					
						
							|  |  |  |             str = "unsupported certificate"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_CERTIFICATE_REVOKED: | 
					
						
							|  |  |  |             str = "certificate revoked"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_CERTIFICATE_EXPIRED: | 
					
						
							|  |  |  |             str = "certificate expired"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_CERTIFICATE_UNKNOWN: | 
					
						
							|  |  |  |             str = "certificate unknown"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AD_ILLEGAL_PARAMETER: | 
					
						
							|  |  |  |             str = "illegal parameter"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_DECRYPTION_FAILED: | 
					
						
							|  |  |  |             str = "decryption failed"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_RECORD_OVERFLOW: | 
					
						
							|  |  |  |             str = "record overflow"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_UNKNOWN_CA: | 
					
						
							|  |  |  |             str = "unknown CA"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_ACCESS_DENIED: | 
					
						
							|  |  |  |             str = "access denied"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_DECODE_ERROR: | 
					
						
							|  |  |  |             str = "decode error"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_DECRYPT_ERROR: | 
					
						
							|  |  |  |             str = "decrypt error"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_EXPORT_RESTRICTION: | 
					
						
							|  |  |  |             str = "export restriction"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_PROTOCOL_VERSION: | 
					
						
							|  |  |  |             str = "protocol version"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_INSUFFICIENT_SECURITY: | 
					
						
							|  |  |  |             str = "insufficient security"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_INTERNAL_ERROR: | 
					
						
							|  |  |  |             str = "internal error"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_USER_CANCELLED: | 
					
						
							|  |  |  |             str = "user canceled"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_NO_RENEGOTIATION: | 
					
						
							|  |  |  |             str = "no renegotiation"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_UNSUPPORTED_EXTENSION: | 
					
						
							|  |  |  |             str = "unsupported extension"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_CERTIFICATE_UNOBTAINABLE: | 
					
						
							|  |  |  |             str = "certificate unobtainable"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_UNRECOGNIZED_NAME: | 
					
						
							|  |  |  |             str = "unrecognized name"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE: | 
					
						
							|  |  |  |             str = "bad certificate status response"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_BAD_CERTIFICATE_HASH_VALUE: | 
					
						
							|  |  |  |             str = "bad certificate hash value"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case TLS1_AD_UNKNOWN_PSK_IDENTITY: | 
					
						
							|  |  |  |             str = "unknown PSK identity"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             str = "unknown"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return str; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get alert type string | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | const char *SSL_alert_type_string(int value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const char *str; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch (value >> 8) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     case SSL3_AL_WARNING: | 
					
						
							|  |  |  |         str = "W"; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     case SSL3_AL_FATAL: | 
					
						
							|  |  |  |         str = "F"; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |         str = "U"; | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return str; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get alert type long string | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | const char *SSL_alert_type_string_long(int value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const char *str; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch (value >> 8) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         case SSL3_AL_WARNING: | 
					
						
							|  |  |  |             str = "warning"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL3_AL_FATAL: | 
					
						
							|  |  |  |             str = "fatal"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             str = "unknown"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return str; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the state string where SSL is reading | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | const char *SSL_rstate_string(SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const char *str; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT2(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     switch (ssl->rlayer.rstate) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         case SSL_ST_READ_HEADER: | 
					
						
							|  |  |  |             str = "RH"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL_ST_READ_BODY: | 
					
						
							|  |  |  |             str = "RB"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL_ST_READ_DONE: | 
					
						
							|  |  |  |             str = "RD"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             str = "unknown"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return str; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the statement long string where SSL is reading | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | const char *SSL_rstate_string_long(SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const char *str = "unknown"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT2(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     switch (ssl->rlayer.rstate) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         case SSL_ST_READ_HEADER: | 
					
						
							|  |  |  |             str = "read header"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL_ST_READ_BODY: | 
					
						
							|  |  |  |             str = "read body"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case SSL_ST_READ_DONE: | 
					
						
							|  |  |  |             str = "read done"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return str; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get SSL statement string | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-04-09 12:58:35 +02:00
										 |  |  | const char *SSL_state_string(const SSL *ssl) | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-04-09 12:58:35 +02:00
										 |  |  |     const char *str = "UNKWN "; | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT2(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-21 09:23:29 +08:00
										 |  |  |     if (ossl_statem_in_error(ssl)) | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |         str = "SSLERR"; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         switch (SSL_get_state(ssl)) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             case TLS_ST_BEFORE: | 
					
						
							|  |  |  |                 str = "PINIT "; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_OK: | 
					
						
							|  |  |  |                 str =  "SSLOK "; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CW_CLNT_HELLO: | 
					
						
							|  |  |  |                 str = "TWCH"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CR_SRVR_HELLO: | 
					
						
							|  |  |  |                 str = "TRSH"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CR_CERT: | 
					
						
							|  |  |  |                 str = "TRSC"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CR_KEY_EXCH: | 
					
						
							|  |  |  |                 str = "TRSKE"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CR_CERT_REQ: | 
					
						
							|  |  |  |                 str = "TRCR"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CR_SRVR_DONE: | 
					
						
							|  |  |  |                 str = "TRSD"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CW_CERT: | 
					
						
							|  |  |  |                 str = "TWCC"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CW_KEY_EXCH: | 
					
						
							|  |  |  |                 str = "TWCKE"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CW_CERT_VRFY: | 
					
						
							|  |  |  |                 str = "TWCV"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SW_CHANGE: | 
					
						
							|  |  |  |             case TLS_ST_CW_CHANGE: | 
					
						
							|  |  |  |                 str = "TWCCS"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SW_FINISHED: | 
					
						
							|  |  |  |             case TLS_ST_CW_FINISHED: | 
					
						
							|  |  |  |                 str = "TWFIN"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SR_CHANGE: | 
					
						
							|  |  |  |             case TLS_ST_CR_CHANGE: | 
					
						
							|  |  |  |                 str = "TRCCS"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SR_FINISHED: | 
					
						
							|  |  |  |             case TLS_ST_CR_FINISHED: | 
					
						
							|  |  |  |                 str = "TRFIN"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SW_HELLO_REQ: | 
					
						
							|  |  |  |                 str = "TWHR"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SR_CLNT_HELLO: | 
					
						
							|  |  |  |                 str = "TRCH"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SW_SRVR_HELLO: | 
					
						
							|  |  |  |                 str = "TWSH"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SW_CERT: | 
					
						
							|  |  |  |                 str = "TWSC"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SW_KEY_EXCH: | 
					
						
							|  |  |  |                 str = "TWSKE"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SW_CERT_REQ: | 
					
						
							|  |  |  |                 str = "TWCR"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SW_SRVR_DONE: | 
					
						
							|  |  |  |                 str = "TWSD"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SR_CERT: | 
					
						
							|  |  |  |                 str = "TRCC"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SR_KEY_EXCH: | 
					
						
							|  |  |  |                 str = "TRCKE"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SR_CERT_VRFY: | 
					
						
							|  |  |  |                 str = "TRCV"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case DTLS_ST_CR_HELLO_VERIFY_REQUEST: | 
					
						
							|  |  |  |                 str = "DRCHV"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case DTLS_ST_SW_HELLO_VERIFY_REQUEST: | 
					
						
							|  |  |  |                 str = "DWCHV"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             default: | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return str; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get SSL statement long string | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-04-09 12:58:35 +02:00
										 |  |  | const char *SSL_state_string_long(const SSL *ssl) | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-04-09 12:58:35 +02:00
										 |  |  |     const char *str = "UNKWN "; | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT2(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (ossl_statem_in_error(ssl)) | 
					
						
							|  |  |  |         str = "SSLERR"; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         switch (SSL_get_state(ssl)) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             case TLS_ST_BEFORE: | 
					
						
							|  |  |  |                 str = "before SSL initialization"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_OK: | 
					
						
							|  |  |  |                 str = "SSL negotiation finished successfully"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CW_CLNT_HELLO: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS write client hello"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CR_SRVR_HELLO: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS read server hello"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CR_CERT: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS read server certificate"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CR_KEY_EXCH: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS read server key exchange"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CR_CERT_REQ: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS read server certificate request"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CR_SESSION_TICKET: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS read server session ticket"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CR_SRVR_DONE: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS read server done"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CW_CERT: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS write client certificate"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CW_KEY_EXCH: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS write client key exchange"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CW_CERT_VRFY: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS write certificate verify"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CW_CHANGE: | 
					
						
							|  |  |  |             case TLS_ST_SW_CHANGE: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS write change cipher spec"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CW_FINISHED: | 
					
						
							|  |  |  |             case TLS_ST_SW_FINISHED: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS write finished"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CR_CHANGE: | 
					
						
							|  |  |  |             case TLS_ST_SR_CHANGE: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS read change cipher spec"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_CR_FINISHED: | 
					
						
							|  |  |  |             case TLS_ST_SR_FINISHED: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS read finished"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SR_CLNT_HELLO: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS read client hello"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SW_HELLO_REQ: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS write hello request"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SW_SRVR_HELLO: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS write server hello"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SW_CERT: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS write certificate"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SW_KEY_EXCH: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS write key exchange"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SW_CERT_REQ: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS write certificate request"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SW_SESSION_TICKET: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS write session ticket"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SW_SRVR_DONE: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS write server done"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SR_CERT: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS read client certificate"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SR_KEY_EXCH: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS read client key exchange"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case TLS_ST_SR_CERT_VRFY: | 
					
						
							|  |  |  |                 str = "SSLv3/TLS read certificate verify"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case DTLS_ST_CR_HELLO_VERIFY_REQUEST: | 
					
						
							|  |  |  |                 str = "DTLS1 read hello verify request"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             case DTLS_ST_SW_HELLO_VERIFY_REQUEST: | 
					
						
							|  |  |  |                 str = "DTLS1 write hello verify request"; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |             default: | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return str; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief set the SSL context read buffer length | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | void SSL_CTX_set_default_read_buffer_len(SSL_CTX *ctx, size_t len) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT3(ctx); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     ctx->read_buffer_len = len; | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief set the SSL read buffer length | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | void SSL_set_default_read_buffer_len(SSL *ssl, size_t len) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT3(ssl); | 
					
						
							|  |  |  |     SSL_ASSERT3(len); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  |     SSL_METHOD_CALL(set_bufflen, ssl, len); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief set the SSL information callback function | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | void SSL_set_info_callback(SSL *ssl, void (*cb) (const SSL *ssl, int type, int val)) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT3(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ssl->info_callback = cb; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief add SSL context reference count by '1' | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_CTX_up_ref(SSL_CTX *ctx) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ctx); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  |     /**
 | 
					
						
							|  |  |  |      * no support multi-thread SSL here | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |     ctx->references++; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief set the SSL security level | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | void SSL_set_security_level(SSL *ssl, int level) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT3(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ssl->cert->sec_level = level; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the SSL security level | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_get_security_level(const SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ssl->cert->sec_level; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the SSL verifying mode of the SSL context | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_CTX_get_verify_mode(const SSL_CTX *ctx) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ctx); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ctx->verify_mode; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief set the session timeout time | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | long SSL_CTX_set_timeout(SSL_CTX *ctx, long t) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     long l; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ctx); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     l = ctx->session_timeout; | 
					
						
							|  |  |  |     ctx->session_timeout = t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return l; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the session timeout time | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | long SSL_CTX_get_timeout(const SSL_CTX *ctx) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ctx); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ctx->session_timeout; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief set the SSL if we can read as many as data | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | void SSL_set_read_ahead(SSL *ssl, int yes) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT3(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ssl->rlayer.read_ahead = yes; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief set the SSL context if we can read as many as data | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | void SSL_CTX_set_read_ahead(SSL_CTX *ctx, int yes) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT3(ctx); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ctx->read_ahead = yes; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the SSL ahead signal if we can read as many as data | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_get_read_ahead(const SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ssl->rlayer.read_ahead; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the SSL context ahead signal if we can read as many as data | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | long SSL_CTX_get_read_ahead(SSL_CTX *ctx) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ctx); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ctx->read_ahead; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief check if the SSL context can read as many as data | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | long SSL_CTX_get_default_read_ahead(SSL_CTX *ctx) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ctx); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ctx->read_ahead; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief set SSL session time | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | long SSL_set_time(SSL *ssl, long t) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 18:13:10 +08:00
										 |  |  |     ssl->session->time = t; | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return t; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief set SSL session timeout time | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | long SSL_set_timeout(SSL *ssl, long t) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 18:13:10 +08:00
										 |  |  |     ssl->session->timeout = t; | 
					
						
							| 
									
										
										
										
											2016-09-20 16:58:46 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return t; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-09-22 10:28:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the verifying result of the SSL certification | 
					
						
							| 
									
										
										
										
											2016-09-22 15:15:16 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | long SSL_get_verify_result(const SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-22 15:15:16 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return SSL_METHOD_CALL(get_verify_result, ssl); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-09-22 15:30:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the SSL verifying depth of the SSL context | 
					
						
							| 
									
										
										
										
											2016-09-22 15:30:25 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_CTX_get_verify_depth(const SSL_CTX *ctx) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ctx); | 
					
						
							| 
									
										
										
										
											2016-09-22 15:30:25 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ctx->param.depth; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief set the SSL verify depth of the SSL context | 
					
						
							| 
									
										
										
										
											2016-09-22 15:30:25 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT3(ctx); | 
					
						
							| 
									
										
										
										
											2016-09-22 15:30:25 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ctx->param.depth = depth; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief get the SSL verifying depth of the SSL | 
					
						
							| 
									
										
										
										
											2016-09-22 15:30:25 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | int SSL_get_verify_depth(const SSL *ssl) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT1(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-22 15:30:25 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ssl->param.depth; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief set the SSL verify depth of the SSL | 
					
						
							| 
									
										
										
										
											2016-09-22 15:30:25 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | void SSL_set_verify_depth(SSL *ssl, int depth) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT3(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-22 15:30:25 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ssl->param.depth = depth; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-09-23 11:41:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief set the SSL context verifying of the SSL context | 
					
						
							| 
									
										
										
										
											2016-09-23 11:41:57 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, int (*verify_callback)(int, X509_STORE_CTX *)) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT3(ctx); | 
					
						
							| 
									
										
										
										
											2016-09-23 11:41:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ctx->verify_mode = mode; | 
					
						
							|  |  |  |     ctx->default_verify_callback = verify_callback; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-23 14:50:27 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @brief set the SSL verifying of the SSL context | 
					
						
							| 
									
										
										
										
											2016-09-23 11:41:57 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | void SSL_set_verify(SSL *ssl, int mode, int (*verify_callback)(int, X509_STORE_CTX *)) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-10 20:49:24 +08:00
										 |  |  |     SSL_ASSERT3(ssl); | 
					
						
							| 
									
										
										
										
											2016-09-23 11:41:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ssl->verify_mode = mode; | 
					
						
							|  |  |  |     ssl->verify_callback = verify_callback; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-09-26 14:13:37 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * @brief set the ALPN protocols in the preferred order. SSL APIs require the | 
					
						
							|  |  |  |  * protocols in a <length><value><length2><value2> format. mbedtls doesn't need | 
					
						
							|  |  |  |  * that though. We sanitize that here itself. So convert from: | 
					
						
							|  |  |  |  * "\x02h2\x06spdy/1" to { {"h2"}, {"spdy/1}, {NULL}} | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | int SSL_CTX_set_alpn_protos(SSL_CTX *ctx, const unsigned char *protos, unsigned protos_len) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |      ctx->ssl_alpn.alpn_string = ssl_mem_zalloc(protos_len + 1); | 
					
						
							|  |  |  |      if (! ctx->ssl_alpn.alpn_string) { | 
					
						
							|  |  |  | 	  return 1; | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  |      ctx->ssl_alpn.alpn_status = ALPN_ENABLE; | 
					
						
							|  |  |  |      memcpy(ctx->ssl_alpn.alpn_string, protos, protos_len); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      char *ptr = ctx->ssl_alpn.alpn_string; | 
					
						
							|  |  |  |      int i; | 
					
						
							|  |  |  |      /* Only running to 1 less than the actual size */ | 
					
						
							|  |  |  |      for (i = 0; i < ALPN_LIST_MAX - 1; i++) { | 
					
						
							|  |  |  | 	  char len = *ptr; | 
					
						
							|  |  |  | 	  *ptr = '\0'; // Overwrite the length to act as previous element's string terminator
 | 
					
						
							|  |  |  | 	  ptr++; | 
					
						
							|  |  |  | 	  protos_len--; | 
					
						
							|  |  |  | 	  ctx->ssl_alpn.alpn_list[i] = ptr; | 
					
						
							|  |  |  | 	  ptr += len; | 
					
						
							|  |  |  | 	  protos_len -= len; | 
					
						
							|  |  |  | 	  if (! protos_len) { | 
					
						
							|  |  |  | 	       i++; | 
					
						
							|  |  |  | 	       break; | 
					
						
							|  |  |  | 	  } | 
					
						
							|  |  |  |      } | 
					
						
							|  |  |  |      ctx->ssl_alpn.alpn_list[i] = NULL; | 
					
						
							|  |  |  |      return 0; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-10-02 14:00:13 +05:30
										 |  |  | 
 |