LINUX.ORG.RU

SSL_read:uninitialized

 , , ,


0

2

Приветствую.

Пытаюсь с хромом по webrtc поговорить, обменялся sdp описанием содержащим sha-256 отпечаток, произошло ice соединение и теперь шлет мне браузер какие то 157 байт аж 3 раза для создания DTLS подключения, делаю что то вроде

    SSL_CTX * ssl_ctx = SSL_CTX_new(DTLS_method());
    SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, cb_dtls_verify);
    SSL_CTX_set_tlsext_use_srtp(ssl_ctx, "SRTP_AEAD_AES_256_GCM:SRTP_AEAD_AES_128_GCM:SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32");

...dtls_generate_keys(&ssl_cert, &ssl_key)...;

    SSL_CTX_use_certificate(ssl_ctx, ssl_cert);
    SSL_CTX_use_PrivateKey(ssl_ctx, ssl_key);
    SSL_CTX_check_private_key(ssl_ctx);
    SSL_CTX_set_read_ahead(ssl_ctx, 1);

...fingerprint...

    SSL * ssl = SSL_new(ssl_ctx)
    SSL_set_info_callback(ssl, cb_dtls);
    BIO * read_bio = BIO_new(BIO_s_mem());
    BIO_set_mem_eof_return(read_bio, -1);
.....
    SSL_set_bio(ssl, read_bio, write_bio);
.....

    int written = BIO_write(read_bio, buf, len);
    char data[DTLS_BUFFER_LEN];
--->int read = SSL_read(ssl, &data, DTLS_BUFFER_LEN);
    if(read < 0)
    {
        if(SSL_get_error(ssl, read) == SSL_ERROR_SSL)
        {
            char err[256];
            ERR_error_string_n(ERR_get_error(), err, sizeof(err));
            g_printerr("ERROR SSL handshake (%s)\n", err);
        }
        else
            g_printerr("ERROR SSL read (%s)\n", ERR_reason_error_string(ERR_get_error()));

        return;
    }

И получаю ошибку в этом месте SSL_ERROR_SSL error:140DF114:SSL routines:SSL_read:uninitialized

★★★

Последнее исправление: wolverin (всего исправлений: 2)

сами байты вроде как и должны быть чем то вроде tls рукопожатия

16:FE:FF:00:00:00:00:00:00:00:00:00:90:01:00:00:84:00:00:00:00:00:00:00:84:FE:FD:3D:CD:F5:4B:BD:FC:5A:97:3F:F0:2A:F5:3C:BF:18:4E:59:C8:90:FA:07:92:BE:57:61:E3:9F:A3:27:F6:D8:40:00:00:00:16:C0:2B:C0:2F:CC:A9:CC:A8:C0:09:C0:13:C0:0A:C0:14:00:9C:00:2F:00:35:01:00:00:44:00:17:00:00:FF:01:00:01:00:00:0A:00:08:00:06:00:1D:00:17:00:18:00:0B:00:02:01:00:00:23:00:00:00:0D:00:14:00:12:04:03:08:04:04:01:05:03:08:05:05:01:08:06:06:01:02:01:00:0E:00:09:00:06:00:01:00:08:00:07:00

т.е. косяк где то в моих api вызовах, но где не соображу…

wolverin ★★★
() автор топика
Последнее исправление: wolverin (всего исправлений: 2)
Ответ на: комментарий от anonymous2

это для простоты, все предыдущий вызовы до SSL_read прошли успешно.

есть мысль что бразер отправляет tls 1.3, а у меня на железке openssl 1.0.2 его не умеет, но это так тупые мысли вслух после изучения битового стека от тлс

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

tls рукопожатия

https://dtls.xargs.org/#open-all

dtls оказывается не совсем тоже самое, но вроде все сходится, хотя и не понятно какая версия рукопожатия пришла от бразера

DTLS Record Header
Each DTLS record starts with a type, some sequence info, and a length.
16 - TLS record type 22 (Handshake)
fe fd - Protocol version (DTLS 1.2, see below)
00 00 - key epoch (incremented each time the encryption keys are updated)
00 00 00 00 00 00 - DTLS record sequence number 0
00 9d - length of following data in this record (0x9D (157) bytes)
DTLS versions are encoded by breaking the protocol version into parts and then putting each part into a byte with the ones-complement value (thus "1.3" becomes {1,3} which becomes the bytes 0xFE 0xFC). This complement technique keeps DTLS versions distinct from TLS versions.

Because middleboxes have been created and deployed that do not allow protocol versions that they do not recognize, all DTLS 1.3 sessions indicate version DTLS 1.2 (0xFE 0xFD) in unencrypted records.
wolverin ★★★
() автор топика