diff --git a/library/oid.c b/library/oid.c
index 371d1ba..93aa3c6 100644
--- a/library/oid.c
+++ b/library/oid.c
@@ -34,6 +34,38 @@
 
 #include <stdio.h>
 
+#define FN_OID_TYPED_FROM_ASN1( TYPE_T, NAME, LIST )                              \
+static const TYPE_T * oid_ ## NAME ## _from_asn1( const asn1_buf *oid )           \
+{ return (const TYPE_T *) oid_descriptor_from_buf(LIST, sizeof(TYPE_T), oid->p, oid->len ); }
+
+/*
+ * Core generic function
+ */
+static const oid_descriptor_t *oid_descriptor_from_buf( const void *struct_set,
+                size_t struct_size, const unsigned char *oid, size_t len )
+{
+    const unsigned char *p = (const unsigned char *) struct_set;
+    const oid_descriptor_t *cur;
+
+    if( struct_set == NULL || oid == NULL )
+        return( NULL );
+
+    cur = (const oid_descriptor_t *) p;
+    while( cur->asn1 != NULL )
+    {
+        if( strlen( cur->asn1 ) == len &&
+            memcmp( cur->asn1, oid, len ) == 0 )
+        {
+            return( cur );
+        }
+
+        p += struct_size;
+        cur = (const oid_descriptor_t *) p;
+    }
+
+    return( NULL );
+}
+
 /*
  * For X520 attribute types
  */
@@ -78,6 +110,20 @@
     }
 };
 
+FN_OID_TYPED_FROM_ASN1(oid_x520_attr_t,  x520_attr,    oid_x520_attr_type);
+
+int oid_get_attr_short_name( const asn1_buf *oid, const char **short_name )
+{
+    const oid_x520_attr_t *data = oid_x520_attr_from_asn1( oid );
+
+    if( data == NULL )
+        return( POLARSSL_ERR_OID_NOT_FOUND );
+
+    *short_name = data->short_name;
+
+    return( 0 );
+}
+
 #if defined(POLARSSL_X509_PARSE_C) || defined(POLARSSL_X509_WRITE_C)
 /*
  * For X509 extensions
@@ -115,6 +161,20 @@
     },
 };
 
+FN_OID_TYPED_FROM_ASN1(oid_x509_ext_t,  x509_ext,    oid_x509_ext);
+
+int oid_get_x509_ext_type( const asn1_buf *oid, int *ext_type )
+{
+    const oid_x509_ext_t *data = oid_x509_ext_from_asn1( oid );
+
+    if( data == NULL )
+        return( POLARSSL_ERR_OID_NOT_FOUND );
+
+    *ext_type = data->ext_type;
+
+    return( 0 );
+}
+
 static const oid_descriptor_t oid_ext_key_usage[] =
 {
     { OID_SERVER_AUTH,      "id-kp-serverAuth",      "TLS Web Server Authentication" },
@@ -125,6 +185,21 @@
     { OID_OCSP_SIGNING,     "id-kp-OCSPSigning",     "OCSP Signing" },
     { NULL, NULL, NULL },
 };
+
+FN_OID_TYPED_FROM_ASN1(oid_descriptor_t,  ext_key_usage,    oid_ext_key_usage);
+
+int oid_get_extended_key_usage( const asn1_buf *oid, const char **desc )
+{
+    const oid_descriptor_t *data = oid_ext_key_usage_from_asn1( oid );
+
+    if( data == NULL )
+        return( POLARSSL_ERR_OID_NOT_FOUND );
+
+    *desc = data->description;
+
+    return( 0 );
+}
+
 #endif /* POLARSSL_X509_PARSE_C || POLARSSL_X509_WRITE_C */
 
 /*
@@ -180,6 +255,54 @@
     },
 };
 
+FN_OID_TYPED_FROM_ASN1(oid_sig_alg_t,    sig_alg,      oid_sig_alg);
+
+int oid_get_sig_alg_desc( const asn1_buf *oid, const char **desc )
+{
+    const oid_sig_alg_t *data = oid_sig_alg_from_asn1( oid );
+
+    if( data == NULL )
+        return( POLARSSL_ERR_OID_NOT_FOUND );
+
+    *desc = data->descriptor.description;
+
+    return( 0 );
+}
+
+int oid_get_sig_alg( const asn1_buf *oid,
+                     md_type_t *md_alg, pk_type_t *pk_alg )
+{
+    const oid_sig_alg_t *data = oid_sig_alg_from_asn1( oid );
+
+    if( data == NULL )
+        return( POLARSSL_ERR_OID_NOT_FOUND );
+
+    *md_alg = data->md_alg;
+    *pk_alg = data->pk_alg;
+
+    return( 0 );
+}
+
+int oid_get_oid_by_sig_alg( pk_type_t pk_alg, md_type_t md_alg,
+                            const char **oid_str )
+{
+    const oid_sig_alg_t *cur = oid_sig_alg;
+
+    while( cur->descriptor.asn1 != NULL )
+    {
+        if( cur->pk_alg == pk_alg &&
+            cur->md_alg == md_alg )
+        {
+            *oid_str = cur->descriptor.asn1;
+            return( 0 );
+        }
+
+        cur++;
+    }
+
+    return( POLARSSL_ERR_OID_NOT_FOUND );
+}
+
 /*
  * For PublicKeyInfo
  */
