Annotation of embedaddon/axTLS/ssl/tls1.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:  * 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>