mbed TLS library

Dependents:   HTTPClient-SSL WS_SERVER

Committer:
ansond
Date:
Thu Jun 11 03:27:03 2015 +0000
Revision:
0:137634ff4186
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ansond 0:137634ff4186 1 /**
ansond 0:137634ff4186 2 * \file oid.c
ansond 0:137634ff4186 3 *
ansond 0:137634ff4186 4 * \brief Object Identifier (OID) database
ansond 0:137634ff4186 5 *
ansond 0:137634ff4186 6 * Copyright (C) 2006-2014, ARM Limited, All Rights Reserved
ansond 0:137634ff4186 7 *
ansond 0:137634ff4186 8 * This file is part of mbed TLS (https://tls.mbed.org)
ansond 0:137634ff4186 9 *
ansond 0:137634ff4186 10 * This program is free software; you can redistribute it and/or modify
ansond 0:137634ff4186 11 * it under the terms of the GNU General Public License as published by
ansond 0:137634ff4186 12 * the Free Software Foundation; either version 2 of the License, or
ansond 0:137634ff4186 13 * (at your option) any later version.
ansond 0:137634ff4186 14 *
ansond 0:137634ff4186 15 * This program is distributed in the hope that it will be useful,
ansond 0:137634ff4186 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ansond 0:137634ff4186 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ansond 0:137634ff4186 18 * GNU General Public License for more details.
ansond 0:137634ff4186 19 *
ansond 0:137634ff4186 20 * You should have received a copy of the GNU General Public License along
ansond 0:137634ff4186 21 * with this program; if not, write to the Free Software Foundation, Inc.,
ansond 0:137634ff4186 22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
ansond 0:137634ff4186 23 */
ansond 0:137634ff4186 24
ansond 0:137634ff4186 25 #if !defined(POLARSSL_CONFIG_FILE)
ansond 0:137634ff4186 26 #include "polarssl/config.h"
ansond 0:137634ff4186 27 #else
ansond 0:137634ff4186 28 #include POLARSSL_CONFIG_FILE
ansond 0:137634ff4186 29 #endif
ansond 0:137634ff4186 30
ansond 0:137634ff4186 31 #if defined(POLARSSL_OID_C)
ansond 0:137634ff4186 32
ansond 0:137634ff4186 33 #include "polarssl/oid.h"
ansond 0:137634ff4186 34 #include "polarssl/rsa.h"
ansond 0:137634ff4186 35
ansond 0:137634ff4186 36 #include <stdio.h>
ansond 0:137634ff4186 37 #include <string.h>
ansond 0:137634ff4186 38
ansond 0:137634ff4186 39 #if defined(POLARSSL_PLATFORM_C)
ansond 0:137634ff4186 40 #include "polarssl/platform.h"
ansond 0:137634ff4186 41 #else
ansond 0:137634ff4186 42 #define polarssl_snprintf snprintf
ansond 0:137634ff4186 43 #endif
ansond 0:137634ff4186 44
ansond 0:137634ff4186 45 #if defined(POLARSSL_X509_USE_C) || defined(POLARSSL_X509_CREATE_C)
ansond 0:137634ff4186 46 #include "polarssl/x509.h"
ansond 0:137634ff4186 47 #endif
ansond 0:137634ff4186 48
ansond 0:137634ff4186 49 /*
ansond 0:137634ff4186 50 * Macro to automatically add the size of #define'd OIDs
ansond 0:137634ff4186 51 */
ansond 0:137634ff4186 52 #define ADD_LEN(s) s, OID_SIZE(s)
ansond 0:137634ff4186 53
ansond 0:137634ff4186 54 /*
ansond 0:137634ff4186 55 * Macro to generate an internal function for oid_XXX_from_asn1() (used by
ansond 0:137634ff4186 56 * the other functions)
ansond 0:137634ff4186 57 */
ansond 0:137634ff4186 58 #define FN_OID_TYPED_FROM_ASN1( TYPE_T, NAME, LIST ) \
ansond 0:137634ff4186 59 static const TYPE_T * oid_ ## NAME ## _from_asn1( const asn1_buf *oid ) \
ansond 0:137634ff4186 60 { \
ansond 0:137634ff4186 61 const TYPE_T *p = LIST; \
ansond 0:137634ff4186 62 const oid_descriptor_t *cur = (const oid_descriptor_t *) p; \
ansond 0:137634ff4186 63 if( p == NULL || oid == NULL ) return( NULL ); \
ansond 0:137634ff4186 64 while( cur->asn1 != NULL ) { \
ansond 0:137634ff4186 65 if( cur->asn1_len == oid->len && \
ansond 0:137634ff4186 66 memcmp( cur->asn1, oid->p, oid->len ) == 0 ) { \
ansond 0:137634ff4186 67 return( p ); \
ansond 0:137634ff4186 68 } \
ansond 0:137634ff4186 69 p++; \
ansond 0:137634ff4186 70 cur = (const oid_descriptor_t *) p; \
ansond 0:137634ff4186 71 } \
ansond 0:137634ff4186 72 return( NULL ); \
ansond 0:137634ff4186 73 }
ansond 0:137634ff4186 74
ansond 0:137634ff4186 75 /*
ansond 0:137634ff4186 76 * Macro to generate a function for retrieving a single attribute from the
ansond 0:137634ff4186 77 * descriptor of an oid_descriptor_t wrapper.
ansond 0:137634ff4186 78 */
ansond 0:137634ff4186 79 #define FN_OID_GET_DESCRIPTOR_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
ansond 0:137634ff4186 80 int FN_NAME( const asn1_buf *oid, ATTR1_TYPE * ATTR1 ) \
ansond 0:137634ff4186 81 { \
ansond 0:137634ff4186 82 const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid ); \
ansond 0:137634ff4186 83 if( data == NULL ) return( POLARSSL_ERR_OID_NOT_FOUND ); \
ansond 0:137634ff4186 84 *ATTR1 = data->descriptor.ATTR1; \
ansond 0:137634ff4186 85 return( 0 ); \
ansond 0:137634ff4186 86 }
ansond 0:137634ff4186 87
ansond 0:137634ff4186 88 /*
ansond 0:137634ff4186 89 * Macro to generate a function for retrieving a single attribute from an
ansond 0:137634ff4186 90 * oid_descriptor_t wrapper.
ansond 0:137634ff4186 91 */
ansond 0:137634ff4186 92 #define FN_OID_GET_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \
ansond 0:137634ff4186 93 int FN_NAME( const asn1_buf *oid, ATTR1_TYPE * ATTR1 ) \
ansond 0:137634ff4186 94 { \
ansond 0:137634ff4186 95 const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid ); \
ansond 0:137634ff4186 96 if( data == NULL ) return( POLARSSL_ERR_OID_NOT_FOUND ); \
ansond 0:137634ff4186 97 *ATTR1 = data->ATTR1; \
ansond 0:137634ff4186 98 return( 0 ); \
ansond 0:137634ff4186 99 }
ansond 0:137634ff4186 100
ansond 0:137634ff4186 101 /*
ansond 0:137634ff4186 102 * Macro to generate a function for retrieving two attributes from an
ansond 0:137634ff4186 103 * oid_descriptor_t wrapper.
ansond 0:137634ff4186 104 */
ansond 0:137634ff4186 105 #define FN_OID_GET_ATTR2(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1, \
ansond 0:137634ff4186 106 ATTR2_TYPE, ATTR2) \
ansond 0:137634ff4186 107 int FN_NAME( const asn1_buf *oid, ATTR1_TYPE * ATTR1, ATTR2_TYPE * ATTR2 ) \
ansond 0:137634ff4186 108 { \
ansond 0:137634ff4186 109 const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid ); \
ansond 0:137634ff4186 110 if( data == NULL ) return( POLARSSL_ERR_OID_NOT_FOUND ); \
ansond 0:137634ff4186 111 *ATTR1 = data->ATTR1; \
ansond 0:137634ff4186 112 *ATTR2 = data->ATTR2; \
ansond 0:137634ff4186 113 return( 0 ); \
ansond 0:137634ff4186 114 }
ansond 0:137634ff4186 115
ansond 0:137634ff4186 116 /*
ansond 0:137634ff4186 117 * Macro to generate a function for retrieving the OID based on a single
ansond 0:137634ff4186 118 * attribute from a oid_descriptor_t wrapper.
ansond 0:137634ff4186 119 */
ansond 0:137634ff4186 120 #define FN_OID_GET_OID_BY_ATTR1(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1) \
ansond 0:137634ff4186 121 int FN_NAME( ATTR1_TYPE ATTR1, const char **oid, size_t *olen ) \
ansond 0:137634ff4186 122 { \
ansond 0:137634ff4186 123 const TYPE_T *cur = LIST; \
ansond 0:137634ff4186 124 while( cur->descriptor.asn1 != NULL ) { \
ansond 0:137634ff4186 125 if( cur->ATTR1 == ATTR1 ) { \
ansond 0:137634ff4186 126 *oid = cur->descriptor.asn1; \
ansond 0:137634ff4186 127 *olen = cur->descriptor.asn1_len; \
ansond 0:137634ff4186 128 return( 0 ); \
ansond 0:137634ff4186 129 } \
ansond 0:137634ff4186 130 cur++; \
ansond 0:137634ff4186 131 } \
ansond 0:137634ff4186 132 return( POLARSSL_ERR_OID_NOT_FOUND ); \
ansond 0:137634ff4186 133 }
ansond 0:137634ff4186 134
ansond 0:137634ff4186 135 /*
ansond 0:137634ff4186 136 * Macro to generate a function for retrieving the OID based on two
ansond 0:137634ff4186 137 * attributes from a oid_descriptor_t wrapper.
ansond 0:137634ff4186 138 */
ansond 0:137634ff4186 139 #define FN_OID_GET_OID_BY_ATTR2(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1, \
ansond 0:137634ff4186 140 ATTR2_TYPE, ATTR2) \
ansond 0:137634ff4186 141 int FN_NAME( ATTR1_TYPE ATTR1, ATTR2_TYPE ATTR2, const char **oid , \
ansond 0:137634ff4186 142 size_t *olen ) \
ansond 0:137634ff4186 143 { \
ansond 0:137634ff4186 144 const TYPE_T *cur = LIST; \
ansond 0:137634ff4186 145 while( cur->descriptor.asn1 != NULL ) { \
ansond 0:137634ff4186 146 if( cur->ATTR1 == ATTR1 && cur->ATTR2 == ATTR2 ) { \
ansond 0:137634ff4186 147 *oid = cur->descriptor.asn1; \
ansond 0:137634ff4186 148 *olen = cur->descriptor.asn1_len; \
ansond 0:137634ff4186 149 return( 0 ); \
ansond 0:137634ff4186 150 } \
ansond 0:137634ff4186 151 cur++; \
ansond 0:137634ff4186 152 } \
ansond 0:137634ff4186 153 return( POLARSSL_ERR_OID_NOT_FOUND ); \
ansond 0:137634ff4186 154 }
ansond 0:137634ff4186 155
ansond 0:137634ff4186 156 /*
ansond 0:137634ff4186 157 * For X520 attribute types
ansond 0:137634ff4186 158 */
ansond 0:137634ff4186 159 typedef struct {
ansond 0:137634ff4186 160 oid_descriptor_t descriptor;
ansond 0:137634ff4186 161 const char *short_name;
ansond 0:137634ff4186 162 } oid_x520_attr_t;
ansond 0:137634ff4186 163
ansond 0:137634ff4186 164 static const oid_x520_attr_t oid_x520_attr_type[] =
ansond 0:137634ff4186 165 {
ansond 0:137634ff4186 166 {
ansond 0:137634ff4186 167 { ADD_LEN( OID_AT_CN ), "id-at-commonName", "Common Name" },
ansond 0:137634ff4186 168 "CN",
ansond 0:137634ff4186 169 },
ansond 0:137634ff4186 170 {
ansond 0:137634ff4186 171 { ADD_LEN( OID_AT_COUNTRY ), "id-at-countryName", "Country" },
ansond 0:137634ff4186 172 "C",
ansond 0:137634ff4186 173 },
ansond 0:137634ff4186 174 {
ansond 0:137634ff4186 175 { ADD_LEN( OID_AT_LOCALITY ), "id-at-locality", "Locality" },
ansond 0:137634ff4186 176 "L",
ansond 0:137634ff4186 177 },
ansond 0:137634ff4186 178 {
ansond 0:137634ff4186 179 { ADD_LEN( OID_AT_STATE ), "id-at-state", "State" },
ansond 0:137634ff4186 180 "ST",
ansond 0:137634ff4186 181 },
ansond 0:137634ff4186 182 {
ansond 0:137634ff4186 183 { ADD_LEN( OID_AT_ORGANIZATION ),"id-at-organizationName", "Organization" },
ansond 0:137634ff4186 184 "O",
ansond 0:137634ff4186 185 },
ansond 0:137634ff4186 186 {
ansond 0:137634ff4186 187 { ADD_LEN( OID_AT_ORG_UNIT ), "id-at-organizationalUnitName", "Org Unit" },
ansond 0:137634ff4186 188 "OU",
ansond 0:137634ff4186 189 },
ansond 0:137634ff4186 190 {
ansond 0:137634ff4186 191 { ADD_LEN( OID_PKCS9_EMAIL ), "emailAddress", "E-mail address" },
ansond 0:137634ff4186 192 "emailAddress",
ansond 0:137634ff4186 193 },
ansond 0:137634ff4186 194 {
ansond 0:137634ff4186 195 { ADD_LEN( OID_AT_SERIAL_NUMBER ),"id-at-serialNumber", "Serial number" },
ansond 0:137634ff4186 196 "serialNumber",
ansond 0:137634ff4186 197 },
ansond 0:137634ff4186 198 {
ansond 0:137634ff4186 199 { ADD_LEN( OID_AT_POSTAL_ADDRESS ),"id-at-postalAddress", "Postal address" },
ansond 0:137634ff4186 200 "postalAddress",
ansond 0:137634ff4186 201 },
ansond 0:137634ff4186 202 {
ansond 0:137634ff4186 203 { ADD_LEN( OID_AT_POSTAL_CODE ), "id-at-postalCode", "Postal code" },
ansond 0:137634ff4186 204 "postalCode",
ansond 0:137634ff4186 205 },
ansond 0:137634ff4186 206 {
ansond 0:137634ff4186 207 { ADD_LEN( OID_AT_SUR_NAME ), "id-at-surName", "Surname" },
ansond 0:137634ff4186 208 "SN",
ansond 0:137634ff4186 209 },
ansond 0:137634ff4186 210 {
ansond 0:137634ff4186 211 { ADD_LEN( OID_AT_GIVEN_NAME ), "id-at-givenName", "Given name" },
ansond 0:137634ff4186 212 "GN",
ansond 0:137634ff4186 213 },
ansond 0:137634ff4186 214 {
ansond 0:137634ff4186 215 { ADD_LEN( OID_AT_INITIALS ), "id-at-initials", "Initials" },
ansond 0:137634ff4186 216 "initials",
ansond 0:137634ff4186 217 },
ansond 0:137634ff4186 218 {
ansond 0:137634ff4186 219 { ADD_LEN( OID_AT_GENERATION_QUALIFIER ), "id-at-generationQualifier", "Generation qualifier" },
ansond 0:137634ff4186 220 "generationQualifier",
ansond 0:137634ff4186 221 },
ansond 0:137634ff4186 222 {
ansond 0:137634ff4186 223 { ADD_LEN( OID_AT_TITLE ), "id-at-title", "Title" },
ansond 0:137634ff4186 224 "title",
ansond 0:137634ff4186 225 },
ansond 0:137634ff4186 226 {
ansond 0:137634ff4186 227 { ADD_LEN( OID_AT_DN_QUALIFIER ),"id-at-dnQualifier", "Distinguished Name qualifier" },
ansond 0:137634ff4186 228 "dnQualifier",
ansond 0:137634ff4186 229 },
ansond 0:137634ff4186 230 {
ansond 0:137634ff4186 231 { ADD_LEN( OID_AT_PSEUDONYM ), "id-at-pseudonym", "Pseudonym" },
ansond 0:137634ff4186 232 "pseudonym",
ansond 0:137634ff4186 233 },
ansond 0:137634ff4186 234 {
ansond 0:137634ff4186 235 { ADD_LEN( OID_DOMAIN_COMPONENT ), "id-domainComponent", "Domain component" },
ansond 0:137634ff4186 236 "DC",
ansond 0:137634ff4186 237 },
ansond 0:137634ff4186 238 {
ansond 0:137634ff4186 239 { ADD_LEN( OID_AT_UNIQUE_IDENTIFIER ), "id-at-uniqueIdentifier", "Unique Identifier" },
ansond 0:137634ff4186 240 "uniqueIdentifier",
ansond 0:137634ff4186 241 },
ansond 0:137634ff4186 242 {
ansond 0:137634ff4186 243 { NULL, 0, NULL, NULL },
ansond 0:137634ff4186 244 NULL,
ansond 0:137634ff4186 245 }
ansond 0:137634ff4186 246 };
ansond 0:137634ff4186 247
ansond 0:137634ff4186 248 FN_OID_TYPED_FROM_ASN1(oid_x520_attr_t, x520_attr, oid_x520_attr_type);
ansond 0:137634ff4186 249 FN_OID_GET_ATTR1(oid_get_attr_short_name, oid_x520_attr_t, x520_attr, const char *, short_name);
ansond 0:137634ff4186 250
ansond 0:137634ff4186 251 #if defined(POLARSSL_X509_USE_C) || defined(POLARSSL_X509_CREATE_C)
ansond 0:137634ff4186 252 /*
ansond 0:137634ff4186 253 * For X509 extensions
ansond 0:137634ff4186 254 */
ansond 0:137634ff4186 255 typedef struct {
ansond 0:137634ff4186 256 oid_descriptor_t descriptor;
ansond 0:137634ff4186 257 int ext_type;
ansond 0:137634ff4186 258 } oid_x509_ext_t;
ansond 0:137634ff4186 259
ansond 0:137634ff4186 260 static const oid_x509_ext_t oid_x509_ext[] =
ansond 0:137634ff4186 261 {
ansond 0:137634ff4186 262 {
ansond 0:137634ff4186 263 { ADD_LEN( OID_BASIC_CONSTRAINTS ), "id-ce-basicConstraints", "Basic Constraints" },
ansond 0:137634ff4186 264 EXT_BASIC_CONSTRAINTS,
ansond 0:137634ff4186 265 },
ansond 0:137634ff4186 266 {
ansond 0:137634ff4186 267 { ADD_LEN( OID_KEY_USAGE ), "id-ce-keyUsage", "Key Usage" },
ansond 0:137634ff4186 268 EXT_KEY_USAGE,
ansond 0:137634ff4186 269 },
ansond 0:137634ff4186 270 {
ansond 0:137634ff4186 271 { ADD_LEN( OID_EXTENDED_KEY_USAGE ), "id-ce-keyUsage", "Extended Key Usage" },
ansond 0:137634ff4186 272 EXT_EXTENDED_KEY_USAGE,
ansond 0:137634ff4186 273 },
ansond 0:137634ff4186 274 {
ansond 0:137634ff4186 275 { ADD_LEN( OID_SUBJECT_ALT_NAME ), "id-ce-subjectAltName", "Subject Alt Name" },
ansond 0:137634ff4186 276 EXT_SUBJECT_ALT_NAME,
ansond 0:137634ff4186 277 },
ansond 0:137634ff4186 278 {
ansond 0:137634ff4186 279 { ADD_LEN( OID_NS_CERT_TYPE ), "id-netscape-certtype", "Netscape Certificate Type" },
ansond 0:137634ff4186 280 EXT_NS_CERT_TYPE,
ansond 0:137634ff4186 281 },
ansond 0:137634ff4186 282 {
ansond 0:137634ff4186 283 { NULL, 0, NULL, NULL },
ansond 0:137634ff4186 284 0,
ansond 0:137634ff4186 285 },
ansond 0:137634ff4186 286 };
ansond 0:137634ff4186 287
ansond 0:137634ff4186 288 FN_OID_TYPED_FROM_ASN1(oid_x509_ext_t, x509_ext, oid_x509_ext);
ansond 0:137634ff4186 289 FN_OID_GET_ATTR1(oid_get_x509_ext_type, oid_x509_ext_t, x509_ext, int, ext_type);
ansond 0:137634ff4186 290
ansond 0:137634ff4186 291 static const oid_descriptor_t oid_ext_key_usage[] =
ansond 0:137634ff4186 292 {
ansond 0:137634ff4186 293 { ADD_LEN( OID_SERVER_AUTH ), "id-kp-serverAuth", "TLS Web Server Authentication" },
ansond 0:137634ff4186 294 { ADD_LEN( OID_CLIENT_AUTH ), "id-kp-clientAuth", "TLS Web Client Authentication" },
ansond 0:137634ff4186 295 { ADD_LEN( OID_CODE_SIGNING ), "id-kp-codeSigning", "Code Signing" },
ansond 0:137634ff4186 296 { ADD_LEN( OID_EMAIL_PROTECTION ), "id-kp-emailProtection", "E-mail Protection" },
ansond 0:137634ff4186 297 { ADD_LEN( OID_TIME_STAMPING ), "id-kp-timeStamping", "Time Stamping" },
ansond 0:137634ff4186 298 { ADD_LEN( OID_OCSP_SIGNING ), "id-kp-OCSPSigning", "OCSP Signing" },
ansond 0:137634ff4186 299 { NULL, 0, NULL, NULL },
ansond 0:137634ff4186 300 };
ansond 0:137634ff4186 301
ansond 0:137634ff4186 302 FN_OID_TYPED_FROM_ASN1(oid_descriptor_t, ext_key_usage, oid_ext_key_usage);
ansond 0:137634ff4186 303 FN_OID_GET_ATTR1(oid_get_extended_key_usage, oid_descriptor_t, ext_key_usage, const char *, description);
ansond 0:137634ff4186 304 #endif /* POLARSSL_X509_USE_C || POLARSSL_X509_CREATE_C */
ansond 0:137634ff4186 305
ansond 0:137634ff4186 306 #if defined(POLARSSL_MD_C)
ansond 0:137634ff4186 307 /*
ansond 0:137634ff4186 308 * For SignatureAlgorithmIdentifier
ansond 0:137634ff4186 309 */
ansond 0:137634ff4186 310 typedef struct {
ansond 0:137634ff4186 311 oid_descriptor_t descriptor;
ansond 0:137634ff4186 312 md_type_t md_alg;
ansond 0:137634ff4186 313 pk_type_t pk_alg;
ansond 0:137634ff4186 314 } oid_sig_alg_t;
ansond 0:137634ff4186 315
ansond 0:137634ff4186 316 static const oid_sig_alg_t oid_sig_alg[] =
ansond 0:137634ff4186 317 {
ansond 0:137634ff4186 318 {
ansond 0:137634ff4186 319 { ADD_LEN( OID_PKCS1_MD2 ), "md2WithRSAEncryption", "RSA with MD2" },
ansond 0:137634ff4186 320 POLARSSL_MD_MD2, POLARSSL_PK_RSA,
ansond 0:137634ff4186 321 },
ansond 0:137634ff4186 322 {
ansond 0:137634ff4186 323 { ADD_LEN( OID_PKCS1_MD4 ), "md4WithRSAEncryption", "RSA with MD4" },
ansond 0:137634ff4186 324 POLARSSL_MD_MD4, POLARSSL_PK_RSA,
ansond 0:137634ff4186 325 },
ansond 0:137634ff4186 326 {
ansond 0:137634ff4186 327 { ADD_LEN( OID_PKCS1_MD5 ), "md5WithRSAEncryption", "RSA with MD5" },
ansond 0:137634ff4186 328 POLARSSL_MD_MD5, POLARSSL_PK_RSA,
ansond 0:137634ff4186 329 },
ansond 0:137634ff4186 330 {
ansond 0:137634ff4186 331 { ADD_LEN( OID_PKCS1_SHA1 ), "sha-1WithRSAEncryption", "RSA with SHA1" },
ansond 0:137634ff4186 332 POLARSSL_MD_SHA1, POLARSSL_PK_RSA,
ansond 0:137634ff4186 333 },
ansond 0:137634ff4186 334 {
ansond 0:137634ff4186 335 { ADD_LEN( OID_PKCS1_SHA224 ), "sha224WithRSAEncryption", "RSA with SHA-224" },
ansond 0:137634ff4186 336 POLARSSL_MD_SHA224, POLARSSL_PK_RSA,
ansond 0:137634ff4186 337 },
ansond 0:137634ff4186 338 {
ansond 0:137634ff4186 339 { ADD_LEN( OID_PKCS1_SHA256 ), "sha256WithRSAEncryption", "RSA with SHA-256" },
ansond 0:137634ff4186 340 POLARSSL_MD_SHA256, POLARSSL_PK_RSA,
ansond 0:137634ff4186 341 },
ansond 0:137634ff4186 342 {
ansond 0:137634ff4186 343 { ADD_LEN( OID_PKCS1_SHA384 ), "sha384WithRSAEncryption", "RSA with SHA-384" },
ansond 0:137634ff4186 344 POLARSSL_MD_SHA384, POLARSSL_PK_RSA,
ansond 0:137634ff4186 345 },
ansond 0:137634ff4186 346 {
ansond 0:137634ff4186 347 { ADD_LEN( OID_PKCS1_SHA512 ), "sha512WithRSAEncryption", "RSA with SHA-512" },
ansond 0:137634ff4186 348 POLARSSL_MD_SHA512, POLARSSL_PK_RSA,
ansond 0:137634ff4186 349 },
ansond 0:137634ff4186 350 {
ansond 0:137634ff4186 351 { ADD_LEN( OID_RSA_SHA_OBS ), "sha-1WithRSAEncryption", "RSA with SHA1" },
ansond 0:137634ff4186 352 POLARSSL_MD_SHA1, POLARSSL_PK_RSA,
ansond 0:137634ff4186 353 },
ansond 0:137634ff4186 354 {
ansond 0:137634ff4186 355 { ADD_LEN( OID_ECDSA_SHA1 ), "ecdsa-with-SHA1", "ECDSA with SHA1" },
ansond 0:137634ff4186 356 POLARSSL_MD_SHA1, POLARSSL_PK_ECDSA,
ansond 0:137634ff4186 357 },
ansond 0:137634ff4186 358 {
ansond 0:137634ff4186 359 { ADD_LEN( OID_ECDSA_SHA224 ), "ecdsa-with-SHA224", "ECDSA with SHA224" },
ansond 0:137634ff4186 360 POLARSSL_MD_SHA224, POLARSSL_PK_ECDSA,
ansond 0:137634ff4186 361 },
ansond 0:137634ff4186 362 {
ansond 0:137634ff4186 363 { ADD_LEN( OID_ECDSA_SHA256 ), "ecdsa-with-SHA256", "ECDSA with SHA256" },
ansond 0:137634ff4186 364 POLARSSL_MD_SHA256, POLARSSL_PK_ECDSA,
ansond 0:137634ff4186 365 },
ansond 0:137634ff4186 366 {
ansond 0:137634ff4186 367 { ADD_LEN( OID_ECDSA_SHA384 ), "ecdsa-with-SHA384", "ECDSA with SHA384" },
ansond 0:137634ff4186 368 POLARSSL_MD_SHA384, POLARSSL_PK_ECDSA,
ansond 0:137634ff4186 369 },
ansond 0:137634ff4186 370 {
ansond 0:137634ff4186 371 { ADD_LEN( OID_ECDSA_SHA512 ), "ecdsa-with-SHA512", "ECDSA with SHA512" },
ansond 0:137634ff4186 372 POLARSSL_MD_SHA512, POLARSSL_PK_ECDSA,
ansond 0:137634ff4186 373 },
ansond 0:137634ff4186 374 {
ansond 0:137634ff4186 375 { ADD_LEN( OID_RSASSA_PSS ), "RSASSA-PSS", "RSASSA-PSS" },
ansond 0:137634ff4186 376 POLARSSL_MD_NONE, POLARSSL_PK_RSASSA_PSS,
ansond 0:137634ff4186 377 },
ansond 0:137634ff4186 378 {
ansond 0:137634ff4186 379 { NULL, 0, NULL, NULL },
ansond 0:137634ff4186 380 POLARSSL_MD_NONE, POLARSSL_PK_NONE,
ansond 0:137634ff4186 381 },
ansond 0:137634ff4186 382 };
ansond 0:137634ff4186 383
ansond 0:137634ff4186 384 FN_OID_TYPED_FROM_ASN1(oid_sig_alg_t, sig_alg, oid_sig_alg);
ansond 0:137634ff4186 385 FN_OID_GET_DESCRIPTOR_ATTR1(oid_get_sig_alg_desc, oid_sig_alg_t, sig_alg, const char *, description);
ansond 0:137634ff4186 386 FN_OID_GET_ATTR2(oid_get_sig_alg, oid_sig_alg_t, sig_alg, md_type_t, md_alg, pk_type_t, pk_alg);
ansond 0:137634ff4186 387 FN_OID_GET_OID_BY_ATTR2(oid_get_oid_by_sig_alg, oid_sig_alg_t, oid_sig_alg, pk_type_t, pk_alg, md_type_t, md_alg);
ansond 0:137634ff4186 388 #endif /* POLARSSL_MD_C */
ansond 0:137634ff4186 389
ansond 0:137634ff4186 390 /*
ansond 0:137634ff4186 391 * For PublicKeyInfo (PKCS1, RFC 5480)
ansond 0:137634ff4186 392 */
ansond 0:137634ff4186 393 typedef struct {
ansond 0:137634ff4186 394 oid_descriptor_t descriptor;
ansond 0:137634ff4186 395 pk_type_t pk_alg;
ansond 0:137634ff4186 396 } oid_pk_alg_t;
ansond 0:137634ff4186 397
ansond 0:137634ff4186 398 static const oid_pk_alg_t oid_pk_alg[] =
ansond 0:137634ff4186 399 {
ansond 0:137634ff4186 400 {
ansond 0:137634ff4186 401 { ADD_LEN( OID_PKCS1_RSA ), "rsaEncryption", "RSA" },
ansond 0:137634ff4186 402 POLARSSL_PK_RSA,
ansond 0:137634ff4186 403 },
ansond 0:137634ff4186 404 {
ansond 0:137634ff4186 405 { ADD_LEN( OID_EC_ALG_UNRESTRICTED ), "id-ecPublicKey", "Generic EC key" },
ansond 0:137634ff4186 406 POLARSSL_PK_ECKEY,
ansond 0:137634ff4186 407 },
ansond 0:137634ff4186 408 {
ansond 0:137634ff4186 409 { ADD_LEN( OID_EC_ALG_ECDH ), "id-ecDH", "EC key for ECDH" },
ansond 0:137634ff4186 410 POLARSSL_PK_ECKEY_DH,
ansond 0:137634ff4186 411 },
ansond 0:137634ff4186 412 {
ansond 0:137634ff4186 413 { NULL, 0, NULL, NULL },
ansond 0:137634ff4186 414 POLARSSL_PK_NONE,
ansond 0:137634ff4186 415 },
ansond 0:137634ff4186 416 };
ansond 0:137634ff4186 417
ansond 0:137634ff4186 418 FN_OID_TYPED_FROM_ASN1(oid_pk_alg_t, pk_alg, oid_pk_alg);
ansond 0:137634ff4186 419 FN_OID_GET_ATTR1(oid_get_pk_alg, oid_pk_alg_t, pk_alg, pk_type_t, pk_alg);
ansond 0:137634ff4186 420 FN_OID_GET_OID_BY_ATTR1(oid_get_oid_by_pk_alg, oid_pk_alg_t, oid_pk_alg, pk_type_t, pk_alg);
ansond 0:137634ff4186 421
ansond 0:137634ff4186 422 #if defined(POLARSSL_ECP_C)
ansond 0:137634ff4186 423 /*
ansond 0:137634ff4186 424 * For namedCurve (RFC 5480)
ansond 0:137634ff4186 425 */
ansond 0:137634ff4186 426 typedef struct {
ansond 0:137634ff4186 427 oid_descriptor_t descriptor;
ansond 0:137634ff4186 428 ecp_group_id grp_id;
ansond 0:137634ff4186 429 } oid_ecp_grp_t;
ansond 0:137634ff4186 430
ansond 0:137634ff4186 431 static const oid_ecp_grp_t oid_ecp_grp[] =
ansond 0:137634ff4186 432 {
ansond 0:137634ff4186 433 {
ansond 0:137634ff4186 434 { ADD_LEN( OID_EC_GRP_SECP192R1 ), "secp192r1", "secp192r1" },
ansond 0:137634ff4186 435 POLARSSL_ECP_DP_SECP192R1,
ansond 0:137634ff4186 436 },
ansond 0:137634ff4186 437 {
ansond 0:137634ff4186 438 { ADD_LEN( OID_EC_GRP_SECP224R1 ), "secp224r1", "secp224r1" },
ansond 0:137634ff4186 439 POLARSSL_ECP_DP_SECP224R1,
ansond 0:137634ff4186 440 },
ansond 0:137634ff4186 441 {
ansond 0:137634ff4186 442 { ADD_LEN( OID_EC_GRP_SECP256R1 ), "secp256r1", "secp256r1" },
ansond 0:137634ff4186 443 POLARSSL_ECP_DP_SECP256R1,
ansond 0:137634ff4186 444 },
ansond 0:137634ff4186 445 {
ansond 0:137634ff4186 446 { ADD_LEN( OID_EC_GRP_SECP384R1 ), "secp384r1", "secp384r1" },
ansond 0:137634ff4186 447 POLARSSL_ECP_DP_SECP384R1,
ansond 0:137634ff4186 448 },
ansond 0:137634ff4186 449 {
ansond 0:137634ff4186 450 { ADD_LEN( OID_EC_GRP_SECP521R1 ), "secp521r1", "secp521r1" },
ansond 0:137634ff4186 451 POLARSSL_ECP_DP_SECP521R1,
ansond 0:137634ff4186 452 },
ansond 0:137634ff4186 453 {
ansond 0:137634ff4186 454 { ADD_LEN( OID_EC_GRP_SECP192K1 ), "secp192k1", "secp192k1" },
ansond 0:137634ff4186 455 POLARSSL_ECP_DP_SECP192K1,
ansond 0:137634ff4186 456 },
ansond 0:137634ff4186 457 {
ansond 0:137634ff4186 458 { ADD_LEN( OID_EC_GRP_SECP224K1 ), "secp224k1", "secp224k1" },
ansond 0:137634ff4186 459 POLARSSL_ECP_DP_SECP224K1,
ansond 0:137634ff4186 460 },
ansond 0:137634ff4186 461 {
ansond 0:137634ff4186 462 { ADD_LEN( OID_EC_GRP_SECP256K1 ), "secp256k1", "secp256k1" },
ansond 0:137634ff4186 463 POLARSSL_ECP_DP_SECP256K1,
ansond 0:137634ff4186 464 },
ansond 0:137634ff4186 465 {
ansond 0:137634ff4186 466 { ADD_LEN( OID_EC_GRP_BP256R1 ), "brainpoolP256r1","brainpool256r1" },
ansond 0:137634ff4186 467 POLARSSL_ECP_DP_BP256R1,
ansond 0:137634ff4186 468 },
ansond 0:137634ff4186 469 {
ansond 0:137634ff4186 470 { ADD_LEN( OID_EC_GRP_BP384R1 ), "brainpoolP384r1","brainpool384r1" },
ansond 0:137634ff4186 471 POLARSSL_ECP_DP_BP384R1,
ansond 0:137634ff4186 472 },
ansond 0:137634ff4186 473 {
ansond 0:137634ff4186 474 { ADD_LEN( OID_EC_GRP_BP512R1 ), "brainpoolP512r1","brainpool512r1" },
ansond 0:137634ff4186 475 POLARSSL_ECP_DP_BP512R1,
ansond 0:137634ff4186 476 },
ansond 0:137634ff4186 477 {
ansond 0:137634ff4186 478 { NULL, 0, NULL, NULL },
ansond 0:137634ff4186 479 POLARSSL_ECP_DP_NONE,
ansond 0:137634ff4186 480 },
ansond 0:137634ff4186 481 };
ansond 0:137634ff4186 482
ansond 0:137634ff4186 483 FN_OID_TYPED_FROM_ASN1(oid_ecp_grp_t, grp_id, oid_ecp_grp);
ansond 0:137634ff4186 484 FN_OID_GET_ATTR1(oid_get_ec_grp, oid_ecp_grp_t, grp_id, ecp_group_id, grp_id);
ansond 0:137634ff4186 485 FN_OID_GET_OID_BY_ATTR1(oid_get_oid_by_ec_grp, oid_ecp_grp_t, oid_ecp_grp, ecp_group_id, grp_id);
ansond 0:137634ff4186 486 #endif /* POLARSSL_ECP_C */
ansond 0:137634ff4186 487
ansond 0:137634ff4186 488 #if defined(POLARSSL_CIPHER_C)
ansond 0:137634ff4186 489 /*
ansond 0:137634ff4186 490 * For PKCS#5 PBES2 encryption algorithm
ansond 0:137634ff4186 491 */
ansond 0:137634ff4186 492 typedef struct {
ansond 0:137634ff4186 493 oid_descriptor_t descriptor;
ansond 0:137634ff4186 494 cipher_type_t cipher_alg;
ansond 0:137634ff4186 495 } oid_cipher_alg_t;
ansond 0:137634ff4186 496
ansond 0:137634ff4186 497 static const oid_cipher_alg_t oid_cipher_alg[] =
ansond 0:137634ff4186 498 {
ansond 0:137634ff4186 499 {
ansond 0:137634ff4186 500 { ADD_LEN( OID_DES_CBC ), "desCBC", "DES-CBC" },
ansond 0:137634ff4186 501 POLARSSL_CIPHER_DES_CBC,
ansond 0:137634ff4186 502 },
ansond 0:137634ff4186 503 {
ansond 0:137634ff4186 504 { ADD_LEN( OID_DES_EDE3_CBC ), "des-ede3-cbc", "DES-EDE3-CBC" },
ansond 0:137634ff4186 505 POLARSSL_CIPHER_DES_EDE3_CBC,
ansond 0:137634ff4186 506 },
ansond 0:137634ff4186 507 {
ansond 0:137634ff4186 508 { NULL, 0, NULL, NULL },
ansond 0:137634ff4186 509 POLARSSL_CIPHER_NONE,
ansond 0:137634ff4186 510 },
ansond 0:137634ff4186 511 };
ansond 0:137634ff4186 512
ansond 0:137634ff4186 513 FN_OID_TYPED_FROM_ASN1(oid_cipher_alg_t, cipher_alg, oid_cipher_alg);
ansond 0:137634ff4186 514 FN_OID_GET_ATTR1(oid_get_cipher_alg, oid_cipher_alg_t, cipher_alg, cipher_type_t, cipher_alg);
ansond 0:137634ff4186 515 #endif /* POLARSSL_CIPHER_C */
ansond 0:137634ff4186 516
ansond 0:137634ff4186 517 #if defined(POLARSSL_MD_C)
ansond 0:137634ff4186 518 /*
ansond 0:137634ff4186 519 * For digestAlgorithm
ansond 0:137634ff4186 520 */
ansond 0:137634ff4186 521 typedef struct {
ansond 0:137634ff4186 522 oid_descriptor_t descriptor;
ansond 0:137634ff4186 523 md_type_t md_alg;
ansond 0:137634ff4186 524 } oid_md_alg_t;
ansond 0:137634ff4186 525
ansond 0:137634ff4186 526 static const oid_md_alg_t oid_md_alg[] =
ansond 0:137634ff4186 527 {
ansond 0:137634ff4186 528 {
ansond 0:137634ff4186 529 { ADD_LEN( OID_DIGEST_ALG_MD2 ), "id-md2", "MD2" },
ansond 0:137634ff4186 530 POLARSSL_MD_MD2,
ansond 0:137634ff4186 531 },
ansond 0:137634ff4186 532 {
ansond 0:137634ff4186 533 { ADD_LEN( OID_DIGEST_ALG_MD4 ), "id-md4", "MD4" },
ansond 0:137634ff4186 534 POLARSSL_MD_MD4,
ansond 0:137634ff4186 535 },
ansond 0:137634ff4186 536 {
ansond 0:137634ff4186 537 { ADD_LEN( OID_DIGEST_ALG_MD5 ), "id-md5", "MD5" },
ansond 0:137634ff4186 538 POLARSSL_MD_MD5,
ansond 0:137634ff4186 539 },
ansond 0:137634ff4186 540 {
ansond 0:137634ff4186 541 { ADD_LEN( OID_DIGEST_ALG_SHA1 ), "id-sha1", "SHA-1" },
ansond 0:137634ff4186 542 POLARSSL_MD_SHA1,
ansond 0:137634ff4186 543 },
ansond 0:137634ff4186 544 {
ansond 0:137634ff4186 545 { ADD_LEN( OID_DIGEST_ALG_SHA224 ), "id-sha224", "SHA-224" },
ansond 0:137634ff4186 546 POLARSSL_MD_SHA224,
ansond 0:137634ff4186 547 },
ansond 0:137634ff4186 548 {
ansond 0:137634ff4186 549 { ADD_LEN( OID_DIGEST_ALG_SHA256 ), "id-sha256", "SHA-256" },
ansond 0:137634ff4186 550 POLARSSL_MD_SHA256,
ansond 0:137634ff4186 551 },
ansond 0:137634ff4186 552 {
ansond 0:137634ff4186 553 { ADD_LEN( OID_DIGEST_ALG_SHA384 ), "id-sha384", "SHA-384" },
ansond 0:137634ff4186 554 POLARSSL_MD_SHA384,
ansond 0:137634ff4186 555 },
ansond 0:137634ff4186 556 {
ansond 0:137634ff4186 557 { ADD_LEN( OID_DIGEST_ALG_SHA512 ), "id-sha512", "SHA-512" },
ansond 0:137634ff4186 558 POLARSSL_MD_SHA512,
ansond 0:137634ff4186 559 },
ansond 0:137634ff4186 560 {
ansond 0:137634ff4186 561 { NULL, 0, NULL, NULL },
ansond 0:137634ff4186 562 POLARSSL_MD_NONE,
ansond 0:137634ff4186 563 },
ansond 0:137634ff4186 564 };
ansond 0:137634ff4186 565
ansond 0:137634ff4186 566 FN_OID_TYPED_FROM_ASN1(oid_md_alg_t, md_alg, oid_md_alg);
ansond 0:137634ff4186 567 FN_OID_GET_ATTR1(oid_get_md_alg, oid_md_alg_t, md_alg, md_type_t, md_alg);
ansond 0:137634ff4186 568 FN_OID_GET_OID_BY_ATTR1(oid_get_oid_by_md, oid_md_alg_t, oid_md_alg, md_type_t, md_alg);
ansond 0:137634ff4186 569 #endif /* POLARSSL_MD_C */
ansond 0:137634ff4186 570
ansond 0:137634ff4186 571 #if defined(POLARSSL_PKCS12_C)
ansond 0:137634ff4186 572 /*
ansond 0:137634ff4186 573 * For PKCS#12 PBEs
ansond 0:137634ff4186 574 */
ansond 0:137634ff4186 575 typedef struct {
ansond 0:137634ff4186 576 oid_descriptor_t descriptor;
ansond 0:137634ff4186 577 md_type_t md_alg;
ansond 0:137634ff4186 578 cipher_type_t cipher_alg;
ansond 0:137634ff4186 579 } oid_pkcs12_pbe_alg_t;
ansond 0:137634ff4186 580
ansond 0:137634ff4186 581 static const oid_pkcs12_pbe_alg_t oid_pkcs12_pbe_alg[] =
ansond 0:137634ff4186 582 {
ansond 0:137634ff4186 583 {
ansond 0:137634ff4186 584 { ADD_LEN( OID_PKCS12_PBE_SHA1_DES3_EDE_CBC ), "pbeWithSHAAnd3-KeyTripleDES-CBC", "PBE with SHA1 and 3-Key 3DES" },
ansond 0:137634ff4186 585 POLARSSL_MD_SHA1, POLARSSL_CIPHER_DES_EDE3_CBC,
ansond 0:137634ff4186 586 },
ansond 0:137634ff4186 587 {
ansond 0:137634ff4186 588 { ADD_LEN( OID_PKCS12_PBE_SHA1_DES2_EDE_CBC ), "pbeWithSHAAnd2-KeyTripleDES-CBC", "PBE with SHA1 and 2-Key 3DES" },
ansond 0:137634ff4186 589 POLARSSL_MD_SHA1, POLARSSL_CIPHER_DES_EDE_CBC,
ansond 0:137634ff4186 590 },
ansond 0:137634ff4186 591 {
ansond 0:137634ff4186 592 { NULL, 0, NULL, NULL },
ansond 0:137634ff4186 593 POLARSSL_MD_NONE, POLARSSL_CIPHER_NONE,
ansond 0:137634ff4186 594 },
ansond 0:137634ff4186 595 };
ansond 0:137634ff4186 596
ansond 0:137634ff4186 597 FN_OID_TYPED_FROM_ASN1(oid_pkcs12_pbe_alg_t, pkcs12_pbe_alg, oid_pkcs12_pbe_alg);
ansond 0:137634ff4186 598 FN_OID_GET_ATTR2(oid_get_pkcs12_pbe_alg, oid_pkcs12_pbe_alg_t, pkcs12_pbe_alg, md_type_t, md_alg, cipher_type_t, cipher_alg);
ansond 0:137634ff4186 599 #endif /* POLARSSL_PKCS12_C */
ansond 0:137634ff4186 600
ansond 0:137634ff4186 601 #if defined(_MSC_VER) && !defined snprintf && !defined(EFIX64) && \
ansond 0:137634ff4186 602 !defined(EFI32)
ansond 0:137634ff4186 603 #include <stdarg.h>
ansond 0:137634ff4186 604
ansond 0:137634ff4186 605 #if !defined vsnprintf
ansond 0:137634ff4186 606 #define vsnprintf _vsnprintf
ansond 0:137634ff4186 607 #endif // vsnprintf
ansond 0:137634ff4186 608
ansond 0:137634ff4186 609 /*
ansond 0:137634ff4186 610 * Windows _snprintf and _vsnprintf are not compatible to linux versions.
ansond 0:137634ff4186 611 * Result value is not size of buffer needed, but -1 if no fit is possible.
ansond 0:137634ff4186 612 *
ansond 0:137634ff4186 613 * This fuction tries to 'fix' this by at least suggesting enlarging the
ansond 0:137634ff4186 614 * size by 20.
ansond 0:137634ff4186 615 */
ansond 0:137634ff4186 616 static int compat_snprintf( char *str, size_t size, const char *format, ... )
ansond 0:137634ff4186 617 {
ansond 0:137634ff4186 618 va_list ap;
ansond 0:137634ff4186 619 int res = -1;
ansond 0:137634ff4186 620
ansond 0:137634ff4186 621 va_start( ap, format );
ansond 0:137634ff4186 622
ansond 0:137634ff4186 623 res = vsnprintf( str, size, format, ap );
ansond 0:137634ff4186 624
ansond 0:137634ff4186 625 va_end( ap );
ansond 0:137634ff4186 626
ansond 0:137634ff4186 627 // No quick fix possible
ansond 0:137634ff4186 628 if( res < 0 )
ansond 0:137634ff4186 629 return( (int) size + 20 );
ansond 0:137634ff4186 630
ansond 0:137634ff4186 631 return( res );
ansond 0:137634ff4186 632 }
ansond 0:137634ff4186 633
ansond 0:137634ff4186 634 #define snprintf compat_snprintf
ansond 0:137634ff4186 635 #endif /* _MSC_VER && !snprintf && !EFIX64 && !EFI32 */
ansond 0:137634ff4186 636
ansond 0:137634ff4186 637 #define SAFE_SNPRINTF() \
ansond 0:137634ff4186 638 { \
ansond 0:137634ff4186 639 if( ret == -1 ) \
ansond 0:137634ff4186 640 return( POLARSSL_ERR_OID_BUF_TOO_SMALL ); \
ansond 0:137634ff4186 641 \
ansond 0:137634ff4186 642 if( (unsigned int) ret >= n ) { \
ansond 0:137634ff4186 643 p[n - 1] = '\0'; \
ansond 0:137634ff4186 644 return( POLARSSL_ERR_OID_BUF_TOO_SMALL ); \
ansond 0:137634ff4186 645 } \
ansond 0:137634ff4186 646 \
ansond 0:137634ff4186 647 n -= (unsigned int) ret; \
ansond 0:137634ff4186 648 p += (unsigned int) ret; \
ansond 0:137634ff4186 649 }
ansond 0:137634ff4186 650
ansond 0:137634ff4186 651 /* Return the x.y.z.... style numeric string for the given OID */
ansond 0:137634ff4186 652 int oid_get_numeric_string( char *buf, size_t size,
ansond 0:137634ff4186 653 const asn1_buf *oid )
ansond 0:137634ff4186 654 {
ansond 0:137634ff4186 655 int ret;
ansond 0:137634ff4186 656 size_t i, n;
ansond 0:137634ff4186 657 unsigned int value;
ansond 0:137634ff4186 658 char *p;
ansond 0:137634ff4186 659
ansond 0:137634ff4186 660 p = buf;
ansond 0:137634ff4186 661 n = size;
ansond 0:137634ff4186 662
ansond 0:137634ff4186 663 /* First byte contains first two dots */
ansond 0:137634ff4186 664 if( oid->len > 0 )
ansond 0:137634ff4186 665 {
ansond 0:137634ff4186 666 ret = polarssl_snprintf( p, n, "%d.%d", oid->p[0] / 40, oid->p[0] % 40 );
ansond 0:137634ff4186 667 SAFE_SNPRINTF();
ansond 0:137634ff4186 668 }
ansond 0:137634ff4186 669
ansond 0:137634ff4186 670 value = 0;
ansond 0:137634ff4186 671 for( i = 1; i < oid->len; i++ )
ansond 0:137634ff4186 672 {
ansond 0:137634ff4186 673 /* Prevent overflow in value. */
ansond 0:137634ff4186 674 if( ( ( value << 7 ) >> 7 ) != value )
ansond 0:137634ff4186 675 return( POLARSSL_ERR_OID_BUF_TOO_SMALL );
ansond 0:137634ff4186 676
ansond 0:137634ff4186 677 value <<= 7;
ansond 0:137634ff4186 678 value += oid->p[i] & 0x7F;
ansond 0:137634ff4186 679
ansond 0:137634ff4186 680 if( !( oid->p[i] & 0x80 ) )
ansond 0:137634ff4186 681 {
ansond 0:137634ff4186 682 /* Last byte */
ansond 0:137634ff4186 683 ret = polarssl_snprintf( p, n, ".%d", value );
ansond 0:137634ff4186 684 SAFE_SNPRINTF();
ansond 0:137634ff4186 685 value = 0;
ansond 0:137634ff4186 686 }
ansond 0:137634ff4186 687 }
ansond 0:137634ff4186 688
ansond 0:137634ff4186 689 return( (int) ( size - n ) );
ansond 0:137634ff4186 690 }
ansond 0:137634ff4186 691
ansond 0:137634ff4186 692 #endif /* POLARSSL_OID_C */
ansond 0:137634ff4186 693