Exemple #1
0
/*
 * Send the entire server hello sequence
 */
static int ICACHE_FLASH_ATTR send_server_hello_sequence(SSL *ssl) {
	int ret;

	if ((ret = send_server_hello(ssl)) == SSL_OK) {
#ifndef CONFIG_SSL_SKELETON_MODE
		/* resume handshake? */
		if (IS_SET_SSL_FLAG(SSL_SESSION_RESUME)) {
			if ((ret = send_change_cipher_spec(ssl)) == SSL_OK) {
				ret = send_finished(ssl);
				ssl->next_state = HS_FINISHED;
			}
		} else
#endif
			if ((ret = send_certificate(ssl)) == SSL_OK) {
#ifdef CONFIG_SSL_CERT_VERIFICATION
				/* ask the client for its certificate */
				if (IS_SET_SSL_FLAG(SSL_CLIENT_AUTHENTICATION)) {
					if ((ret = send_certificate_request(ssl)) == SSL_OK) {
						ret = send_server_hello_done(ssl);
						ssl->next_state = HS_CERTIFICATE;
					}
				} else
#endif
				{
					ret = send_server_hello_done(ssl);
					ssl->next_state = HS_CLIENT_KEY_XCHG;
				}
			}
	}

	return ret;
}
/*
 * Process the handshake record.
 */
int ICACHE_FLASH_ATTR do_clnt_handshake(SSL *ssl, int handshake_type, uint8_t *buf, int hs_len)
{
    int ret;

    /* To get here the state must be valid */
//	ssl_printf("do_clnt_handshake: %d %d\n",__LINE__, handshake_type);
    switch (handshake_type)
    {
        case HS_SERVER_HELLO:
            ret = process_server_hello(ssl);
            break;

        case HS_CERTIFICATE:
            ret = process_certificate(ssl, &ssl->x509_ctx);
            break;

        case HS_SERVER_HELLO_DONE:
            if ((ret = process_server_hello_done(ssl)) == SSL_OK)
            {
                if (IS_SET_SSL_FLAG(SSL_HAS_CERT_REQ))
                {
                    if ((ret = send_certificate(ssl)) == SSL_OK &&
                        (ret = send_client_key_xchg(ssl)) == SSL_OK)
                    {
                        send_cert_verify(ssl);
                    }
                }
                else
                {
                    ret = send_client_key_xchg(ssl);
                }

                if (ret == SSL_OK && 
                     (ret = send_change_cipher_spec(ssl)) == SSL_OK)
                {
                    ret = send_finished(ssl);
                }
            }
            break;

        case HS_CERT_REQ:
            ret = process_cert_req(ssl);
            break;

        case HS_FINISHED:
            ret = process_finished(ssl, buf, hs_len);
            disposable_free(ssl);   /* free up some memory */
            /* note: client renegotiation is not allowed after this */
            break;

        case HS_HELLO_REQUEST:
            disposable_new(ssl);
            ret = do_client_connect(ssl);
            break;

        default:
            ret = SSL_ERROR_INVALID_HANDSHAKE;
            break;
    }

    return ret;
}