2017-01-18 6 views
1

SGKと組み合わせたmbedtlsライブラリでPSKを使用しようとしています。 PSKがなければ、接続は正常に動作します。ここでPSKでmbedtlsエラーが発生する

は、関連するクライアント側のコードです:

mbedtls_entropy_context entropy; 
mbedtls_ctr_drbg_context ctr_drbg; 
mbedtls_ssl_context ssl; 
mbedtls_ssl_config conf; 
mbedtls_x509_crt cacert; 

mbedtls_net_init(&server_fd); 
mbedtls_ssl_init(&ssl); 
mbedtls_ssl_config_init(&conf); 
mbedtls_x509_crt_init(&cacert); 
mbedtls_ctr_drbg_init(&ctr_drbg); 


mbedtls_entropy_init(&entropy); 
if ((mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char*) pers, strlen(pers))) != 0) { 
    mbedtls_printf(" failed\n ! mbedtls_ctr_drbg_seed returned %d\n", ret); 
    ret = -1; 
    break; 
} 

ret = mbedtls_x509_crt_parse(&cacert, (const unsigned char *) mbedtls_crt, mbedtls_crt_len); 

if ((ret = mbedtls_net_connect(&server_fd, SERVER_NAME, SERVER_PORT, MBEDTLS_NET_PROTO_TCP)) != 0) { 
    mbedtls_printf(" failed\n ! mbedtls_net_connect returned %d\n\n", ret); 
    break; 
} 

if ((ret = mbedtls_ssl_config_defaults(&conf, 
             MBEDTLS_SSL_IS_CLIENT, 
             MBEDTLS_SSL_TRANSPORT_STREAM, 
             MBEDTLS_SSL_PRESET_DEFAULT)) != 0) 
{ 
    mbedtls_printf(" failed\n ! mbedtls_ssl_config_defaults returned %d\n\n", ret); 
    break; 
} 

mbedtls_ssl_conf_authmode(&conf, MBEDTLS_SSL_VERIFY_OPTIONAL); 
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, NULL); 
mbedtls_ssl_conf_verify(&conf, my_verify, NULL); 

const unsigned char psk_key[] = { 
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 
    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f 
}; 
size_t psk_len = sizeof(psk_key); 
const char psk_id[] = "Client_identity"; 

if ((ret = mbedtls_ssl_conf_psk(&conf, psk_key, psk_len, 
           (const unsigned char *) psk_id, 
           strlen(psk_id))) != 0) 
{ 
    mbedtls_printf(" mbedtls_ssl_conf_psk returned %d\n\n", ret); 
    break; 
} 



if((ret = mbedtls_ssl_setup(&ssl, &conf)) != 0) 
{ 
    mbedtls_printf(" failed\n ! mbedtls_ssl_setup returned %d\n\n", ret); 
    break; 
} 

if((ret = mbedtls_ssl_set_hostname(&ssl, "mbed TLS Server 1")) != 0) 
{ 
    mbedtls_printf(" failed\n ! mbedtls_ssl_set_hostname returned %d\n\n", ret); 
    break; 
} 

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

mbedtls_printf(" ok\n"); 
mbedtls_printf(" . Performing the SSL/TLS handshake..."); 

while ((ret = mbedtls_ssl_handshake(&ssl)) != 0) { 
    if (ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE) { 
     mbedtls_printf(" failed\n ! mbedtls_ssl_handshake returned -0x%x\n\n", -ret); 
     break; 
    } 
} 


.... 

私が実行しているのopensslテストサーバーを持っている:

openssl s_server -accept 4433 -cert server.pem -psk 000102030405060708090a0b0c0d0e0f -psk_hint Client_identity -cipher PSK-AES256-CBC-SHA -debug 

サーバーが接続を受信し、同様にPSKメッセージを交換しますが、 復号ポイントで次のエラーが表示されます。

error:1408F119:SSL routines:SSL3_GET_RECORD:decryption failed or bad record mac:s3_pkt.c:532: 

私はまた-cipher PSK-AES256-CBC-SHAを別の暗号に変更しようとしましたが、同じエラーが残っています。 暗号を完全に省略すると接続は機能しますが、PSKは実行されません!

答えて

0

数回の試行の後、私はこの問題の根本的な原因に到達することができました。失敗の理由、(私は-debug -tlsextdebugを使用)のopenssl s_serverログに以下のログから暗示されています。

openssl code から発信され

created PSK len=15

はしかし、あなたが使用しているキーは16バイトです。

created PSK len=16

私はこの失敗の根本的な原因は、最も重要なゼロを無視した、OPENSSL_hexstr2buf() implementation内にあるので、戻って信じている:私は、TLS接続は以下のログで、働いていた、「010102030405060708090a0b0c0d0e0f」にPSKを変更 キーの長さ。

よろしく、
MBED TLSチームのメンバー
ロン

関連する問題