in platform/posix/transport/src/mbedtls_pkcs11_posix.c [263:352]
static MbedtlsPkcs11Status_t configureMbedtls( MbedtlsPkcs11Context_t * pMbedtlsPkcs11Context,
const char * pHostName,
const MbedtlsPkcs11Credentials_t * pMbedtlsPkcs11Credentials,
uint32_t recvTimeoutMs )
{
MbedtlsPkcs11Status_t returnStatus = MBEDTLS_PKCS11_SUCCESS;
int32_t mbedtlsError = 0;
assert( pMbedtlsPkcs11Context != NULL );
assert( pHostName != NULL );
assert( pMbedtlsPkcs11Credentials != NULL );
assert( pMbedtlsPkcs11Credentials->pRootCaPath != NULL );
/* Initialize the MbedTLS context structures. */
contextInit( pMbedtlsPkcs11Context );
pMbedtlsPkcs11Context->p11Session = pMbedtlsPkcs11Credentials->p11Session;
mbedtlsError = mbedtls_ssl_config_defaults( &( pMbedtlsPkcs11Context->config ),
MBEDTLS_SSL_IS_CLIENT,
MBEDTLS_SSL_TRANSPORT_STREAM,
MBEDTLS_SSL_PRESET_DEFAULT );
if( mbedtlsError != 0 )
{
LogError( ( "Failed to set default SSL configuration: mbedTLSError= %s : %s.",
mbedtlsHighLevelCodeOrDefault( mbedtlsError ),
mbedtlsLowLevelCodeOrDefault( mbedtlsError ) ) );
/* Per MbedTLS docs, mbedtls_ssl_config_defaults only fails on memory allocation. */
returnStatus = MBEDTLS_PKCS11_INSUFFICIENT_MEMORY;
}
else
{
/* Set up the certificate security profile, starting from the default value. */
pMbedtlsPkcs11Context->certProfile = mbedtls_x509_crt_profile_default;
/* Set SSL authmode and the RNG context. */
mbedtls_ssl_conf_authmode( &( pMbedtlsPkcs11Context->config ), MBEDTLS_SSL_VERIFY_REQUIRED );
mbedtls_ssl_conf_rng( &( pMbedtlsPkcs11Context->config ), generateRandomBytes, pMbedtlsPkcs11Context );
mbedtls_ssl_conf_cert_profile( &( pMbedtlsPkcs11Context->config ), &( pMbedtlsPkcs11Context->certProfile ) );
mbedtls_ssl_conf_read_timeout( &( pMbedtlsPkcs11Context->config ), recvTimeoutMs );
mbedtls_ssl_conf_dbg( &pMbedtlsPkcs11Context->config, mbedtlsDebugPrint, NULL );
mbedtls_debug_set_threshold( MBEDTLS_DEBUG_LOG_LEVEL );
returnStatus = configureMbedtlsCertificates( pMbedtlsPkcs11Context, pMbedtlsPkcs11Credentials );
}
if( returnStatus == MBEDTLS_PKCS11_SUCCESS )
{
returnStatus = configureMbedtlsSniAlpn( pMbedtlsPkcs11Context, pMbedtlsPkcs11Credentials, pHostName );
}
if( returnStatus == MBEDTLS_PKCS11_SUCCESS )
{
/* Initialize the MbedTLS secured connection context. */
mbedtlsError = mbedtls_ssl_setup( &( pMbedtlsPkcs11Context->context ),
&( pMbedtlsPkcs11Context->config ) );
if( mbedtlsError != 0 )
{
LogError( ( "Failed to set up MbedTLS SSL context: mbedTLSError= %s : %s.",
mbedtlsHighLevelCodeOrDefault( mbedtlsError ),
mbedtlsLowLevelCodeOrDefault( mbedtlsError ) ) );
returnStatus = MBEDTLS_PKCS11_INTERNAL_ERROR;
}
}
if( returnStatus == MBEDTLS_PKCS11_SUCCESS )
{
/* Set the underlying IO for the TLS connection. */
mbedtls_ssl_set_bio( &( pMbedtlsPkcs11Context->context ),
( void * ) &( pMbedtlsPkcs11Context->socketContext ),
mbedtls_net_send,
mbedtls_net_recv,
mbedtls_net_recv_timeout );
returnStatus = configureMbedtlsFragmentLength( pMbedtlsPkcs11Context );
}
if( returnStatus != MBEDTLS_PKCS11_SUCCESS )
{
contextFree( pMbedtlsPkcs11Context );
}
else
{
LogDebug( ( "Configured MbedTLS context." ) );
}
return returnStatus;
}