diff --git a/library/x509_create.c b/library/x509_create.c
index 9d40db0..daf17a6 100644
--- a/library/x509_create.c
+++ b/library/x509_create.c
@@ -130,34 +130,6 @@
     return cur;
 }
 
-static char *x509_oid_from_numericoid(const char *numericoid,
-                                      size_t numericoid_len)
-{
-    char *oid;
-    mbedtls_asn1_buf *oid_buf = mbedtls_calloc(1, sizeof(mbedtls_asn1_buf));
-    int ret;
-
-    ret = mbedtls_oid_from_numeric_string(oid_buf, numericoid, numericoid_len);
-    if (ret != 0) {
-        if (ret != MBEDTLS_ERR_ASN1_ALLOC_FAILED) {
-            mbedtls_free(oid_buf->p);
-        }
-        mbedtls_free(oid_buf);
-        return NULL;
-    }
-    oid = mbedtls_calloc(1, oid_buf->len + 1);
-    if(oid == NULL) {
-        mbedtls_free(oid_buf->p);
-        mbedtls_free(oid_buf);
-        return MBEDTLS_ERR_X509_ALLOC_FAILED;
-    }
-    memcpy(oid, oid_buf->p, oid_buf->len);
-    oid[oid_buf->len + 1] = '\0';
-    mbedtls_free(oid_buf->p);
-    mbedtls_free(oid_buf);
-    return oid;
-}
-
 static int hex_to_int(char c)
 {
     return ('0' <= c && c <= '9') ? (c - '0') :
@@ -270,7 +242,7 @@
     int parse_ret = 0;
     const char *s = name, *c = s;
     const char *end = s + strlen(s);
-    char *oid = NULL;
+    mbedtls_asn1_buf oid = { .p = NULL, .len = 0, .tag = 5 };
     const x509_attr_descriptor_t *attr_descr = NULL;
     int in_attr_type = 1;
     int tag;
@@ -284,14 +256,15 @@
     while (c <= end) {
         if (in_attr_type && *c == '=') {
             if ((attr_descr = x509_attr_descr_from_name(s, c - s)) == NULL) {
-                if ((oid = x509_oid_from_numericoid(s, c - s)) == NULL) {
+                if ((mbedtls_oid_from_numeric_string(&oid, s, c - s)) != 0) {
                     return MBEDTLS_ERR_X509_INVALID_NAME;
                 } else {
                     numericoid = 1;
                 }
             } else {
-                oid = mbedtls_calloc(1, strlen(attr_descr->oid));
-                strcpy(oid, attr_descr->oid);
+                oid.len = strlen(attr_descr->oid);
+                oid.p = mbedtls_calloc(1, oid.len);
+                memcpy(oid.p, attr_descr->oid, oid.len);
                 numericoid = 0;
             }
 
@@ -305,13 +278,13 @@
                      parse_attribute_value_ber_encoded(s, (int) (c - s), data, &data_len,
                                                        &tag)) != 0) {
                 if (numericoid) {
-                    mbedtls_free(oid);
+                    mbedtls_free(oid.p);
                     return MBEDTLS_ERR_X509_INVALID_NAME;
                 } else {
                     if ((parse_ret =
                              parse_attribute_value_string(s, (int) (c - s), data,
                                                           &data_len)) != 0) {
-                        mbedtls_free(oid);
+                        mbedtls_free(oid.p);
                         return parse_ret;
                     }
                     tag = attr_descr->default_tag;
@@ -332,11 +305,11 @@
             }
 #endif
             mbedtls_asn1_named_data *cur =
-                mbedtls_asn1_store_named_data(head, oid, strlen(oid),
+                mbedtls_asn1_store_named_data(head, (char *) oid.p, oid.len,
                                               (unsigned char *) data,
                                               data_len);
-            mbedtls_free(oid);
-            oid = NULL;
+            mbedtls_free(oid.p);
+            oid.p = NULL;
             if (cur == NULL) {
                 return MBEDTLS_ERR_X509_ALLOC_FAILED;
             }
@@ -356,8 +329,8 @@
         }
         c++;
     }
-    if (oid != NULL) {
-        mbedtls_free(oid);
+    if (oid.p != NULL) {
+        mbedtls_free(oid.p);
     }
     return ret;
 }
