Создайте TLS-соединение, используя mbed TLS без TCP в iOS

Проект, над которым я работаю, включает подключение к устройству MFI (Made for iPhone) с использованием EAF (External Accessory Framework) и передачу данных туда и обратно через USB-кабель. Я хочу использовать TLS для шифрования трафика, но у меня возникают проблемы с его работой, потому что TCP недоступен на устройстве.

Я использую следующий код для проверки рукопожатия TLS с веб-сервером. Это работает нормально. Моя проблема в том, что я не знаю, как создать соединение с устройством, так как TCP недоступен. Любой совет? Спасибо.

bool tlsHandshake( id param )
{

mbedtls_entropy_context entropy;
mbedtls_ctr_drbg_context ctr_drbg;

mbedtls_ssl_config conf;
mbedtls_ssl_context m_ssl;
mbedtls_net_context server_fd;
mbedtls_x509_crt cacert;

//initialise an SSL/TLS context
mbedtls_net_init( &server_fd );
mbedtls_ssl_init(&m_ssl);
mbedtls_ssl_config_init( &conf );

mbedtls_entropy_init( &entropy );
const char *pers = "BYOM2Plus";

mbedtls_debug_set_threshold( DEBUG_LEVEL );
int ret = 0;
ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char *)pers, strlen(pers));

if( ret != 0 ) {

    [param LogEvent:[NSString stringWithFormat:@"%@%@", @"failed!! mbedtls_ctr_drbg_seed returned 0x%x", [@(ret) stringValue]]];
    return false;
}
else{
    [param LogEvent:@"mbedtls_ctr_drbg_seed OK"];
}

//-------------------------- Initialize certificates --------------------------

[param LogEvent:@"Loading the CA root certificate"];
int ret2 = 0;
ret2 = mbedtls_x509_crt_parse( &cacert, (const unsigned char *) mbedtls_test_cas_pem, mbedtls_test_cas_pem_len );
if( ret2 < 0 )
{
     [param LogEvent:[NSString stringWithFormat:@"%@%@", @" failed\n  !  mbedtls_x509_crt_parse returned -", [@(ret2) stringValue] ]];
     return false;
}

[param LogEvent:[NSString stringWithFormat:@"%@%@", @"x509 cert ok ", [@(ret2) stringValue]]];

//---------------------------- Start the connection -----------------------------
[param LogEvent:[NSString stringWithFormat:@"%@%s%@%s",@"Connecting to tcp ", SERVER_NAME, @":", SERVER_PORT]];

int ret3 = mbedtls_net_connect( &server_fd, SERVER_NAME, SERVER_PORT, MBEDTLS_NET_PROTO_TCP );
if( ret3 != 0 )
{
    [param LogEvent:[NSString stringWithFormat:@"%@%@", @"Failed ! mbedtls_net_connect returned -", [@(ret3) stringValue]]];
    return false;
}

[param LogEvent:[NSString stringWithFormat:@"%@%@", @"Connection started: ", [@(ret3) stringValue]]];

//---------------------------- SSL setup ----------------------------
int ret4 = 0;
ret4 = mbedtls_ssl_config_defaults( &conf,
                                           MBEDTLS_SSL_IS_CLIENT,
                                           MBEDTLS_SSL_TRANSPORT_STREAM,
                                       MBEDTLS_SSL_PRESET_DEFAULT );
if( ret4 != 0 ) {
    [param LogEvent:[NSString stringWithFormat:@"%@%@", @"failed!! mbedtls_ssl_config_defaults returned 0x%0x", [@(ret4) stringValue]]];
    return false;
}
else{
    [param LogEvent:@"mbedtls_ssl_config_defaults OK"];
}

mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_NONE );
mbedtls_ssl_conf_ca_chain( &conf, &cacert, NULL );
mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );
mbedtls_ssl_conf_dbg( &conf, my_debug, stdout );

int ret5 = 0;
ret5 = mbedtls_ssl_setup( &m_ssl, &conf );
if( ret5 != 0 ) {
    [param LogEvent:[NSString stringWithFormat:@"%@%@", @"failed!! mbedtls_ssl_setup returned -", [@(ret5) stringValue]]];
    return false;
}

int ret6 = 0;
ret6 = mbedtls_ssl_set_hostname( &m_ssl, "mbed TLS Server 1" );
if( ret6 != 0 )
{
    [param LogEvent:[NSString stringWithFormat:@"%@%@", @" failed ! mbedtls_ssl_set_hostname returned -", [@(ret6) stringValue]]];
    return false;
}

mbedtls_ssl_set_bio( &m_ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL );

[param LogEvent:@"Performing the SSL/TLS handshake"];
[param LogEvent:@"Waiting for Handshake"];

//#ifdef HANDSHAKING_TEST
//perform an SSL/TLS handshake
int ret7 = -1;
while(( ret7 = mbedtls_ssl_handshake( &m_ssl )) != 0 ) {
    if( ret7 != MBEDTLS_ERR_SSL_WANT_READ && ret7 != MBEDTLS_ERR_SSL_WANT_WRITE ) {
        [param LogEvent:[NSString stringWithFormat:@"%@%@", @"failed!! mbedtls_ssl_handshake returned ", [@(ret7) stringValue]]];
        return false;
    }
    else{
        [param LogEvent:@"SSL/TLS handshake succeeded"];
    }
}

[param LogEvent:[NSString stringWithFormat:@"%@%@", @"Handshake return value: ", [@(ret7) stringValue]]];

return true;
}

person Brian Kalski    schedule 29.03.2016    source источник
comment
Помогает ли официальная демонстрация? Вроде работает с UDP   -  person Andrew Chang    schedule 10.05.2016


Ответы (1)


Даже если это старый вопрос, я дам несколько советов.

В struct mbedtls_ssl_context помимо многих членов входят следующие интересные участники:

  • p_bio, который ссылается на mbedtls_net_context (который на самом деле является оболочкой для дескриптора сокета/файла)
  • f_send, который является методом обратного вызова для отправки по сети
  • f_recv, который является методом обратного вызова для получения по сети

Эти члены обычно устанавливаются через mbedtls_ssl_set_bio(). Одним из решений для вас может быть создание собственной функции set_bio() или просто установка членов структуры напрямую.

Ссылки на файлы:

  • include/mbedtls/ssl.h
  • library/ssl_tls.c

Версия, используемая для проверки: mbedtls-2.16.6

person reichhart    schedule 01.06.2020