diff --git a/library/oid.c b/library/oid.c
index 93aa3c6..d8b4360 100644
--- a/library/oid.c
+++ b/library/oid.c
@@ -34,11 +34,56 @@
 
 #include <stdio.h>
 
+/*
+ * Macro to generate an internal function for oid_XXX_from_asn1() (used by
+ * the other functions)
+ */
 #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 ); }
 
 /*
+ * Macro to generate a function for retrieving a single attribute from the
+ * descriptor of an oid_descriptor_t wrapper.
+ */
+#define FN_OID_GET_DESCRIPTOR_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
+int FN_NAME( const asn1_buf *oid, ATTR1_TYPE * ATTR1 )                  \
+{                                                                       \
+    const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid );        \
+    if( data == NULL ) return ( POLARSSL_ERR_OID_NOT_FOUND );           \
+    *ATTR1 = data->descriptor.ATTR1;                                    \
+    return( 0 );                                                        \
+}
+
+/*
+ * Macro to generate a function for retrieving a single attribute from an
+ * oid_descriptor_t wrapper.
+ */
+#define FN_OID_GET_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
+int FN_NAME( const asn1_buf *oid, ATTR1_TYPE * ATTR1 )                  \
+{                                                                       \
+    const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid );        \
+    if( data == NULL ) return ( POLARSSL_ERR_OID_NOT_FOUND );           \
+    *ATTR1 = data->ATTR1;                                               \
+    return( 0 );                                                        \
+}
+
+/*
+ * Macro to generate a function for retrieving two attributes from an
+ * oid_descriptor_t wrapper.
+ */
+#define FN_OID_GET_ATTR2(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1,     \
+                         ATTR2_TYPE, ATTR2)                                 \
+int FN_NAME( const asn1_buf *oid, ATTR1_TYPE * ATTR1, ATTR2_TYPE * ATTR2 )  \
+{                                                                           \
+    const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid );            \
+    if( data == NULL ) return ( POLARSSL_ERR_OID_NOT_FOUND );               \
+    *ATTR1 = data->ATTR1;                                                   \
+    *ATTR2 = data->ATTR2;                                                   \
+    return( 0 );                                                            \
+}
+
+/*
  * Core generic function
  */
 static const oid_descriptor_t *oid_descriptor_from_buf( const void *struct_set,
@@ -110,19 +155,8 @@
     }
 };
 
-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 );
-}
+FN_OID_TYPED_FROM_ASN1(oid_x520_attr_t, x520_attr, oid_x520_attr_type);
+FN_OID_GET_ATTR1(oid_get_attr_short_name, oid_x520_attr_t, x520_attr, const char *, short_name);
 
 #if defined(POLARSSL_X509_PARSE_C) || defined(POLARSSL_X509_WRITE_C)
 /*
@@ -161,19 +195,8 @@
     },
 };
 
-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 );
-}
+FN_OID_TYPED_FROM_ASN1(oid_x509_ext_t, x509_ext, oid_x509_ext);
+FN_OID_GET_ATTR1(oid_get_x509_ext_type, oid_x509_ext_t, x509_ext, int, ext_type);
 
 static const oid_descriptor_t oid_ext_key_usage[] =
 {
@@ -186,19 +209,8 @@
     { 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 );
-}
+FN_OID_TYPED_FROM_ASN1(oid_descriptor_t, ext_key_usage, oid_ext_key_usage);
+FN_OID_GET_ATTR1(oid_get_extended_key_usage, oid_descriptor_t, ext_key_usage, const char *, description);
 
 #endif /* POLARSSL_X509_PARSE_C || POLARSSL_X509_WRITE_C */
 
@@ -255,33 +267,9 @@
     },
 };
 
-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 );
-}
+FN_OID_TYPED_FROM_ASN1(oid_sig_alg_t, sig_alg, oid_sig_alg);
+FN_OID_GET_DESCRIPTOR_ATTR1(oid_get_sig_alg_desc, oid_sig_alg_t, sig_alg, const char *, description);
+FN_OID_GET_ATTR2(oid_get_sig_alg, oid_sig_alg_t, sig_alg, md_type_t, md_alg, pk_type_t, pk_alg);
 
 int oid_get_oid_by_sig_alg( pk_type_t pk_alg, md_type_t md_alg,
                             const char **oid_str )
@@ -323,19 +311,8 @@
     },
 };
 
-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 );
-}
+FN_OID_TYPED_FROM_ASN1(oid_pk_alg_t, pk_alg, oid_pk_alg);
+FN_OID_GET_ATTR1(oid_get_pk_alg, oid_pk_alg_t, pk_alg, pk_type_t, pk_alg);
 
 /*
  * For PKCS#5 PBES2 encryption algorithm
@@ -361,19 +338,8 @@
     },
 };
 
-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 );
-}
+FN_OID_TYPED_FROM_ASN1(oid_cipher_alg_t, cipher_alg, oid_cipher_alg);
+FN_OID_GET_ATTR1(oid_get_cipher_alg, oid_cipher_alg_t, cipher_alg, cipher_type_t, cipher_alg);
 
 /*
  * For digestAlgorithm
@@ -427,19 +393,8 @@
     },
 };
 
-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 );
-}
+FN_OID_TYPED_FROM_ASN1(oid_md_alg_t, md_alg, oid_md_alg);
+FN_OID_GET_ATTR1(oid_get_md_alg, oid_md_alg_t, md_alg, md_type_t, md_alg);
 
 int oid_get_oid_by_md( md_type_t md_alg, const char **oid_str )
 {
