mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2024-11-27 04:44:14 +01:00
Adapt ssl_server2 to datagram-style read
This commit is contained in:
parent
46fb942046
commit
cce220d6aa
@ -1748,16 +1748,111 @@ data_exchange:
|
|||||||
printf( " < Read from client:" );
|
printf( " < Read from client:" );
|
||||||
fflush( stdout );
|
fflush( stdout );
|
||||||
|
|
||||||
do
|
/*
|
||||||
|
* TLS and DTLS need different reading styles (stream vs datagram)
|
||||||
|
*/
|
||||||
|
if( opt.transport == SSL_TRANSPORT_STREAM )
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
int terminated = 0;
|
||||||
|
len = sizeof( buf ) - 1;
|
||||||
|
memset( buf, 0, sizeof( buf ) );
|
||||||
|
ret = ssl_read( &ssl, buf, len );
|
||||||
|
|
||||||
|
if( ret == POLARSSL_ERR_NET_WANT_READ ||
|
||||||
|
ret == POLARSSL_ERR_NET_WANT_WRITE )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if( ret <= 0 )
|
||||||
|
{
|
||||||
|
switch( ret )
|
||||||
|
{
|
||||||
|
case POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY:
|
||||||
|
printf( " connection was closed gracefully\n" );
|
||||||
|
goto close_notify;
|
||||||
|
|
||||||
|
case 0:
|
||||||
|
case POLARSSL_ERR_NET_CONN_RESET:
|
||||||
|
printf( " connection was reset by peer\n" );
|
||||||
|
ret = POLARSSL_ERR_NET_CONN_RESET;
|
||||||
|
goto reset;
|
||||||
|
|
||||||
|
default:
|
||||||
|
printf( " ssl_read returned -0x%x\n", -ret );
|
||||||
|
goto reset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ssl_get_bytes_avail( &ssl ) == 0 )
|
||||||
|
{
|
||||||
|
len = ret;
|
||||||
|
buf[len] = '\0';
|
||||||
|
printf( " %d bytes read\n\n%s\n", len, (char *) buf );
|
||||||
|
|
||||||
|
/* End of message should be detected according to the syntax of the
|
||||||
|
* application protocol (eg HTTP), just use a dummy test here. */
|
||||||
|
if( buf[len - 1] == '\n' )
|
||||||
|
terminated = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int extra_len, ori_len;
|
||||||
|
unsigned char *larger_buf;
|
||||||
|
|
||||||
|
ori_len = ret;
|
||||||
|
extra_len = ssl_get_bytes_avail( &ssl );
|
||||||
|
|
||||||
|
larger_buf = polarssl_malloc( ori_len + extra_len + 1 );
|
||||||
|
if( larger_buf == NULL )
|
||||||
|
{
|
||||||
|
printf( " ! memory allocation failed\n" );
|
||||||
|
ret = 1;
|
||||||
|
goto reset;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset( larger_buf, 0, ori_len + extra_len );
|
||||||
|
memcpy( larger_buf, buf, ori_len );
|
||||||
|
|
||||||
|
/* This read should never fail and get the whole cached data */
|
||||||
|
ret = ssl_read( &ssl, larger_buf + ori_len, extra_len );
|
||||||
|
if( ret != extra_len ||
|
||||||
|
ssl_get_bytes_avail( &ssl ) != 0 )
|
||||||
|
{
|
||||||
|
printf( " ! ssl_read failed on cached data\n" );
|
||||||
|
ret = 1;
|
||||||
|
goto reset;
|
||||||
|
}
|
||||||
|
|
||||||
|
larger_buf[ori_len + extra_len] = '\0';
|
||||||
|
printf( " %u bytes read (%u + %u)\n\n%s\n",
|
||||||
|
ori_len + extra_len, ori_len, extra_len,
|
||||||
|
(char *) larger_buf );
|
||||||
|
|
||||||
|
/* End of message should be detected according to the syntax of the
|
||||||
|
* application protocol (eg HTTP), just use a dummy test here. */
|
||||||
|
if( larger_buf[ori_len + extra_len - 1] == '\n' )
|
||||||
|
terminated = 1;
|
||||||
|
|
||||||
|
polarssl_free( larger_buf );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( terminated )
|
||||||
|
{
|
||||||
|
ret = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while( 1 );
|
||||||
|
}
|
||||||
|
else /* Not stream, so datagram */
|
||||||
{
|
{
|
||||||
int terminated = 0;
|
|
||||||
len = sizeof( buf ) - 1;
|
len = sizeof( buf ) - 1;
|
||||||
memset( buf, 0, sizeof( buf ) );
|
memset( buf, 0, sizeof( buf ) );
|
||||||
ret = ssl_read( &ssl, buf, len );
|
|
||||||
|
|
||||||
if( ret == POLARSSL_ERR_NET_WANT_READ ||
|
do ret = ssl_read( &ssl, buf, len );
|
||||||
ret == POLARSSL_ERR_NET_WANT_WRITE )
|
while( ret == POLARSSL_ERR_NET_WANT_READ ||
|
||||||
continue;
|
ret == POLARSSL_ERR_NET_WANT_WRITE );
|
||||||
|
|
||||||
if( ret <= 0 )
|
if( ret <= 0 )
|
||||||
{
|
{
|
||||||
@ -1765,13 +1860,14 @@ data_exchange:
|
|||||||
{
|
{
|
||||||
case POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY:
|
case POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY:
|
||||||
printf( " connection was closed gracefully\n" );
|
printf( " connection was closed gracefully\n" );
|
||||||
|
ret = 0;
|
||||||
goto close_notify;
|
goto close_notify;
|
||||||
|
|
||||||
case 0:
|
case 0:
|
||||||
case POLARSSL_ERR_NET_CONN_RESET:
|
case POLARSSL_ERR_NET_CONN_RESET:
|
||||||
printf( " connection was reset by peer\n" );
|
printf( " connection was reset by peer\n" );
|
||||||
ret = POLARSSL_ERR_NET_CONN_RESET;
|
ret = POLARSSL_ERR_NET_CONN_RESET;
|
||||||
goto reset;
|
goto reset;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
printf( " ssl_read returned -0x%x\n", -ret );
|
printf( " ssl_read returned -0x%x\n", -ret );
|
||||||
@ -1779,66 +1875,11 @@ data_exchange:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ssl_get_bytes_avail( &ssl ) == 0 )
|
len = ret;
|
||||||
{
|
buf[len] = '\0';
|
||||||
len = ret;
|
printf( " %d bytes read\n\n%s", len, (char *) buf );
|
||||||
buf[len] = '\0';
|
ret = 0;
|
||||||
printf( " %d bytes read\n\n%s\n", len, (char *) buf );
|
|
||||||
|
|
||||||
/* End of message should be detected according to the syntax of the
|
|
||||||
* application protocol (eg HTTP), just use a dummy test here. */
|
|
||||||
if( buf[len - 1] == '\n' )
|
|
||||||
terminated = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int extra_len, ori_len;
|
|
||||||
unsigned char *larger_buf;
|
|
||||||
|
|
||||||
ori_len = ret;
|
|
||||||
extra_len = ssl_get_bytes_avail( &ssl );
|
|
||||||
|
|
||||||
larger_buf = polarssl_malloc( ori_len + extra_len + 1 );
|
|
||||||
if( larger_buf == NULL )
|
|
||||||
{
|
|
||||||
printf( " ! memory allocation failed\n" );
|
|
||||||
ret = 1;
|
|
||||||
goto reset;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset( larger_buf, 0, ori_len + extra_len );
|
|
||||||
memcpy( larger_buf, buf, ori_len );
|
|
||||||
|
|
||||||
/* This read should never fail and get the whole cached data */
|
|
||||||
ret = ssl_read( &ssl, larger_buf + ori_len, extra_len );
|
|
||||||
if( ret != extra_len ||
|
|
||||||
ssl_get_bytes_avail( &ssl ) != 0 )
|
|
||||||
{
|
|
||||||
printf( " ! ssl_read failed on cached data\n" );
|
|
||||||
ret = 1;
|
|
||||||
goto reset;
|
|
||||||
}
|
|
||||||
|
|
||||||
larger_buf[ori_len + extra_len] = '\0';
|
|
||||||
printf( " %u bytes read (%u + %u)\n\n%s\n",
|
|
||||||
ori_len + extra_len, ori_len, extra_len,
|
|
||||||
(char *) larger_buf );
|
|
||||||
|
|
||||||
/* End of message should be detected according to the syntax of the
|
|
||||||
* application protocol (eg HTTP), just use a dummy test here. */
|
|
||||||
if( larger_buf[ori_len + extra_len - 1] == '\n' )
|
|
||||||
terminated = 1;
|
|
||||||
|
|
||||||
polarssl_free( larger_buf );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( terminated )
|
|
||||||
{
|
|
||||||
ret = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
while( 1 );
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 7a. Request renegotiation while client is waiting for input from us.
|
* 7a. Request renegotiation while client is waiting for input from us.
|
||||||
|
Loading…
Reference in New Issue
Block a user