Annotation of embedaddon/axTLS/ssl/openssl.c, revision 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>