28 #if !defined(POLARSSL_CONFIG_FILE)
31 #include POLARSSL_CONFIG_FILE
34 #if defined(POLARSSL_OID_C)
39 #if defined(POLARSSL_X509_USE_C) || defined(POLARSSL_X509_CREATE_C)
48 #define ADD_LEN(s) s, OID_SIZE(s)
54 #define FN_OID_TYPED_FROM_ASN1( TYPE_T, NAME, LIST ) \
55 static const TYPE_T * oid_ ## NAME ## _from_asn1( const asn1_buf *oid ) \
57 const TYPE_T *p = LIST; \
58 const oid_descriptor_t *cur = (const oid_descriptor_t *) p; \
59 if( p == NULL || oid == NULL ) return( NULL ); \
60 while( cur->asn1 != NULL ) { \
61 if( cur->asn1_len == oid->len && \
62 memcmp( cur->asn1, oid->p, oid->len ) == 0 ) { \
66 cur = (const oid_descriptor_t *) p; \
75 #define FN_OID_GET_DESCRIPTOR_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
76 int FN_NAME( const asn1_buf *oid, ATTR1_TYPE * ATTR1 ) \
78 const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid ); \
79 if( data == NULL ) return( POLARSSL_ERR_OID_NOT_FOUND ); \
80 *ATTR1 = data->descriptor.ATTR1; \
88 #define FN_OID_GET_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
89 int FN_NAME( const asn1_buf *oid, ATTR1_TYPE * ATTR1 ) \
91 const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid ); \
92 if( data == NULL ) return( POLARSSL_ERR_OID_NOT_FOUND ); \
93 *ATTR1 = data->ATTR1; \
101 #define FN_OID_GET_ATTR2(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1, \
103 int FN_NAME( const asn1_buf *oid, ATTR1_TYPE * ATTR1, ATTR2_TYPE * ATTR2 ) \
105 const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid ); \
106 if( data == NULL ) return( POLARSSL_ERR_OID_NOT_FOUND ); \
107 *ATTR1 = data->ATTR1; \
108 *ATTR2 = data->ATTR2; \
116 #define FN_OID_GET_OID_BY_ATTR1(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1) \
117 int FN_NAME( ATTR1_TYPE ATTR1, const char **oid, size_t *olen ) \
119 const TYPE_T *cur = LIST; \
120 while( cur->descriptor.asn1 != NULL ) { \
121 if( cur->ATTR1 == ATTR1 ) { \
122 *oid = cur->descriptor.asn1; \
123 *olen = cur->descriptor.asn1_len; \
128 return( POLARSSL_ERR_OID_NOT_FOUND ); \
135 #define FN_OID_GET_OID_BY_ATTR2(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1, \
137 int FN_NAME( ATTR1_TYPE ATTR1, ATTR2_TYPE ATTR2, const char **oid , \
140 const TYPE_T *cur = LIST; \
141 while( cur->descriptor.asn1 != NULL ) { \
142 if( cur->ATTR1 == ATTR1 && cur->ATTR2 == ATTR2 ) { \
143 *oid = cur->descriptor.asn1; \
144 *olen = cur->descriptor.asn1_len; \
149 return( POLARSSL_ERR_OID_NOT_FOUND ); \
157 const char *short_name;
160 static const oid_x520_attr_t oid_x520_attr_type[] =
163 { ADD_LEN(
OID_AT_CN ),
"id-at-commonName",
"Common Name" },
183 { ADD_LEN(
OID_AT_ORG_UNIT ),
"id-at-organizationalUnitName",
"Org Unit" },
216 "generationQualifier",
235 { NULL, 0, NULL, NULL },
240 FN_OID_TYPED_FROM_ASN1(oid_x520_attr_t, x520_attr, oid_x520_attr_type);
243 #if defined(POLARSSL_X509_USE_C) || defined(POLARSSL_X509_CREATE_C)
252 static const oid_x509_ext_t oid_x509_ext[] =
271 { ADD_LEN(
OID_NS_CERT_TYPE ),
"id-netscape-certtype",
"Netscape Certificate Type" },
275 { NULL, 0, NULL, NULL },
280 FN_OID_TYPED_FROM_ASN1(oid_x509_ext_t, x509_ext, oid_x509_ext);
285 { ADD_LEN(
OID_SERVER_AUTH ),
"id-kp-serverAuth",
"TLS Web Server Authentication" },
286 { ADD_LEN(
OID_CLIENT_AUTH ),
"id-kp-clientAuth",
"TLS Web Client Authentication" },
291 { NULL, 0, NULL, NULL },
298 #if defined(POLARSSL_MD_C)
308 static const oid_sig_alg_t oid_sig_alg[] =
311 { ADD_LEN(
OID_PKCS1_MD2 ),
"md2WithRSAEncryption",
"RSA with MD2" },
315 { ADD_LEN(
OID_PKCS1_MD4 ),
"md4WithRSAEncryption",
"RSA with MD4" },
319 { ADD_LEN(
OID_PKCS1_MD5 ),
"md5WithRSAEncryption",
"RSA with MD5" },
323 { ADD_LEN(
OID_PKCS1_SHA1 ),
"sha-1WithRSAEncryption",
"RSA with SHA1" },
327 { ADD_LEN(
OID_PKCS1_SHA224 ),
"sha224WithRSAEncryption",
"RSA with SHA-224" },
331 { ADD_LEN(
OID_PKCS1_SHA256 ),
"sha256WithRSAEncryption",
"RSA with SHA-256" },
335 { ADD_LEN(
OID_PKCS1_SHA384 ),
"sha384WithRSAEncryption",
"RSA with SHA-384" },
339 { ADD_LEN(
OID_PKCS1_SHA512 ),
"sha512WithRSAEncryption",
"RSA with SHA-512" },
343 { ADD_LEN(
OID_RSA_SHA_OBS ),
"sha-1WithRSAEncryption",
"RSA with SHA1" },
347 { ADD_LEN(
OID_ECDSA_SHA1 ),
"ecdsa-with-SHA1",
"ECDSA with SHA1" },
371 { NULL, 0, NULL, NULL },
376 FN_OID_TYPED_FROM_ASN1(oid_sig_alg_t, sig_alg, oid_sig_alg);
377 FN_OID_GET_DESCRIPTOR_ATTR1(
oid_get_sig_alg_desc, oid_sig_alg_t, sig_alg,
const char *, description);
390 static const oid_pk_alg_t oid_pk_alg[] =
405 { NULL, 0, NULL, NULL },
410 FN_OID_TYPED_FROM_ASN1(oid_pk_alg_t, pk_alg, oid_pk_alg);
414 #if defined(POLARSSL_ECP_C)
423 static const oid_ecp_grp_t oid_ecp_grp[] =
470 { NULL, 0, NULL, NULL },
475 FN_OID_TYPED_FROM_ASN1(oid_ecp_grp_t, grp_id, oid_ecp_grp);
480 #if defined(POLARSSL_CIPHER_C)
489 static const oid_cipher_alg_t oid_cipher_alg[] =
500 { NULL, 0, NULL, NULL },
505 FN_OID_TYPED_FROM_ASN1(oid_cipher_alg_t, cipher_alg, oid_cipher_alg);
509 #if defined(POLARSSL_MD_C)
518 static const oid_md_alg_t oid_md_alg[] =
553 { NULL, 0, NULL, NULL },
558 FN_OID_TYPED_FROM_ASN1(oid_md_alg_t, md_alg, oid_md_alg);
563 #if defined(POLARSSL_PKCS12_C)
571 } oid_pkcs12_pbe_alg_t;
573 static const oid_pkcs12_pbe_alg_t oid_pkcs12_pbe_alg[] =
584 { NULL, 0, NULL, NULL },
589 FN_OID_TYPED_FROM_ASN1(oid_pkcs12_pbe_alg_t, pkcs12_pbe_alg, oid_pkcs12_pbe_alg);
593 #if defined(_MSC_VER) && !defined snprintf && !defined(EFIX64) && \
597 #if !defined vsnprintf
598 #define vsnprintf _vsnprintf
608 static int compat_snprintf(
char *str,
size_t size,
const char *format, ... )
613 va_start( ap, format );
615 res = vsnprintf( str, size, format, ap );
621 return( (
int) size + 20 );
626 #define snprintf compat_snprintf
629 #define SAFE_SNPRINTF() \
632 return( POLARSSL_ERR_OID_BUF_TOO_SMALL ); \
634 if( (unsigned int) ret >= n ) { \
636 return( POLARSSL_ERR_OID_BUF_TOO_SMALL ); \
639 n -= (unsigned int) ret; \
640 p += (unsigned int) ret; \
658 ret = snprintf( p, n,
"%d.%d", oid->
p[0] / 40, oid->
p[0] % 40 );
663 for( i = 1; i < oid->
len; i++ )
666 if( ( ( value << 7 ) >> 7 ) != value )
670 value += oid->
p[i] & 0x7F;
672 if( !( oid->
p[i] & 0x80 ) )
675 ret = snprintf( p, n,
".%d", value );
681 return( (
int) ( size - n ) );