Annotation of embedaddon/axTLS/ssl/openssl.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (c) 2007, Cameron Rich
                      3:  * 
                      4:  * All rights reserved.
                      5:  * 
                      6:  * Redistribution and use in source and binary forms, with or without 
                      7:  * modification, are permitted provided that the following conditions are met:
                      8:  *
                      9:  * * Redistributions of source code must retain the above copyright notice, 
                     10:  *   this list of conditions and the following disclaimer.
                     11:  * * Redistributions in binary form must reproduce the above copyright notice, 
                     12:  *   this list of conditions and the following disclaimer in the documentation 
                     13:  *   and/or other materials provided with the distribution.
                     14:  * * Neither the name of the axTLS project nor the names of its contributors 
                     15:  *   may be used to endorse or promote products derived from this software 
                     16:  *   without specific prior written permission.
                     17:  *
                     18:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
                     19:  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
                     20:  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
                     21:  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
                     22:  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
                     23:  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
                     24:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
                     25:  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
                     26:  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
                     27:  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
                     28:  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     29:  */
                     30: 
                     31: /*
                     32:  * Enable a subset of openssl compatible functions. We don't aim to be 100%
                     33:  * compatible - just to be able to do basic ports etc.
                     34:  *
                     35:  * Only really tested on mini_httpd, so I'm not too sure how extensive this
                     36:  * port is.
                     37:  */
                     38: 
                     39: #include "config.h"
                     40: 
                     41: #ifdef CONFIG_OPENSSL_COMPATIBLE
                     42: #include <stdlib.h>
                     43: #include <string.h>
                     44: #include <stdarg.h>
                     45: #include "os_port.h"
                     46: #include "ssl.h"
                     47: 
                     48: #define OPENSSL_CTX_ATTR  ((OPENSSL_CTX *)ssl_ctx->bonus_attr)
                     49: 
                     50: static char *key_password = NULL;
                     51: 
                     52: void *SSLv23_server_method(void) { return NULL; }
                     53: void *SSLv3_server_method(void) { return NULL; }
                     54: void *TLSv1_server_method(void) { return NULL; }
                     55: void *SSLv23_client_method(void) { return NULL; }
                     56: void *SSLv3_client_method(void) { return NULL; }
                     57: void *TLSv1_client_method(void) { return NULL; }
                     58: 
                     59: typedef void * (*ssl_func_type_t)(void);
                     60: typedef void * (*bio_func_type_t)(void);
                     61: 
                     62: typedef struct
                     63: {
                     64:     ssl_func_type_t ssl_func_type;
                     65: } OPENSSL_CTX;
                     66: 
                     67: SSL_CTX * SSL_CTX_new(ssl_func_type_t meth)
                     68: {
                     69:     SSL_CTX *ssl_ctx = ssl_ctx_new(0, 5);
                     70:     ssl_ctx->bonus_attr = malloc(sizeof(OPENSSL_CTX));
                     71:     OPENSSL_CTX_ATTR->ssl_func_type = meth;
                     72:     return ssl_ctx;
                     73: }
                     74: 
                     75: void SSL_CTX_free(SSL_CTX * ssl_ctx)
                     76: {
                     77:     free(ssl_ctx->bonus_attr);
                     78:     ssl_ctx_free(ssl_ctx);
                     79: }
                     80: 
                     81: SSL * SSL_new(SSL_CTX *ssl_ctx)
                     82: {
                     83:     SSL *ssl;
                     84:     ssl_func_type_t ssl_func_type;
                     85: 
                     86:     ssl = ssl_new(ssl_ctx, -1);        /* fd is set later */
                     87:     ssl_func_type = OPENSSL_CTX_ATTR->ssl_func_type;
                     88: 
                     89: #ifdef CONFIG_SSL_ENABLE_CLIENT
                     90:     if (ssl_func_type == SSLv23_client_method ||
                     91:         ssl_func_type == SSLv3_client_method ||
                     92:         ssl_func_type == TLSv1_client_method)
                     93:     {
                     94:         SET_SSL_FLAG(SSL_IS_CLIENT);
                     95:     }
                     96:     else
                     97: #endif
                     98:     {
                     99:         ssl->next_state = HS_CLIENT_HELLO;
                    100:     }
                    101: 
                    102:     return ssl;
                    103: }
                    104: 
                    105: int SSL_set_fd(SSL *s, int fd)
                    106: {
                    107:     s->client_fd = fd;
                    108:     return 1;   /* always succeeds */
                    109: }
                    110: 
                    111: int SSL_accept(SSL *ssl)
                    112: {
                    113:     while (ssl_read(ssl, NULL) == SSL_OK)
                    114:     {
                    115:         if (ssl->next_state == HS_CLIENT_HELLO)
                    116:             return 1;   /* we're done */
                    117:     }
                    118: 
                    119:     return -1;
                    120: }
                    121: 
                    122: #ifdef CONFIG_SSL_ENABLE_CLIENT
                    123: int SSL_connect(SSL *ssl)
                    124: {
                    125:     return do_client_connect(ssl) == SSL_OK ? 1 : -1;
                    126: }
                    127: #endif
                    128: 
                    129: void SSL_free(SSL *ssl)
                    130: {
                    131:     ssl_free(ssl);
                    132: }
                    133: 
                    134: int SSL_read(SSL *ssl, void *buf, int num)
                    135: {
                    136:     uint8_t *read_buf;
                    137:     int ret;
                    138: 
                    139:     while ((ret = ssl_read(ssl, &read_buf)) == SSL_OK);
                    140: 
                    141:     if (ret > SSL_OK)
                    142:     {
                    143:         memcpy(buf, read_buf, ret > num ? num : ret);
                    144:     }
                    145: 
                    146:     return ret;
                    147: }
                    148: 
                    149: int SSL_write(SSL *ssl, const void *buf, int num)
                    150: {
                    151:     return ssl_write(ssl, buf, num);
                    152: }
                    153: 
                    154: int SSL_CTX_use_certificate_file(SSL_CTX *ssl_ctx, const char *file, int type)
                    155: {
                    156:     return (ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CERT, file, NULL) == SSL_OK);
                    157: }
                    158: 
                    159: int SSL_CTX_use_PrivateKey_file(SSL_CTX *ssl_ctx, const char *file, int type)
                    160: {
                    161:     return (ssl_obj_load(ssl_ctx, SSL_OBJ_RSA_KEY, file, key_password) == SSL_OK);
                    162: }
                    163: 
                    164: int SSL_CTX_use_certificate_ASN1(SSL_CTX *ssl_ctx, int len, const uint8_t *d)
                    165: {
                    166:     return (ssl_obj_memory_load(ssl_ctx, 
                    167:                         SSL_OBJ_X509_CERT, d, len, NULL) == SSL_OK);
                    168: }
                    169: 
                    170: int SSL_CTX_set_session_id_context(SSL_CTX *ctx, const unsigned char *sid_ctx,
                    171:                                             unsigned int sid_ctx_len)
                    172: {
                    173:     return 1;
                    174: }
                    175: 
                    176: int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx)
                    177: {
                    178:     return 1;
                    179: }
                    180: 
                    181: int SSL_CTX_use_certificate_chain_file(SSL_CTX *ssl_ctx, const char *file)
                    182: {
                    183:     return (ssl_obj_load(ssl_ctx, 
                    184:                         SSL_OBJ_X509_CERT, file, NULL) == SSL_OK);
                    185: }
                    186: 
                    187: int SSL_shutdown(SSL *ssl)
                    188: {
                    189:     return 1;
                    190: }
                    191: 
                    192: /*** get/set session ***/
                    193: SSL_SESSION *SSL_get1_session(SSL *ssl)
                    194: {
                    195:     return (SSL_SESSION *)ssl_get_session_id(ssl); /* note: wrong cast */
                    196: }
                    197: 
                    198: int SSL_set_session(SSL *ssl, SSL_SESSION *session)
                    199: {
                    200:     memcpy(ssl->session_id, (uint8_t *)session, SSL_SESSION_ID_SIZE);
                    201:     return 1;
                    202: }
                    203: 
                    204: void SSL_SESSION_free(SSL_SESSION *session) { }
                    205: /*** end get/set session ***/
                    206: 
                    207: long SSL_CTX_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg)
                    208: {
                    209:     return 0;
                    210: }
                    211: 
                    212: void SSL_CTX_set_verify(SSL_CTX *ctx, int mode,
                    213:                                  int (*verify_callback)(int, void *)) { }
                    214: 
                    215: void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth) { }
                    216: 
                    217: int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,
                    218:                                            const char *CApath)
                    219: {
                    220:     return 1;
                    221: }
                    222: 
                    223: void *SSL_load_client_CA_file(const char *file)
                    224: {
                    225:     return (void *)file;
                    226: }
                    227: 
                    228: void SSL_CTX_set_client_CA_list(SSL_CTX *ssl_ctx, void *file) 
                    229: { 
                    230: 
                    231:     ssl_obj_load(ssl_ctx, SSL_OBJ_X509_CERT, (const char *)file, NULL);
                    232: }
                    233: 
                    234: void SSLv23_method(void) { }
                    235: 
                    236: void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, void *cb) { }
                    237: 
                    238: void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u) 
                    239: { 
                    240:     key_password = (char *)u;
                    241: }
                    242: 
                    243: int SSL_peek(SSL *ssl, void *buf, int num)
                    244: {
                    245:     memcpy(buf, ssl->bm_data, num);
                    246:     return num;
                    247: }
                    248: 
                    249: void SSL_set_bio(SSL *ssl, void *rbio, void *wbio) { }
                    250: 
                    251: long SSL_get_verify_result(const SSL *ssl)
                    252: {
                    253:     return ssl_handshake_status(ssl);
                    254: }
                    255: 
                    256: int SSL_state(SSL *ssl)
                    257: {
                    258:     return 0x03; // ok state
                    259: }
                    260: 
                    261: /** end of could do better list */
                    262: 
                    263: void *SSL_get_peer_certificate(const SSL *ssl)
                    264: {
                    265:     return &ssl->ssl_ctx->certs[0];
                    266: }
                    267: 
                    268: int SSL_clear(SSL *ssl)
                    269: {
                    270:     return 1;
                    271: }
                    272: 
                    273: 
                    274: int SSL_CTX_check_private_key(const SSL_CTX *ctx)
                    275: {
                    276:     return 1;
                    277: }
                    278: 
                    279: int SSL_CTX_set_cipher_list(SSL *s, const char *str)
                    280: {
                    281:     return 1;
                    282: }
                    283: 
                    284: int SSL_get_error(const SSL *ssl, int ret)
                    285: {
                    286:     ssl_display_error(ret);
                    287:     return 0;   /* TODO: return proper return code */
                    288: }
                    289: 
                    290: void SSL_CTX_set_options(SSL_CTX *ssl_ctx, int option) {}
                    291: int SSL_library_init(void ) { return 1; }
                    292: void SSL_load_error_strings(void ) {}
                    293: void ERR_print_errors_fp(FILE *fp) {}
                    294: 
                    295: #ifndef CONFIG_SSL_SKELETON_MODE
                    296: long SSL_CTX_get_timeout(const SSL_CTX *ssl_ctx) { 
                    297:                             return CONFIG_SSL_EXPIRY_TIME*3600; }
                    298: long SSL_CTX_set_timeout(SSL_CTX *ssl_ctx, long t) { 
                    299:                             return SSL_CTX_get_timeout(ssl_ctx); }
                    300: #endif
                    301: void BIO_printf(FILE *f, const char *format, ...)
                    302: {
                    303:     va_list(ap);
                    304:     va_start(ap, format);
                    305:     vfprintf(f, format, ap);
                    306:     va_end(ap);
                    307: }
                    308: 
                    309: void* BIO_s_null(void) { return NULL; }
                    310: FILE *BIO_new(bio_func_type_t func)
                    311: {
                    312:     if (func == BIO_s_null)
                    313:         return fopen("/dev/null", "r");
                    314:     else
                    315:         return NULL;
                    316: }
                    317: 
                    318: FILE *BIO_new_fp(FILE *stream, int close_flag) { return stream; }
                    319: int BIO_free(FILE *a) { if (a != stdout && a != stderr) fclose(a); return 1; }
                    320: 
                    321: 
                    322: 
                    323: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>