@@ -200,6 +323,20 @@
     },
 };
 
+FN_OID_TYPED_FROM_ASN1(oid_pk_alg_t,     pk_alg,       oid_pk_alg);
+
+int oid_get_pk_alg( const asn1_buf *oid, pk_type_t *pk_alg )
+{
+    const oid_pk_alg_t *data = oid_pk_alg_from_asn1( oid );
+
+    if( data == NULL )
+        return( POLARSSL_ERR_OID_NOT_FOUND );
+
+    *pk_alg = data->pk_alg;
+
+    return( 0 );
+}
+
 /*
  * For PKCS#5 PBES2 encryption algorithm
  */
@@ -224,6 +361,20 @@
     },
 };
 
+FN_OID_TYPED_FROM_ASN1(oid_cipher_alg_t, cipher_alg,   oid_cipher_alg);
+
+int oid_get_cipher_alg( const asn1_buf *oid, cipher_type_t *cipher_alg )
+{
+    const oid_cipher_alg_t *data = oid_cipher_alg_from_asn1( oid );
+
+    if( data == NULL )
+        return( POLARSSL_ERR_OID_NOT_FOUND );
+
+    *cipher_alg = data->cipher_alg;
+
+    return( 0 );
+}
+
 /*
  * For digestAlgorithm
  */
@@ -276,6 +427,38 @@
     },
 };
 
+FN_OID_TYPED_FROM_ASN1(oid_md_alg_t,     md_alg,       oid_md_alg);
+
+int oid_get_md_alg( const asn1_buf *oid, md_type_t *md_alg )
+{
+    const oid_md_alg_t *data = oid_md_alg_from_asn1( oid );
+
+    if( data == NULL )
+        return( POLARSSL_ERR_OID_NOT_FOUND );
+
+    *md_alg = data->md_alg;
+
+    return( 0 );
+}
+
+int oid_get_oid_by_md( md_type_t md_alg, const char **oid_str )
+{
+    const oid_md_alg_t *cur = oid_md_alg;
+
+    while( cur->descriptor.asn1 != NULL )
+    {
+        if( cur->md_alg == md_alg )
+        {
+            *oid_str = cur->descriptor.asn1;
+            return( 0 );
+        }
+
+        cur++;
+    }
+
+    return( POLARSSL_ERR_OID_NOT_FOUND );
+}
+
 #if defined _MSC_VER && !defined snprintf
 #include <stdarg.h>
 
@@ -368,234 +551,4 @@
     return( (int) ( size - n ) );
 }
 
