Changeset 5390

Show
Ignore:
Timestamp:
03/14/08 16:26:34 (4 months ago)
Author:
morris
Message:

Refactor the SSL part of sockets

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • libwired/trunk/libwired/net/wi-socket.c

    r5386 r5390  
    5757#include <wired/wi-assert.h> 
    5858#include <wired/wi-address.h> 
     59#include <wired/wi-crypto.h> 
    5960#include <wired/wi-date.h> 
    6061#include <wired/wi-macros.h> 
     
    6970 
    7071 
    71 struct _wi_socket_context
     72struct _wi_socket_tls
    7273        wi_runtime_base_t                                       base; 
    7374         
     
    7576        SSL_CTX                                                         *ssl_ctx; 
    7677        DH                                                                      *dh; 
    77          
    78         RSA                                                                     *pub_rsa; 
    79         RSA                                                                     *priv_rsa; 
    80          
    81         wi_boolean_t                                            certificate; 
     78        wi_boolean_t                                            private_key; 
    8279#endif 
    8380}; 
     
    111108#endif 
    112109 
    113 static void                                                             _wi_socket_context_dealloc(wi_runtime_instance_t *); 
     110static void                                                             _wi_socket_tls_dealloc(wi_runtime_instance_t *); 
    114111 
    115112static void                                                             _wi_socket_dealloc(wi_runtime_instance_t *); 
     
    124121#endif 
    125122 
    126 static wi_runtime_id_t                                  _wi_socket_context_runtime_id = WI_RUNTIME_ID_NULL; 
    127 static wi_runtime_class_t                               _wi_socket_context_runtime_class = { 
    128         "wi_socket_context_t", 
    129         _wi_socket_context_dealloc, 
     123static wi_runtime_id_t                                  _wi_socket_tls_runtime_id = WI_RUNTIME_ID_NULL; 
     124static wi_runtime_class_t                               _wi_socket_tls_runtime_class = { 
     125        "wi_socket_tls_t", 
     126        _wi_socket_tls_dealloc, 
    130127        NULL, 
    131128        NULL, 
     
    147144 
    148145void wi_socket_register(void) { 
    149         _wi_socket_context_runtime_id = wi_runtime_register_class(&_wi_socket_context_runtime_class); 
     146        _wi_socket_tls_runtime_id = wi_runtime_register_class(&_wi_socket_tls_runtime_class); 
    150147        _wi_socket_runtime_id = wi_runtime_register_class(&_wi_socket_runtime_class); 
    151148} 
     
    217214#pragma mark - 
    218215 
    219 wi_runtime_id_t wi_socket_context_runtime_id(void) { 
    220         return _wi_socket_context_runtime_id; 
     216wi_runtime_id_t wi_socket_tls_runtime_id(void) { 
     217        return _wi_socket_tls_runtime_id; 
    221218} 
    222219 
     
    225222#pragma mark - 
    226223 
    227 wi_socket_context_t * wi_socket_context_alloc(void) { 
    228         return wi_runtime_create_instance(_wi_socket_context_runtime_id, sizeof(wi_socket_context_t)); 
    229 } 
    230  
    231  
    232  
    233 wi_socket_context_t * wi_socket_context_init(wi_socket_context_t *context) { 
    234         return context
    235 } 
    236  
    237  
    238  
    239 static void _wi_socket_context_dealloc(wi_runtime_instance_t *instance) { 
    240 #ifdef WI_SSL 
    241         wi_socket_context_t            *context = instance; 
    242          
    243         if(context->ssl_ctx) 
    244                 SSL_CTX_free(context->ssl_ctx); 
    245          
    246         if(context->dh) 
    247                 DH_free(context->dh); 
     224wi_socket_tls_t * wi_socket_tls_alloc(void) { 
     225        return wi_runtime_create_instance(_wi_socket_tls_runtime_id, sizeof(wi_socket_tls_t)); 
     226} 
     227 
     228 
     229 
     230wi_socket_tls_t * wi_socket_tls_init(wi_socket_tls_t *tls) { 
     231        return tls
     232} 
     233 
     234 
     235 
     236static void _wi_socket_tls_dealloc(wi_runtime_instance_t *instance) { 
     237#ifdef WI_SSL 
     238        wi_socket_tls_t                *tls = instance; 
     239         
     240        if(tls->ssl_ctx) 
     241                SSL_CTX_free(tls->ssl_ctx); 
     242         
     243        if(tls->dh) 
     244                DH_free(tls->dh); 
    248245#endif 
    249246} 
     
    253250#pragma mark - 
    254251 
    255 wi_boolean_t wi_socket_context_set_ssl_type(wi_socket_context_t *context, wi_socket_ssl_type_t type) { 
     252wi_boolean_t wi_socket_tls_set_type(wi_socket_tls_t *tls, wi_socket_tls_type_t type) { 
    256253#ifdef WI_SSL 
    257254        SSL_METHOD              *method = NULL; 
    258255         
    259256        switch(type) { 
    260                 case WI_SOCKET_SSL_CLIENT: 
     257                case WI_SOCKET_TLS_CLIENT: 
    261258                        method = TLSv1_client_method(); 
    262259                        break; 
    263260 
    264                 case WI_SOCKET_SSL_SERVER: 
     261                case WI_SOCKET_TLS_SERVER: 
    265262                        method = TLSv1_server_method(); 
    266263                        break; 
    267264        } 
    268265         
    269         context->ssl_ctx = SSL_CTX_new(method); 
    270          
    271         if(!context->ssl_ctx) { 
     266        tls->ssl_ctx = SSL_CTX_new(method); 
     267         
     268        if(!tls->ssl_ctx) { 
    272269                wi_error_set_openssl_error(); 
    273270                 
     
    275272        } 
    276273         
    277         SSL_CTX_set_mode(context->ssl_ctx, SSL_MODE_AUTO_RETRY); 
    278         SSL_CTX_set_quiet_shutdown(context->ssl_ctx, 1); 
     274        SSL_CTX_set_mode(tls->ssl_ctx, SSL_MODE_AUTO_RETRY); 
     275        SSL_CTX_set_quiet_shutdown(tls->ssl_ctx, 1); 
    279276         
    280277        return true; 
     
    288285 
    289286 
    290 wi_boolean_t wi_socket_context_set_ssl_certificate(wi_socket_context_t *context, wi_string_t *path) { 
    291 #ifdef WI_SSL 
    292         const char              *certificate; 
    293          
    294         context->certificate = false; 
    295          
    296         certificate = wi_string_cstring(path); 
    297          
    298         if(SSL_CTX_use_certificate_chain_file(context->ssl_ctx, certificate) != 1) { 
     287wi_boolean_t wi_socket_tls_set_certificate(wi_socket_tls_t *tls, wi_x509_t *x509) { 
     288#ifdef WI_SSL 
     289        if(SSL_CTX_use_certificate(tls->ssl_ctx, wi_x509_x509(x509)) != 1) { 
    299290                wi_error_set_openssl_error(); 
    300291 
    301292                return false; 
    302293        } 
    303          
    304         if(SSL_CTX_use_PrivateKey_file(context->ssl_ctx, certificate, SSL_FILETYPE_PEM) != 1) { 
    305                 wi_error_set_openssl_error(); 
    306  
    307                 return false; 
    308         } 
    309          
    310         context->certificate = true; 
    311294         
    312295        return true; 
     
    320303 
    321304 
    322 wi_boolean_t wi_socket_context_set_ssl_privkey(wi_socket_context_t *context, wi_string_t *path) { 
    323 #ifdef WI_SSL 
    324         FILE            *fp; 
    325          
    326         fp = fopen(wi_string_cstring(path), "r"); 
    327          
    328         if(!fp) { 
    329                 wi_error_set_errno(errno); 
    330                  
     305wi_boolean_t wi_socket_tls_set_private_key(wi_socket_tls_t *tls, wi_rsa_t *rsa) { 
     306#ifdef WI_SSL 
     307        tls->private_key = false; 
     308         
     309        if(SSL_CTX_use_RSAPrivateKey(tls->ssl_ctx, wi_rsa_rsa(rsa)) != 1) { 
     310                wi_error_set_openssl_error(); 
     311 
    331312                return false; 
    332313        } 
    333                  
    334         context->priv_rsa = PEM_read_RSAPrivateKey(fp, NULL, 0, NULL); 
    335          
    336         if(!context->priv_rsa) 
    337                 wi_error_set_openssl_error(); 
    338          
    339         fclose(fp); 
    340          
    341         return (context->priv_rsa != NULL); 
    342 #else 
    343         wi_error_set_libwired_error(WI_ERROR_SOCKET_NOSSL); 
    344          
    345         return false; 
    346 #endif 
    347 
    348  
    349  
    350  
    351 void wi_socket_context_set_ssl_pubkey(wi_socket_context_t *context, void *rsa) { 
    352 #ifdef WI_SSL 
    353         if(context->pub_rsa != rsa) { 
    354                 if(context->pub_rsa) 
    355                         RSA_free(context->pub_rsa); 
    356                  
    357                 context->pub_rsa = rsa; 
    358         } 
    359 #endif 
    360 
    361  
    362  
    363  
    364 wi_boolean_t wi_socket_context_set_ssl_ciphers(wi_socket_context_t *context, wi_string_t *ciphers) { 
    365 #ifdef WI_SSL 
    366         if(SSL_CTX_set_cipher_list(context->ssl_ctx, wi_string_cstring(ciphers)) != 1) { 
    367                 wi_error_set_libwired_error(WI_ERROR_SOCKET_NOVALIDCIPHER); 
    368  
    369                 return false; 
    370         } 
     314         
     315        tls->private_key = true; 
    371316         
    372317        return true; 
     
    380325 
    381326 
    382 wi_boolean_t wi_socket_context_set_ssl_dh(wi_socket_context_t *context, const unsigned char *p, size_t p_size, const unsigned char *g, size_t g_size) { 
    383 #ifdef WI_SSL 
    384         context->dh = DH_new(); 
    385          
    386         if(!context->dh) { 
     327wi_boolean_t wi_socket_tls_set_ciphers(wi_socket_tls_t *tls, wi_string_t *ciphers) { 
     328#ifdef WI_SSL 
     329        if(SSL_CTX_set_cipher_list(tls->ssl_ctx, wi_string_cstring(ciphers)) != 1) { 
     330                wi_error_set_libwired_error(WI_ERROR_SOCKET_NOVALIDCIPHER); 
     331 
     332                return false; 
     333        } 
     334         
     335        return true; 
     336#else 
     337        wi_error_set_libwired_error(WI_ERROR_SOCKET_NOSSL); 
     338         
     339        return false; 
     340#endif 
     341
     342 
     343 
     344 
     345wi_boolean_t wi_socket_tls_set_dh(wi_socket_tls_t *tls, const unsigned char *p, size_t p_size, const unsigned char *g, size_t g_size) { 
     346#ifdef WI_SSL 
     347        tls->dh = DH_new(); 
     348         
     349        if(!tls->dh) { 
    387350                wi_error_set_openssl_error(); 
    388351 
     
    390353        } 
    391354 
    392         context->dh->p = BN_bin2bn(p, p_size, NULL); 
    393         context->dh->g = BN_bin2bn(g, g_size, NULL); 
    394  
    395         if(!context->dh->p || !context->dh->g) { 
     355        tls->dh->p = BN_bin2bn(p, p_size, NULL); 
     356        tls->dh->g = BN_bin2bn(g, g_size, NULL); 
     357 
     358        if(!tls->dh->p || !tls->dh->g) { 
    396359                wi_error_set_openssl_error(); 
    397360 
    398                 DH_free(context->dh); 
    399                 context->dh = NULL; 
     361                DH_free(tls->dh); 
     362                tls->dh = NULL; 
    400363                 
    401364                return false; 
     
    989952 
    990953 
    991 wi_boolean_t wi_socket_connect(wi_socket_t *socket, wi_socket_context_t *context, wi_time_interval_t timeout) { 
    992         if(!wi_socket_tcp_connect(socket, timeout)) 
    993                 return false; 
    994          
    995 #if WI_SSL 
    996         if(context) { 
    997                 if(!wi_socket_tls_connect(socket, context, timeout)) 
    998                         return false; 
    999         } 
    1000 #endif 
    1001          
    1002         return true; 
    1003 
    1004  
    1005  
    1006  
    1007 wi_boolean_t wi_socket_tcp_connect(wi_socket_t *socket, wi_time_interval_t timeout) { 
     954wi_boolean_t wi_socket_connect(wi_socket_t *socket, wi_time_interval_t timeout) { 
    1008955        struct sockaddr         *sa; 
    1009956        wi_socket_state_t       state; 
     
    10701017 
    10711018 
    1072 wi_boolean_t wi_socket_tls_connect(wi_socket_t *socket, wi_socket_context_t *context, wi_time_interval_t timeout) { 
     1019wi_boolean_t wi_socket_connect_tls(wi_socket_t *socket, wi_socket_tls_t *tls, wi_time_interval_t timeout) { 
    10731020#ifdef WI_SSL 
    10741021        wi_socket_state_t       state; 
     
    10821029                        wi_socket_set_blocking(socket, false); 
    10831030 
    1084                 socket->ssl = SSL_new(context->ssl_ctx); 
     1031                socket->ssl = SSL_new(tls->ssl_ctx); 
    10851032                 
    10861033                if(!socket->ssl) { 
     
    11351082                        wi_socket_set_blocking(socket, true); 
    11361083        } else { 
    1137                 socket->ssl = SSL_new(context->ssl_ctx); 
     1084                socket->ssl = SSL_new(tls->ssl_ctx); 
    11381085                 
    11391086                if(!socket->ssl) { 
     
    11661113 
    11671114 
    1168 wi_socket_t * wi_socket_accept_multiple(wi_array_t *array, wi_socket_context_t *context, wi_time_interval_t timeout, wi_address_t **address) { 
     1115wi_socket_t * wi_socket_accept_multiple(wi_array_t *array, wi_time_interval_t timeout, wi_address_t **address) { 
    11691116        wi_socket_t             *socket; 
    11701117         
     
    11751122                return NULL; 
    11761123         
    1177         return wi_socket_accept(socket, context, timeout, address); 
    1178 
    1179  
    1180  
    1181  
    1182 wi_socket_t * wi_socket_accept(wi_socket_t *accept_socket, wi_socket_context_t *context, wi_time_interval_t timeout, wi_address_t **address) { 
    1183         wi_socket_t                                     *socket; 
    1184          
    1185         socket = wi_socket_accept_tcp(accept_socket, timeout, address); 
    1186          
    1187         if(!socket) 
    1188                 return NULL; 
    1189          
    1190 #ifdef WI_SSL 
    1191         if(context) { 
    1192                 if(!wi_socket_accept_tls(socket, context, timeout)) 
    1193                         return NULL; 
    1194         } 
    1195 #endif WI_SSL 
    1196          
    1197         return socket; 
    1198 
    1199  
    1200  
    1201  
    1202 wi_socket_t * wi_socket_accept_tcp(wi_socket_t *accept_socket, wi_time_interval_t timeout, wi_address_t **address) { 
     1124        return wi_socket_accept(socket, timeout, address); 
     1125
     1126 
     1127 
     1128 
     1129wi_socket_t * wi_socket_accept(wi_socket_t *accept_socket, wi_time_interval_t timeout, wi_address_t **address) { 
    12031130        wi_socket_t                                     *socket; 
    12041131        struct sockaddr_storage         ss; 
     
    12371164 
    12381165 
    1239 wi_boolean_t wi_socket_accept_tls(wi_socket_t *socket, wi_socket_context_t *context, wi_time_interval_t timeout) { 
     1166wi_boolean_t wi_socket_accept_tls(wi_socket_t *socket, wi_socket_tls_t *tls, wi_time_interval_t timeout) { 
    12401167#ifdef WI_SSL 
    12411168        SSL             *ssl; 
    12421169         
    1243         ssl = SSL_new(context->ssl_ctx); 
     1170        ssl = SSL_new(tls->ssl_ctx); 
    12441171 
    12451172        if(!ssl) { 
     
    12551182        } 
    12561183 
    1257         if(!context->certificate && context->dh) { 
    1258                 if(SSL_set_tmp_dh(ssl, context->dh) != 1) { 
     1184        if(!tls->private_key && tls->dh) { 
     1185                if(SSL_set_tmp_dh(ssl, tls->dh) != 1) { 
    12591186                        wi_error_set_openssl_error(); 
    12601187                         
     
    13171244#pragma mark - 
    13181245 
    1319 wi_integer_t wi_socket_sendto(wi_socket_t *socket, wi_socket_context_t *context, wi_string_t *fmt, ...) { 
     1246wi_integer_t wi_socket_sendto_format(wi_socket_t *socket, wi_string_t *fmt, ...) { 
    13201247        wi_string_t             *string; 
    13211248        int                             bytes; 
     
    13261253        va_end(ap); 
    13271254 
    1328         bytes = wi_socket_sendto_buffer(socket, context, wi_string_cstring(string), wi_string_length(string)); 
     1255        bytes = wi_socket_sendto_buffer(socket, wi_string_cstring(string), wi_string_length(string)); 
    13291256         
    13301257        wi_release(string); 
     
    13351262 
    13361263 
    1337 wi_integer_t wi_socket_sendto_buffer(wi_socket_t *socket, wi_socket_context_t *context, const char *buffer, size_t length) { 
     1264wi_integer_t wi_socket_sendto_buffer(wi_socket_t *socket, const char *buffer, size_t length) { 
    13381265        wi_address_t    *address; 
    13391266        char                    *outbuffer = NULL; 
     
    13411268         
    13421269        address = wi_socket_address(socket); 
    1343  
    1344 #ifdef WI_SSL 
    1345         if(context && context->pub_rsa) { 
    1346                 outbuffer = wi_malloc(RSA_size(context->pub_rsa)); 
    1347                 bytes = RSA_public_encrypt(length, (unsigned char *) buffer, (unsigned char *) outbuffer, 
    1348                         context->pub_rsa, RSA_PKCS1_OAEP_PADDING); 
    1349                  
    1350                 if(bytes < 0) { 
    1351                         wi_error_set_openssl_error(); 
    1352                          
    1353                         goto end; 
    1354                 } 
    1355                  
    1356                 bytes = sendto(socket->sd, outbuffer, bytes, 0, 
    1357                         wi_address_sa(address), wi_address_sa_length(address)); 
    1358         } else { 
    1359 #endif 
    1360                 bytes = sendto(socket->sd, buffer, length, 0, 
    1361                         wi_address_sa(address), wi_address_sa_length(address)); 
    1362 #ifdef WI_SSL 
    1363         } 
    1364 #endif 
     1270        bytes = sendto(socket->sd, buffer, length, 0, 
     1271                wi_address_sa(address), wi_address_sa_length(address)); 
    13651272         
    13661273        if(bytes < 0) { 
     
    13791286 
    13801287 
    1381 wi_integer_t wi_socket_recvfrom_multiple(wi_array_t *array, wi_socket_context_t *context, char *buffer, size_t length, wi_address_t **address) { 
     1288wi_integer_t wi_socket_recvfrom_multiple(wi_array_t *array, char *buffer, size_t length, wi_address_t **address) { 
    13821289        wi_socket_t             *socket; 
    13831290         
     
    13881295                return -1; 
    13891296         
    1390         return wi_socket_recvfrom(socket, context, buffer, length, address); 
    1391 } 
    1392  
    1393  
    1394  
    1395 wi_integer_t wi_socket_recvfrom(wi_socket_t *socket, wi_socket_context_t *context, char *buffer, size_t length, wi_address_t **address) { 
     1297        return wi_socket_recvfrom(socket, buffer, length, address); 
     1298} 
     1299 
     1300 
     1301 
     1302wi_integer_t wi_socket_recvfrom(wi_socket_t *socket, char *buffer, size_t length, wi_address_t **address) { 
    13961303        struct sockaddr_storage         ss; 
    13971304        char                                            *inbuffer = NULL; 
     
    14001307         
    14011308        sslength = sizeof(ss); 
    1402          
    1403 #ifdef WI_SSL 
    1404         if(context && context->priv_rsa) { 
    1405                 inbuffer = wi_malloc(length); 
    1406                 bytes = recvfrom(socket->sd, inbuffer, length, 0, (struct sockaddr *) &ss, &sslength); 
    1407                  
    1408                 if(bytes < 0) { 
    1409                         wi_error_set_errno(errno); 
    1410                          
    1411                         goto end; 
    1412                 } 
    1413                  
    1414                 bytes = RSA_private_decrypt(bytes, (unsigned char *) inbuffer, (unsigned char *) buffer, 
    1415                         context->priv_rsa, RSA_PKCS1_OAEP_PADDING); 
    1416                  
    1417                 if(bytes < 0) { 
    1418                         wi_error_set_openssl_error(); 
    1419  
    1420                         goto end; 
    1421                 } 
    1422         } else { 
    1423 #endif 
    1424                 bytes = recvfrom(socket->sd, buffer, length, 0, (struct sockaddr *) &ss, &sslength); 
    1425  
    1426                 if(bytes < 0) { 
    1427                         wi_error_set_errno(errno); 
    1428                          
    1429                         goto end; 
    1430                 } 
    1431 #ifdef WI_SSL 
    1432         } 
    1433 #endif 
     1309        bytes = recvfrom(socket->sd, buffer, length, 0, (struct sockaddr *) &ss, &sslength); 
     1310 
     1311        if(bytes < 0) { 
     1312                wi_error_set_errno(errno); 
     1313                 
     1314                goto end; 
     1315        } 
    14341316 
    14351317end: 
     
    14461328#pragma mark - 
    14471329 
    1448 wi_integer_t wi_socket_write(wi_socket_t *socket, wi_time_interval_t timeout, wi_string_t *fmt, ...) { 
     1330wi_integer_t wi_socket_write_format(wi_socket_t *socket, wi_time_interval_t timeout, wi_string_t *fmt, ...) { 
    14491331        wi_string_t             *string; 
    14501332        wi_integer_t    bytes; 
  • libwired/trunk/libwired/net/wi-socket.h

    r5384 r5390  
    3939 
    4040 
    41 typedef struct _wi_socket_context               wi_socket_context_t; 
    42  
     41typedef struct _wi_socket_tls                   wi_socket_tls_t; 
    4342typedef struct _wi_socket                               wi_socket_t; 
    4443 
     
    5251 
    5352enum _wi_socket_direction { 
    54         WI_SOCKET_READ                                          = 1 << 0
    55         WI_SOCKET_WRITE                                         = 1 << 1 
     53        WI_SOCKET_READ                                          = (1 << 0)
     54        WI_SOCKET_WRITE                                         = (1 << 1) 
    5655}; 
    5756typedef enum _wi_socket_direction               wi_socket_direction_t; 
    5857 
    5958 
    60 enum _wi_socket_ssl_type { 
    61         WI_SOCKET_SSL_CLIENT, 
    62         WI_SOCKET_SSL_SERVER, 
     59enum _wi_socket_tls_type { 
     60        WI_SOCKET_TLS_CLIENT, 
     61        WI_SOCKET_TLS_SERVER, 
    6362}; 
    64 typedef enum _wi_socket_ssl_type               wi_socket_ssl_type_t; 
     63typedef enum _wi_socket_tls_type               wi_socket_tls_type_t; 
    6564 
    6665 
     
    7372 
    7473 
    75 WI_EXPORT wi_runtime_id_t                               wi_socket_context_runtime_id(void); 
     74WI_EXPORT wi_runtime_id_t                               wi_socket_tls_runtime_id(void); 
    7675 
    77 WI_EXPORT wi_socket_context_t *                        wi_socket_context_alloc(void); 
    78 WI_EXPORT wi_socket_context_t *                        wi_socket_context_init(wi_socket_context_t *); 
     76WI_EXPORT wi_socket_tls_t *                            wi_socket_tls_alloc(void); 
     77WI_EXPORT wi_socket_tls_t *                            wi_socket_tls_init(wi_socket_tls_t *); 
    7978 
    80 WI_EXPORT wi_boolean_t                                  wi_socket_context_set_ssl_type(wi_socket_context_t *, wi_socket_ssl_type_t); 
    81 WI_EXPORT wi_boolean_t                                  wi_socket_context_set_ssl_certificate(wi_socket_context_t *, wi_string_t *); 
    82 WI_EXPORT wi_boolean_t                                  wi_socket_context_set_ssl_privkey(wi_socket_context_t *, wi_string_t *); 
    83 WI_EXPORT void                                                  wi_socket_context_set_ssl_pubkey(wi_socket_context_t *, void *); 
    84 WI_EXPORT wi_boolean_t                                  wi_socket_context_set_ssl_dh(wi_socket_context_t *, const unsigned char *, size_t, const unsigned char *, size_t); 
    85 WI_EXPORT wi_boolean_t                                  wi_socket_context_set_ssl_ciphers(wi_socket_context_t *, wi_string_t *); 
     79WI_EXPORT wi_boolean_t                                  wi_socket_tls_set_type(wi_socket_tls_t *, wi_socket_tls_type_t); 
     80WI_EXPORT wi_boolean_t                                  wi_socket_tls_set_certificate(wi_socket_tls_t *, wi_x509_t *); 
     81WI_EXPORT wi_boolean_t                                  wi_socket_tls_set_private_key(wi_socket_tls_t *, wi_rsa_t *); 
     82WI_EXPORT wi_boolean_t                                  wi_socket_tls_set_dh(wi_socket_tls_t *, const unsigned char *, size_t, const unsigned char *, size_t); 
     83WI_EXPORT wi_boolean_t                                  wi_socket_tls_set_ciphers(wi_socket_tls_t *, wi_string_t *); 
    8684 
    8785 
     
    120118 
    121119WI_EXPORT wi_boolean_t                                  wi_socket_listen(wi_socket_t *, wi_uinteger_t); 
    122 WI_EXPORT wi_boolean_t                                  wi_socket_connect(wi_socket_t *, wi_socket_context_t *, wi_time_interval_t); 
    123 WI_EXPORT wi_boolean_t                                  wi_socket_tcp_connect(wi_socket_t *, wi_time_interval_t); 
    124 WI_EXPORT wi_boolean_t                                  wi_socket_tls_connect(wi_socket_t *, wi_socket_context_t *, wi_time_interval_t); 
    125 WI_EXPORT wi_socket_t *                                 wi_socket_accept_multiple(wi_array_t *, wi_socket_context_t *, wi_time_interval_t, wi_address_t **); 
    126 WI_EXPORT wi_socket_t *                                 wi_socket_accept(wi_socket_t *, wi_socket_context_t *, wi_time_interval_t, wi_address_t **); 
    127 WI_EXPORT wi_socket_t *                                 wi_socket_accept_tcp(wi_socket_t *, wi_time_interval_t, wi_address_t **); 
    128 WI_EXPORT wi_boolean_t                                  wi_socket_accept_tls(wi_socket_t *, wi_socket_context_t *, wi_time_interval_t); 
     120WI_EXPORT wi_boolean_t                                  wi_socket_connect(wi_socket_t *, wi_time_interval_t); 
     121WI_EXPORT wi_boolean_t                                  wi_socket_connect_tls(wi_socket_t *, wi_socket_tls_t *, wi_time_interval_t); 
     122WI_EXPORT wi_socket_t *                                 wi_socket_accept_multiple(wi_array_t *, wi_time_interval_t, wi_address_t **); 
     123WI_EXPORT wi_socket_t *                                 wi_socket_accept(wi_socket_t *, wi_time_interval_t, wi_address_t **); 
     124WI_EXPORT wi_boolean_t                                  wi_socket_accept_tls(wi_socket_t *, wi_socket_tls_t *, wi_time_interval_t); 
    129125WI_EXPORT void                                                  wi_socket_close(wi_socket_t *); 
    130126 
    131 WI_EXPORT wi_integer_t                                  wi_socket_sendto(wi_socket_t *, wi_socket_context_t *, wi_string_t *, ...); 
    132 WI_EXPORT wi_integer_t                                  wi_socket_sendto_buffer(wi_socket_t *, wi_socket_context_t *, const char *, size_t); 
    133 WI_EXPORT wi_integer_t                                  wi_socket_recvfrom_multiple(wi_array_t *, wi_socket_context_t *, char *, size_t, wi_address_t **); 
    134 WI_EXPORT wi_integer_t                                  wi_socket_recvfrom(wi_socket_t *, wi_socket_context_t *, char *, size_t, wi_address_t **); 
     127WI_EXPORT wi_integer_t                                  wi_socket_sendto_format(wi_socket_t *, wi_string_t *, ...); 
     128WI_EXPORT wi_integer_t                                  wi_socket_sendto_buffer(wi_socket_t *, const char *, size_t); 
     129WI_EXPORT wi_integer_t                                  wi_socket_recvfrom_multiple(wi_array_t *, char *, size_t, wi_address_t **); 
     130WI_EXPORT wi_integer_t                                  wi_socket_recvfrom(wi_socket_t *, char *, size_t, wi_address_t **); 
    135131 
    136 WI_EXPORT wi_integer_t                                  wi_socket_write(wi_socket_t *, wi_time_interval_t, wi_string_t *, ...); 
     132WI_EXPORT wi_integer_t                                  wi_socket_write_format(wi_socket_t *, wi_time_interval_t, wi_string_t *, ...); 
    137133WI_EXPORT wi_integer_t                                  wi_socket_write_buffer(wi_socket_t *, wi_time_interval_t, const void *, size_t); 
    138134WI_EXPORT wi_string_t *                                 wi_socket_read(wi_socket_t *, wi_time_interval_t, size_t);