1a8e1175bSopenharmony_ci/* BEGIN_HEADER */
2a8e1175bSopenharmony_ci#include "mbedtls/oid.h"
3a8e1175bSopenharmony_ci#include "mbedtls/asn1.h"
4a8e1175bSopenharmony_ci#include "mbedtls/asn1write.h"
5a8e1175bSopenharmony_ci#include "string.h"
6a8e1175bSopenharmony_ci/* END_HEADER */
7a8e1175bSopenharmony_ci
8a8e1175bSopenharmony_ci/* BEGIN_DEPENDENCIES
9a8e1175bSopenharmony_ci * depends_on:MBEDTLS_OID_C:!MBEDTLS_X509_REMOVE_INFO
10a8e1175bSopenharmony_ci * END_DEPENDENCIES
11a8e1175bSopenharmony_ci */
12a8e1175bSopenharmony_ci
13a8e1175bSopenharmony_ci/* BEGIN_CASE */
14a8e1175bSopenharmony_civoid oid_get_certificate_policies(data_t *oid, char *result_str)
15a8e1175bSopenharmony_ci{
16a8e1175bSopenharmony_ci    mbedtls_asn1_buf asn1_buf = { 0, 0, NULL };
17a8e1175bSopenharmony_ci    int ret;
18a8e1175bSopenharmony_ci    const char *desc;
19a8e1175bSopenharmony_ci
20a8e1175bSopenharmony_ci    asn1_buf.tag = MBEDTLS_ASN1_OID;
21a8e1175bSopenharmony_ci    asn1_buf.p = oid->x;
22a8e1175bSopenharmony_ci    asn1_buf.len = oid->len;
23a8e1175bSopenharmony_ci
24a8e1175bSopenharmony_ci    ret = mbedtls_oid_get_certificate_policies(&asn1_buf, &desc);
25a8e1175bSopenharmony_ci    if (strlen(result_str) == 0) {
26a8e1175bSopenharmony_ci        TEST_ASSERT(ret == MBEDTLS_ERR_OID_NOT_FOUND);
27a8e1175bSopenharmony_ci    } else {
28a8e1175bSopenharmony_ci        TEST_ASSERT(ret == 0);
29a8e1175bSopenharmony_ci        TEST_ASSERT(strcmp((char *) desc, result_str) == 0);
30a8e1175bSopenharmony_ci    }
31a8e1175bSopenharmony_ci}
32a8e1175bSopenharmony_ci/* END_CASE */
33a8e1175bSopenharmony_ci
34a8e1175bSopenharmony_ci/* BEGIN_CASE */
35a8e1175bSopenharmony_civoid oid_get_extended_key_usage(data_t *oid, char *result_str)
36a8e1175bSopenharmony_ci{
37a8e1175bSopenharmony_ci    mbedtls_asn1_buf asn1_buf = { 0, 0, NULL };
38a8e1175bSopenharmony_ci    int ret;
39a8e1175bSopenharmony_ci    const char *desc;
40a8e1175bSopenharmony_ci
41a8e1175bSopenharmony_ci    asn1_buf.tag = MBEDTLS_ASN1_OID;
42a8e1175bSopenharmony_ci    asn1_buf.p = oid->x;
43a8e1175bSopenharmony_ci    asn1_buf.len = oid->len;
44a8e1175bSopenharmony_ci
45a8e1175bSopenharmony_ci    ret = mbedtls_oid_get_extended_key_usage(&asn1_buf, &desc);
46a8e1175bSopenharmony_ci    if (strlen(result_str) == 0) {
47a8e1175bSopenharmony_ci        TEST_ASSERT(ret == MBEDTLS_ERR_OID_NOT_FOUND);
48a8e1175bSopenharmony_ci    } else {
49a8e1175bSopenharmony_ci        TEST_ASSERT(ret == 0);
50a8e1175bSopenharmony_ci        TEST_ASSERT(strcmp((char *) desc, result_str) == 0);
51a8e1175bSopenharmony_ci    }
52a8e1175bSopenharmony_ci}
53a8e1175bSopenharmony_ci/* END_CASE */
54a8e1175bSopenharmony_ci
55a8e1175bSopenharmony_ci/* BEGIN_CASE */
56a8e1175bSopenharmony_civoid oid_get_x509_extension(data_t *oid, int exp_type)
57a8e1175bSopenharmony_ci{
58a8e1175bSopenharmony_ci    mbedtls_asn1_buf ext_oid = { 0, 0, NULL };
59a8e1175bSopenharmony_ci    int ret;
60a8e1175bSopenharmony_ci    int ext_type;
61a8e1175bSopenharmony_ci
62a8e1175bSopenharmony_ci    ext_oid.tag = MBEDTLS_ASN1_OID;
63a8e1175bSopenharmony_ci    ext_oid.p = oid->x;
64a8e1175bSopenharmony_ci    ext_oid.len = oid->len;
65a8e1175bSopenharmony_ci
66a8e1175bSopenharmony_ci    ret = mbedtls_oid_get_x509_ext_type(&ext_oid, &ext_type);
67a8e1175bSopenharmony_ci    if (exp_type == 0) {
68a8e1175bSopenharmony_ci        TEST_ASSERT(ret == MBEDTLS_ERR_OID_NOT_FOUND);
69a8e1175bSopenharmony_ci    } else {
70a8e1175bSopenharmony_ci        TEST_ASSERT(ret == 0);
71a8e1175bSopenharmony_ci        TEST_ASSERT(ext_type == exp_type);
72a8e1175bSopenharmony_ci    }
73a8e1175bSopenharmony_ci}
74a8e1175bSopenharmony_ci/* END_CASE */
75a8e1175bSopenharmony_ci
76a8e1175bSopenharmony_ci/* BEGIN_CASE */
77a8e1175bSopenharmony_civoid oid_get_md_alg_id(data_t *oid, int exp_md_id)
78a8e1175bSopenharmony_ci{
79a8e1175bSopenharmony_ci    mbedtls_asn1_buf md_oid = { 0, 0, NULL };
80a8e1175bSopenharmony_ci    int ret;
81a8e1175bSopenharmony_ci    mbedtls_md_type_t md_id = 0;
82a8e1175bSopenharmony_ci
83a8e1175bSopenharmony_ci    md_oid.tag = MBEDTLS_ASN1_OID;
84a8e1175bSopenharmony_ci    md_oid.p = oid->x;
85a8e1175bSopenharmony_ci    md_oid.len = oid->len;
86a8e1175bSopenharmony_ci
87a8e1175bSopenharmony_ci    ret = mbedtls_oid_get_md_alg(&md_oid, &md_id);
88a8e1175bSopenharmony_ci
89a8e1175bSopenharmony_ci    if (exp_md_id < 0) {
90a8e1175bSopenharmony_ci        TEST_ASSERT(ret == MBEDTLS_ERR_OID_NOT_FOUND);
91a8e1175bSopenharmony_ci        TEST_ASSERT(md_id == 0);
92a8e1175bSopenharmony_ci    } else {
93a8e1175bSopenharmony_ci        TEST_ASSERT(ret == 0);
94a8e1175bSopenharmony_ci        TEST_ASSERT((mbedtls_md_type_t) exp_md_id == md_id);
95a8e1175bSopenharmony_ci    }
96a8e1175bSopenharmony_ci}
97a8e1175bSopenharmony_ci/* END_CASE */
98a8e1175bSopenharmony_ci
99a8e1175bSopenharmony_ci/* BEGIN_CASE */
100a8e1175bSopenharmony_civoid mbedtls_oid_get_md_hmac(data_t *oid, int exp_md_id)
101a8e1175bSopenharmony_ci{
102a8e1175bSopenharmony_ci    mbedtls_asn1_buf md_oid = { 0, 0, NULL };
103a8e1175bSopenharmony_ci    int ret;
104a8e1175bSopenharmony_ci    mbedtls_md_type_t md_id = 0;
105a8e1175bSopenharmony_ci
106a8e1175bSopenharmony_ci    md_oid.tag = MBEDTLS_ASN1_OID;
107a8e1175bSopenharmony_ci    md_oid.p = oid->x;
108a8e1175bSopenharmony_ci    md_oid.len = oid->len;
109a8e1175bSopenharmony_ci
110a8e1175bSopenharmony_ci    ret = mbedtls_oid_get_md_hmac(&md_oid, &md_id);
111a8e1175bSopenharmony_ci
112a8e1175bSopenharmony_ci    if (exp_md_id < 0) {
113a8e1175bSopenharmony_ci        TEST_ASSERT(ret == MBEDTLS_ERR_OID_NOT_FOUND);
114a8e1175bSopenharmony_ci        TEST_ASSERT(md_id == 0);
115a8e1175bSopenharmony_ci    } else {
116a8e1175bSopenharmony_ci        TEST_ASSERT(ret == 0);
117a8e1175bSopenharmony_ci        TEST_ASSERT((mbedtls_md_type_t) exp_md_id == md_id);
118a8e1175bSopenharmony_ci    }
119a8e1175bSopenharmony_ci}
120a8e1175bSopenharmony_ci/* END_CASE */
121a8e1175bSopenharmony_ci
122a8e1175bSopenharmony_ci/* BEGIN_CASE */
123a8e1175bSopenharmony_civoid oid_get_numeric_string(data_t *oid, int error_ret, char *result_str)
124a8e1175bSopenharmony_ci{
125a8e1175bSopenharmony_ci    char buf[256];
126a8e1175bSopenharmony_ci    mbedtls_asn1_buf input_oid = { 0, 0, NULL };
127a8e1175bSopenharmony_ci    int ret;
128a8e1175bSopenharmony_ci
129a8e1175bSopenharmony_ci    input_oid.tag = MBEDTLS_ASN1_OID;
130a8e1175bSopenharmony_ci    /* Test that an empty OID is not dereferenced */
131a8e1175bSopenharmony_ci    input_oid.p = oid->len ? oid->x : (void *) 1;
132a8e1175bSopenharmony_ci    input_oid.len = oid->len;
133a8e1175bSopenharmony_ci
134a8e1175bSopenharmony_ci    ret = mbedtls_oid_get_numeric_string(buf, sizeof(buf), &input_oid);
135a8e1175bSopenharmony_ci
136a8e1175bSopenharmony_ci    if (error_ret == 0) {
137a8e1175bSopenharmony_ci        TEST_EQUAL(ret, strlen(result_str));
138a8e1175bSopenharmony_ci        TEST_ASSERT(ret >= 3);
139a8e1175bSopenharmony_ci        TEST_EQUAL(strcmp(buf, result_str), 0);
140a8e1175bSopenharmony_ci    } else {
141a8e1175bSopenharmony_ci        TEST_EQUAL(ret, error_ret);
142a8e1175bSopenharmony_ci    }
143a8e1175bSopenharmony_ci}
144a8e1175bSopenharmony_ci/* END_CASE */
145a8e1175bSopenharmony_ci
146a8e1175bSopenharmony_ci/* BEGIN_CASE */
147a8e1175bSopenharmony_civoid oid_from_numeric_string(char *oid_str, int error_ret,
148a8e1175bSopenharmony_ci                             data_t *exp_oid_buf)
149a8e1175bSopenharmony_ci{
150a8e1175bSopenharmony_ci    mbedtls_asn1_buf oid = { 0, 0, NULL };
151a8e1175bSopenharmony_ci    mbedtls_asn1_buf exp_oid = { 0, 0, NULL };
152a8e1175bSopenharmony_ci    int ret;
153a8e1175bSopenharmony_ci
154a8e1175bSopenharmony_ci    exp_oid.tag = MBEDTLS_ASN1_OID;
155a8e1175bSopenharmony_ci    exp_oid.p = exp_oid_buf->x;
156a8e1175bSopenharmony_ci    exp_oid.len = exp_oid_buf->len;
157a8e1175bSopenharmony_ci
158a8e1175bSopenharmony_ci    ret = mbedtls_oid_from_numeric_string(&oid, oid_str, strlen(oid_str));
159a8e1175bSopenharmony_ci
160a8e1175bSopenharmony_ci    if (error_ret == 0) {
161a8e1175bSopenharmony_ci        TEST_EQUAL(oid.len, exp_oid.len);
162a8e1175bSopenharmony_ci        TEST_ASSERT(memcmp(oid.p, exp_oid.p, oid.len) == 0);
163a8e1175bSopenharmony_ci        mbedtls_free(oid.p);
164a8e1175bSopenharmony_ci        oid.p = NULL;
165a8e1175bSopenharmony_ci        oid.len = 0;
166a8e1175bSopenharmony_ci    } else {
167a8e1175bSopenharmony_ci        TEST_EQUAL(ret, error_ret);
168a8e1175bSopenharmony_ci    }
169a8e1175bSopenharmony_ci}
170a8e1175bSopenharmony_ci/* END_CASE */
171