-static const oid_descriptor_t *oid_descriptor_from_buf(
-                const void *struct_set,
-                size_t struct_size,
-                const unsigned char *oid,
-                size_t len )
-{
-    const unsigned char *p = (const unsigned char *) struct_set;
-    const oid_descriptor_t *cur;
-
-    if( struct_set == NULL || oid == NULL )
-        return( NULL );
-
-    cur = (const oid_descriptor_t *) p;
-    while( cur->asn1 != NULL )
-    {
-        if( strlen( cur->asn1 ) == len &&
-            memcmp( cur->asn1, oid, len ) == 0 )
-        {
-            return( cur );
-        }
-
-        p += struct_size;
-        cur = (const oid_descriptor_t *) p;
-    }
-
-    return( NULL );
-}
-
-static const oid_descriptor_t *oid_descriptor_from_asn1(
-                const void *struct_set,
-                size_t struct_size,
-                const asn1_buf *oid )
-{
-    return oid_descriptor_from_buf( struct_set, struct_size,
-                                    oid->p, oid->len );
-}
-
-#if defined(POLARSSL_X509_PARSE_C) || defined(POLARSSL_X509_WRITE_C)
-int oid_get_extended_key_usage( const asn1_buf *oid, const char **desc )
-{
-    const oid_descriptor_t *data = oid_descriptor_from_asn1(
-                                oid_ext_key_usage,
-                                sizeof(oid_descriptor_t),
-                                oid );
-
-    if( data == NULL )
-        return( POLARSSL_ERR_OID_NOT_FOUND );
-
-    *desc = data->description;
-
-    return( 0 );
-}
-
-static const oid_x509_ext_t *oid_x509_ext_from_asn1( const asn1_buf *oid )
-{
-    return (const oid_x509_ext_t *) oid_descriptor_from_asn1(
-                                oid_x509_ext,
-                                sizeof(oid_x509_ext_t),
-                                oid );
-}
-
-int oid_get_x509_ext_type( const asn1_buf *oid, int *ext_type )
-{
-    const oid_x509_ext_t *data = oid_x509_ext_from_asn1( oid );
-
-    if( data == NULL )
-        return( POLARSSL_ERR_OID_NOT_FOUND );
-
-    *ext_type = data->ext_type;
-
-    return( 0 );
-}
-
-#endif /* POLARSSL_X509_PARSE_C || POLARSSL_X509_WRITE_C */
-
-static const oid_x520_attr_t *oid_x520_attr_from_asn1( const asn1_buf *oid )
-{
-    return (const oid_x520_attr_t *) oid_descriptor_from_asn1(
-                                oid_x520_attr_type,
-                                sizeof(oid_x520_attr_t),
-                                oid );
-}
-
-static const oid_pk_alg_t *oid_pk_alg_from_asn1( const asn1_buf *oid )
-{
-    return (const oid_pk_alg_t *) oid_descriptor_from_asn1(
-                                oid_pk_alg,
-                                sizeof(oid_pk_alg_t),
-                                oid );
-}
-
-static const oid_sig_alg_t *oid_sig_alg_from_asn1( const asn1_buf *oid )
-{
-    return (const oid_sig_alg_t *) oid_descriptor_from_asn1(
-                                oid_sig_alg,
-                                sizeof(oid_sig_alg_t),
-                                oid );
-}
-
-static const oid_md_alg_t *oid_md_alg_from_asn1( const asn1_buf *oid )
-{
-    return (const oid_md_alg_t *) oid_descriptor_from_asn1(
-                                oid_md_alg,
-                                sizeof(oid_md_alg_t),
-                                oid );
-}
-
-static const oid_cipher_alg_t *oid_cipher_alg_from_asn1( const asn1_buf *oid )
-{
-    return (const oid_cipher_alg_t *) oid_descriptor_from_asn1(
-                                oid_cipher_alg,
-                                sizeof(oid_cipher_alg_t),
-                                oid );
-}
-
-int oid_get_attr_short_name( const asn1_buf *oid, const char **short_name )
-{
-    const oid_x520_attr_t *data = oid_x520_attr_from_asn1( oid );
-
-    if( data == NULL )
-        return( POLARSSL_ERR_OID_NOT_FOUND );
-
-    *short_name = data->short_name;
-
-    return( 0 );
-}
-
-int oid_get_pk_alg( const asn1_buf *oid, pk_type_t *pk_alg )
-{
-    const oid_pk_alg_t *data = oid_pk_alg_from_asn1( oid );
-
-    if( data == NULL )
-        return( POLARSSL_ERR_OID_NOT_FOUND );
-
-    *pk_alg = data->pk_alg;
-
-    return( 0 );
-}
-
-int oid_get_sig_alg_desc( const asn1_buf *oid, const char **desc )
-{
-    const oid_sig_alg_t *data = oid_sig_alg_from_asn1( oid );
-
-    if( data == NULL )
-        return( POLARSSL_ERR_OID_NOT_FOUND );
-
-    *desc = data->descriptor.description;
-
-    return( 0 );
-}
-
-int oid_get_sig_alg( const asn1_buf *oid,
-                     md_type_t *md_alg, pk_type_t *pk_alg )
-{
-    const oid_sig_alg_t *data = oid_sig_alg_from_asn1( oid );
-
-    if( data == NULL )
-        return( POLARSSL_ERR_OID_NOT_FOUND );
-
-    *md_alg = data->md_alg;
-    *pk_alg = data->pk_alg;
-
-    return( 0 );
-}
-
-int oid_get_oid_by_sig_alg( pk_type_t pk_alg, md_type_t md_alg,
-                            const char **oid_str )
-{
-    const oid_sig_alg_t *cur = oid_sig_alg;
-
-    while( cur->descriptor.asn1 != NULL )
-    {
-        if( cur->pk_alg == pk_alg &&
-            cur->md_alg == md_alg )
-        {
-            *oid_str = cur->descriptor.asn1;
-            return( 0 );
-        }
-
-        cur++;
-    }
-
-    return( POLARSSL_ERR_OID_NOT_FOUND );
-}
-
-int oid_get_md_alg( const asn1_buf *oid,
-                    md_type_t *md_alg )
-{
-    const oid_md_alg_t *data = oid_md_alg_from_asn1( oid );
-
-    if( data == NULL )
-        return( POLARSSL_ERR_OID_NOT_FOUND );
-
-    *md_alg = data->md_alg;
-
-    return( 0 );
-}
-
-int oid_get_oid_by_md( md_type_t md_alg,
-                       const char **oid_str )
-{
-    const oid_md_alg_t *cur = oid_md_alg;
-
-    while( cur->descriptor.asn1 != NULL )
-    {
-        if( cur->md_alg == md_alg )
-        {
-            *oid_str = cur->descriptor.asn1;
-            return( 0 );
-        }
-
-        cur++;
-    }
-
-    return( POLARSSL_ERR_OID_NOT_FOUND );
-}
-
-int oid_get_cipher_alg( const asn1_buf *oid,
-                        cipher_type_t *cipher_alg )
-{
-    const oid_cipher_alg_t *data = oid_cipher_alg_from_asn1( oid );
-
-    if( data == NULL )
-        return( POLARSSL_ERR_OID_NOT_FOUND );
-
-    *cipher_alg = data->cipher_alg;
-
-    return( 0 );
-}
-
 #endif /* POLARSSL_OID_C */
