File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / axTLS / ssl / tls1.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Fri Sep 28 11:55:55 2012 UTC (12 years, 6 months ago) by misho
Branches: v1_4_8, MAIN
CVS tags: datecs, HEAD
axTLS

    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:  * Common ssl/tlsv1 code to both the client and server implementations.
   33:  */
   34: 
   35: #include <string.h>
   36: #include <stdlib.h>
   37: #include <stdio.h>
   38: #include <stdarg.h>
   39: #include "os_port.h"
   40: #include "ssl.h"
   41: 
   42: /* The session expiry time */
   43: #define SSL_EXPIRY_TIME     (CONFIG_SSL_EXPIRY_TIME*3600)
   44: 
   45: static const uint8_t g_hello_request[] = { HS_HELLO_REQUEST, 0, 0, 0 };
   46: static const uint8_t g_chg_cipher_spec_pkt[] = { 1 };
   47: static const char * server_finished = "server finished";
   48: static const char * client_finished = "client finished";
   49: 
   50: static int do_handshake(SSL *ssl, uint8_t *buf, int read_len);
   51: static int set_key_block(SSL *ssl, int is_write);
   52: static int verify_digest(SSL *ssl, int mode, const uint8_t *buf, int read_len);
   53: static void *crypt_new(SSL *ssl, uint8_t *key, uint8_t *iv, int is_decrypt);
   54: static int send_raw_packet(SSL *ssl, uint8_t protocol);
   55: 
   56: /**
   57:  * The server will pick the cipher based on the order that the order that the
   58:  * ciphers are listed. This order is defined at compile time.
   59:  */
   60: #ifdef CONFIG_SSL_SKELETON_MODE
   61: const uint8_t ssl_prot_prefs[NUM_PROTOCOLS] = 
   62: { SSL_RC4_128_SHA };
   63: #else
   64: static void session_free(SSL_SESSION *ssl_sessions[], int sess_index);
   65: 
   66: const uint8_t ssl_prot_prefs[NUM_PROTOCOLS] = 
   67: #ifdef CONFIG_SSL_PROT_LOW                  /* low security, fast speed */
   68: { SSL_RC4_128_SHA, SSL_AES128_SHA, SSL_AES256_SHA, SSL_RC4_128_MD5 };
   69: #elif CONFIG_SSL_PROT_MEDIUM                /* medium security, medium speed */
   70: { SSL_AES128_SHA, SSL_AES256_SHA, SSL_RC4_128_SHA, SSL_RC4_128_MD5 };    
   71: #else /* CONFIG_SSL_PROT_HIGH */            /* high security, low speed */
   72: { SSL_AES256_SHA, SSL_AES128_SHA, SSL_RC4_128_SHA, SSL_RC4_128_MD5 };
   73: #endif
   74: #endif /* CONFIG_SSL_SKELETON_MODE */
   75: 
   76: /**
   77:  * The cipher map containing all the essentials for each cipher.
   78:  */
   79: #ifdef CONFIG_SSL_SKELETON_MODE
   80: static const cipher_info_t cipher_info[NUM_PROTOCOLS] = 
   81: {
   82:     {   /* RC4-SHA */
   83:         SSL_RC4_128_SHA,                /* RC4-SHA */
   84:         16,                             /* key size */
   85:         0,                              /* iv size */ 
   86:         2*(SHA1_SIZE+16),               /* key block size */
   87:         0,                              /* no padding */
   88:         SHA1_SIZE,                      /* digest size */
   89:         hmac_sha1,                      /* hmac algorithm */
   90:         (crypt_func)RC4_crypt,          /* encrypt */
   91:         (crypt_func)RC4_crypt           /* decrypt */
   92:     },
   93: };
   94: #else
   95: static const cipher_info_t cipher_info[NUM_PROTOCOLS] = 
   96: {
   97:     {   /* AES128-SHA */
   98:         SSL_AES128_SHA,                 /* AES128-SHA */
   99:         16,                             /* key size */
  100:         16,                             /* iv size */ 
  101:         2*(SHA1_SIZE+16+16),            /* key block size */
  102:         16,                             /* block padding size */
  103:         SHA1_SIZE,                      /* digest size */
  104:         hmac_sha1,                      /* hmac algorithm */
  105:         (crypt_func)AES_cbc_encrypt,    /* encrypt */
  106:         (crypt_func)AES_cbc_decrypt     /* decrypt */
  107:     },
  108:     {   /* AES256-SHA */
  109:         SSL_AES256_SHA,                 /* AES256-SHA */
  110:         32,                             /* key size */
  111:         16,                             /* iv size */ 
  112:         2*(SHA1_SIZE+32+16),            /* key block size */
  113:         16,                             /* block padding size */
  114:         SHA1_SIZE,                      /* digest size */
  115:         hmac_sha1,                      /* hmac algorithm */
  116:         (crypt_func)AES_cbc_encrypt,    /* encrypt */
  117:         (crypt_func)AES_cbc_decrypt     /* decrypt */
  118:     },       
  119:     {   /* RC4-SHA */
  120:         SSL_RC4_128_SHA,                /* RC4-SHA */
  121:         16,                             /* key size */
  122:         0,                              /* iv size */ 
  123:         2*(SHA1_SIZE+16),               /* key block size */
  124:         0,                              /* no padding */
  125:         SHA1_SIZE,                      /* digest size */
  126:         hmac_sha1,                      /* hmac algorithm */
  127:         (crypt_func)RC4_crypt,          /* encrypt */
  128:         (crypt_func)RC4_crypt           /* decrypt */
  129:     },
  130:     /*
  131:      * This protocol is from SSLv2 days and is unlikely to be used - but was
  132:      * useful for testing different possible digest algorithms.
  133:      */
  134:     {   /* RC4-MD5 */
  135:         SSL_RC4_128_MD5,                /* RC4-MD5 */
  136:         16,                             /* key size */
  137:         0,                              /* iv size */ 
  138:         2*(MD5_SIZE+16),                /* key block size */
  139:         0,                              /* no padding */
  140:         MD5_SIZE,                       /* digest size */
  141:         hmac_md5,                       /* hmac algorithm */
  142:         (crypt_func)RC4_crypt,          /* encrypt */
  143:         (crypt_func)RC4_crypt           /* decrypt */
  144:     },
  145: };
  146: #endif
  147: 
  148: static void prf(const uint8_t *sec, int sec_len, uint8_t *seed, int seed_len,
  149:         uint8_t *out, int olen);
  150: static const cipher_info_t *get_cipher_info(uint8_t cipher);
  151: static void increment_read_sequence(SSL *ssl);
  152: static void increment_write_sequence(SSL *ssl);
  153: static void add_hmac_digest(SSL *ssl, int snd, uint8_t *hmac_header,
  154:         const uint8_t *buf, int buf_len, uint8_t *hmac_buf);
  155: 
  156: /* win32 VC6.0 doesn't have variadic macros */
  157: #if defined(WIN32) && !defined(CONFIG_SSL_FULL_MODE)
  158: void DISPLAY_BYTES(SSL *ssl, const char *format, 
  159:         const uint8_t *data, int size, ...) {}
  160: #endif
  161: 
  162: /**
  163:  * Establish a new client/server context.
  164:  */
  165: EXP_FUNC SSL_CTX *STDCALL ssl_ctx_new(uint32_t options, int num_sessions)
  166: {
  167:     SSL_CTX *ssl_ctx = (SSL_CTX *)calloc(1, sizeof (SSL_CTX));
  168:     ssl_ctx->options = options;
  169:     RNG_initialize();
  170: 
  171:     if (load_key_certs(ssl_ctx) < 0)
  172:     {
  173:         free(ssl_ctx);  /* can't load our key/certificate pair, so die */
  174:         return NULL;
  175:     }
  176: 
  177: #ifndef CONFIG_SSL_SKELETON_MODE
  178:     ssl_ctx->num_sessions = num_sessions;
  179: #endif
  180: 
  181:     SSL_CTX_MUTEX_INIT(ssl_ctx->mutex);
  182: 
  183: #ifndef CONFIG_SSL_SKELETON_MODE
  184:     if (num_sessions)
  185:     {
  186:         ssl_ctx->ssl_sessions = (SSL_SESSION **)
  187:                         calloc(1, num_sessions*sizeof(SSL_SESSION *));
  188:     }
  189: #endif
  190: 
  191:     return ssl_ctx;
  192: }
  193: 
  194: /*
  195:  * Remove a client/server context.
  196:  */
  197: EXP_FUNC void STDCALL ssl_ctx_free(SSL_CTX *ssl_ctx)
  198: {
  199:     SSL *ssl;
  200:     int i;
  201: 
  202:     if (ssl_ctx == NULL)
  203:         return;
  204: 
  205:     ssl = ssl_ctx->head;
  206: 
  207:     /* clear out all the ssl entries */
  208:     while (ssl)
  209:     {
  210:         SSL *next = ssl->next;
  211:         ssl_free(ssl);
  212:         ssl = next;
  213:     }
  214: 
  215: #ifndef CONFIG_SSL_SKELETON_MODE
  216:     /* clear out all the sessions */
  217:     for (i = 0; i < ssl_ctx->num_sessions; i++)
  218:         session_free(ssl_ctx->ssl_sessions, i);
  219: 
  220:     free(ssl_ctx->ssl_sessions);
  221: #endif
  222: 
  223:     i = 0;
  224:     while (i < CONFIG_SSL_MAX_CERTS && ssl_ctx->certs[i].buf)
  225:     {
  226:         free(ssl_ctx->certs[i].buf);
  227:         ssl_ctx->certs[i++].buf = NULL;
  228:     }
  229: 
  230: #ifdef CONFIG_SSL_CERT_VERIFICATION
  231:     remove_ca_certs(ssl_ctx->ca_cert_ctx);
  232: #endif
  233:     ssl_ctx->chain_length = 0;
  234:     SSL_CTX_MUTEX_DESTROY(ssl_ctx->mutex);
  235:     RSA_free(ssl_ctx->rsa_ctx);
  236:     RNG_terminate();
  237:     free(ssl_ctx);
  238: }
  239: 
  240: /*
  241:  * Free any used resources used by this connection.
  242:  */
  243: EXP_FUNC void STDCALL ssl_free(SSL *ssl)
  244: {
  245:     SSL_CTX *ssl_ctx;
  246: 
  247:     if (ssl == NULL)        /* just ignore null pointers */
  248:         return;
  249: 
  250:     /* only notify if we weren't notified first */
  251:     /* spec says we must notify when we are dying */
  252:     if (!IS_SET_SSL_FLAG(SSL_SENT_CLOSE_NOTIFY))
  253:       send_alert(ssl, SSL_ALERT_CLOSE_NOTIFY);
  254: 
  255:     ssl_ctx = ssl->ssl_ctx;
  256: 
  257:     SSL_CTX_LOCK(ssl_ctx->mutex);
  258: 
  259:     /* adjust the server SSL list */
  260:     if (ssl->prev)
  261:         ssl->prev->next = ssl->next;
  262:     else
  263:         ssl_ctx->head = ssl->next;
  264: 
  265:     if (ssl->next)
  266:         ssl->next->prev = ssl->prev;
  267:     else
  268:         ssl_ctx->tail = ssl->prev;
  269: 
  270:     SSL_CTX_UNLOCK(ssl_ctx->mutex);
  271: 
  272:     /* may already be free - but be sure */
  273:     free(ssl->encrypt_ctx);
  274:     free(ssl->decrypt_ctx);
  275:     disposable_free(ssl);
  276: #ifdef CONFIG_SSL_CERT_VERIFICATION
  277:     x509_free(ssl->x509_ctx);
  278: #endif
  279: 
  280:     free(ssl);
  281: }
  282: 
  283: /*
  284:  * Read the SSL connection and send any alerts for various errors.
  285:  */
  286: EXP_FUNC int STDCALL ssl_read(SSL *ssl, uint8_t **in_data)
  287: {
  288:     int ret = basic_read(ssl, in_data);
  289: 
  290:     /* check for return code so we can send an alert */
  291:     if (ret < SSL_OK && ret != SSL_CLOSE_NOTIFY)
  292:     {
  293:         if (ret != SSL_ERROR_CONN_LOST)
  294:         {
  295:             send_alert(ssl, ret);
  296: #ifndef CONFIG_SSL_SKELETON_MODE
  297:             /* something nasty happened, so get rid of this session */
  298:             kill_ssl_session(ssl->ssl_ctx->ssl_sessions, ssl);
  299: #endif
  300:         }
  301:     }
  302: 
  303:     return ret;
  304: }
  305: 
  306: /*
  307:  * Write application data to the client
  308:  */
  309: EXP_FUNC int STDCALL ssl_write(SSL *ssl, const uint8_t *out_data, int out_len)
  310: {
  311:     int n = out_len, nw, i, tot = 0;
  312: 
  313:     /* maximum size of a TLS packet is around 16kB, so fragment */
  314:     do 
  315:     {
  316:         nw = n;
  317: 
  318:         if (nw > RT_MAX_PLAIN_LENGTH)    /* fragment if necessary */
  319:             nw = RT_MAX_PLAIN_LENGTH;
  320: 
  321:         if ((i = send_packet(ssl, PT_APP_PROTOCOL_DATA, 
  322:                                             &out_data[tot], nw)) <= 0)
  323:         {
  324:             out_len = i;    /* an error */
  325:             break;
  326:         }
  327: 
  328:         tot += i;
  329:         n -= i;
  330:     } while (n > 0);
  331: 
  332:     return out_len;
  333: }
  334: 
  335: /**
  336:  * Add a certificate to the certificate chain.
  337:  */
  338: int add_cert(SSL_CTX *ssl_ctx, const uint8_t *buf, int len)
  339: {
  340:     int ret = SSL_ERROR_NO_CERT_DEFINED, i = 0;
  341:     SSL_CERT *ssl_cert;
  342:     X509_CTX *cert = NULL;
  343:     int offset;
  344: 
  345:     while (ssl_ctx->certs[i].buf && i < CONFIG_SSL_MAX_CERTS) 
  346:         i++;
  347: 
  348:     if (i == CONFIG_SSL_MAX_CERTS) /* too many certs */
  349:     {
  350: #ifdef CONFIG_SSL_FULL_MODE
  351:         printf("Error: maximum number of certs added (%d) - change of "
  352:                 "compile-time configuration required\n",
  353:                 CONFIG_SSL_MAX_CERTS);
  354: #endif
  355:         goto error;
  356:     }
  357: 
  358:     if ((ret = x509_new(buf, &offset, &cert)))
  359:         goto error;
  360: 
  361: #if defined (CONFIG_SSL_FULL_MODE)
  362:     if (ssl_ctx->options & SSL_DISPLAY_CERTS)
  363:         x509_print(cert, NULL);
  364: #endif
  365: 
  366:     ssl_cert = &ssl_ctx->certs[i];
  367:     ssl_cert->size = len;
  368:     ssl_cert->buf = (uint8_t *)malloc(len);
  369:     memcpy(ssl_cert->buf, buf, len);
  370:     ssl_ctx->chain_length++;
  371:     len -= offset;
  372:     ret = SSL_OK;           /* ok so far */
  373: 
  374:     /* recurse? */
  375:     if (len > 0)
  376:     {
  377:         ret = add_cert(ssl_ctx, &buf[offset], len);
  378:     }
  379: 
  380: error:
  381:     x509_free(cert);        /* don't need anymore */
  382:     return ret;
  383: }
  384: 
  385: #ifdef CONFIG_SSL_CERT_VERIFICATION
  386: /**
  387:  * Add a certificate authority.
  388:  */
  389: int add_cert_auth(SSL_CTX *ssl_ctx, const uint8_t *buf, int len)
  390: {
  391:     int ret = SSL_OK; /* ignore errors for now */
  392:     int i = 0;
  393:     CA_CERT_CTX *ca_cert_ctx;
  394: 
  395:     if (ssl_ctx->ca_cert_ctx == NULL)
  396:         ssl_ctx->ca_cert_ctx = (CA_CERT_CTX *)calloc(1, sizeof(CA_CERT_CTX));
  397: 
  398:     ca_cert_ctx = ssl_ctx->ca_cert_ctx;
  399: 
  400:     while (i < CONFIG_X509_MAX_CA_CERTS && ca_cert_ctx->cert[i]) 
  401:         i++;
  402: 
  403:     while (len > 0)
  404:     {
  405:         int offset;
  406:         if (i >= CONFIG_X509_MAX_CA_CERTS)
  407:         {
  408: #ifdef CONFIG_SSL_FULL_MODE
  409:             printf("Error: maximum number of CA certs added (%d) - change of "
  410:                     "compile-time configuration required\n", 
  411:                     CONFIG_X509_MAX_CA_CERTS);
  412: #endif
  413:             break;
  414:         }
  415: 
  416: 
  417:         /* ignore the return code */
  418:         if (x509_new(buf, &offset, &ca_cert_ctx->cert[i]) == X509_OK)
  419:         {
  420: #if defined (CONFIG_SSL_FULL_MODE)
  421:             if (ssl_ctx->options & SSL_DISPLAY_CERTS)
  422:                 x509_print(ca_cert_ctx->cert[i], NULL);
  423: #endif
  424:         }
  425: 
  426:         i++;
  427:         len -= offset;
  428:     }
  429: 
  430:     return ret;
  431: }
  432: 
  433: /*
  434:  * Retrieve an X.509 distinguished name component
  435:  */
  436: EXP_FUNC const char * STDCALL ssl_get_cert_dn(const SSL *ssl, int component)
  437: {
  438:     if (ssl->x509_ctx == NULL)
  439:         return NULL;
  440: 
  441:     switch (component)
  442:     {
  443:         case SSL_X509_CERT_COMMON_NAME:
  444:             return ssl->x509_ctx->cert_dn[X509_COMMON_NAME];
  445: 
  446:         case SSL_X509_CERT_ORGANIZATION:
  447:             return ssl->x509_ctx->cert_dn[X509_ORGANIZATION];
  448: 
  449:         case SSL_X509_CERT_ORGANIZATIONAL_NAME:       
  450:             return ssl->x509_ctx->cert_dn[X509_ORGANIZATIONAL_UNIT];
  451: 
  452:         case SSL_X509_CA_CERT_COMMON_NAME:
  453:             return ssl->x509_ctx->ca_cert_dn[X509_COMMON_NAME];
  454: 
  455:         case SSL_X509_CA_CERT_ORGANIZATION:
  456:             return ssl->x509_ctx->ca_cert_dn[X509_ORGANIZATION];
  457: 
  458:         case SSL_X509_CA_CERT_ORGANIZATIONAL_NAME:       
  459:             return ssl->x509_ctx->ca_cert_dn[X509_ORGANIZATIONAL_UNIT];
  460: 
  461:         default:
  462:             return NULL;
  463:     }
  464: }
  465: 
  466: /*
  467:  * Retrieve a "Subject Alternative Name" from a v3 certificate
  468:  */
  469: EXP_FUNC const char * STDCALL ssl_get_cert_subject_alt_dnsname(const SSL *ssl,
  470:         int dnsindex)
  471: {
  472:     int i;
  473: 
  474:     if (ssl->x509_ctx == NULL || ssl->x509_ctx->subject_alt_dnsnames == NULL)
  475:         return NULL;
  476: 
  477:     for (i = 0; i < dnsindex; ++i)
  478:     {
  479:         if (ssl->x509_ctx->subject_alt_dnsnames[i] == NULL)
  480:             return NULL;
  481:     }
  482: 
  483:     return ssl->x509_ctx->subject_alt_dnsnames[dnsindex];
  484: }
  485: 
  486: #endif /* CONFIG_SSL_CERT_VERIFICATION */
  487: 
  488: /*
  489:  * Find an ssl object based on the client's file descriptor.
  490:  */
  491: EXP_FUNC SSL * STDCALL ssl_find(SSL_CTX *ssl_ctx, int client_fd)
  492: {
  493:     SSL *ssl;
  494: 
  495:     SSL_CTX_LOCK(ssl_ctx->mutex);
  496:     ssl = ssl_ctx->head;
  497: 
  498:     /* search through all the ssl entries */
  499:     while (ssl)
  500:     {
  501:         if (ssl->client_fd == client_fd)
  502:         {
  503:             SSL_CTX_UNLOCK(ssl_ctx->mutex);
  504:             return ssl;
  505:         }
  506: 
  507:         ssl = ssl->next;
  508:     }
  509: 
  510:     SSL_CTX_UNLOCK(ssl_ctx->mutex);
  511:     return NULL;
  512: }
  513: 
  514: /*
  515:  * Force the client to perform its handshake again.
  516:  */
  517: EXP_FUNC int STDCALL ssl_renegotiate(SSL *ssl)
  518: {
  519:     int ret = SSL_OK;
  520: 
  521:     disposable_new(ssl);
  522: #ifdef CONFIG_SSL_ENABLE_CLIENT
  523:     if (IS_SET_SSL_FLAG(SSL_IS_CLIENT))
  524:     {
  525:         ret = do_client_connect(ssl);
  526:     }
  527:     else
  528: #endif
  529:     {
  530:         send_packet(ssl, PT_HANDSHAKE_PROTOCOL, 
  531:                 g_hello_request, sizeof(g_hello_request));
  532:         SET_SSL_FLAG(SSL_NEED_RECORD);
  533:     }
  534: 
  535:     return ret;
  536: }
  537: 
  538: /**
  539:  * @brief Get what we need for key info.
  540:  * @param cipher    [in]    The cipher information we are after
  541:  * @param key_size  [out]   The key size for the cipher
  542:  * @param iv_size   [out]   The iv size for the cipher
  543:  * @return  The amount of key information we need.
  544:  */
  545: static const cipher_info_t *get_cipher_info(uint8_t cipher)
  546: {
  547:     int i;
  548: 
  549:     for (i = 0; i < NUM_PROTOCOLS; i++)
  550:     {
  551:         if (cipher_info[i].cipher == cipher)
  552:         {
  553:             return &cipher_info[i];
  554:         }
  555:     }
  556: 
  557:     return NULL;  /* error */
  558: }
  559: 
  560: /*
  561:  * Get a new ssl context for a new connection.
  562:  */
  563: SSL *ssl_new(SSL_CTX *ssl_ctx, int client_fd)
  564: {
  565:     SSL *ssl = (SSL *)calloc(1, sizeof(SSL));
  566:     ssl->ssl_ctx = ssl_ctx;
  567:     ssl->need_bytes = SSL_RECORD_SIZE;      /* need a record */
  568:     ssl->client_fd = client_fd;
  569:     ssl->flag = SSL_NEED_RECORD;
  570:     ssl->bm_data = ssl->bm_all_data+BM_RECORD_OFFSET; /* space at the start */
  571:     ssl->hs_status = SSL_NOT_OK;            /* not connected */
  572: #ifdef CONFIG_ENABLE_VERIFICATION
  573:     ssl->ca_cert_ctx = ssl_ctx->ca_cert_ctx;
  574: #endif
  575:     disposable_new(ssl);
  576: 
  577:     /* a bit hacky but saves a few bytes of memory */
  578:     ssl->flag |= ssl_ctx->options;
  579:     SSL_CTX_LOCK(ssl_ctx->mutex);
  580: 
  581:     if (ssl_ctx->head == NULL)
  582:     {
  583:         ssl_ctx->head = ssl;
  584:         ssl_ctx->tail = ssl;
  585:     }
  586:     else
  587:     {
  588:         ssl->prev = ssl_ctx->tail;
  589:         ssl_ctx->tail->next = ssl;
  590:         ssl_ctx->tail = ssl;
  591:     }
  592: 
  593:     SSL_CTX_UNLOCK(ssl_ctx->mutex);
  594:     return ssl;
  595: }
  596: 
  597: /*
  598:  * Add a private key to a context.
  599:  */
  600: int add_private_key(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj)
  601: {
  602:     int ret = SSL_OK;
  603: 
  604:     /* get the private key details */
  605:     if (asn1_get_private_key(ssl_obj->buf, ssl_obj->len, &ssl_ctx->rsa_ctx))
  606:     {
  607:         ret = SSL_ERROR_INVALID_KEY;
  608:         goto error;
  609:     }
  610: 
  611: error:
  612:     return ret;
  613: }
  614: 
  615: /** 
  616:  * Increment the read sequence number (as a 64 bit endian indepenent #)
  617:  */     
  618: static void increment_read_sequence(SSL *ssl)
  619: {
  620:     int i;
  621: 
  622:     for (i = 7; i >= 0; i--) 
  623:     {       
  624:         if (++ssl->read_sequence[i])
  625:             break;
  626:     }
  627: }
  628:             
  629: /**
  630:  * Increment the read sequence number (as a 64 bit endian indepenent #)
  631:  */      
  632: static void increment_write_sequence(SSL *ssl)
  633: {        
  634:     int i;                  
  635:          
  636:     for (i = 7; i >= 0; i--)
  637:     {                       
  638:         if (++ssl->write_sequence[i])
  639:             break;
  640:     }                       
  641: }
  642: 
  643: /**
  644:  * Work out the HMAC digest in a packet.
  645:  */
  646: static void add_hmac_digest(SSL *ssl, int mode, uint8_t *hmac_header,
  647:         const uint8_t *buf, int buf_len, uint8_t *hmac_buf)
  648: {
  649:     int hmac_len = buf_len + 8 + SSL_RECORD_SIZE;
  650:     uint8_t *t_buf = (uint8_t *)alloca(hmac_len+10);
  651: 
  652:     memcpy(t_buf, (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_WRITE) ? 
  653:                     ssl->write_sequence : ssl->read_sequence, 8);
  654:     memcpy(&t_buf[8], hmac_header, SSL_RECORD_SIZE);
  655:     memcpy(&t_buf[8+SSL_RECORD_SIZE], buf, buf_len);
  656: 
  657:     ssl->cipher_info->hmac(t_buf, hmac_len, 
  658:             (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_READ) ? 
  659:                 ssl->server_mac : ssl->client_mac, 
  660:             ssl->cipher_info->digest_size, hmac_buf);
  661: 
  662: #if 0
  663:     print_blob("record", ssl->hmac_tx, SSL_RECORD_SIZE);
  664:     print_blob("buf", buf, buf_len);
  665:     if (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_WRITE)
  666:     {
  667:         print_blob("write seq", ssl->write_sequence, 8);
  668:     }
  669:     else
  670:     {
  671:         print_blob("read seq", ssl->read_sequence, 8);
  672:     }
  673: 
  674:     if (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_READ)
  675:     {
  676:         print_blob("server mac", 
  677:                 ssl->server_mac, ssl->cipher_info->digest_size);
  678:     }
  679:     else
  680:     {
  681:         print_blob("client mac", 
  682:                 ssl->client_mac, ssl->cipher_info->digest_size);
  683:     }
  684:     print_blob("hmac", hmac_buf, SHA1_SIZE);
  685: #endif
  686: }
  687: 
  688: /**
  689:  * Verify that the digest of a packet is correct.
  690:  */
  691: static int verify_digest(SSL *ssl, int mode, const uint8_t *buf, int read_len)
  692: {   
  693:     uint8_t hmac_buf[SHA1_SIZE];
  694:     int hmac_offset;
  695:    
  696:     if (ssl->cipher_info->padding_size)
  697:     {
  698:         int last_blk_size = buf[read_len-1], i;
  699:         hmac_offset = read_len-last_blk_size-ssl->cipher_info->digest_size-1;
  700: 
  701:         /* guard against a timing attack - make sure we do the digest */
  702:         if (hmac_offset < 0)
  703:         {
  704:             hmac_offset = 0;
  705:         }
  706:         else
  707:         {
  708:             /* already looked at last byte */
  709:             for (i = 1; i < last_blk_size; i++)
  710:             {
  711:                 if (buf[read_len-i] != last_blk_size)
  712:                 {
  713:                     hmac_offset = 0;
  714:                     break;
  715:                 }
  716:             }
  717:         }
  718:     }
  719:     else /* stream cipher */
  720:     {
  721:         hmac_offset = read_len - ssl->cipher_info->digest_size;
  722: 
  723:         if (hmac_offset < 0)
  724:         {
  725:             hmac_offset = 0;
  726:         }
  727:     }
  728: 
  729:     /* sanity check the offset */
  730:     ssl->hmac_header[3] = hmac_offset >> 8;      /* insert size */
  731:     ssl->hmac_header[4] = hmac_offset & 0xff;
  732:     add_hmac_digest(ssl, mode, ssl->hmac_header, buf, hmac_offset, hmac_buf);
  733: 
  734:     if (memcmp(hmac_buf, &buf[hmac_offset], ssl->cipher_info->digest_size))
  735:     {
  736:         return SSL_ERROR_INVALID_HMAC;
  737:     }
  738: 
  739:     return hmac_offset;
  740: }
  741: 
  742: /**
  743:  * Add a packet to the end of our sent and received packets, so that we may use
  744:  * it to calculate the hash at the end.
  745:  */
  746: void add_packet(SSL *ssl, const uint8_t *pkt, int len)
  747: {
  748:     MD5_Update(&ssl->dc->md5_ctx, pkt, len);
  749:     SHA1_Update(&ssl->dc->sha1_ctx, pkt, len);
  750: }
  751: 
  752: /**
  753:  * Work out the MD5 PRF.
  754:  */
  755: static void p_hash_md5(const uint8_t *sec, int sec_len, 
  756:         uint8_t *seed, int seed_len, uint8_t *out, int olen)
  757: {
  758:     uint8_t a1[128];
  759: 
  760:     /* A(1) */
  761:     hmac_md5(seed, seed_len, sec, sec_len, a1);
  762:     memcpy(&a1[MD5_SIZE], seed, seed_len);
  763:     hmac_md5(a1, MD5_SIZE+seed_len, sec, sec_len, out);
  764: 
  765:     while (olen > MD5_SIZE)
  766:     {
  767:         uint8_t a2[MD5_SIZE];
  768:         out += MD5_SIZE;
  769:         olen -= MD5_SIZE;
  770: 
  771:         /* A(N) */
  772:         hmac_md5(a1, MD5_SIZE, sec, sec_len, a2);
  773:         memcpy(a1, a2, MD5_SIZE);
  774: 
  775:         /* work out the actual hash */
  776:         hmac_md5(a1, MD5_SIZE+seed_len, sec, sec_len, out);
  777:     }
  778: }
  779: 
  780: /**
  781:  * Work out the SHA1 PRF.
  782:  */
  783: static void p_hash_sha1(const uint8_t *sec, int sec_len, 
  784:         uint8_t *seed, int seed_len, uint8_t *out, int olen)
  785: {
  786:     uint8_t a1[128];
  787: 
  788:     /* A(1) */
  789:     hmac_sha1(seed, seed_len, sec, sec_len, a1);
  790:     memcpy(&a1[SHA1_SIZE], seed, seed_len);
  791:     hmac_sha1(a1, SHA1_SIZE+seed_len, sec, sec_len, out);
  792: 
  793:     while (olen > SHA1_SIZE)
  794:     {
  795:         uint8_t a2[SHA1_SIZE];
  796:         out += SHA1_SIZE;
  797:         olen -= SHA1_SIZE;
  798: 
  799:         /* A(N) */
  800:         hmac_sha1(a1, SHA1_SIZE, sec, sec_len, a2);
  801:         memcpy(a1, a2, SHA1_SIZE);
  802: 
  803:         /* work out the actual hash */
  804:         hmac_sha1(a1, SHA1_SIZE+seed_len, sec, sec_len, out);
  805:     }
  806: }
  807: 
  808: /**
  809:  * Work out the PRF.
  810:  */
  811: static void prf(const uint8_t *sec, int sec_len, uint8_t *seed, int seed_len,
  812:         uint8_t *out, int olen)
  813: {
  814:     int len, i;
  815:     const uint8_t *S1, *S2;
  816:     uint8_t xbuf[256]; /* needs to be > the amount of key data */
  817:     uint8_t ybuf[256]; /* needs to be > the amount of key data */
  818: 
  819:     len = sec_len/2;
  820:     S1 = sec;
  821:     S2 = &sec[len];
  822:     len += (sec_len & 1); /* add for odd, make longer */
  823: 
  824:     p_hash_md5(S1, len, seed, seed_len, xbuf, olen);
  825:     p_hash_sha1(S2, len, seed, seed_len, ybuf, olen);
  826: 
  827:     for (i = 0; i < olen; i++)
  828:         out[i] = xbuf[i] ^ ybuf[i];
  829: }
  830: 
  831: /**
  832:  * Generate a master secret based on the client/server random data and the
  833:  * premaster secret.
  834:  */
  835: void generate_master_secret(SSL *ssl, const uint8_t *premaster_secret)
  836: {
  837:     uint8_t buf[128];   /* needs to be > 13+32+32 in size */
  838:     strcpy((char *)buf, "master secret");
  839:     memcpy(&buf[13], ssl->dc->client_random, SSL_RANDOM_SIZE);
  840:     memcpy(&buf[45], ssl->dc->server_random, SSL_RANDOM_SIZE);
  841:     prf(premaster_secret, SSL_SECRET_SIZE, buf, 77, ssl->dc->master_secret,
  842:             SSL_SECRET_SIZE);
  843: }
  844: 
  845: /**
  846:  * Generate a 'random' blob of data used for the generation of keys.
  847:  */
  848: static void generate_key_block(uint8_t *client_random, uint8_t *server_random,
  849:         uint8_t *master_secret, uint8_t *key_block, int key_block_size)
  850: {
  851:     uint8_t buf[128];
  852:     strcpy((char *)buf, "key expansion");
  853:     memcpy(&buf[13], server_random, SSL_RANDOM_SIZE);
  854:     memcpy(&buf[45], client_random, SSL_RANDOM_SIZE);
  855:     prf(master_secret, SSL_SECRET_SIZE, buf, 77, key_block, key_block_size);
  856: }
  857: 
  858: /** 
  859:  * Calculate the digest used in the finished message. This function also
  860:  * doubles up as a certificate verify function.
  861:  */
  862: void finished_digest(SSL *ssl, const char *label, uint8_t *digest)
  863: {
  864:     uint8_t mac_buf[128]; 
  865:     uint8_t *q = mac_buf;
  866:     MD5_CTX md5_ctx = ssl->dc->md5_ctx;
  867:     SHA1_CTX sha1_ctx = ssl->dc->sha1_ctx;
  868: 
  869:     if (label)
  870:     {
  871:         strcpy((char *)q, label);
  872:         q += strlen(label);
  873:     }
  874: 
  875:     MD5_Final(q, &md5_ctx);
  876:     q += MD5_SIZE;
  877:     
  878:     SHA1_Final(q, &sha1_ctx);
  879:     q += SHA1_SIZE;
  880: 
  881:     if (label)
  882:     {
  883:         prf(ssl->dc->master_secret, SSL_SECRET_SIZE, mac_buf, (int)(q-mac_buf),
  884:             digest, SSL_FINISHED_HASH_SIZE);
  885:     }
  886:     else    /* for use in a certificate verify */
  887:     {
  888:         memcpy(digest, mac_buf, MD5_SIZE + SHA1_SIZE);
  889:     }
  890: 
  891: #if 0
  892:     printf("label: %s\n", label);
  893:     print_blob("master secret", ssl->dc->master_secret, 48);
  894:     print_blob("mac_buf", mac_buf, q-mac_buf);
  895:     print_blob("finished digest", digest, SSL_FINISHED_HASH_SIZE);
  896: #endif
  897: }   
  898:     
  899: /**
  900:  * Retrieve (and initialise) the context of a cipher.
  901:  */
  902: static void *crypt_new(SSL *ssl, uint8_t *key, uint8_t *iv, int is_decrypt)
  903: {
  904:     switch (ssl->cipher)
  905:     {
  906: #ifndef CONFIG_SSL_SKELETON_MODE
  907:         case SSL_AES128_SHA:
  908:             {
  909:                 AES_CTX *aes_ctx = (AES_CTX *)malloc(sizeof(AES_CTX));
  910:                 AES_set_key(aes_ctx, key, iv, AES_MODE_128);
  911: 
  912:                 if (is_decrypt)
  913:                 {
  914:                     AES_convert_key(aes_ctx);
  915:                 }
  916: 
  917:                 return (void *)aes_ctx;
  918:             }
  919: 
  920:         case SSL_AES256_SHA:
  921:             {
  922:                 AES_CTX *aes_ctx = (AES_CTX *)malloc(sizeof(AES_CTX));
  923:                 AES_set_key(aes_ctx, key, iv, AES_MODE_256);
  924: 
  925:                 if (is_decrypt)
  926:                 {
  927:                     AES_convert_key(aes_ctx);
  928:                 }
  929: 
  930:                 return (void *)aes_ctx;
  931:             }
  932: 
  933:         case SSL_RC4_128_MD5:
  934: #endif
  935:         case SSL_RC4_128_SHA:
  936:             {
  937:                 RC4_CTX *rc4_ctx = (RC4_CTX *)malloc(sizeof(RC4_CTX));
  938:                 RC4_setup(rc4_ctx, key, 16);
  939:                 return (void *)rc4_ctx;
  940:             }
  941:     }
  942: 
  943:     return NULL;    /* its all gone wrong */
  944: }
  945: 
  946: /**
  947:  * Send a packet over the socket.
  948:  */
  949: static int send_raw_packet(SSL *ssl, uint8_t protocol)
  950: {
  951:     uint8_t *rec_buf = ssl->bm_all_data;
  952:     int pkt_size = SSL_RECORD_SIZE+ssl->bm_index;
  953:     int sent = 0;
  954:     int ret = SSL_OK;
  955: 
  956:     rec_buf[0] = protocol;
  957:     rec_buf[1] = 0x03;      /* version = 3.1 or higher */
  958:     rec_buf[2] = ssl->version & 0x0f;
  959:     rec_buf[3] = ssl->bm_index >> 8;
  960:     rec_buf[4] = ssl->bm_index & 0xff;
  961: 
  962:     DISPLAY_BYTES(ssl, "sending %d bytes", ssl->bm_all_data, 
  963:                              pkt_size, pkt_size);
  964: 
  965:     while (sent < pkt_size)
  966:     {
  967:         ret = SOCKET_WRITE(ssl->client_fd, 
  968:                         &ssl->bm_all_data[sent], pkt_size-sent);
  969: 
  970:         if (ret >= 0)
  971:             sent += ret;
  972:         else
  973:         {
  974: 
  975: #ifdef WIN32
  976:             if (GetLastError() != WSAEWOULDBLOCK)
  977: #else
  978:             if (errno != EAGAIN && errno != EWOULDBLOCK)
  979: #endif
  980:                 return SSL_ERROR_CONN_LOST;
  981:         }
  982: 
  983:         /* keep going until the write buffer has some space */
  984:         if (sent != pkt_size)
  985:         {
  986:             fd_set wfds;
  987:             FD_ZERO(&wfds);
  988:             FD_SET(ssl->client_fd, &wfds);
  989: 
  990:             /* block and wait for it */
  991:             if (select(ssl->client_fd + 1, NULL, &wfds, NULL, NULL) < 0)
  992:                 return SSL_ERROR_CONN_LOST;
  993:         }
  994:     }
  995: 
  996:     SET_SSL_FLAG(SSL_NEED_RECORD);  /* reset for next time */
  997:     ssl->bm_index = 0;
  998: 
  999:     if (protocol != PT_APP_PROTOCOL_DATA)  
 1000:     {
 1001:         /* always return SSL_OK during handshake */   
 1002:         ret = SSL_OK;
 1003:     }
 1004: 
 1005:     return ret;
 1006: }
 1007: 
 1008: /**
 1009:  * Send an encrypted packet with padding bytes if necessary.
 1010:  */
 1011: int send_packet(SSL *ssl, uint8_t protocol, const uint8_t *in, int length)
 1012: {
 1013:     int ret, msg_length = 0;
 1014: 
 1015:     /* if our state is bad, don't bother */
 1016:     if (ssl->hs_status == SSL_ERROR_DEAD)
 1017:         return SSL_ERROR_CONN_LOST;
 1018: 
 1019:     if (in) /* has the buffer already been initialised? */
 1020:     {
 1021:         memcpy(ssl->bm_data, in, length);
 1022:     }
 1023: 
 1024:     msg_length += length;
 1025: 
 1026:     if (IS_SET_SSL_FLAG(SSL_TX_ENCRYPTED))
 1027:     {
 1028:         int mode = IS_SET_SSL_FLAG(SSL_IS_CLIENT) ? 
 1029:                             SSL_CLIENT_WRITE : SSL_SERVER_WRITE;
 1030:         uint8_t hmac_header[SSL_RECORD_SIZE] = 
 1031:         {
 1032:             protocol, 
 1033:             0x03, /* version = 3.1 or higher */
 1034:             ssl->version & 0x0f,
 1035:             msg_length >> 8,
 1036:             msg_length & 0xff 
 1037:         };
 1038: 
 1039:         if (protocol == PT_HANDSHAKE_PROTOCOL)
 1040:         {
 1041:             DISPLAY_STATE(ssl, 1, ssl->bm_data[0], 0);
 1042: 
 1043:             if (ssl->bm_data[0] != HS_HELLO_REQUEST)
 1044:             {
 1045:                 add_packet(ssl, ssl->bm_data, msg_length);
 1046:             }
 1047:         }
 1048: 
 1049:         /* add the packet digest */
 1050:         add_hmac_digest(ssl, mode, hmac_header, ssl->bm_data, msg_length, 
 1051:                                                 &ssl->bm_data[msg_length]);
 1052:         msg_length += ssl->cipher_info->digest_size;
 1053: 
 1054:         /* add padding? */
 1055:         if (ssl->cipher_info->padding_size)
 1056:         {
 1057:             int last_blk_size = msg_length%ssl->cipher_info->padding_size;
 1058:             int pad_bytes = ssl->cipher_info->padding_size - last_blk_size;
 1059: 
 1060:             /* ensure we always have at least 1 padding byte */
 1061:             if (pad_bytes == 0)
 1062:                 pad_bytes += ssl->cipher_info->padding_size;
 1063: 
 1064:             memset(&ssl->bm_data[msg_length], pad_bytes-1, pad_bytes);
 1065:             msg_length += pad_bytes;
 1066:         }
 1067: 
 1068:         DISPLAY_BYTES(ssl, "unencrypted write", ssl->bm_data, msg_length);
 1069:         increment_write_sequence(ssl);
 1070: 
 1071:         /* add the explicit IV for TLS1.1 */
 1072:         if (ssl->version >= SSL_PROTOCOL_VERSION1_1 &&
 1073:                         ssl->cipher_info->iv_size)
 1074:                         
 1075:         {
 1076:             uint8_t iv_size = ssl->cipher_info->iv_size;
 1077:             uint8_t *t_buf = alloca(msg_length + iv_size);
 1078:             memcpy(t_buf + iv_size, ssl->bm_data, msg_length);
 1079:             get_random(iv_size, t_buf);
 1080:             msg_length += iv_size;
 1081:             memcpy(ssl->bm_data, t_buf, msg_length);
 1082:         }
 1083: 
 1084:         /* now encrypt the packet */
 1085:         ssl->cipher_info->encrypt(ssl->encrypt_ctx, ssl->bm_data, 
 1086:                                             ssl->bm_data, msg_length);
 1087:     }
 1088:     else if (protocol == PT_HANDSHAKE_PROTOCOL)
 1089:     {
 1090:         DISPLAY_STATE(ssl, 1, ssl->bm_data[0], 0);
 1091: 
 1092:         if (ssl->bm_data[0] != HS_HELLO_REQUEST)
 1093:         {
 1094:             add_packet(ssl, ssl->bm_data, length);
 1095:         }
 1096:     }
 1097: 
 1098:     ssl->bm_index = msg_length;
 1099:     if ((ret = send_raw_packet(ssl, protocol)) <= 0)
 1100:         return ret;
 1101: 
 1102:     return length;  /* just return what we wanted to send */
 1103: }
 1104: 
 1105: /**
 1106:  * Work out the cipher keys we are going to use for this session based on the
 1107:  * master secret.
 1108:  */
 1109: static int set_key_block(SSL *ssl, int is_write)
 1110: {
 1111:     const cipher_info_t *ciph_info = get_cipher_info(ssl->cipher);
 1112:     uint8_t *q;
 1113:     uint8_t client_key[32], server_key[32]; /* big enough for AES256 */
 1114:     uint8_t client_iv[16], server_iv[16];   /* big enough for AES128/256 */
 1115:     int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT);
 1116: 
 1117:     if (ciph_info == NULL)
 1118:         return -1;
 1119: 
 1120:     /* only do once in a handshake */
 1121:     if (ssl->dc->key_block == NULL)
 1122:     {
 1123:         ssl->dc->key_block = (uint8_t *)malloc(ciph_info->key_block_size);
 1124: 
 1125: #if 0
 1126:         print_blob("client", ssl->dc->client_random, 32);
 1127:         print_blob("server", ssl->dc->server_random, 32);
 1128:         print_blob("master", ssl->dc->master_secret, SSL_SECRET_SIZE);
 1129: #endif
 1130:         generate_key_block(ssl->dc->client_random, ssl->dc->server_random,
 1131:             ssl->dc->master_secret, ssl->dc->key_block, 
 1132:             ciph_info->key_block_size);
 1133: #if 0
 1134:         print_blob("keyblock", ssl->key_block, ciph_info->key_block_size);
 1135: #endif
 1136:     }
 1137: 
 1138:     q = ssl->dc->key_block;
 1139: 
 1140:     if ((is_client && is_write) || (!is_client && !is_write))
 1141:     {
 1142:         memcpy(ssl->client_mac, q, ciph_info->digest_size);
 1143:     }
 1144: 
 1145:     q += ciph_info->digest_size;
 1146: 
 1147:     if ((!is_client && is_write) || (is_client && !is_write))
 1148:     {
 1149:         memcpy(ssl->server_mac, q, ciph_info->digest_size);
 1150:     }
 1151: 
 1152:     q += ciph_info->digest_size;
 1153:     memcpy(client_key, q, ciph_info->key_size);
 1154:     q += ciph_info->key_size;
 1155:     memcpy(server_key, q, ciph_info->key_size);
 1156:     q += ciph_info->key_size;
 1157: 
 1158: #ifndef CONFIG_SSL_SKELETON_MODE 
 1159:     if (ciph_info->iv_size)    /* RC4 has no IV, AES does */
 1160:     {
 1161:         memcpy(client_iv, q, ciph_info->iv_size);
 1162:         q += ciph_info->iv_size;
 1163:         memcpy(server_iv, q, ciph_info->iv_size);
 1164:         q += ciph_info->iv_size;
 1165:     }
 1166: #endif
 1167: 
 1168:     free(is_write ? ssl->encrypt_ctx : ssl->decrypt_ctx);
 1169: 
 1170:     /* now initialise the ciphers */
 1171:     if (is_client)
 1172:     {
 1173:         finished_digest(ssl, server_finished, ssl->dc->final_finish_mac);
 1174: 
 1175:         if (is_write)
 1176:             ssl->encrypt_ctx = crypt_new(ssl, client_key, client_iv, 0);
 1177:         else
 1178:             ssl->decrypt_ctx = crypt_new(ssl, server_key, server_iv, 1);
 1179:     }
 1180:     else
 1181:     {
 1182:         finished_digest(ssl, client_finished, ssl->dc->final_finish_mac);
 1183: 
 1184:         if (is_write)
 1185:             ssl->encrypt_ctx = crypt_new(ssl, server_key, server_iv, 0);
 1186:         else
 1187:             ssl->decrypt_ctx = crypt_new(ssl, client_key, client_iv, 1);
 1188:     }
 1189: 
 1190:     ssl->cipher_info = ciph_info;
 1191:     return 0;
 1192: }
 1193: 
 1194: /**
 1195:  * Read the SSL connection.
 1196:  */
 1197: int basic_read(SSL *ssl, uint8_t **in_data)
 1198: {
 1199:     int ret = SSL_OK;
 1200:     int read_len, is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT);
 1201:     uint8_t *buf = ssl->bm_data;
 1202: 
 1203:     read_len = SOCKET_READ(ssl->client_fd, &buf[ssl->bm_read_index], 
 1204:                             ssl->need_bytes-ssl->got_bytes);
 1205: 
 1206:     if (read_len < 0) 
 1207:     {
 1208: #ifdef WIN32
 1209:         if (GetLastError() == WSAEWOULDBLOCK)
 1210: #else
 1211:         if (errno == EAGAIN || errno == EWOULDBLOCK)
 1212: #endif
 1213:             return 0;
 1214:     }
 1215: 
 1216:     /* connection has gone, so die */
 1217:     if (read_len <= 0)
 1218:     {
 1219:         ret = SSL_ERROR_CONN_LOST;
 1220:         ssl->hs_status = SSL_ERROR_DEAD;  /* make sure it stays dead */
 1221:         goto error;
 1222:     }
 1223: 
 1224:     DISPLAY_BYTES(ssl, "received %d bytes", 
 1225:             &ssl->bm_data[ssl->bm_read_index], read_len, read_len);
 1226: 
 1227:     ssl->got_bytes += read_len;
 1228:     ssl->bm_read_index += read_len;
 1229: 
 1230:     /* haven't quite got what we want, so try again later */
 1231:     if (ssl->got_bytes < ssl->need_bytes)
 1232:         return SSL_OK;
 1233: 
 1234:     read_len = ssl->got_bytes;
 1235:     ssl->got_bytes = 0;
 1236: 
 1237:     if (IS_SET_SSL_FLAG(SSL_NEED_RECORD))
 1238:     {
 1239:         /* check for sslv2 "client hello" */
 1240:         if (buf[0] & 0x80 && buf[2] == 1)
 1241:         {
 1242: #ifdef CONFIG_SSL_ENABLE_V23_HANDSHAKE
 1243:             uint8_t version = (buf[3] << 4) + buf[4];
 1244:             DISPLAY_BYTES(ssl, "ssl2 record", buf, 5);
 1245: 
 1246:             /* should be v3.1 (TLSv1) or better  */
 1247:             ssl->version = ssl->client_version = version;
 1248: 
 1249:             if (version > SSL_PROTOCOL_VERSION_MAX)
 1250:             {
 1251:                 /* use client's version */
 1252:                 ssl->version = SSL_PROTOCOL_VERSION_MAX;
 1253:             }
 1254:             else if (version < SSL_PROTOCOL_MIN_VERSION)  
 1255:             {
 1256:                 ret = SSL_ERROR_INVALID_VERSION;
 1257:                 ssl_display_error(ret);
 1258:                 return ret;
 1259:             }
 1260: 
 1261:             add_packet(ssl, &buf[2], 3);
 1262:             ret = process_sslv23_client_hello(ssl); 
 1263: #else
 1264:             printf("Error: no SSLv23 handshaking allowed\n"); TTY_FLUSH();
 1265:             ret = SSL_ERROR_NOT_SUPPORTED;
 1266: #endif
 1267:             goto error; /* not an error - just get out of here */
 1268:         }
 1269: 
 1270:         ssl->need_bytes = (buf[3] << 8) + buf[4];
 1271: 
 1272:         /* do we violate the spec with the message size?  */
 1273:         if (ssl->need_bytes > RT_MAX_PLAIN_LENGTH+RT_EXTRA-BM_RECORD_OFFSET)
 1274:         {
 1275:             ret = SSL_ERROR_INVALID_PROT_MSG;              
 1276:             goto error;
 1277:         }
 1278: 
 1279:         CLR_SSL_FLAG(SSL_NEED_RECORD);
 1280:         memcpy(ssl->hmac_header, buf, 3);       /* store for hmac */
 1281:         ssl->record_type = buf[0];
 1282:         goto error;                         /* no error, we're done */
 1283:     }
 1284: 
 1285:     /* for next time - just do it now in case of an error */
 1286:     SET_SSL_FLAG(SSL_NEED_RECORD);
 1287:     ssl->need_bytes = SSL_RECORD_SIZE;
 1288: 
 1289:     /* decrypt if we need to */
 1290:     if (IS_SET_SSL_FLAG(SSL_RX_ENCRYPTED))
 1291:     {
 1292:         ssl->cipher_info->decrypt(ssl->decrypt_ctx, buf, buf, read_len);
 1293: 
 1294:         if (ssl->version >= SSL_PROTOCOL_VERSION1_1 &&
 1295:                         ssl->cipher_info->iv_size)
 1296:         {
 1297:             buf += ssl->cipher_info->iv_size;
 1298:             read_len -= ssl->cipher_info->iv_size;
 1299:         }
 1300: 
 1301:         read_len = verify_digest(ssl, 
 1302:                 is_client ? SSL_CLIENT_READ : SSL_SERVER_READ, buf, read_len);
 1303: 
 1304:         /* does the hmac work? */
 1305:         if (read_len < 0)
 1306:         {
 1307:             ret = read_len;
 1308:             goto error;
 1309:         }
 1310: 
 1311:         DISPLAY_BYTES(ssl, "decrypted", buf, read_len);
 1312:         increment_read_sequence(ssl);
 1313:     }
 1314: 
 1315:     /* The main part of the SSL packet */
 1316:     switch (ssl->record_type)
 1317:     {
 1318:         case PT_HANDSHAKE_PROTOCOL:
 1319:             if (ssl->dc != NULL)
 1320:             {
 1321:                 ssl->dc->bm_proc_index = 0;
 1322:                 ret = do_handshake(ssl, buf, read_len);
 1323:             }
 1324:             else /* no client renegotiation allowed */
 1325:             {
 1326:                 ret = SSL_ERROR_NO_CLIENT_RENOG;              
 1327:                 goto error;
 1328:             }
 1329:             break;
 1330: 
 1331:         case PT_CHANGE_CIPHER_SPEC:
 1332:             if (ssl->next_state != HS_FINISHED)
 1333:             {
 1334:                 ret = SSL_ERROR_INVALID_HANDSHAKE;
 1335:                 goto error;
 1336:             }
 1337: 
 1338:             /* all encrypted from now on */
 1339:             SET_SSL_FLAG(SSL_RX_ENCRYPTED);
 1340:             if (set_key_block(ssl, 0) < 0)
 1341:             {
 1342:                 ret = SSL_ERROR_INVALID_HANDSHAKE;
 1343:                 goto error;
 1344:             }
 1345:             
 1346:             memset(ssl->read_sequence, 0, 8);
 1347:             break;
 1348: 
 1349:         case PT_APP_PROTOCOL_DATA:
 1350:             if (in_data)
 1351:             {
 1352:                 *in_data = buf;   /* point to the work buffer */
 1353:                 (*in_data)[read_len] = 0;  /* null terminate just in case */
 1354:             }
 1355: 
 1356:             ret = read_len;
 1357:             break;
 1358: 
 1359:         case PT_ALERT_PROTOCOL:
 1360:             /* return the alert # with alert bit set */
 1361:             if(buf[0] == SSL_ALERT_TYPE_WARNING &&
 1362:                buf[1] == SSL_ALERT_CLOSE_NOTIFY)
 1363:             {
 1364:               ret = SSL_CLOSE_NOTIFY;
 1365:               send_alert(ssl, SSL_ALERT_CLOSE_NOTIFY);
 1366:               SET_SSL_FLAG(SSL_SENT_CLOSE_NOTIFY);
 1367:             }
 1368:             else 
 1369:             {
 1370:                 ret = -buf[1]; 
 1371:                 DISPLAY_ALERT(ssl, buf[1]);
 1372:             }
 1373: 
 1374:             break;
 1375: 
 1376:         default:
 1377:             ret = SSL_ERROR_INVALID_PROT_MSG;
 1378:             break;
 1379:     }
 1380: 
 1381: error:
 1382:     ssl->bm_read_index = 0;          /* reset to go again */
 1383: 
 1384:     if (ret < SSL_OK && in_data)/* if all wrong, then clear this buffer ptr */
 1385:         *in_data = NULL;
 1386: 
 1387:     return ret;
 1388: }
 1389: 
 1390: /**
 1391:  * Do some basic checking of data and then perform the appropriate handshaking.
 1392:  */
 1393: static int do_handshake(SSL *ssl, uint8_t *buf, int read_len)
 1394: {
 1395:     int hs_len = (buf[2]<<8) + buf[3];
 1396:     uint8_t handshake_type = buf[0];
 1397:     int ret = SSL_OK;
 1398:     int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT);
 1399: 
 1400:     /* some integrity checking on the handshake */
 1401:     PARANOIA_CHECK(read_len-SSL_HS_HDR_SIZE, hs_len);
 1402: 
 1403:     if (handshake_type != ssl->next_state)
 1404:     {
 1405:         /* handle a special case on the client */
 1406:         if (!is_client || handshake_type != HS_CERT_REQ ||
 1407:                         ssl->next_state != HS_SERVER_HELLO_DONE)
 1408:         {
 1409:             ret = SSL_ERROR_INVALID_HANDSHAKE;
 1410:             goto error;
 1411:         }
 1412:     }
 1413: 
 1414:     hs_len += SSL_HS_HDR_SIZE;  /* adjust for when adding packets */
 1415:     ssl->bm_index = hs_len;     /* store the size and check later */
 1416:     DISPLAY_STATE(ssl, 0, handshake_type, 0);
 1417: 
 1418:     if (handshake_type != HS_CERT_VERIFY && handshake_type != HS_HELLO_REQUEST)
 1419:         add_packet(ssl, buf, hs_len); 
 1420: 
 1421: #if defined(CONFIG_SSL_ENABLE_CLIENT)
 1422:     ret = is_client ? 
 1423:         do_clnt_handshake(ssl, handshake_type, buf, hs_len) :
 1424:         do_svr_handshake(ssl, handshake_type, buf, hs_len);
 1425: #else
 1426:     ret = do_svr_handshake(ssl, handshake_type, buf, hs_len);
 1427: #endif
 1428: 
 1429:     /* just use recursion to get the rest */
 1430:     if (hs_len < read_len && ret == SSL_OK)
 1431:         ret = do_handshake(ssl, &buf[hs_len], read_len-hs_len);
 1432: 
 1433: error:
 1434:     return ret;
 1435: }
 1436: 
 1437: /**
 1438:  * Sends the change cipher spec message. We have just read a finished message
 1439:  * from the client.
 1440:  */
 1441: int send_change_cipher_spec(SSL *ssl)
 1442: {
 1443:     int ret = send_packet(ssl, PT_CHANGE_CIPHER_SPEC, 
 1444:             g_chg_cipher_spec_pkt, sizeof(g_chg_cipher_spec_pkt));
 1445:     SET_SSL_FLAG(SSL_TX_ENCRYPTED);
 1446: 
 1447:     if (ret >= 0 && set_key_block(ssl, 1) < 0)
 1448:         ret = SSL_ERROR_INVALID_HANDSHAKE;
 1449: 
 1450:     memset(ssl->write_sequence, 0, 8);
 1451:     return ret;
 1452: }
 1453: 
 1454: /**
 1455:  * Send a "finished" message
 1456:  */
 1457: int send_finished(SSL *ssl)
 1458: {
 1459:     uint8_t buf[SSL_FINISHED_HASH_SIZE+4] = {
 1460:         HS_FINISHED, 0, 0, SSL_FINISHED_HASH_SIZE };
 1461: 
 1462:     /* now add the finished digest mac (12 bytes) */
 1463:     finished_digest(ssl, 
 1464:         IS_SET_SSL_FLAG(SSL_IS_CLIENT) ?
 1465:                     client_finished : server_finished, &buf[4]);
 1466: 
 1467: #ifndef CONFIG_SSL_SKELETON_MODE
 1468:     /* store in the session cache */
 1469:     if (!IS_SET_SSL_FLAG(SSL_SESSION_RESUME) && ssl->ssl_ctx->num_sessions)
 1470:     {
 1471:         memcpy(ssl->session->master_secret,
 1472:                 ssl->dc->master_secret, SSL_SECRET_SIZE);
 1473:     }
 1474: #endif
 1475: 
 1476:     return send_packet(ssl, PT_HANDSHAKE_PROTOCOL,
 1477:                                 buf, SSL_FINISHED_HASH_SIZE+4);
 1478: }
 1479: 
 1480: /**
 1481:  * Send an alert message.
 1482:  * Return 1 if the alert was an "error".
 1483:  */
 1484: int send_alert(SSL *ssl, int error_code)
 1485: {
 1486:     int alert_num = 0;
 1487:     int is_warning = 0;
 1488:     uint8_t buf[2];
 1489: 
 1490:     /* Don't bother we're already dead */
 1491:     if (ssl->hs_status == SSL_ERROR_DEAD)
 1492:     {
 1493:         return SSL_ERROR_CONN_LOST;
 1494:     }
 1495: 
 1496: #ifdef CONFIG_SSL_FULL_MODE
 1497:     if (IS_SET_SSL_FLAG(SSL_DISPLAY_STATES))
 1498:         ssl_display_error(error_code);
 1499: #endif
 1500: 
 1501:     switch (error_code)
 1502:     {
 1503:         case SSL_ALERT_CLOSE_NOTIFY:
 1504:             is_warning = 1;
 1505:             alert_num = SSL_ALERT_CLOSE_NOTIFY;
 1506:             break;
 1507: 
 1508:         case SSL_ERROR_CONN_LOST:       /* don't send alert just yet */
 1509:             is_warning = 1;
 1510:             break;
 1511: 
 1512:         case SSL_ERROR_INVALID_HANDSHAKE:
 1513:         case SSL_ERROR_INVALID_PROT_MSG:
 1514:             alert_num = SSL_ALERT_HANDSHAKE_FAILURE;
 1515:             break;
 1516: 
 1517:         case SSL_ERROR_INVALID_HMAC:
 1518:         case SSL_ERROR_FINISHED_INVALID:
 1519:             alert_num = SSL_ALERT_BAD_RECORD_MAC;
 1520:             break;
 1521: 
 1522:         case SSL_ERROR_INVALID_VERSION:
 1523:             alert_num = SSL_ALERT_INVALID_VERSION;
 1524:             break;
 1525: 
 1526:         case SSL_ERROR_INVALID_SESSION:
 1527:         case SSL_ERROR_NO_CIPHER:
 1528:         case SSL_ERROR_INVALID_KEY:
 1529:             alert_num = SSL_ALERT_ILLEGAL_PARAMETER;
 1530:             break;
 1531: 
 1532:         case SSL_ERROR_BAD_CERTIFICATE:
 1533:             alert_num = SSL_ALERT_BAD_CERTIFICATE;
 1534:             break;
 1535: 
 1536:         case SSL_ERROR_NO_CLIENT_RENOG:
 1537:             alert_num = SSL_ALERT_NO_RENEGOTIATION;
 1538:             break;
 1539: 
 1540:         default:
 1541:             /* a catch-all for any badly verified certificates */
 1542:             alert_num = (error_code <= SSL_X509_OFFSET) ?  
 1543:                 SSL_ALERT_BAD_CERTIFICATE : SSL_ALERT_UNEXPECTED_MESSAGE;
 1544:             break;
 1545:     }
 1546: 
 1547:     buf[0] = is_warning ? 1 : 2;
 1548:     buf[1] = alert_num;
 1549:     send_packet(ssl, PT_ALERT_PROTOCOL, buf, sizeof(buf));
 1550:     DISPLAY_ALERT(ssl, alert_num);
 1551:     return is_warning ? 0 : 1;
 1552: }
 1553: 
 1554: /**
 1555:  * Process a client finished message.
 1556:  */
 1557: int process_finished(SSL *ssl, uint8_t *buf, int hs_len)
 1558: {
 1559:     int ret = SSL_OK;
 1560:     int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT);
 1561:     int resume = IS_SET_SSL_FLAG(SSL_SESSION_RESUME);
 1562: 
 1563:     PARANOIA_CHECK(ssl->bm_index, SSL_FINISHED_HASH_SIZE+4);
 1564: 
 1565:     /* check that we all work before we continue */
 1566:     if (memcmp(ssl->dc->final_finish_mac, &buf[4], SSL_FINISHED_HASH_SIZE))
 1567:         return SSL_ERROR_FINISHED_INVALID;
 1568: 
 1569:     if ((!is_client && !resume) || (is_client && resume))
 1570:     {
 1571:         if ((ret = send_change_cipher_spec(ssl)) == SSL_OK)
 1572:             ret = send_finished(ssl);
 1573:     }
 1574: 
 1575:     /* if we ever renegotiate */
 1576:     ssl->next_state = is_client ? HS_HELLO_REQUEST : HS_CLIENT_HELLO;  
 1577:     ssl->hs_status = ret;  /* set the final handshake status */
 1578: 
 1579: error:
 1580:     return ret;
 1581: }
 1582: 
 1583: /**
 1584:  * Send a certificate.
 1585:  */
 1586: int send_certificate(SSL *ssl)
 1587: {
 1588:     int i = 0;
 1589:     uint8_t *buf = ssl->bm_data;
 1590:     int offset = 7;
 1591:     int chain_length;
 1592: 
 1593:     buf[0] = HS_CERTIFICATE;
 1594:     buf[1] = 0;
 1595:     buf[4] = 0;
 1596: 
 1597:     while (i < ssl->ssl_ctx->chain_length)
 1598:     {
 1599:         SSL_CERT *cert = &ssl->ssl_ctx->certs[i];
 1600:         buf[offset++] = 0;        
 1601:         buf[offset++] = cert->size >> 8;        /* cert 1 length */
 1602:         buf[offset++] = cert->size & 0xff;
 1603:         memcpy(&buf[offset], cert->buf, cert->size);
 1604:         offset += cert->size;
 1605:         i++;
 1606:     }
 1607: 
 1608:     chain_length = offset - 7;
 1609:     buf[5] = chain_length >> 8;        /* cert chain length */
 1610:     buf[6] = chain_length & 0xff;
 1611:     chain_length += 3;
 1612:     buf[2] = chain_length >> 8;        /* handshake length */
 1613:     buf[3] = chain_length & 0xff;
 1614:     ssl->bm_index = offset;
 1615:     return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, offset);
 1616: }
 1617: 
 1618: /**
 1619:  * Create a blob of memory that we'll get rid of once the handshake is
 1620:  * complete.
 1621:  */
 1622: void disposable_new(SSL *ssl)
 1623: {
 1624:     if (ssl->dc == NULL)
 1625:     {
 1626:         ssl->dc = (DISPOSABLE_CTX *)calloc(1, sizeof(DISPOSABLE_CTX));
 1627:         MD5_Init(&ssl->dc->md5_ctx);
 1628:         SHA1_Init(&ssl->dc->sha1_ctx);
 1629:     }
 1630: }
 1631: 
 1632: /**
 1633:  * Remove the temporary blob of memory.
 1634:  */
 1635: void disposable_free(SSL *ssl)
 1636: {
 1637:     if (ssl->dc)
 1638:     {
 1639:         free(ssl->dc->key_block);
 1640:         memset(ssl->dc, 0, sizeof(DISPOSABLE_CTX));
 1641:         free(ssl->dc);
 1642:         ssl->dc = NULL;
 1643:     }
 1644: 
 1645: }
 1646: 
 1647: #ifndef CONFIG_SSL_SKELETON_MODE     /* no session resumption in this mode */
 1648: /**
 1649:  * Find if an existing session has the same session id. If so, use the
 1650:  * master secret from this session for session resumption.
 1651:  */
 1652: SSL_SESSION *ssl_session_update(int max_sessions, SSL_SESSION *ssl_sessions[], 
 1653:         SSL *ssl, const uint8_t *session_id)
 1654: {
 1655:     time_t tm = time(NULL);
 1656:     time_t oldest_sess_time = tm;
 1657:     SSL_SESSION *oldest_sess = NULL;
 1658:     int i;
 1659: 
 1660:     /* no sessions? Then bail */
 1661:     if (max_sessions == 0)
 1662:         return NULL;
 1663: 
 1664:     SSL_CTX_LOCK(ssl->ssl_ctx->mutex);
 1665:     if (session_id)
 1666:     {
 1667:         for (i = 0; i < max_sessions; i++)
 1668:         {
 1669:             if (ssl_sessions[i])
 1670:             {
 1671:                 /* kill off any expired sessions (including those in 
 1672:                    the future) */
 1673:                 if ((tm > ssl_sessions[i]->conn_time + SSL_EXPIRY_TIME) ||
 1674:                             (tm < ssl_sessions[i]->conn_time))
 1675:                 {
 1676:                     session_free(ssl_sessions, i);
 1677:                     continue;
 1678:                 }
 1679: 
 1680:                 /* if the session id matches, it must still be less than 
 1681:                    the expiry time */
 1682:                 if (memcmp(ssl_sessions[i]->session_id, session_id,
 1683:                                                 SSL_SESSION_ID_SIZE) == 0)
 1684:                 {
 1685:                     ssl->session_index = i;
 1686:                     memcpy(ssl->dc->master_secret, 
 1687:                             ssl_sessions[i]->master_secret, SSL_SECRET_SIZE);
 1688:                     SET_SSL_FLAG(SSL_SESSION_RESUME);
 1689:                     SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
 1690:                     return ssl_sessions[i];  /* a session was found */
 1691:                 }
 1692:             }
 1693:         }
 1694:     }
 1695: 
 1696:     /* If we've got here, no matching session was found - so create one */
 1697:     for (i = 0; i < max_sessions; i++)
 1698:     {
 1699:         if (ssl_sessions[i] == NULL)
 1700:         {
 1701:             /* perfect, this will do */
 1702:             ssl_sessions[i] = (SSL_SESSION *)calloc(1, sizeof(SSL_SESSION));
 1703:             ssl_sessions[i]->conn_time = tm;
 1704:             ssl->session_index = i;
 1705:             SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
 1706:             return ssl_sessions[i]; /* return the session object */
 1707:         }
 1708:         else if (ssl_sessions[i]->conn_time <= oldest_sess_time)
 1709:         {
 1710:             /* find the oldest session */
 1711:             oldest_sess_time = ssl_sessions[i]->conn_time;
 1712:             oldest_sess = ssl_sessions[i];
 1713:             ssl->session_index = i;
 1714:         }
 1715:     }
 1716: 
 1717:     /* ok, we've used up all of our sessions. So blow the oldest session away */
 1718:     oldest_sess->conn_time = tm;
 1719:     memset(oldest_sess->session_id, 0, sizeof(SSL_SESSION_ID_SIZE));
 1720:     memset(oldest_sess->master_secret, 0, sizeof(SSL_SECRET_SIZE));
 1721:     SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
 1722:     return oldest_sess;
 1723: }
 1724: 
 1725: /**
 1726:  * Free an existing session.
 1727:  */
 1728: static void session_free(SSL_SESSION *ssl_sessions[], int sess_index)
 1729: {
 1730:     if (ssl_sessions[sess_index])
 1731:     {
 1732:         free(ssl_sessions[sess_index]);
 1733:         ssl_sessions[sess_index] = NULL;
 1734:     }
 1735: }
 1736: 
 1737: /**
 1738:  * This ssl object doesn't want this session anymore.
 1739:  */
 1740: void kill_ssl_session(SSL_SESSION **ssl_sessions, SSL *ssl)
 1741: {
 1742:     SSL_CTX_LOCK(ssl->ssl_ctx->mutex);
 1743: 
 1744:     if (ssl->ssl_ctx->num_sessions)
 1745:     {
 1746:         session_free(ssl_sessions, ssl->session_index);
 1747:         ssl->session = NULL;
 1748:     }
 1749: 
 1750:     SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
 1751: }
 1752: #endif /* CONFIG_SSL_SKELETON_MODE */
 1753: 
 1754: /*
 1755:  * Get the session id for a handshake. This will be a 32 byte sequence.
 1756:  */
 1757: EXP_FUNC const uint8_t * STDCALL ssl_get_session_id(const SSL *ssl)
 1758: {
 1759:     return ssl->session_id;
 1760: }
 1761: 
 1762: /*
 1763:  * Get the session id size for a handshake. 
 1764:  */
 1765: EXP_FUNC uint8_t STDCALL ssl_get_session_id_size(const SSL *ssl)
 1766: {
 1767:     return ssl->sess_id_size;
 1768: }
 1769: 
 1770: /*
 1771:  * Return the cipher id (in the SSL form).
 1772:  */
 1773: EXP_FUNC uint8_t STDCALL ssl_get_cipher_id(const SSL *ssl)
 1774: {
 1775:     return ssl->cipher;
 1776: }
 1777: 
 1778: /*
 1779:  * Return the status of the handshake.
 1780:  */
 1781: EXP_FUNC int STDCALL ssl_handshake_status(const SSL *ssl)
 1782: {
 1783:     return ssl->hs_status;
 1784: }
 1785: 
 1786: /*
 1787:  * Retrieve various parameters about the SSL engine.
 1788:  */
 1789: EXP_FUNC int STDCALL ssl_get_config(int offset)
 1790: {
 1791:     switch (offset)
 1792:     {
 1793:         /* return the appropriate build mode */
 1794:         case SSL_BUILD_MODE:
 1795: #if defined(CONFIG_SSL_FULL_MODE)
 1796:             return SSL_BUILD_FULL_MODE;
 1797: #elif defined(CONFIG_SSL_ENABLE_CLIENT)
 1798:             return SSL_BUILD_ENABLE_CLIENT;
 1799: #elif defined(CONFIG_ENABLE_VERIFICATION)
 1800:             return SSL_BUILD_ENABLE_VERIFICATION;
 1801: #elif defined(CONFIG_SSL_SERVER_ONLY )
 1802:             return SSL_BUILD_SERVER_ONLY;
 1803: #else 
 1804:             return SSL_BUILD_SKELETON_MODE;
 1805: #endif
 1806: 
 1807:         case SSL_MAX_CERT_CFG_OFFSET:
 1808:             return CONFIG_SSL_MAX_CERTS;
 1809: 
 1810: #ifdef CONFIG_SSL_CERT_VERIFICATION
 1811:         case SSL_MAX_CA_CERT_CFG_OFFSET:
 1812:             return CONFIG_X509_MAX_CA_CERTS;
 1813: #endif
 1814: #ifdef CONFIG_SSL_HAS_PEM
 1815:         case SSL_HAS_PEM:
 1816:             return 1;
 1817: #endif
 1818:         default:
 1819:             return 0;
 1820:     }
 1821: }
 1822: 
 1823: #ifdef CONFIG_SSL_CERT_VERIFICATION
 1824: /**
 1825:  * Authenticate a received certificate.
 1826:  */
 1827: EXP_FUNC int STDCALL ssl_verify_cert(const SSL *ssl)
 1828: {
 1829:     int ret;
 1830:     SSL_CTX_LOCK(ssl->ssl_ctx->mutex);
 1831:     ret = x509_verify(ssl->ssl_ctx->ca_cert_ctx, ssl->x509_ctx);
 1832:     SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
 1833: 
 1834:     if (ret)        /* modify into an SSL error type */
 1835:     {
 1836:         ret = SSL_X509_ERROR(ret);
 1837:     }
 1838: 
 1839:     return ret;
 1840: }
 1841: 
 1842: /**
 1843:  * Process a certificate message.
 1844:  */
 1845: int process_certificate(SSL *ssl, X509_CTX **x509_ctx)
 1846: {
 1847:     int ret = SSL_OK;
 1848:     uint8_t *buf = &ssl->bm_data[ssl->dc->bm_proc_index];
 1849:     int pkt_size = ssl->bm_index;
 1850:     int cert_size, offset = 5;
 1851:     int total_cert_size = (buf[offset]<<8) + buf[offset+1];
 1852:     int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT);
 1853:     X509_CTX **chain = x509_ctx;
 1854:     offset += 2;
 1855: 
 1856:     PARANOIA_CHECK(total_cert_size, offset);
 1857: 
 1858:     while (offset < total_cert_size)
 1859:     {
 1860:         offset++;       /* skip empty char */
 1861:         cert_size = (buf[offset]<<8) + buf[offset+1];
 1862:         offset += 2;
 1863:         
 1864:         if (x509_new(&buf[offset], NULL, chain))
 1865:         {
 1866:             ret = SSL_ERROR_BAD_CERTIFICATE;
 1867:             goto error;
 1868:         }
 1869: 
 1870:         chain = &((*chain)->next);
 1871:         offset += cert_size;
 1872:     }
 1873: 
 1874:     PARANOIA_CHECK(pkt_size, offset);
 1875: 
 1876:     /* if we are client we can do the verify now or later */
 1877:     if (is_client && !IS_SET_SSL_FLAG(SSL_SERVER_VERIFY_LATER))
 1878:     {
 1879:         ret = ssl_verify_cert(ssl);
 1880:     }
 1881: 
 1882:     ssl->next_state = is_client ? HS_SERVER_HELLO_DONE : HS_CLIENT_KEY_XCHG;
 1883:     ssl->dc->bm_proc_index += offset;
 1884: error:
 1885:     return ret;
 1886: }
 1887: 
 1888: #endif /* CONFIG_SSL_CERT_VERIFICATION */
 1889: 
 1890: /**
 1891:  * Debugging routine to display SSL handshaking stuff.
 1892:  */
 1893: #ifdef CONFIG_SSL_FULL_MODE
 1894: /**
 1895:  * Debugging routine to display SSL states.
 1896:  */
 1897: void DISPLAY_STATE(SSL *ssl, int is_send, uint8_t state, int not_ok)
 1898: {
 1899:     const char *str;
 1900: 
 1901:     if (!IS_SET_SSL_FLAG(SSL_DISPLAY_STATES))
 1902:         return;
 1903: 
 1904:     printf(not_ok ? "Error - invalid State:\t" : "State:\t");
 1905:     printf(is_send ? "sending " : "receiving ");
 1906: 
 1907:     switch (state)
 1908:     {
 1909:         case HS_HELLO_REQUEST:
 1910:             str = "Hello Request (0)";
 1911:             break;
 1912: 
 1913:         case HS_CLIENT_HELLO:
 1914:             str = "Client Hello (1)";
 1915:             break;
 1916: 
 1917:         case HS_SERVER_HELLO:
 1918:             str = "Server Hello (2)";
 1919:             break;
 1920: 
 1921:         case HS_CERTIFICATE:
 1922:             str = "Certificate (11)";
 1923:             break;
 1924: 
 1925:         case HS_SERVER_KEY_XCHG:
 1926:             str = "Certificate Request (12)";
 1927:             break;
 1928: 
 1929:         case HS_CERT_REQ:
 1930:             str = "Certificate Request (13)";
 1931:             break;
 1932: 
 1933:         case HS_SERVER_HELLO_DONE:
 1934:             str = "Server Hello Done (14)";
 1935:             break;
 1936: 
 1937:         case HS_CERT_VERIFY:
 1938:             str = "Certificate Verify (15)";
 1939:             break;
 1940: 
 1941:         case HS_CLIENT_KEY_XCHG:
 1942:             str = "Client Key Exchange (16)";
 1943:             break;
 1944: 
 1945:         case HS_FINISHED:
 1946:             str = "Finished (16)";
 1947:             break;
 1948: 
 1949:         default:
 1950:             str = "Error (Unknown)";
 1951:             
 1952:             break;
 1953:     }
 1954: 
 1955:     printf("%s\n", str);
 1956:     TTY_FLUSH();
 1957: }
 1958: 
 1959: /**
 1960:  * Debugging routine to display RSA objects
 1961:  */
 1962: void DISPLAY_RSA(SSL *ssl, const RSA_CTX *rsa_ctx)
 1963: {
 1964:     if (!IS_SET_SSL_FLAG(SSL_DISPLAY_RSA))
 1965:         return;
 1966: 
 1967:     RSA_print(rsa_ctx);
 1968:     TTY_FLUSH();
 1969: }
 1970: 
 1971: /**
 1972:  * Debugging routine to display SSL handshaking bytes.
 1973:  */
 1974: void DISPLAY_BYTES(SSL *ssl, const char *format, 
 1975:         const uint8_t *data, int size, ...)
 1976: {
 1977:     va_list(ap);
 1978: 
 1979:     if (!IS_SET_SSL_FLAG(SSL_DISPLAY_BYTES))
 1980:         return;
 1981: 
 1982:     va_start(ap, size);
 1983:     print_blob(format, data, size, va_arg(ap, char *));
 1984:     va_end(ap);
 1985:     TTY_FLUSH();
 1986: }
 1987: 
 1988: /**
 1989:  * Debugging routine to display SSL handshaking errors.
 1990:  */
 1991: EXP_FUNC void STDCALL ssl_display_error(int error_code)
 1992: {
 1993:     if (error_code == SSL_OK)
 1994:         return;
 1995: 
 1996:     printf("Error: ");
 1997: 
 1998:     /* X509 error? */
 1999:     if (error_code < SSL_X509_OFFSET)
 2000:     {
 2001:         printf("%s\n", x509_display_error(error_code - SSL_X509_OFFSET));
 2002:         return;
 2003:     }
 2004: 
 2005:     /* SSL alert error code */
 2006:     if (error_code > SSL_ERROR_CONN_LOST)
 2007:     {
 2008:         printf("SSL error %d\n", -error_code);
 2009:         return;
 2010:     }
 2011: 
 2012:     switch (error_code)
 2013:     {
 2014:         case SSL_ERROR_DEAD:
 2015:             printf("connection dead");
 2016:             break;
 2017: 
 2018:         case SSL_ERROR_INVALID_HANDSHAKE:
 2019:             printf("invalid handshake");
 2020:             break;
 2021: 
 2022:         case SSL_ERROR_INVALID_PROT_MSG:
 2023:             printf("invalid protocol message");
 2024:             break;
 2025: 
 2026:         case SSL_ERROR_INVALID_HMAC:
 2027:             printf("invalid mac");
 2028:             break;
 2029: 
 2030:         case SSL_ERROR_INVALID_VERSION:
 2031:             printf("invalid version");
 2032:             break;
 2033: 
 2034:         case SSL_ERROR_INVALID_SESSION:
 2035:             printf("invalid session");
 2036:             break;
 2037: 
 2038:         case SSL_ERROR_NO_CIPHER:
 2039:             printf("no cipher");
 2040:             break;
 2041: 
 2042:         case SSL_ERROR_CONN_LOST:
 2043:             printf("connection lost");
 2044:             break;
 2045: 
 2046:         case SSL_ERROR_BAD_CERTIFICATE:
 2047:             printf("bad certificate");
 2048:             break;
 2049: 
 2050:         case SSL_ERROR_INVALID_KEY:
 2051:             printf("invalid key");
 2052:             break;
 2053: 
 2054:         case SSL_ERROR_FINISHED_INVALID:
 2055:             printf("finished invalid");
 2056:             break;
 2057: 
 2058:         case SSL_ERROR_NO_CERT_DEFINED:
 2059:             printf("no certificate defined");
 2060:             break;
 2061: 
 2062:         case SSL_ERROR_NO_CLIENT_RENOG:
 2063:             printf("client renegotiation not supported");
 2064:             break;
 2065:             
 2066:         case SSL_ERROR_NOT_SUPPORTED:
 2067:             printf("Option not supported");
 2068:             break;
 2069: 
 2070:         default:
 2071:             printf("undefined as yet - %d", error_code);
 2072:             break;
 2073:     }
 2074: 
 2075:     printf("\n");
 2076:     TTY_FLUSH();
 2077: }
 2078: 
 2079: /**
 2080:  * Debugging routine to display alerts.
 2081:  */
 2082: void DISPLAY_ALERT(SSL *ssl, int alert)
 2083: {
 2084:     if (!IS_SET_SSL_FLAG(SSL_DISPLAY_STATES))
 2085:         return;
 2086: 
 2087:     printf("Alert: ");
 2088: 
 2089:     switch (alert)
 2090:     {
 2091:         case SSL_ALERT_CLOSE_NOTIFY:
 2092:             printf("close notify");
 2093:             break;
 2094: 
 2095:         case SSL_ALERT_INVALID_VERSION:
 2096:             printf("invalid version");
 2097:             break;
 2098: 
 2099:         case SSL_ALERT_BAD_CERTIFICATE:
 2100:             printf("bad certificate");
 2101:             break;
 2102: 
 2103:         case SSL_ALERT_UNEXPECTED_MESSAGE:
 2104:             printf("unexpected message");
 2105:             break;
 2106: 
 2107:         case SSL_ALERT_BAD_RECORD_MAC:
 2108:             printf("bad record mac");
 2109:             break;
 2110: 
 2111:         case SSL_ALERT_HANDSHAKE_FAILURE:
 2112:             printf("handshake failure");
 2113:             break;
 2114: 
 2115:         case SSL_ALERT_ILLEGAL_PARAMETER:
 2116:             printf("illegal parameter");
 2117:             break;
 2118: 
 2119:         case SSL_ALERT_DECODE_ERROR:
 2120:             printf("decode error");
 2121:             break;
 2122: 
 2123:         case SSL_ALERT_DECRYPT_ERROR:
 2124:             printf("decrypt error");
 2125:             break;
 2126: 
 2127:         case SSL_ALERT_NO_RENEGOTIATION:
 2128:             printf("no renegotiation");
 2129:             break;
 2130: 
 2131:         default:
 2132:             printf("alert - (unknown %d)", alert);
 2133:             break;
 2134:     }
 2135: 
 2136:     printf("\n");
 2137:     TTY_FLUSH();
 2138: }
 2139: 
 2140: #endif /* CONFIG_SSL_FULL_MODE */
 2141: 
 2142: /**
 2143:  * Return the version of this library.
 2144:  */
 2145: EXP_FUNC const char  * STDCALL ssl_version()
 2146: {
 2147:     static const char * axtls_version = AXTLS_VERSION;
 2148:     return axtls_version;
 2149: }
 2150: 
 2151: /**
 2152:  * Enable the various language bindings to work regardless of the
 2153:  * configuration - they just return an error statement and a bad return code.
 2154:  */
 2155: #if !defined(CONFIG_SSL_FULL_MODE)
 2156: EXP_FUNC void STDCALL ssl_display_error(int error_code) {}
 2157: #endif
 2158: 
 2159: #ifdef CONFIG_BINDINGS
 2160: #if !defined(CONFIG_SSL_ENABLE_CLIENT)
 2161: EXP_FUNC SSL * STDCALL ssl_client_new(SSL_CTX *ssl_ctx, int client_fd, const
 2162:         uint8_t *session_id, uint8_t sess_id_size)
 2163: {
 2164:     printf(unsupported_str);
 2165:     return NULL;
 2166: }
 2167: #endif
 2168: 
 2169: #if !defined(CONFIG_SSL_CERT_VERIFICATION)
 2170: EXP_FUNC int STDCALL ssl_verify_cert(const SSL *ssl)
 2171: {
 2172:     printf(unsupported_str);
 2173:     return -1;
 2174: }
 2175: 
 2176: 
 2177: EXP_FUNC const char * STDCALL ssl_get_cert_dn(const SSL *ssl, int component)
 2178: {
 2179:     printf(unsupported_str);
 2180:     return NULL;
 2181: }
 2182: 
 2183: EXP_FUNC const char * STDCALL ssl_get_cert_subject_alt_dnsname(const SSL *ssl, int index)
 2184: {
 2185:     printf(unsupported_str);
 2186:     return NULL;
 2187: }
 2188: 
 2189: #endif  /* CONFIG_SSL_CERT_VERIFICATION */
 2190: 
 2191: #endif /* CONFIG_BINDINGS */
 2192: 

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