Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
tls1.c
00001 /* 00002 * Copyright (c) 2007, Cameron Rich 00003 * 00004 * All rights reserved. 00005 * 00006 * Redistribution and use in source and binary forms, with or without 00007 * modification, are permitted provided that the following conditions are met: 00008 * 00009 * * Redistributions of source code must retain the above copyright notice, 00010 * this list of conditions and the following disclaimer. 00011 * * Redistributions in binary form must reproduce the above copyright notice, 00012 * this list of conditions and the following disclaimer in the documentation 00013 * and/or other materials provided with the distribution. 00014 * * Neither the name of the axTLS project nor the names of its contributors 00015 * may be used to endorse or promote products derived from this software 00016 * without specific prior written permission. 00017 * 00018 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00019 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00020 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 00021 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 00022 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00023 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00024 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00025 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00026 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00027 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00028 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00029 */ 00030 00031 /** 00032 * Common ssl/tlsv1 code to both the client and server implementations. 00033 */ 00034 00035 00036 #include <string.h> 00037 #include <stdlib.h> 00038 #include <stdio.h> 00039 #include <stdarg.h> 00040 #include <errno.h> 00041 00042 00043 00044 #include "lwip/sockets.h" 00045 #include "os_port.h" 00046 #include "ssl.h" 00047 #include "arch.h" 00048 00049 00050 /* The session expiry time */ 00051 #define SSL_EXPIRY_TIME (CONFIG_SSL_EXPIRY_TIME*3600) 00052 00053 static const uint8_t g_hello_request[] = { HS_HELLO_REQUEST, 0, 0, 0 }; 00054 static const uint8_t g_chg_cipher_spec_pkt[] = { 1 }; 00055 static const char * server_finished = "server finished"; 00056 static const char * client_finished = "client finished"; 00057 00058 static int do_handshake(SSL *ssl, uint8_t *buf, int read_len); 00059 static int set_key_block(SSL *ssl, int is_write); 00060 static int verify_digest(SSL *ssl, int mode, const uint8_t *buf, int read_len); 00061 static void *crypt_new(SSL *ssl, uint8_t *key, uint8_t *iv, int is_decrypt); 00062 static int send_raw_packet(SSL *ssl, uint8_t protocol); 00063 00064 /** 00065 * The server will pick the cipher based on the order that the order that the 00066 * ciphers are listed. This order is defined at compile time. 00067 */ 00068 #ifdef CONFIG_SSL_SKELETON_MODE 00069 const uint8_t ssl_prot_prefs[NUM_PROTOCOLS] = 00070 { SSL_RC4_128_SHA }; 00071 #else 00072 static void session_free(SSL_SESSION *ssl_sessions[], int sess_index); 00073 00074 const uint8_t ssl_prot_prefs[NUM_PROTOCOLS] = 00075 #ifdef CONFIG_SSL_PROT_LOW /* low security, fast speed */ 00076 { SSL_RC4_128_SHA, SSL_AES128_SHA, SSL_AES256_SHA, SSL_RC4_128_MD5 }; 00077 #elif CONFIG_SSL_PROT_MEDIUM /* medium security, medium speed */ 00078 { SSL_AES128_SHA, SSL_AES256_SHA, SSL_RC4_128_SHA, SSL_RC4_128_MD5 }; 00079 #else /* CONFIG_SSL_PROT_HIGH */ /* high security, low speed */ 00080 { SSL_AES256_SHA, SSL_AES128_SHA, SSL_RC4_128_SHA, SSL_RC4_128_MD5 }; 00081 #endif 00082 #endif /* CONFIG_SSL_SKELETON_MODE */ 00083 00084 /** 00085 * The cipher map containing all the essentials for each cipher. 00086 */ 00087 #ifdef CONFIG_SSL_SKELETON_MODE 00088 static const cipher_info_t cipher_info[NUM_PROTOCOLS] = 00089 { 00090 { /* RC4-SHA */ 00091 SSL_RC4_128_SHA, /* RC4-SHA */ 00092 16, /* key size */ 00093 0, /* iv size */ 00094 2*(SHA1_SIZE+16), /* key block size */ 00095 0, /* no padding */ 00096 SHA1_SIZE, /* digest size */ 00097 hmac_sha1, /* hmac algorithm */ 00098 (crypt_func)RC4_crypt, /* encrypt */ 00099 (crypt_func)RC4_crypt /* decrypt */ 00100 }, 00101 }; 00102 #else 00103 static const cipher_info_t cipher_info[NUM_PROTOCOLS] = 00104 { 00105 { /* AES128-SHA */ 00106 SSL_AES128_SHA, /* AES128-SHA */ 00107 16, /* key size */ 00108 16, /* iv size */ 00109 2*(SHA1_SIZE+16+16), /* key block size */ 00110 16, /* block padding size */ 00111 SHA1_SIZE, /* digest size */ 00112 hmac_sha1, /* hmac algorithm */ 00113 (crypt_func)AES_cbc_encrypt, /* encrypt */ 00114 (crypt_func)AES_cbc_decrypt /* decrypt */ 00115 }, 00116 { /* AES256-SHA */ 00117 SSL_AES256_SHA, /* AES256-SHA */ 00118 32, /* key size */ 00119 16, /* iv size */ 00120 2*(SHA1_SIZE+32+16), /* key block size */ 00121 16, /* block padding size */ 00122 SHA1_SIZE, /* digest size */ 00123 hmac_sha1, /* hmac algorithm */ 00124 (crypt_func)AES_cbc_encrypt, /* encrypt */ 00125 (crypt_func)AES_cbc_decrypt /* decrypt */ 00126 }, 00127 { /* RC4-SHA */ 00128 SSL_RC4_128_SHA, /* RC4-SHA */ 00129 16, /* key size */ 00130 0, /* iv size */ 00131 2*(SHA1_SIZE+16), /* key block size */ 00132 0, /* no padding */ 00133 SHA1_SIZE, /* digest size */ 00134 hmac_sha1, /* hmac algorithm */ 00135 (crypt_func)RC4_crypt, /* encrypt */ 00136 (crypt_func)RC4_crypt /* decrypt */ 00137 }, 00138 /* 00139 * This protocol is from SSLv2 days and is unlikely to be used - but was 00140 * useful for testing different possible digest algorithms. 00141 */ 00142 { /* RC4-MD5 */ 00143 SSL_RC4_128_MD5, /* RC4-MD5 */ 00144 16, /* key size */ 00145 0, /* iv size */ 00146 2*(MD5_SIZE+16), /* key block size */ 00147 0, /* no padding */ 00148 MD5_SIZE, /* digest size */ 00149 hmac_md5, /* hmac algorithm */ 00150 (crypt_func)RC4_crypt, /* encrypt */ 00151 (crypt_func)RC4_crypt /* decrypt */ 00152 }, 00153 }; 00154 #endif 00155 00156 static void prf(const uint8_t *sec, int sec_len, uint8_t *seed, int seed_len, 00157 uint8_t *out, int olen); 00158 static const cipher_info_t *get_cipher_info(uint8_t cipher); 00159 static void increment_read_sequence(SSL *ssl); 00160 static void increment_write_sequence(SSL *ssl); 00161 static void add_hmac_digest(SSL *ssl, int snd, uint8_t *hmac_header, 00162 const uint8_t *buf, int buf_len, uint8_t *hmac_buf); 00163 00164 /* win32 VC6.0 doesn't have variadic macros */ 00165 #if defined(WIN32) && !defined(CONFIG_SSL_FULL_MODE) 00166 void DISPLAY_BYTES(SSL *ssl, const char *format, 00167 const uint8_t *data, int size, ...) {} 00168 #endif 00169 00170 /** 00171 * Establish a new client/server context. 00172 */ 00173 EXP_FUNC SSL_CTX *STDCALL ssl_ctx_new(SSL_CTX *ssl_ctx, uint32_t options, int num_sessions) 00174 { 00175 ssl_ctx->options = options; 00176 RNG_initialize(); 00177 00178 if (load_key_certs(ssl_ctx) < 0) 00179 { 00180 printf("error loading key certs\r\n"); 00181 //free(ssl_ctx); /* can't load our key/certificate pair, so die */ 00182 return NULL; 00183 } 00184 00185 #ifndef CONFIG_SSL_SKELETON_MODE 00186 ssl_ctx->num_sessions = num_sessions; 00187 #endif 00188 00189 SSL_CTX_MUTEX_INIT(ssl_ctx->mutex); 00190 00191 #ifndef CONFIG_SSL_SKELETON_MODE 00192 if (num_sessions) 00193 { 00194 ssl_ctx->ssl_sessions = (SSL_SESSION **) 00195 calloc(1, num_sessions*sizeof(SSL_SESSION *)); 00196 } 00197 #endif 00198 00199 return ssl_ctx; 00200 } 00201 00202 /* 00203 * Remove a client/server context. 00204 */ 00205 EXP_FUNC void STDCALL ssl_ctx_free(SSL_CTX *ssl_ctx) 00206 { 00207 SSL *ssl; 00208 int i; 00209 00210 if (ssl_ctx == NULL) 00211 return; 00212 00213 ssl = ssl_ctx->head; 00214 00215 /* clear out all the ssl entries */ 00216 while (ssl) 00217 { 00218 SSL *next = ssl->next; 00219 ssl_free(ssl); 00220 ssl = next; 00221 } 00222 00223 #ifndef CONFIG_SSL_SKELETON_MODE 00224 /* clear out all the sessions */ 00225 for (i = 0; i < ssl_ctx->num_sessions; i++) 00226 session_free(ssl_ctx->ssl_sessions, i); 00227 00228 free(ssl_ctx->ssl_sessions); 00229 #endif 00230 00231 i = 0; 00232 //while (i < CONFIG_SSL_MAX_CERTS && ssl_ctx->certs[i].buf) 00233 { 00234 //free(ssl_ctx->certs[i].buf); 00235 //ssl_ctx->certs[i++].buf = NULL; 00236 } 00237 00238 #ifdef CONFIG_SSL_CERT_VERIFICATION 00239 remove_ca_certs(ssl_ctx->ca_cert_ctx); 00240 #endif 00241 ssl_ctx->chain_length = 0; 00242 SSL_CTX_MUTEX_DESTROY(ssl_ctx->mutex); 00243 RSA_free(ssl_ctx->rsa_ctx); 00244 RNG_terminate(); 00245 //free(ssl_ctx); 00246 } 00247 00248 /* 00249 * Free any used resources used by this connection. 00250 */ 00251 EXP_FUNC void STDCALL ssl_free(SSL *ssl) 00252 { 00253 SSL_CTX *ssl_ctx; 00254 00255 if (ssl == NULL) /* just ignore null pointers */ 00256 return; 00257 00258 /* only notify if we weren't notified first */ 00259 /* spec says we must notify when we are dying */ 00260 if (!IS_SET_SSL_FLAG(SSL_SENT_CLOSE_NOTIFY)) 00261 send_alert(ssl, SSL_ALERT_CLOSE_NOTIFY); 00262 00263 ssl_ctx = ssl->ssl_ctx; 00264 00265 SSL_CTX_LOCK(ssl_ctx->mutex); 00266 00267 /* adjust the server SSL list */ 00268 if (ssl->prev) 00269 ssl->prev->next = ssl->next; 00270 else 00271 ssl_ctx->head = ssl->next; 00272 00273 if (ssl->next) 00274 ssl->next->prev = ssl->prev; 00275 else 00276 ssl_ctx->tail = ssl->prev; 00277 00278 SSL_CTX_UNLOCK(ssl_ctx->mutex); 00279 00280 /* may already be free - but be sure */ 00281 free(ssl->encrypt_ctx); 00282 free(ssl->decrypt_ctx); 00283 disposable_free(ssl); 00284 00285 #ifdef CONFIG_SSL_CERT_VERIFICATION 00286 x509_free(ssl->x509_ctx); 00287 #endif 00288 //free(ssl->ssl_ctx); 00289 //free(ssl); 00290 } 00291 00292 /* 00293 * Write application data to the client 00294 */ 00295 EXP_FUNC int STDCALL ssl_write(SSL *ssl, const uint8_t *out_data, int out_len) 00296 { 00297 int n = out_len, nw, i, tot = 0; 00298 00299 /* maximum size of a TLS packet is around 16kB, so fragment */ 00300 do 00301 { 00302 nw = n; 00303 00304 if (nw > RT_MAX_PLAIN_LENGTH) /* fragment if necessary */ 00305 nw = RT_MAX_PLAIN_LENGTH; 00306 00307 if ((i = send_packet(ssl, PT_APP_PROTOCOL_DATA, 00308 &out_data[tot], nw)) <= 0) 00309 { 00310 out_len = i; /* an error */ 00311 break; 00312 } 00313 00314 tot += i; 00315 n -= i; 00316 } while (n > 0); 00317 00318 return out_len; 00319 } 00320 00321 /** 00322 * Add a certificate to the certificate chain. 00323 */ 00324 int add_cert(SSL_CTX *ssl_ctx, const uint8_t *buf, int len) 00325 { 00326 int ret = SSL_ERROR_NO_CERT_DEFINED, i = 0; 00327 SSL_CERT *ssl_cert; 00328 X509_CTX *cert = NULL; 00329 int offset; 00330 00331 while (ssl_ctx->certs[i].buf && i < CONFIG_SSL_MAX_CERTS) 00332 i++; 00333 00334 if (i == CONFIG_SSL_MAX_CERTS) /* too many certs */ 00335 { 00336 #ifdef CONFIG_SSL_FULL_MODE 00337 printf("Error: maximum number of certs added (%d) - change of " 00338 "compile-time configuration required\n", 00339 CONFIG_SSL_MAX_CERTS); 00340 #endif 00341 goto error; 00342 } 00343 00344 if ((ret = x509_new(buf, &offset, &cert))) 00345 goto error; 00346 00347 #if defined (CONFIG_SSL_FULL_MODE) 00348 if (ssl_ctx->options & SSL_DISPLAY_CERTS) 00349 x509_print(cert, NULL); 00350 #endif 00351 00352 ssl_cert = &ssl_ctx->certs[i]; 00353 ssl_cert->size = len; 00354 ssl_cert->buf = buf; 00355 ssl_ctx->chain_length++; 00356 len -= offset; 00357 ret = SSL_OK; /* ok so far */ 00358 00359 /* recurse? */ 00360 if (len > 0) 00361 { 00362 ret = add_cert(ssl_ctx, &buf[offset], len); 00363 } 00364 00365 error: 00366 x509_free(cert); /* don't need anymore */ 00367 return ret; 00368 } 00369 00370 #ifdef CONFIG_SSL_CERT_VERIFICATION 00371 /** 00372 * Add a certificate authority. 00373 */ 00374 int add_cert_auth(SSL_CTX *ssl_ctx, const uint8_t *buf, int len) 00375 { 00376 int ret = SSL_OK; /* ignore errors for now */ 00377 int i = 0; 00378 CA_CERT_CTX *ca_cert_ctx; 00379 00380 if (ssl_ctx->ca_cert_ctx == NULL) 00381 ssl_ctx->ca_cert_ctx = (CA_CERT_CTX *)calloc(1, sizeof(CA_CERT_CTX)); 00382 00383 ca_cert_ctx = ssl_ctx->ca_cert_ctx; 00384 00385 while (i < CONFIG_X509_MAX_CA_CERTS && ca_cert_ctx->cert[i]) 00386 i++; 00387 00388 while (len > 0) 00389 { 00390 int offset; 00391 if (i >= CONFIG_X509_MAX_CA_CERTS) 00392 { 00393 #ifdef CONFIG_SSL_FULL_MODE 00394 printf("Error: maximum number of CA certs added (%d) - change of " 00395 "compile-time configuration required\n", 00396 CONFIG_X509_MAX_CA_CERTS); 00397 #endif 00398 break; 00399 } 00400 00401 00402 /* ignore the return code */ 00403 if (x509_new(buf, &offset, &ca_cert_ctx->cert[i]) == X509_OK) 00404 { 00405 #if defined (CONFIG_SSL_FULL_MODE) 00406 if (ssl_ctx->options & SSL_DISPLAY_CERTS) 00407 x509_print(ca_cert_ctx->cert[i], NULL); 00408 #endif 00409 } 00410 00411 i++; 00412 len -= offset; 00413 } 00414 00415 return ret; 00416 } 00417 00418 /* 00419 * Retrieve an X.509 distinguished name component 00420 */ 00421 EXP_FUNC const char * STDCALL ssl_get_cert_dn(const SSL *ssl, int component) 00422 { 00423 if (ssl->x509_ctx == NULL) 00424 return NULL; 00425 00426 switch (component) 00427 { 00428 case SSL_X509_CERT_COMMON_NAME: 00429 return ssl->x509_ctx->cert_dn[X509_COMMON_NAME]; 00430 00431 case SSL_X509_CERT_ORGANIZATION: 00432 return ssl->x509_ctx->cert_dn[X509_ORGANIZATION]; 00433 00434 case SSL_X509_CERT_ORGANIZATIONAL_NAME: 00435 return ssl->x509_ctx->cert_dn[X509_ORGANIZATIONAL_UNIT]; 00436 00437 case SSL_X509_CA_CERT_COMMON_NAME: 00438 return ssl->x509_ctx->ca_cert_dn[X509_COMMON_NAME]; 00439 00440 case SSL_X509_CA_CERT_ORGANIZATION: 00441 return ssl->x509_ctx->ca_cert_dn[X509_ORGANIZATION]; 00442 00443 case SSL_X509_CA_CERT_ORGANIZATIONAL_NAME: 00444 return ssl->x509_ctx->ca_cert_dn[X509_ORGANIZATIONAL_UNIT]; 00445 00446 default: 00447 return NULL; 00448 } 00449 } 00450 00451 /* 00452 * Retrieve a "Subject Alternative Name" from a v3 certificate 00453 */ 00454 EXP_FUNC const char * STDCALL ssl_get_cert_subject_alt_dnsname(const SSL *ssl, 00455 int dnsindex) 00456 { 00457 int i; 00458 00459 if (ssl->x509_ctx == NULL || ssl->x509_ctx->subject_alt_dnsnames == NULL) 00460 return NULL; 00461 00462 for (i = 0; i < dnsindex; ++i) 00463 { 00464 if (ssl->x509_ctx->subject_alt_dnsnames[i] == NULL) 00465 return NULL; 00466 } 00467 00468 return ssl->x509_ctx->subject_alt_dnsnames[dnsindex]; 00469 } 00470 00471 #endif /* CONFIG_SSL_CERT_VERIFICATION */ 00472 00473 /* 00474 * Find an ssl object based on the client's file descriptor. 00475 */ 00476 EXP_FUNC SSL * STDCALL ssl_find(SSL_CTX *ssl_ctx, int client_fd) 00477 { 00478 SSL *ssl; 00479 00480 SSL_CTX_LOCK(ssl_ctx->mutex); 00481 ssl = ssl_ctx->head; 00482 00483 /* search through all the ssl entries */ 00484 while (ssl) 00485 { 00486 if (ssl->client_fd == client_fd) 00487 { 00488 SSL_CTX_UNLOCK(ssl_ctx->mutex); 00489 return ssl; 00490 } 00491 00492 ssl = ssl->next; 00493 } 00494 00495 SSL_CTX_UNLOCK(ssl_ctx->mutex); 00496 return NULL; 00497 } 00498 00499 /* 00500 * Force the client to perform its handshake again. 00501 */ 00502 EXP_FUNC int STDCALL ssl_renegotiate(SSL *ssl) 00503 { 00504 int ret = SSL_OK; 00505 00506 disposable_new(ssl); 00507 #ifdef CONFIG_SSL_ENABLE_CLIENT 00508 if (IS_SET_SSL_FLAG(SSL_IS_CLIENT)) 00509 { 00510 ret = do_client_connect(ssl); 00511 } 00512 else 00513 #endif 00514 { 00515 send_packet(ssl, PT_HANDSHAKE_PROTOCOL, 00516 g_hello_request, sizeof(g_hello_request)); 00517 SET_SSL_FLAG(SSL_NEED_RECORD); 00518 } 00519 00520 return ret; 00521 } 00522 00523 /** 00524 * @brief Get what we need for key info. 00525 * @param cipher [in] The cipher information we are after 00526 * @param key_size [out] The key size for the cipher 00527 * @param iv_size [out] The iv size for the cipher 00528 * @return The amount of key information we need. 00529 */ 00530 static const cipher_info_t *get_cipher_info(uint8_t cipher) 00531 { 00532 int i; 00533 00534 for (i = 0; i < NUM_PROTOCOLS; i++) 00535 { 00536 if (cipher_info[i].cipher == cipher) 00537 { 00538 return &cipher_info[i]; 00539 } 00540 } 00541 00542 return NULL; /* error */ 00543 } 00544 00545 /* 00546 * Get a new ssl context for a new connection. 00547 */ 00548 SSL *ssl_new(SSL *ssl, int client_fd) 00549 { 00550 SSL_CTX* ssl_ctx = ssl->ssl_ctx; 00551 ssl->need_bytes = SSL_RECORD_SIZE; /* need a record */ 00552 ssl->client_fd = 0; 00553 ssl->flag = SSL_NEED_RECORD; 00554 ssl->bm_data = ssl->bm_all_data + BM_RECORD_OFFSET; 00555 ssl->bm_read_index = 0; 00556 ssl->hs_status = SSL_NOT_OK; /* not connected */ 00557 #ifdef CONFIG_ENABLE_VERIFICATION 00558 ssl->ca_cert_ctx = ssl_ctx->ca_cert_ctx; 00559 #endif 00560 disposable_new(ssl); 00561 00562 /* a bit hacky but saves a few bytes of memory */ 00563 ssl->flag |= ssl_ctx->options; 00564 SSL_CTX_LOCK(ssl_ctx->mutex); 00565 00566 if (ssl_ctx->head == NULL) 00567 { 00568 ssl_ctx->head = ssl; 00569 ssl_ctx->tail = ssl; 00570 } 00571 else 00572 { 00573 ssl->prev = ssl_ctx->tail; 00574 ssl_ctx->tail->next = ssl; 00575 ssl_ctx->tail = ssl; 00576 } 00577 ssl->encrypt_ctx = NULL; 00578 ssl->decrypt_ctx = NULL; 00579 00580 SSL_CTX_UNLOCK(ssl_ctx->mutex); 00581 return ssl; 00582 } 00583 00584 /* 00585 * Add a private key to a context. 00586 */ 00587 int add_private_key(SSL_CTX *ssl_ctx, SSLObjLoader *ssl_obj) 00588 { 00589 int ret = SSL_OK; 00590 00591 /* get the private key details */ 00592 if (asn1_get_private_key(ssl_obj->buf, ssl_obj->len, &ssl_ctx->rsa_ctx)) 00593 { 00594 ret = SSL_ERROR_INVALID_KEY; 00595 goto error; 00596 } 00597 00598 error: 00599 return ret; 00600 } 00601 00602 /** 00603 * Increment the read sequence number (as a 64 bit endian indepenent #) 00604 */ 00605 static void increment_read_sequence(SSL *ssl) 00606 { 00607 int i; 00608 00609 for (i = 7; i >= 0; i--) 00610 { 00611 if (++ssl->read_sequence[i]) 00612 break; 00613 } 00614 } 00615 00616 /** 00617 * Increment the read sequence number (as a 64 bit endian indepenent #) 00618 */ 00619 static void increment_write_sequence(SSL *ssl) 00620 { 00621 int i; 00622 00623 for (i = 7; i >= 0; i--) 00624 { 00625 if (++ssl->write_sequence[i]) 00626 break; 00627 } 00628 } 00629 00630 /** 00631 * Work out the HMAC digest in a packet. 00632 */ 00633 static void add_hmac_digest(SSL *ssl, int mode, uint8_t *hmac_header, 00634 const uint8_t *buf, int buf_len, uint8_t *hmac_buf) 00635 { 00636 int hmac_len = buf_len + 8 + SSL_RECORD_SIZE; 00637 uint8_t *t_buf = (uint8_t *)alloca(hmac_len+10); 00638 00639 memcpy(t_buf, (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_WRITE) ? 00640 ssl->write_sequence : ssl->read_sequence, 8); 00641 memcpy(&t_buf[8], hmac_header, SSL_RECORD_SIZE); 00642 memcpy(&t_buf[8+SSL_RECORD_SIZE], buf, buf_len); 00643 00644 ssl->cipher_info->hmac(t_buf, hmac_len, 00645 (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_READ) ? 00646 ssl->server_mac : ssl->client_mac, 00647 ssl->cipher_info->digest_size, hmac_buf); 00648 00649 #if 0 00650 print_blob("record", hmac_header, SSL_RECORD_SIZE); 00651 print_blob("buf", buf, buf_len); 00652 if (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_WRITE) 00653 { 00654 print_blob("write seq", ssl->write_sequence, 8); 00655 } 00656 else 00657 { 00658 print_blob("read seq", ssl->read_sequence, 8); 00659 } 00660 00661 if (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_READ) 00662 { 00663 print_blob("server mac", 00664 ssl->server_mac, ssl->cipher_info->digest_size); 00665 } 00666 else 00667 { 00668 print_blob("client mac", 00669 ssl->client_mac, ssl->cipher_info->digest_size); 00670 } 00671 print_blob("hmac", hmac_buf, SHA1_SIZE); 00672 #endif 00673 } 00674 00675 /** 00676 * Verify that the digest of a packet is correct. 00677 */ 00678 static int verify_digest(SSL *ssl, int mode, const uint8_t *buf, int read_len) 00679 { 00680 uint8_t hmac_buf[SHA1_SIZE]; 00681 int hmac_offset; 00682 00683 if (ssl->cipher_info->padding_size) 00684 { 00685 int last_blk_size = buf[read_len-1], i; 00686 hmac_offset = read_len-last_blk_size-ssl->cipher_info->digest_size-1; 00687 00688 /* guard against a timing attack - make sure we do the digest */ 00689 if (hmac_offset < 0) 00690 { 00691 hmac_offset = 0; 00692 } 00693 else 00694 { 00695 /* already looked at last byte */ 00696 for (i = 1; i < last_blk_size; i++) 00697 { 00698 if (buf[read_len-i] != last_blk_size) 00699 { 00700 hmac_offset = 0; 00701 break; 00702 } 00703 } 00704 } 00705 } 00706 else /* stream cipher */ 00707 { 00708 hmac_offset = read_len - ssl->cipher_info->digest_size; 00709 00710 if (hmac_offset < 0) 00711 { 00712 hmac_offset = 0; 00713 } 00714 } 00715 00716 /* sanity check the offset */ 00717 ssl->hmac_header[3] = hmac_offset >> 8; /* insert size */ 00718 ssl->hmac_header[4] = hmac_offset & 0xff; 00719 add_hmac_digest(ssl, mode, ssl->hmac_header, buf, hmac_offset, hmac_buf); 00720 00721 if (memcmp(hmac_buf, &buf[hmac_offset], ssl->cipher_info->digest_size)) 00722 { 00723 return SSL_ERROR_INVALID_HMAC; 00724 } 00725 00726 return hmac_offset; 00727 } 00728 00729 /** 00730 * Add a packet to the end of our sent and received packets, so that we may use 00731 * it to calculate the hash at the end. 00732 */ 00733 void add_packet(SSL *ssl, const uint8_t *pkt, int len) 00734 { 00735 MD5_Update(&ssl->dc->md5_ctx, pkt, len); 00736 SHA1_Update(&ssl->dc->sha1_ctx, pkt, len); 00737 } 00738 00739 /** 00740 * Work out the MD5 PRF. 00741 */ 00742 static void p_hash_md5(const uint8_t *sec, int sec_len, 00743 uint8_t *seed, int seed_len, uint8_t *out, int olen) 00744 { 00745 uint8_t a1[128]; 00746 00747 /* A(1) */ 00748 hmac_md5(seed, seed_len, sec, sec_len, a1); 00749 memcpy(&a1[MD5_SIZE], seed, seed_len); 00750 hmac_md5(a1, MD5_SIZE+seed_len, sec, sec_len, out); 00751 00752 while (olen > MD5_SIZE) 00753 { 00754 uint8_t a2[MD5_SIZE]; 00755 out += MD5_SIZE; 00756 olen -= MD5_SIZE; 00757 00758 /* A(N) */ 00759 hmac_md5(a1, MD5_SIZE, sec, sec_len, a2); 00760 memcpy(a1, a2, MD5_SIZE); 00761 00762 /* work out the actual hash */ 00763 hmac_md5(a1, MD5_SIZE+seed_len, sec, sec_len, out); 00764 } 00765 } 00766 00767 /** 00768 * Work out the SHA1 PRF. 00769 */ 00770 static void p_hash_sha1(const uint8_t *sec, int sec_len, 00771 uint8_t *seed, int seed_len, uint8_t *out, int olen) 00772 { 00773 uint8_t a1[128]; 00774 00775 /* A(1) */ 00776 hmac_sha1(seed, seed_len, sec, sec_len, a1); 00777 memcpy(&a1[SHA1_SIZE], seed, seed_len); 00778 hmac_sha1(a1, SHA1_SIZE+seed_len, sec, sec_len, out); 00779 00780 while (olen > SHA1_SIZE) 00781 { 00782 uint8_t a2[SHA1_SIZE]; 00783 out += SHA1_SIZE; 00784 olen -= SHA1_SIZE; 00785 00786 /* A(N) */ 00787 hmac_sha1(a1, SHA1_SIZE, sec, sec_len, a2); 00788 memcpy(a1, a2, SHA1_SIZE); 00789 00790 /* work out the actual hash */ 00791 hmac_sha1(a1, SHA1_SIZE+seed_len, sec, sec_len, out); 00792 } 00793 } 00794 00795 /** 00796 * Work out the PRF. 00797 */ 00798 static void prf(const uint8_t *sec, int sec_len, uint8_t *seed, int seed_len, 00799 uint8_t *out, int olen) 00800 { 00801 int len, i; 00802 const uint8_t *S1, *S2; 00803 uint8_t xbuf[256]; /* needs to be > the amount of key data */ 00804 uint8_t ybuf[256]; /* needs to be > the amount of key data */ 00805 00806 len = sec_len/2; 00807 S1 = sec; 00808 S2 = &sec[len]; 00809 len += (sec_len & 1); /* add for odd, make longer */ 00810 00811 p_hash_md5(S1, len, seed, seed_len, xbuf, olen); 00812 p_hash_sha1(S2, len, seed, seed_len, ybuf, olen); 00813 00814 for (i = 0; i < olen; i++) 00815 out[i] = xbuf[i] ^ ybuf[i]; 00816 } 00817 00818 /** 00819 * Generate a master secret based on the client/server random data and the 00820 * premaster secret. 00821 */ 00822 void generate_master_secret(SSL *ssl, const uint8_t *premaster_secret) 00823 { 00824 uint8_t buf[128]; /* needs to be > 13+32+32 in size */ 00825 strcpy((char *)buf, "master secret"); 00826 memcpy(&buf[13], ssl->dc->client_random, SSL_RANDOM_SIZE); 00827 memcpy(&buf[45], ssl->dc->server_random, SSL_RANDOM_SIZE); 00828 prf(premaster_secret, SSL_SECRET_SIZE, buf, 77, ssl->dc->master_secret, 00829 SSL_SECRET_SIZE); 00830 } 00831 00832 /** 00833 * Generate a 'random' blob of data used for the generation of keys. 00834 */ 00835 static void generate_key_block(uint8_t *client_random, uint8_t *server_random, 00836 uint8_t *master_secret, uint8_t *key_block, int key_block_size) 00837 { 00838 uint8_t buf[128]; 00839 strcpy((char *)buf, "key expansion"); 00840 memcpy(&buf[13], server_random, SSL_RANDOM_SIZE); 00841 memcpy(&buf[45], client_random, SSL_RANDOM_SIZE); 00842 prf(master_secret, SSL_SECRET_SIZE, buf, 77, key_block, key_block_size); 00843 } 00844 00845 /** 00846 * Calculate the digest used in the finished message. This function also 00847 * doubles up as a certificate verify function. 00848 */ 00849 void finished_digest(SSL *ssl, const char *label, uint8_t *digest) 00850 { 00851 uint8_t mac_buf[128]; 00852 uint8_t *q = mac_buf; 00853 MD5_CTX md5_ctx = ssl->dc->md5_ctx; 00854 SHA1_CTX sha1_ctx = ssl->dc->sha1_ctx; 00855 00856 if (label) 00857 { 00858 strcpy((char *)q, label); 00859 q += strlen(label); 00860 } 00861 00862 MD5_Final(q, &md5_ctx); 00863 q += MD5_SIZE; 00864 00865 SHA1_Final(q, &sha1_ctx); 00866 q += SHA1_SIZE; 00867 00868 if (label) 00869 { 00870 prf(ssl->dc->master_secret, SSL_SECRET_SIZE, mac_buf, (int)(q-mac_buf), 00871 digest, SSL_FINISHED_HASH_SIZE); 00872 } 00873 else /* for use in a certificate verify */ 00874 { 00875 memcpy(digest, mac_buf, MD5_SIZE + SHA1_SIZE); 00876 } 00877 00878 #if 0 00879 printf("label: %s\r\n", label); 00880 print_blob("master secret", ssl->dc->master_secret, 48); 00881 print_blob("mac_buf", mac_buf, q-mac_buf); 00882 print_blob("finished digest", digest, SSL_FINISHED_HASH_SIZE); 00883 #endif 00884 } 00885 00886 /** 00887 * Retrieve (and initialise) the context of a cipher. 00888 */ 00889 static void *crypt_new(SSL *ssl, uint8_t *key, uint8_t *iv, int is_decrypt) 00890 { 00891 switch (ssl->cipher) 00892 { 00893 #ifndef CONFIG_SSL_SKELETON_MODE 00894 case SSL_AES128_SHA: 00895 { 00896 AES_CTX *aes_ctx = (AES_CTX *)malloc(sizeof(AES_CTX)); 00897 AES_set_key(aes_ctx, key, iv, AES_MODE_128); 00898 00899 if (is_decrypt) 00900 { 00901 AES_convert_key(aes_ctx); 00902 } 00903 00904 return (void *)aes_ctx; 00905 } 00906 00907 case SSL_AES256_SHA: 00908 { 00909 AES_CTX *aes_ctx = (AES_CTX *)malloc(sizeof(AES_CTX)); 00910 AES_set_key(aes_ctx, key, iv, AES_MODE_256); 00911 00912 if (is_decrypt) 00913 { 00914 AES_convert_key(aes_ctx); 00915 } 00916 00917 return (void *)aes_ctx; 00918 } 00919 00920 case SSL_RC4_128_MD5: 00921 #endif 00922 case SSL_RC4_128_SHA: 00923 { 00924 RC4_CTX *rc4_ctx = (RC4_CTX *)malloc(sizeof(RC4_CTX)); 00925 RC4_setup(rc4_ctx, key, 16); 00926 return (void *)rc4_ctx; 00927 } 00928 } 00929 00930 return NULL; /* its all gone wrong */ 00931 } 00932 00933 00934 /** 00935 * Send a packet over the socket. 00936 */ 00937 static int send_raw_packet(SSL *ssl, uint8_t protocol) 00938 { 00939 uint8_t *rec_buf = ssl->bm_all_data; 00940 int pkt_size = SSL_RECORD_SIZE+ssl->bm_index; 00941 int sent = 0; 00942 int ret = SSL_OK; 00943 rec_buf[0] = protocol; 00944 rec_buf[1] = 0x03; /* version = 3.1 or higher */ 00945 rec_buf[2] = ssl->version & 0x0f; 00946 rec_buf[3] = ssl->bm_index >> 8; 00947 rec_buf[4] = ssl->bm_index & 0xff; 00948 00949 DISPLAY_BYTES(ssl, "sending %d bytes", ssl->bm_all_data, 00950 pkt_size, pkt_size); 00951 00952 00953 00954 while (sent < pkt_size) 00955 { 00956 ret = SOCKET_WRITE(ssl->client_fd, 00957 &ssl->bm_all_data[sent], pkt_size-sent); 00958 if (ret >= 0) 00959 sent += ret; 00960 else 00961 { 00962 00963 #ifdef WIN32 00964 if (GetLastError() != WSAEWOULDBLOCK) 00965 #else 00966 if (errno != EAGAIN && errno != EWOULDBLOCK) 00967 #endif 00968 return SSL_ERROR_CONN_LOST; 00969 } 00970 00971 /* keep going until the write buffer has some space */ 00972 if (sent != pkt_size) 00973 { 00974 fd_set wfds; 00975 FD_ZERO(&wfds); 00976 FD_SET(ssl->client_fd, &wfds); 00977 00978 /* block and wait for it */ 00979 if (lwip_select(FD_SETSIZE, NULL, &wfds, NULL, NULL) < 0) 00980 return SSL_ERROR_CONN_LOST; 00981 00982 } 00983 } 00984 fd_set wfds; 00985 FD_ZERO(&wfds); 00986 FD_SET(ssl->client_fd, &wfds); 00987 00988 /* block and wait for it */ 00989 if (lwip_select(FD_SETSIZE, NULL, &wfds, NULL, NULL) < 0) 00990 return SSL_ERROR_CONN_LOST; 00991 00992 SET_SSL_FLAG(SSL_NEED_RECORD); /* reset for next time */ 00993 ssl->bm_index = 0; 00994 00995 if (protocol != PT_APP_PROTOCOL_DATA) 00996 { 00997 /* always return SSL_OK during handshake */ 00998 ret = SSL_OK; 00999 } 01000 01001 return ret; 01002 } 01003 01004 /** 01005 * Send an encrypted packet with padding bytes if necessary. 01006 */ 01007 int send_packet(SSL *ssl, uint8_t protocol, const uint8_t *in, int length) 01008 { 01009 int ret, msg_length = 0; 01010 01011 /* if our state is bad, don't bother */ 01012 if (ssl->hs_status == SSL_ERROR_DEAD) 01013 return SSL_ERROR_CONN_LOST; 01014 01015 if (in) /* has the buffer already been initialised? */ 01016 { 01017 memcpy(ssl->bm_data, in, length); 01018 } 01019 01020 msg_length += length; 01021 01022 if (IS_SET_SSL_FLAG(SSL_TX_ENCRYPTED)) 01023 { 01024 int mode = IS_SET_SSL_FLAG(SSL_IS_CLIENT) ? 01025 SSL_CLIENT_WRITE : SSL_SERVER_WRITE; 01026 uint8_t hmac_header[SSL_RECORD_SIZE] = 01027 { 01028 protocol, 01029 0x03, /* version = 3.1 or higher */ 01030 ssl->version & 0x0f, 01031 msg_length >> 8, 01032 msg_length & 0xff 01033 }; 01034 01035 if (protocol == PT_HANDSHAKE_PROTOCOL) 01036 { 01037 DISPLAY_STATE(ssl, 1, ssl->bm_data[0], 0); 01038 01039 if (ssl->bm_data[0] != HS_HELLO_REQUEST) 01040 { 01041 add_packet(ssl, ssl->bm_data, msg_length); 01042 } 01043 } 01044 01045 /* add the packet digest */ 01046 add_hmac_digest(ssl, mode, hmac_header, ssl->bm_data, msg_length, 01047 &ssl->bm_data[msg_length]); 01048 msg_length += ssl->cipher_info->digest_size; 01049 01050 /* add padding? */ 01051 if (ssl->cipher_info->padding_size) 01052 { 01053 int last_blk_size = msg_length%ssl->cipher_info->padding_size; 01054 int pad_bytes = ssl->cipher_info->padding_size - last_blk_size; 01055 01056 /* ensure we always have at least 1 padding byte */ 01057 if (pad_bytes == 0) 01058 pad_bytes += ssl->cipher_info->padding_size; 01059 01060 memset(&ssl->bm_data[msg_length], pad_bytes-1, pad_bytes); 01061 msg_length += pad_bytes; 01062 } 01063 01064 DISPLAY_BYTES(ssl, "unencrypted write", ssl->bm_data, msg_length); 01065 increment_write_sequence(ssl); 01066 01067 /* add the explicit IV for TLS1.1 */ 01068 if (ssl->version >= SSL_PROTOCOL_VERSION1_1 && 01069 ssl->cipher_info->iv_size) 01070 { 01071 uint8_t iv_size = ssl->cipher_info->iv_size; 01072 uint8_t *t_buf = alloca(msg_length + iv_size); 01073 memcpy(t_buf + iv_size, ssl->bm_data, msg_length); 01074 get_random(iv_size, t_buf); 01075 msg_length += iv_size; 01076 memcpy(ssl->bm_data, t_buf, msg_length); 01077 } 01078 01079 /* now encrypt the packet */ 01080 ssl->cipher_info->encrypt(ssl->encrypt_ctx, ssl->bm_data, 01081 ssl->bm_data, msg_length); 01082 } 01083 else if (protocol == PT_HANDSHAKE_PROTOCOL) 01084 { 01085 DISPLAY_STATE(ssl, 1, ssl->bm_data[0], 0); 01086 01087 if (ssl->bm_data[0] != HS_HELLO_REQUEST) 01088 { 01089 add_packet(ssl, ssl->bm_data, length); 01090 } 01091 } 01092 01093 ssl->bm_index = msg_length; 01094 if ((ret = send_raw_packet(ssl, protocol)) <= 0) 01095 return ret; 01096 01097 return length; /* just return what we wanted to send */ 01098 } 01099 01100 /** 01101 * Work out the cipher keys we are going to use for this session based on the 01102 * master secret. 01103 */ 01104 static int set_key_block(SSL *ssl, int is_write) 01105 { 01106 const cipher_info_t *ciph_info = get_cipher_info(ssl->cipher); 01107 uint8_t *q; 01108 uint8_t client_key[32], server_key[32]; /* big enough for AES256 */ 01109 uint8_t client_iv[16], server_iv[16]; /* big enough for AES128/256 */ 01110 int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT); 01111 01112 if (ciph_info == NULL) 01113 return -1; 01114 01115 uint8_t key_tmp[MAX_KEYBLOCK_SIZE] = {0}; 01116 /* only do once in a handshake */ 01117 if (memcmp(ssl->dc->key_block, key_tmp, MAX_KEYBLOCK_SIZE) == 0) 01118 { 01119 #if 0 01120 print_blob("client", ssl->dc->client_random, 32); 01121 print_blob("server", ssl->dc->server_random, 32); 01122 print_blob("master", ssl->dc->master_secret, SSL_SECRET_SIZE); 01123 #endif 01124 generate_key_block(ssl->dc->client_random, ssl->dc->server_random, 01125 ssl->dc->master_secret, ssl->dc->key_block, 01126 ciph_info->key_block_size); 01127 #if 0 01128 print_blob("keyblock", ssl->dc->key_block, ciph_info->key_block_size); 01129 #endif 01130 } 01131 01132 q = ssl->dc->key_block; 01133 01134 if ((is_client && is_write) || (!is_client && !is_write)) 01135 { 01136 memcpy(ssl->client_mac, q, ciph_info->digest_size); 01137 } 01138 01139 q += ciph_info->digest_size; 01140 01141 if ((!is_client && is_write) || (is_client && !is_write)) 01142 { 01143 memcpy(ssl->server_mac, q, ciph_info->digest_size); 01144 } 01145 01146 q += ciph_info->digest_size; 01147 memcpy(client_key, q, ciph_info->key_size); 01148 q += ciph_info->key_size; 01149 memcpy(server_key, q, ciph_info->key_size); 01150 q += ciph_info->key_size; 01151 01152 #ifndef CONFIG_SSL_SKELETON_MODE 01153 if (ciph_info->iv_size) /* RC4 has no IV, AES does */ 01154 { 01155 memcpy(client_iv, q, ciph_info->iv_size); 01156 q += ciph_info->iv_size; 01157 memcpy(server_iv, q, ciph_info->iv_size); 01158 q += ciph_info->iv_size; 01159 } 01160 #endif 01161 01162 if( (is_write ? ssl->encrypt_ctx : ssl->decrypt_ctx) != NULL) 01163 free(is_write ? ssl->encrypt_ctx : ssl->decrypt_ctx); 01164 01165 /* now initialise the ciphers */ 01166 if (is_client) 01167 { 01168 finished_digest(ssl, server_finished, ssl->dc->final_finish_mac); 01169 01170 if (is_write) 01171 ssl->encrypt_ctx = crypt_new(ssl, client_key, client_iv, 0); 01172 else 01173 ssl->decrypt_ctx = crypt_new(ssl, server_key, server_iv, 1); 01174 } 01175 else 01176 { 01177 finished_digest(ssl, client_finished, ssl->dc->final_finish_mac); 01178 01179 if (is_write) 01180 ssl->encrypt_ctx = crypt_new(ssl, server_key, server_iv, 0); 01181 else 01182 ssl->decrypt_ctx = crypt_new(ssl, client_key, client_iv, 1); 01183 } 01184 01185 ssl->cipher_info = ciph_info; 01186 return 0; 01187 } 01188 01189 /** 01190 * Blocking read 01191 * data must be valid buffer of size length at least 01192 * length 01193 */ 01194 int basic_read2(SSL *ssl, uint8_t *data, uint32_t length) 01195 { 01196 // printf("basic_read2\n"); 01197 if(data == NULL) 01198 return -1; 01199 01200 int ret = 0; 01201 01202 do 01203 { 01204 //printf("before_lwip_select\n"); 01205 fd_set rfds; 01206 FD_ZERO(&rfds); 01207 FD_SET(ssl->client_fd, &rfds); 01208 01209 /* block and wait for it */ 01210 if (lwip_select(FD_SETSIZE, &rfds, NULL, NULL, NULL) < 0) 01211 return SSL_ERROR_CONN_LOST; 01212 // printf("after_lwip_select\n"); 01213 01214 int read_len = SOCKET_READ(ssl->client_fd, &data[ret], length-ret); 01215 // printf("read_len = %d\n", read_len); 01216 01217 if (read_len < 0) 01218 { 01219 01220 #ifdef WIN32 01221 if (GetLastError() == WSAEWOULDBLOCK) 01222 #else 01223 if (errno == EAGAIN || errno == EWOULDBLOCK) 01224 #endif 01225 continue; 01226 } 01227 01228 /* connection has gone, so die */ 01229 if (read_len <= 0) 01230 { 01231 printf("SSL_ERROR_CONN_LOST\n"); 01232 ssl->hs_status = SSL_ERROR_DEAD; /* make sure it stays dead */ 01233 return SSL_ERROR_CONN_LOST; 01234 } 01235 01236 ret += read_len; 01237 01238 }while(ret < length); 01239 DISPLAY_BYTES(ssl, "received %d bytes", data, ret, ret); 01240 return ret; 01241 } 01242 01243 int read_record(SSL *ssl) 01244 { 01245 if(!IS_SET_SSL_FLAG(SSL_NEED_RECORD)) 01246 return 0; 01247 uint8_t record[SSL_RECORD_SIZE]; 01248 int ret = basic_read2(ssl, record, SSL_RECORD_SIZE); 01249 if(ret != SSL_RECORD_SIZE) 01250 return ret; 01251 01252 /* check for sslv2 "client hello" */ 01253 if (record[0] & 0x80 && record[2] == 1) 01254 { 01255 #ifdef CONFIG_SSL_ENABLE_V23_HANDSHAKE 01256 uint8_t version = (record[3] << 4) + record[4]; 01257 DISPLAY_BYTES(ssl, "ssl2 record", record, 5); 01258 01259 /* should be v3.1 (TLSv1) or better */ 01260 ssl->version = ssl->client_version = version; 01261 01262 if (version > SSL_PROTOCOL_VERSION_MAX) 01263 { 01264 /* use client's version */ 01265 ssl->version = SSL_PROTOCOL_VERSION_MAX; 01266 } 01267 else if (version < SSL_PROTOCOL_MIN_VERSION) 01268 { 01269 ret = SSL_ERROR_INVALID_VERSION; 01270 ssl_display_error(ret); 01271 return ret; 01272 } 01273 01274 add_packet(ssl, &record[2], 3); 01275 ret = process_sslv23_client_hello(ssl); 01276 #else 01277 printf("Error: no SSLv23 handshaking allowed\n"); TTY_FLUSH(); 01278 ret = SSL_ERROR_NOT_SUPPORTED; 01279 #endif 01280 return ret; 01281 } 01282 01283 ssl->need_bytes = (record[3] << 8) + record[4]; 01284 01285 01286 memcpy(ssl->hmac_header, record, 3); /* store for hmac */ 01287 ssl->record_type = record[0]; 01288 CLR_SSL_FLAG(SSL_NEED_RECORD); 01289 return SSL_OK; 01290 } 01291 01292 int basic_decrypt(SSL *ssl, uint8_t *buf, int len) 01293 { 01294 if (IS_SET_SSL_FLAG(SSL_RX_ENCRYPTED)) 01295 { 01296 ssl->cipher_info->decrypt(ssl->decrypt_ctx, buf, buf, len); 01297 01298 if (ssl->version >= SSL_PROTOCOL_VERSION1_1 && 01299 ssl->cipher_info->iv_size) 01300 { 01301 buf += ssl->cipher_info->iv_size; 01302 ssl->need_bytes -= ssl->cipher_info->iv_size; 01303 } 01304 if(ssl->record_type != PT_APP_PROTOCOL_DATA) 01305 len = verify_digest(ssl, 01306 IS_SET_SSL_FLAG(SSL_IS_CLIENT) ? SSL_CLIENT_READ : SSL_SERVER_READ, buf, len); 01307 01308 /* does the hmac work? */ 01309 if (ssl->need_bytes < 0) 01310 { 01311 return ssl->need_bytes; 01312 } 01313 01314 DISPLAY_BYTES(ssl, "decrypted", buf, len); 01315 increment_read_sequence(ssl); 01316 } 01317 return len; 01318 } 01319 01320 int ssl_read(SSL *ssl, uint8_t *in_data, int len) 01321 { 01322 if(len <= 0 || in_data == NULL) 01323 return 0; 01324 01325 if(IS_SET_SSL_FLAG(SSL_NEED_RECORD)) 01326 { 01327 read_record(ssl); 01328 } 01329 01330 return process_data(ssl, in_data, len); 01331 } 01332 01333 int process_data(SSL* ssl, uint8_t *in_data, int len) 01334 { 01335 /* The main part of the SSL packet */ 01336 switch (ssl->record_type) 01337 { 01338 case PT_HANDSHAKE_PROTOCOL: 01339 01340 if (ssl->dc != NULL) 01341 { 01342 ssl->dc->bm_proc_index = 0; 01343 int ret = do_handshake(ssl, NULL, 0); 01344 SET_SSL_FLAG(SSL_NEED_RECORD); 01345 return ret; 01346 } 01347 else /* no client renegotiation allowed */ 01348 { 01349 SET_SSL_FLAG(SSL_NEED_RECORD); 01350 return SSL_ERROR_NO_CLIENT_RENOG; 01351 } 01352 01353 case PT_CHANGE_CIPHER_SPEC: 01354 01355 if(basic_read2(ssl, ssl->bm_data, ssl->need_bytes) != ssl->need_bytes) 01356 return -1; 01357 ssl->need_bytes = basic_decrypt(ssl, ssl->bm_data, ssl->need_bytes); 01358 if(ssl->need_bytes < 0) 01359 return -1; 01360 01361 if (ssl->next_state != HS_FINISHED) 01362 { 01363 return SSL_ERROR_INVALID_HANDSHAKE; 01364 } 01365 01366 /* all encrypted from now on */ 01367 SET_SSL_FLAG(SSL_RX_ENCRYPTED); 01368 if (set_key_block(ssl, 0) < 0) 01369 { 01370 return SSL_ERROR_INVALID_HANDSHAKE; 01371 } 01372 01373 memset(ssl->read_sequence, 0, 8); 01374 SET_SSL_FLAG(SSL_NEED_RECORD); 01375 break; 01376 01377 case PT_APP_PROTOCOL_DATA: 01378 if(len <= 0) 01379 return 0; 01380 if(ssl->need_bytes == 0) 01381 return 0; 01382 if (in_data) 01383 { 01384 uint16_t index = ssl->bm_index % 2048; 01385 if(ssl->bm_read_index == 0) 01386 { 01387 int read_len = len; 01388 if(read_len > 2048-index) 01389 read_len = 2048-index; 01390 if(read_len > ssl->need_bytes) 01391 read_len = ssl->need_bytes; 01392 read_len -= read_len % AES_BLOCKSIZE; 01393 01394 if(read_len <= 0) 01395 read_len = AES_BLOCKSIZE; 01396 if(ssl->need_bytes < AES_BLOCKSIZE) 01397 read_len = AES_BLOCKSIZE; 01398 int ret = basic_read2(ssl, ssl->bm_all_data + index, read_len); 01399 if(ret != read_len) 01400 return 0; 01401 01402 ssl->bm_read_index = basic_decrypt(ssl, ssl->bm_all_data + index, read_len); 01403 ssl->need_bytes -= ssl->bm_read_index; 01404 if(ssl->need_bytes == 0) 01405 { 01406 ssl->bm_read_index = 0; 01407 SET_SSL_FLAG(SSL_NEED_RECORD); 01408 return ssl_read(ssl, in_data, len); 01409 } 01410 } 01411 if(len > ssl->bm_read_index) 01412 len = ssl->bm_read_index; 01413 memcpy(in_data, ssl->bm_all_data+index, len); 01414 ssl->bm_index += len; 01415 ssl->bm_read_index -= len; 01416 01417 if(ssl->need_bytes == 0) 01418 SET_SSL_FLAG(SSL_NEED_RECORD); 01419 if(ssl->bm_index >= 2048) 01420 ssl->bm_index = 0; 01421 return len; 01422 } 01423 return 0; 01424 01425 case PT_ALERT_PROTOCOL: 01426 if(basic_read2(ssl, ssl->bm_data, ssl->need_bytes) != ssl->need_bytes) 01427 return -1; 01428 ssl->need_bytes = basic_decrypt(ssl, ssl->bm_data, ssl->need_bytes); 01429 if(ssl->need_bytes < 0) 01430 return -1; 01431 01432 SET_SSL_FLAG(SSL_NEED_RECORD); 01433 01434 /* return the alert # with alert bit set */ 01435 if(ssl->bm_data[0] == SSL_ALERT_TYPE_WARNING && 01436 ssl->bm_data[1] == SSL_ALERT_CLOSE_NOTIFY) 01437 { 01438 send_alert(ssl, SSL_ALERT_CLOSE_NOTIFY); 01439 SET_SSL_FLAG(SSL_SENT_CLOSE_NOTIFY); 01440 return SSL_CLOSE_NOTIFY; 01441 } 01442 else 01443 { 01444 int ret = -ssl->bm_data[1]; 01445 DISPLAY_ALERT(ssl, -ret); 01446 return ret; 01447 } 01448 01449 default: 01450 return SSL_ERROR_INVALID_PROT_MSG; 01451 01452 } 01453 } 01454 01455 01456 /** 01457 * Do some basic checking of data and then perform the appropriate handshaking. 01458 */ 01459 static int do_handshake(SSL *ssl, uint8_t *buf, int read_len) 01460 { 01461 uint8_t hs_hdr[SSL_HS_HDR_SIZE]; 01462 if (IS_SET_SSL_FLAG(SSL_RX_ENCRYPTED)) 01463 { 01464 if(basic_read2(ssl, ssl->bm_data, ssl->need_bytes) != ssl->need_bytes) 01465 return -1; 01466 ssl->need_bytes = basic_decrypt(ssl, ssl->bm_data, ssl->need_bytes); 01467 if(ssl->need_bytes < 0) 01468 return -1; 01469 buf = ssl->bm_data; 01470 } 01471 else 01472 { 01473 if(basic_read2(ssl, hs_hdr, SSL_HS_HDR_SIZE) != SSL_HS_HDR_SIZE) 01474 return -1; 01475 buf = hs_hdr; 01476 } 01477 01478 int hs_len = (buf[2]<<8) + buf[3]; 01479 uint8_t handshake_type = buf[0]; 01480 int ret = SSL_OK; 01481 int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT); 01482 01483 /* some integrity checking on the handshake */ 01484 //PARANOIA_CHECK(read_len-SSL_HS_HDR_SIZE, hs_len); 01485 01486 if (handshake_type != ssl->next_state) 01487 { 01488 /* handle a special case on the client */ 01489 if (!is_client || handshake_type != HS_CERT_REQ || 01490 ssl->next_state != HS_SERVER_HELLO_DONE) 01491 { 01492 return SSL_ERROR_INVALID_HANDSHAKE; 01493 } 01494 } 01495 01496 //hs_len += SSL_HS_HDR_SIZE; /* adjust for when adding packets */ 01497 ssl->bm_index = hs_len+SSL_HS_HDR_SIZE; /* store the size and check later */ 01498 DISPLAY_STATE(ssl, 0, handshake_type, 0); 01499 01500 if (handshake_type != HS_CERT_VERIFY && handshake_type != HS_HELLO_REQUEST) 01501 { 01502 add_packet(ssl, buf, SSL_HS_HDR_SIZE); 01503 } 01504 01505 if(!IS_SET_SSL_FLAG(SSL_RX_ENCRYPTED)) 01506 { 01507 if(hs_len != 0 && handshake_type != HS_CERTIFICATE) 01508 { 01509 if(basic_read2(ssl, ssl->bm_data, hs_len) != hs_len) 01510 return -1; 01511 hs_len = basic_decrypt(ssl, ssl->bm_data, hs_len); 01512 if(hs_len < 0) 01513 return -1; 01514 01515 buf = ssl->bm_data; 01516 if (handshake_type != HS_CERT_VERIFY && handshake_type != HS_HELLO_REQUEST) 01517 add_packet(ssl, buf, hs_len); 01518 } 01519 } 01520 else if (handshake_type != HS_CERT_VERIFY && handshake_type != HS_HELLO_REQUEST) 01521 add_packet(ssl, ssl->bm_data+SSL_HS_HDR_SIZE, hs_len-SSL_HS_HDR_SIZE); 01522 01523 #if defined(CONFIG_SSL_ENABLE_CLIENT) 01524 ret = is_client ? 01525 do_clnt_handshake(ssl, handshake_type, buf, hs_len) : 01526 do_svr_handshake(ssl, handshake_type, buf, hs_len); 01527 #else 01528 ret = do_svr_handshake(ssl, handshake_type, buf, hs_len); 01529 #endif 01530 01531 /* just use recursion to get the rest */ 01532 //if (hs_len < read_len && ret == SSL_OK) 01533 //ret = do_handshake(ssl, &buf[hs_len], read_len-hs_len); 01534 01535 return ret; 01536 } 01537 01538 /** 01539 * Sends the change cipher spec message. We have just read a finished message 01540 * from the client. 01541 */ 01542 int send_change_cipher_spec(SSL *ssl) 01543 { 01544 int ret = send_packet(ssl, PT_CHANGE_CIPHER_SPEC, 01545 g_chg_cipher_spec_pkt, sizeof(g_chg_cipher_spec_pkt)); 01546 SET_SSL_FLAG(SSL_TX_ENCRYPTED); 01547 01548 if (ret >= 0 && set_key_block(ssl, 1) < 0) 01549 ret = SSL_ERROR_INVALID_HANDSHAKE; 01550 01551 memset(ssl->write_sequence, 0, 8); 01552 return ret; 01553 } 01554 01555 /** 01556 * Send a "finished" message 01557 */ 01558 int send_finished(SSL *ssl) 01559 { 01560 uint8_t buf[SSL_FINISHED_HASH_SIZE+4] = { 01561 HS_FINISHED, 0, 0, SSL_FINISHED_HASH_SIZE }; 01562 01563 /* now add the finished digest mac (12 bytes) */ 01564 finished_digest(ssl, 01565 IS_SET_SSL_FLAG(SSL_IS_CLIENT) ? 01566 client_finished : server_finished, &buf[4]); 01567 01568 #ifndef CONFIG_SSL_SKELETON_MODE 01569 /* store in the session cache */ 01570 if (!IS_SET_SSL_FLAG(SSL_SESSION_RESUME) && ssl->ssl_ctx->num_sessions) 01571 { 01572 memcpy(ssl->session->master_secret, 01573 ssl->dc->master_secret, SSL_SECRET_SIZE); 01574 } 01575 #endif 01576 01577 return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, 01578 buf, SSL_FINISHED_HASH_SIZE+4); 01579 } 01580 01581 /** 01582 * Send an alert message. 01583 * Return 1 if the alert was an "error". 01584 */ 01585 int send_alert(SSL *ssl, int error_code) 01586 { 01587 int alert_num = 0; 01588 int is_warning = 0; 01589 uint8_t buf[2]; 01590 01591 /* Don't bother we're already dead */ 01592 if (ssl->hs_status == SSL_ERROR_DEAD) 01593 { 01594 return SSL_ERROR_CONN_LOST; 01595 } 01596 01597 #ifdef CONFIG_SSL_FULL_MODE 01598 if (IS_SET_SSL_FLAG(SSL_DISPLAY_STATES)) 01599 ssl_display_error(error_code); 01600 #endif 01601 01602 switch (error_code) 01603 { 01604 case SSL_ALERT_CLOSE_NOTIFY: 01605 is_warning = 1; 01606 alert_num = SSL_ALERT_CLOSE_NOTIFY; 01607 break; 01608 01609 case SSL_ERROR_CONN_LOST: /* don't send alert just yet */ 01610 is_warning = 1; 01611 break; 01612 01613 case SSL_ERROR_INVALID_HANDSHAKE: 01614 case SSL_ERROR_INVALID_PROT_MSG: 01615 alert_num = SSL_ALERT_HANDSHAKE_FAILURE; 01616 break; 01617 01618 case SSL_ERROR_INVALID_HMAC: 01619 case SSL_ERROR_FINISHED_INVALID: 01620 alert_num = SSL_ALERT_BAD_RECORD_MAC; 01621 break; 01622 01623 case SSL_ERROR_INVALID_VERSION: 01624 alert_num = SSL_ALERT_INVALID_VERSION; 01625 break; 01626 01627 case SSL_ERROR_INVALID_SESSION: 01628 case SSL_ERROR_NO_CIPHER: 01629 case SSL_ERROR_INVALID_KEY: 01630 alert_num = SSL_ALERT_ILLEGAL_PARAMETER; 01631 break; 01632 01633 case SSL_ERROR_BAD_CERTIFICATE: 01634 alert_num = SSL_ALERT_BAD_CERTIFICATE; 01635 break; 01636 01637 case SSL_ERROR_NO_CLIENT_RENOG: 01638 alert_num = SSL_ALERT_NO_RENEGOTIATION; 01639 break; 01640 01641 default: 01642 /* a catch-all for any badly verified certificates */ 01643 alert_num = (error_code <= SSL_X509_OFFSET) ? 01644 SSL_ALERT_BAD_CERTIFICATE : SSL_ALERT_UNEXPECTED_MESSAGE; 01645 break; 01646 } 01647 01648 buf[0] = is_warning ? 1 : 2; 01649 buf[1] = alert_num; 01650 01651 send_packet(ssl, PT_ALERT_PROTOCOL, buf, sizeof(buf)); 01652 DISPLAY_ALERT(ssl, alert_num); 01653 return is_warning ? 0 : 1; 01654 } 01655 01656 /** 01657 * Process a client finished message. 01658 */ 01659 int process_finished(SSL *ssl, uint8_t *buf, int hs_len) 01660 { 01661 int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT); 01662 int ret = SSL_OK; 01663 int resume = IS_SET_SSL_FLAG(SSL_SESSION_RESUME); 01664 01665 PARANOIA_CHECK(ssl->bm_index, SSL_FINISHED_HASH_SIZE); 01666 01667 /* check that we all work before we continue */ 01668 if (memcmp(ssl->dc->final_finish_mac, &buf[4], SSL_FINISHED_HASH_SIZE)) 01669 { 01670 return SSL_ERROR_FINISHED_INVALID; 01671 } 01672 if ((!is_client && !resume) || (is_client && resume)) 01673 { 01674 if ((ret = send_change_cipher_spec(ssl)) == SSL_OK) 01675 ret = send_finished(ssl); 01676 } 01677 01678 /* if we ever renegotiate */ 01679 ssl->next_state = is_client ? HS_HELLO_REQUEST : HS_CLIENT_HELLO; 01680 ssl->hs_status = ret; /* set the final handshake status */ 01681 error: 01682 return ret; 01683 } 01684 01685 /** 01686 * Send a certificate. 01687 */ 01688 int send_certificate(SSL *ssl) 01689 { 01690 int i = 0; 01691 uint8_t *buf = ssl->bm_data; 01692 int offset = 7; 01693 int chain_length; 01694 01695 buf[0] = HS_CERTIFICATE; 01696 buf[1] = 0; 01697 buf[4] = 0; 01698 01699 while (i < ssl->ssl_ctx->chain_length) 01700 { 01701 SSL_CERT *cert = &ssl->ssl_ctx->certs[i]; 01702 buf[offset++] = 0; 01703 buf[offset++] = cert->size >> 8; /* cert 1 length */ 01704 buf[offset++] = cert->size & 0xff; 01705 memcpy(&buf[offset], cert->buf, cert->size); 01706 offset += cert->size; 01707 i++; 01708 } 01709 01710 chain_length = offset - 7; 01711 buf[5] = chain_length >> 8; /* cert chain length */ 01712 buf[6] = chain_length & 0xff; 01713 chain_length += 3; 01714 buf[2] = chain_length >> 8; /* handshake length */ 01715 buf[3] = chain_length & 0xff; 01716 ssl->bm_index = offset; 01717 return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, offset); 01718 } 01719 01720 /** 01721 * Create a blob of memory that we'll get rid of once the handshake is 01722 * complete. 01723 */ 01724 void disposable_new(SSL *ssl) 01725 { 01726 if (ssl->dc == NULL) 01727 { 01728 ssl->dc = (DISPOSABLE_CTX *)calloc(1, sizeof(DISPOSABLE_CTX)); 01729 memset(ssl->dc->key_block, 0, MAX_KEYBLOCK_SIZE); 01730 MD5_Init(&ssl->dc->md5_ctx); 01731 SHA1_Init(&ssl->dc->sha1_ctx); 01732 } 01733 } 01734 01735 /** 01736 * Remove the temporary blob of memory. 01737 */ 01738 void disposable_free(SSL *ssl) 01739 { 01740 if (ssl->dc) 01741 { 01742 //free(ssl->dc->key_block); 01743 memset(ssl->dc, 0, sizeof(DISPOSABLE_CTX)); 01744 free(ssl->dc); 01745 ssl->dc = NULL; 01746 } 01747 01748 } 01749 01750 #ifndef CONFIG_SSL_SKELETON_MODE /* no session resumption in this mode */ 01751 /** 01752 * Find if an existing session has the same session id. If so, use the 01753 * master secret from this session for session resumption. 01754 */ 01755 SSL_SESSION *ssl_session_update(int max_sessions, SSL_SESSION *ssl_sessions[], 01756 SSL *ssl, const uint8_t *session_id) 01757 { 01758 time_t tm = time(NULL); 01759 time_t oldest_sess_time = tm; 01760 SSL_SESSION *oldest_sess = NULL; 01761 int i; 01762 01763 /* no sessions? Then bail */ 01764 if (max_sessions == 0) 01765 return NULL; 01766 01767 SSL_CTX_LOCK(ssl->ssl_ctx->mutex); 01768 if (session_id) 01769 { 01770 for (i = 0; i < max_sessions; i++) 01771 { 01772 if (ssl_sessions[i]) 01773 { 01774 /* kill off any expired sessions (including those in 01775 the future) */ 01776 if ((tm > ssl_sessions[i]->conn_time + SSL_EXPIRY_TIME) || 01777 (tm < ssl_sessions[i]->conn_time)) 01778 { 01779 session_free(ssl_sessions, i); 01780 continue; 01781 } 01782 01783 /* if the session id matches, it must still be less than 01784 the expiry time */ 01785 if (memcmp(ssl_sessions[i]->session_id, session_id, 01786 SSL_SESSION_ID_SIZE) == 0) 01787 { 01788 ssl->session_index = i; 01789 memcpy(ssl->dc->master_secret, 01790 ssl_sessions[i]->master_secret, SSL_SECRET_SIZE); 01791 SET_SSL_FLAG(SSL_SESSION_RESUME); 01792 SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex); 01793 return ssl_sessions[i]; /* a session was found */ 01794 } 01795 } 01796 } 01797 } 01798 01799 /* If we've got here, no matching session was found - so create one */ 01800 for (i = 0; i < max_sessions; i++) 01801 { 01802 if (ssl_sessions[i] == NULL) 01803 { 01804 /* perfect, this will do */ 01805 ssl_sessions[i] = (SSL_SESSION *)calloc(1, sizeof(SSL_SESSION)); 01806 ssl_sessions[i]->conn_time = tm; 01807 ssl->session_index = i; 01808 SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex); 01809 return ssl_sessions[i]; /* return the session object */ 01810 } 01811 else if (ssl_sessions[i]->conn_time <= oldest_sess_time) 01812 { 01813 /* find the oldest session */ 01814 oldest_sess_time = ssl_sessions[i]->conn_time; 01815 oldest_sess = ssl_sessions[i]; 01816 ssl->session_index = i; 01817 } 01818 } 01819 01820 /* ok, we've used up all of our sessions. So blow the oldest session away */ 01821 oldest_sess->conn_time = tm; 01822 memset(oldest_sess->session_id, 0, sizeof(SSL_SESSION_ID_SIZE)); 01823 memset(oldest_sess->master_secret, 0, sizeof(SSL_SECRET_SIZE)); 01824 SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex); 01825 return oldest_sess; 01826 } 01827 01828 /** 01829 * Free an existing session. 01830 */ 01831 static void session_free(SSL_SESSION *ssl_sessions[], int sess_index) 01832 { 01833 if (ssl_sessions[sess_index]) 01834 { 01835 free(ssl_sessions[sess_index]); 01836 ssl_sessions[sess_index] = NULL; 01837 } 01838 } 01839 01840 /** 01841 * This ssl object doesn't want this session anymore. 01842 */ 01843 void kill_ssl_session(SSL_SESSION **ssl_sessions, SSL *ssl) 01844 { 01845 SSL_CTX_LOCK(ssl->ssl_ctx->mutex); 01846 01847 if (ssl->ssl_ctx->num_sessions) 01848 { 01849 session_free(ssl_sessions, ssl->session_index); 01850 ssl->session = NULL; 01851 } 01852 01853 SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex); 01854 } 01855 #endif /* CONFIG_SSL_SKELETON_MODE */ 01856 01857 /* 01858 * Get the session id for a handshake. This will be a 32 byte sequence. 01859 */ 01860 EXP_FUNC const uint8_t * STDCALL ssl_get_session_id(const SSL *ssl) 01861 { 01862 return ssl->session_id; 01863 } 01864 01865 /* 01866 * Get the session id size for a handshake. 01867 */ 01868 EXP_FUNC uint8_t STDCALL ssl_get_session_id_size(const SSL *ssl) 01869 { 01870 return ssl->sess_id_size; 01871 } 01872 01873 /* 01874 * Return the cipher id (in the SSL form). 01875 */ 01876 EXP_FUNC uint8_t STDCALL ssl_get_cipher_id(const SSL *ssl) 01877 { 01878 return ssl->cipher; 01879 } 01880 01881 /* 01882 * Return the status of the handshake. 01883 */ 01884 EXP_FUNC int STDCALL ssl_handshake_status(const SSL *ssl) 01885 { 01886 return ssl->hs_status; 01887 } 01888 01889 /* 01890 * Retrieve various parameters about the SSL engine. 01891 */ 01892 EXP_FUNC int STDCALL ssl_get_config(int offset) 01893 { 01894 switch (offset) 01895 { 01896 /* return the appropriate build mode */ 01897 case SSL_BUILD_MODE: 01898 #if defined(CONFIG_SSL_FULL_MODE) 01899 return SSL_BUILD_FULL_MODE; 01900 #elif defined(CONFIG_SSL_ENABLE_CLIENT) 01901 return SSL_BUILD_ENABLE_CLIENT; 01902 #elif defined(CONFIG_ENABLE_VERIFICATION) 01903 return SSL_BUILD_ENABLE_VERIFICATION; 01904 #elif defined(CONFIG_SSL_SERVER_ONLY ) 01905 return SSL_BUILD_SERVER_ONLY; 01906 #else 01907 return SSL_BUILD_SKELETON_MODE; 01908 #endif 01909 01910 case SSL_MAX_CERT_CFG_OFFSET: 01911 return CONFIG_SSL_MAX_CERTS; 01912 01913 #ifdef CONFIG_SSL_CERT_VERIFICATION 01914 case SSL_MAX_CA_CERT_CFG_OFFSET: 01915 return CONFIG_X509_MAX_CA_CERTS; 01916 #endif 01917 #ifdef CONFIG_SSL_HAS_PEM 01918 case SSL_HAS_PEM: 01919 return 1; 01920 #endif 01921 default: 01922 return 0; 01923 } 01924 } 01925 01926 #ifdef CONFIG_SSL_CERT_VERIFICATION 01927 /** 01928 * Authenticate a received certificate. 01929 */ 01930 EXP_FUNC int STDCALL ssl_verify_cert(const SSL *ssl) 01931 { 01932 int ret; 01933 SSL_CTX_LOCK(ssl->ssl_ctx->mutex); 01934 ret = x509_verify(ssl->ssl_ctx->ca_cert_ctx, ssl->x509_ctx); 01935 SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex); 01936 01937 if (ret) /* modify into an SSL error type */ 01938 { 01939 ret = SSL_X509_ERROR(ret); 01940 } 01941 01942 return ret; 01943 } 01944 01945 /** 01946 * Process a certificate message. 01947 */ 01948 int process_certificate(SSL *ssl, X509_CTX **x509_ctx) 01949 { 01950 int ret = SSL_OK; 01951 01952 uint8_t cert_hdr[3]; 01953 if(basic_read2(ssl, cert_hdr, 3) != 3) 01954 { 01955 ret = SSL_NOT_OK; 01956 return ret; 01957 } 01958 01959 add_packet(ssl, cert_hdr, 3); 01960 int len = 5; 01961 int pkt_size = ssl->bm_index; 01962 int cert_size; 01963 int total_cert_size = (cert_hdr[1]<<8) + cert_hdr[2]; 01964 int is_client = IS_SET_SSL_FLAG(SSL_IS_CLIENT); 01965 X509_CTX **chain = x509_ctx; 01966 len += 2; 01967 PARANOIA_CHECK(total_cert_size, 3); 01968 01969 while (len < total_cert_size) 01970 { 01971 01972 if(basic_read2(ssl, cert_hdr, 3) != 3) 01973 { 01974 ret = SSL_NOT_OK; 01975 return ret; 01976 } 01977 01978 add_packet(ssl, cert_hdr, 3); 01979 01980 cert_size = (cert_hdr[1]<<8) + cert_hdr[2]; 01981 if(cert_size > RT_MAX_PLAIN_LENGTH) 01982 { 01983 ret = SSL_NOT_OK; 01984 return ret; 01985 } 01986 01987 len += 3; 01988 01989 if(basic_read2(ssl, ssl->bm_data, cert_size) != cert_size) 01990 { 01991 return SSL_NOT_OK; 01992 } 01993 01994 add_packet(ssl, ssl->bm_data, cert_size); 01995 01996 if (x509_new(ssl->bm_data, NULL, chain)) 01997 { 01998 ret = SSL_ERROR_BAD_CERTIFICATE; 01999 goto error; 02000 } 02001 02002 chain = &((*chain)->next); 02003 len += cert_size; 02004 } 02005 PARANOIA_CHECK(pkt_size, len); 02006 02007 /* if we are client we can do the verify now or later */ 02008 if (is_client && !IS_SET_SSL_FLAG(SSL_SERVER_VERIFY_LATER)) 02009 { 02010 ret = ssl_verify_cert(ssl); 02011 } 02012 02013 ssl->next_state = is_client ? HS_SERVER_HELLO_DONE : HS_CLIENT_KEY_XCHG; 02014 ssl->dc->bm_proc_index += len; 02015 error: 02016 02017 return ret; 02018 } 02019 02020 #endif /* CONFIG_SSL_CERT_VERIFICATION */ 02021 02022 /** 02023 * Debugging routine to display SSL handshaking stuff. 02024 */ 02025 #ifdef CONFIG_SSL_FULL_MODE 02026 /** 02027 * Debugging routine to display SSL states. 02028 */ 02029 void DISPLAY_STATE(SSL *ssl, int is_send, uint8_t state, int not_ok) 02030 { 02031 const char *str; 02032 02033 if (!IS_SET_SSL_FLAG(SSL_DISPLAY_STATES)) 02034 return; 02035 02036 printf(not_ok ? "Error - invalid State:\t" : "State:\t"); 02037 printf(is_send ? "sending " : "receiving "); 02038 02039 switch (state) 02040 { 02041 case HS_HELLO_REQUEST: 02042 str = "Hello Request (0)"; 02043 break; 02044 02045 case HS_CLIENT_HELLO: 02046 str = "Client Hello (1)"; 02047 break; 02048 02049 case HS_SERVER_HELLO: 02050 str = "Server Hello (2)"; 02051 break; 02052 02053 case HS_CERTIFICATE: 02054 str = "Certificate (11)"; 02055 break; 02056 02057 case HS_SERVER_KEY_XCHG: 02058 str = "Certificate Request (12)"; 02059 break; 02060 02061 case HS_CERT_REQ: 02062 str = "Certificate Request (13)"; 02063 break; 02064 02065 case HS_SERVER_HELLO_DONE: 02066 str = "Server Hello Done (14)"; 02067 break; 02068 02069 case HS_CERT_VERIFY: 02070 str = "Certificate Verify (15)"; 02071 break; 02072 02073 case HS_CLIENT_KEY_XCHG: 02074 str = "Client Key Exchange (16)"; 02075 break; 02076 02077 case HS_FINISHED: 02078 str = "Finished (16)"; 02079 break; 02080 02081 default: 02082 str = "Error (Unknown)"; 02083 02084 break; 02085 } 02086 02087 printf("%s\r\n", str); 02088 TTY_FLUSH(); 02089 } 02090 02091 /** 02092 * Debugging routine to display RSA objects 02093 */ 02094 void DISPLAY_RSA(SSL *ssl, const RSA_CTX *rsa_ctx) 02095 { 02096 if (!IS_SET_SSL_FLAG(SSL_DISPLAY_RSA)) 02097 return; 02098 02099 RSA_print(rsa_ctx); 02100 TTY_FLUSH(); 02101 } 02102 02103 /** 02104 * Debugging routine to display SSL handshaking bytes. 02105 */ 02106 void DISPLAY_BYTES(SSL *ssl, const char *format, 02107 const uint8_t *data, int size, ...) 02108 { 02109 va_list(ap); 02110 02111 if (!IS_SET_SSL_FLAG(SSL_DISPLAY_BYTES)) 02112 return; 02113 02114 va_start(ap, size); 02115 print_blob(format, data, size, va_arg(ap, char *)); 02116 va_end(ap); 02117 TTY_FLUSH(); 02118 } 02119 02120 /** 02121 * Debugging routine to display SSL handshaking errors. 02122 */ 02123 EXP_FUNC void STDCALL ssl_display_error(int error_code) 02124 { 02125 if (error_code == SSL_OK) 02126 return; 02127 02128 printf("Error: "); 02129 02130 /* X509 error? */ 02131 if (error_code < SSL_X509_OFFSET) 02132 { 02133 printf("%s\r\n", x509_display_error(error_code - SSL_X509_OFFSET)); 02134 return; 02135 } 02136 02137 /* SSL alert error code */ 02138 if (error_code > SSL_ERROR_CONN_LOST) 02139 { 02140 printf("SSL error %d\n", -error_code); 02141 return; 02142 } 02143 02144 switch (error_code) 02145 { 02146 case SSL_ERROR_DEAD: 02147 printf("connection dead"); 02148 break; 02149 02150 case SSL_ERROR_INVALID_HANDSHAKE: 02151 printf("invalid handshake"); 02152 break; 02153 02154 case SSL_ERROR_INVALID_PROT_MSG: 02155 printf("invalid protocol message"); 02156 break; 02157 02158 case SSL_ERROR_INVALID_HMAC: 02159 printf("invalid mac"); 02160 break; 02161 02162 case SSL_ERROR_INVALID_VERSION: 02163 printf("invalid version"); 02164 break; 02165 02166 case SSL_ERROR_INVALID_SESSION: 02167 printf("invalid session"); 02168 break; 02169 02170 case SSL_ERROR_NO_CIPHER: 02171 printf("no cipher"); 02172 break; 02173 02174 case SSL_ERROR_CONN_LOST: 02175 printf("connection lost"); 02176 break; 02177 02178 case SSL_ERROR_BAD_CERTIFICATE: 02179 printf("bad certificate"); 02180 break; 02181 02182 case SSL_ERROR_INVALID_KEY: 02183 printf("invalid key"); 02184 break; 02185 02186 case SSL_ERROR_FINISHED_INVALID: 02187 printf("finished invalid"); 02188 break; 02189 02190 case SSL_ERROR_NO_CERT_DEFINED: 02191 printf("no certificate defined"); 02192 break; 02193 02194 case SSL_ERROR_NO_CLIENT_RENOG: 02195 printf("client renegotiation not supported"); 02196 break; 02197 02198 case SSL_ERROR_NOT_SUPPORTED: 02199 printf("Option not supported"); 02200 break; 02201 02202 default: 02203 printf("undefined as yet - %d", error_code); 02204 break; 02205 } 02206 02207 printf("\r\n"); 02208 TTY_FLUSH(); 02209 } 02210 02211 /** 02212 * Debugging routine to display alerts. 02213 */ 02214 void DISPLAY_ALERT(SSL *ssl, int alert) 02215 { 02216 if (!IS_SET_SSL_FLAG(SSL_DISPLAY_STATES)) 02217 return; 02218 02219 printf("Alert: "); 02220 02221 switch (alert) 02222 { 02223 case SSL_ALERT_CLOSE_NOTIFY: 02224 printf("close notify"); 02225 break; 02226 02227 case SSL_ALERT_INVALID_VERSION: 02228 printf("invalid version"); 02229 break; 02230 02231 case SSL_ALERT_BAD_CERTIFICATE: 02232 printf("bad certificate"); 02233 break; 02234 02235 case SSL_ALERT_UNEXPECTED_MESSAGE: 02236 printf("unexpected message"); 02237 break; 02238 02239 case SSL_ALERT_BAD_RECORD_MAC: 02240 printf("bad record mac"); 02241 break; 02242 02243 case SSL_ALERT_HANDSHAKE_FAILURE: 02244 printf("handshake failure"); 02245 break; 02246 02247 case SSL_ALERT_ILLEGAL_PARAMETER: 02248 printf("illegal parameter"); 02249 break; 02250 02251 case SSL_ALERT_DECODE_ERROR: 02252 printf("decode error"); 02253 break; 02254 02255 case SSL_ALERT_DECRYPT_ERROR: 02256 printf("decrypt error"); 02257 break; 02258 02259 case SSL_ALERT_NO_RENEGOTIATION: 02260 printf("no renegotiation"); 02261 break; 02262 02263 default: 02264 printf("alert - (unknown %d)", alert); 02265 break; 02266 } 02267 02268 printf("\r\n"); 02269 TTY_FLUSH(); 02270 } 02271 02272 #endif /* CONFIG_SSL_FULL_MODE */ 02273 02274 /** 02275 * Return the version of this library. 02276 */ 02277 EXP_FUNC const char * STDCALL ssl_version() 02278 { 02279 static const char * axtls_version = AXTLS_VERSION; 02280 return axtls_version; 02281 } 02282 02283 /** 02284 * Enable the various language bindings to work regardless of the 02285 * configuration - they just return an error statement and a bad return code. 02286 */ 02287 #if !defined(CONFIG_SSL_FULL_MODE) 02288 EXP_FUNC void STDCALL ssl_display_error(int error_code) {} 02289 #endif 02290 02291 #ifdef CONFIG_BINDINGS 02292 #if !defined(CONFIG_SSL_ENABLE_CLIENT) 02293 EXP_FUNC SSL * STDCALL ssl_client_new(SSL_CTX *ssl_ctx, int client_fd, const 02294 uint8_t *session_id, uint8_t sess_id_size) 02295 { 02296 printf(unsupported_str); 02297 return NULL; 02298 } 02299 #endif 02300 02301 #if !defined(CONFIG_SSL_CERT_VERIFICATION) 02302 EXP_FUNC int STDCALL ssl_verify_cert(const SSL *ssl) 02303 { 02304 printf(unsupported_str); 02305 return -1; 02306 } 02307 02308 02309 EXP_FUNC const char * STDCALL ssl_get_cert_dn(const SSL *ssl, int component) 02310 { 02311 printf(unsupported_str); 02312 return NULL; 02313 } 02314 02315 EXP_FUNC const char * STDCALL ssl_get_cert_subject_alt_dnsname(const SSL *ssl, int index) 02316 { 02317 printf(unsupported_str); 02318 return NULL; 02319 } 02320 02321 #endif /* CONFIG_SSL_CERT_VERIFICATION */ 02322 02323 #endif /* CONFIG_BINDINGS */ 02324
Generated on Tue Jul 12 2022 13:05:45 by
1.7.2