/* BEGIN_HEADER */
#include "mbedtls/oid.h"
#include "mbedtls/asn1.h"
#include "mbedtls/asn1write.h"
#include "string.h"
#include "mbedtls/legacy_or_psa.h"
/* END_HEADER */

/* BEGIN_DEPENDENCIES
 * depends_on:MBEDTLS_OID_C:!MBEDTLS_X509_REMOVE_INFO
 * END_DEPENDENCIES
 */

/* BEGIN_CASE */
void oid_get_certificate_policies( data_t *oid, char *result_str )
{
    mbedtls_asn1_buf asn1_buf = { 0, 0, NULL };
    int ret;
    const char *desc;

    asn1_buf.tag = MBEDTLS_ASN1_OID;
    asn1_buf.p = oid->x;
    asn1_buf.len = oid->len;

    ret = mbedtls_oid_get_certificate_policies( &asn1_buf, &desc );
    if( strlen( result_str ) == 0 )
    {
        TEST_ASSERT( ret == MBEDTLS_ERR_OID_NOT_FOUND );
    }
    else
    {
        TEST_ASSERT( ret == 0 );
        TEST_ASSERT( strcmp( ( char* )desc, result_str ) == 0 );
    }
}
/* END_CASE */

/* BEGIN_CASE */
void oid_get_extended_key_usage( data_t *oid, char *result_str )
{
    mbedtls_asn1_buf asn1_buf = { 0, 0, NULL };
    int ret;
    const char *desc;

    asn1_buf.tag = MBEDTLS_ASN1_OID;
    asn1_buf.p = oid->x;
    asn1_buf.len = oid->len;

    ret = mbedtls_oid_get_extended_key_usage( &asn1_buf, &desc );
    if( strlen( result_str ) == 0 )
    {
        TEST_ASSERT( ret == MBEDTLS_ERR_OID_NOT_FOUND );
    }
    else
    {
        TEST_ASSERT( ret == 0 );
        TEST_ASSERT( strcmp( ( char * )desc, result_str ) == 0 );
    }
}
/* END_CASE */

/* BEGIN_CASE */
void oid_get_x509_extension( data_t *oid, int exp_type )
{
    mbedtls_asn1_buf ext_oid = { 0, 0, NULL };
    int ret;
    int ext_type;

    ext_oid.tag = MBEDTLS_ASN1_OID;
    ext_oid.p = oid->x;
    ext_oid.len = oid->len;

    ret = mbedtls_oid_get_x509_ext_type( &ext_oid, &ext_type );
    if( exp_type == 0 )
    {
        TEST_ASSERT( ret == MBEDTLS_ERR_OID_NOT_FOUND );
    }
    else
    {
        TEST_ASSERT( ret == 0 );
        TEST_ASSERT( ext_type == exp_type );
    }
}
/* END_CASE */

/* BEGIN_CASE */
void oid_get_md_alg_id( data_t *oid, int exp_md_id )
{
    mbedtls_asn1_buf md_oid = { 0, 0, NULL };
    int ret;
    mbedtls_md_type_t md_id = 0;

    md_oid.tag = MBEDTLS_ASN1_OID;
    md_oid.p = oid->x;
    md_oid.len = oid->len;

    ret = mbedtls_oid_get_md_alg( &md_oid, &md_id );

    if( exp_md_id < 0 )
    {
        TEST_ASSERT( ret == MBEDTLS_ERR_OID_NOT_FOUND );
        TEST_ASSERT( md_id == 0);
    }
    else
    {
        TEST_ASSERT( ret == 0 );
        TEST_ASSERT( (mbedtls_md_type_t)exp_md_id == md_id );
    }
}
/* END_CASE */
