asn_public.h (37159B)
1 /* asn_public.h 2 * 3 * Copyright (C) 2006-2025 wolfSSL Inc. 4 * 5 * This file is part of wolfSSL. 6 * 7 * wolfSSL is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 3 of the License, or 10 * (at your option) any later version. 11 * 12 * wolfSSL is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA 20 */ 21 22 /*! 23 \file wolfssl/wolfcrypt/asn_public.h 24 */ 25 26 /* 27 DESCRIPTION 28 This library defines the interface APIs for X509 certificates. 29 30 */ 31 #ifndef WOLF_CRYPT_ASN_PUBLIC_H 32 #define WOLF_CRYPT_ASN_PUBLIC_H 33 34 #include <wolfssl/wolfcrypt/types.h> 35 #ifndef NO_DSA 36 #include <wolfssl/wolfcrypt/dsa.h> 37 #endif 38 #include <wolfssl/wolfcrypt/random.h> 39 40 #ifdef __cplusplus 41 extern "C" { 42 #endif 43 44 /* guard on redeclaration */ 45 #ifndef WC_ECCKEY_TYPE_DEFINED 46 typedef struct ecc_key ecc_key; 47 #define WC_ECCKEY_TYPE_DEFINED 48 #endif 49 #ifndef WC_ED25519KEY_TYPE_DEFINED 50 typedef struct ed25519_key ed25519_key; 51 #define WC_ED25519KEY_TYPE_DEFINED 52 #endif 53 #ifndef WC_CURVE25519KEY_TYPE_DEFINED 54 typedef struct curve25519_key curve25519_key; 55 #define WC_CURVE25519KEY_TYPE_DEFINED 56 #endif 57 #ifndef WC_ED448KEY_TYPE_DEFINED 58 typedef struct ed448_key ed448_key; 59 #define WC_ED448KEY_TYPE_DEFINED 60 #endif 61 #ifndef WC_CURVE448KEY_TYPE_DEFINED 62 typedef struct curve448_key curve448_key; 63 #define WC_CURVE448KEY_TYPE_DEFINED 64 #endif 65 #ifndef WC_RSAKEY_TYPE_DEFINED 66 typedef struct RsaKey RsaKey; 67 #define WC_RSAKEY_TYPE_DEFINED 68 #endif 69 #ifndef WC_DH_TYPE_DEFINED 70 typedef struct DhKey DhKey; 71 #define WC_DH_TYPE_DEFINED 72 #endif 73 #ifndef WC_FALCONKEY_TYPE_DEFINED 74 typedef struct falcon_key falcon_key; 75 #define WC_FALCONKEY_TYPE_DEFINED 76 #endif 77 #ifndef WC_DILITHIUMKEY_TYPE_DEFINED 78 typedef struct dilithium_key dilithium_key; 79 #define WC_DILITHIUMKEY_TYPE_DEFINED 80 #endif 81 #ifndef WC_SPHINCSKEY_TYPE_DEFINED 82 typedef struct sphincs_key sphincs_key; 83 #define WC_SPHINCSKEY_TYPE_DEFINED 84 #endif 85 86 enum EncPkcs8Types { 87 ENC_PKCS8_VER_PKCS12 = 1, 88 ENC_PKCS8_VER_PKCS5 = 5, 89 90 ENC_PKCS8_PBES2 = 13, 91 92 ENC_PKCS8_PBE_SHA1_RC4_128 = 1, 93 ENC_PKCS8_PBE_SHA1_DES = 2, 94 ENC_PKCS8_PBE_SHA1_DES3 = 3, 95 ENC_PKCS8_PBE_SHA1_40RC2_CBC = 6, 96 97 ENC_PKCS8_PBES1_MD5_DES = 3, 98 ENC_PKCS8_PBES1_SHA1_DES = 10, 99 100 ENC_PKCS8_ALG_AES128CBC = 414, 101 ENC_PKCS8_ALG_AES256CBC = 454, 102 ENC_PKCS8_ALG_DES = 69, 103 ENC_PKCS8_ALG_DES3 = 652 104 }; 105 106 /* Certificate file Type */ 107 enum CertType { 108 CERT_TYPE = 0, 109 PRIVATEKEY_TYPE, 110 ALT_PRIVATEKEY_TYPE, 111 DH_PARAM_TYPE, 112 DSA_PARAM_TYPE, 113 CRL_TYPE, 114 CA_TYPE, 115 ECC_PRIVATEKEY_TYPE, 116 DSA_PRIVATEKEY_TYPE, 117 ACERT_TYPE, 118 CERTREQ_TYPE, 119 DSA_TYPE, 120 ECC_TYPE, 121 RSA_TYPE, 122 PUBLICKEY_TYPE, 123 RSA_PUBLICKEY_TYPE, 124 ECC_PUBLICKEY_TYPE, 125 TRUSTED_PEER_TYPE, 126 EDDSA_PRIVATEKEY_TYPE, 127 ED25519_TYPE, 128 ED448_TYPE, 129 PKCS12_TYPE, 130 PKCS8_PRIVATEKEY_TYPE, 131 PKCS8_ENC_PRIVATEKEY_TYPE, 132 DETECT_CERT_TYPE, 133 DH_PRIVATEKEY_TYPE, 134 X942_PARAM_TYPE, 135 FALCON_LEVEL1_TYPE, 136 FALCON_LEVEL5_TYPE, 137 DILITHIUM_LEVEL2_TYPE, 138 DILITHIUM_LEVEL3_TYPE, 139 DILITHIUM_LEVEL5_TYPE, 140 ML_DSA_LEVEL2_TYPE, 141 ML_DSA_LEVEL3_TYPE, 142 ML_DSA_LEVEL5_TYPE, 143 SPHINCS_FAST_LEVEL1_TYPE, 144 SPHINCS_FAST_LEVEL3_TYPE, 145 SPHINCS_FAST_LEVEL5_TYPE, 146 SPHINCS_SMALL_LEVEL1_TYPE, 147 SPHINCS_SMALL_LEVEL3_TYPE, 148 SPHINCS_SMALL_LEVEL5_TYPE, 149 ECC_PARAM_TYPE, 150 CHAIN_CERT_TYPE, 151 PKCS7_TYPE, 152 TRUSTED_CERT_TYPE 153 }; 154 155 156 enum Ctc_Encoding { 157 CTC_UTF8 = 0x0c, /* utf8 */ 158 CTC_PRINTABLE = 0x13 /* printable */ 159 }; 160 161 #ifndef WC_CTC_NAME_SIZE 162 #define WC_CTC_NAME_SIZE 64 163 #endif 164 #ifndef WC_CTC_MAX_ALT_SIZE 165 #define WC_CTC_MAX_ALT_SIZE 16384 166 #endif 167 #ifdef WOLFSSL_CERT_EXT 168 #ifndef WC_CTC_MAX_CRLINFO_SZ 169 #define WC_CTC_MAX_CRLINFO_SZ 200 170 #endif 171 #endif 172 173 enum Ctc_Misc { 174 CTC_COUNTRY_SIZE = 2, 175 CTC_NAME_SIZE = WC_CTC_NAME_SIZE, 176 CTC_DATE_SIZE = 32, 177 CTC_MAX_ALT_SIZE = WC_CTC_MAX_ALT_SIZE, /* may be huge, default: 16384 */ 178 CTC_SERIAL_SIZE = 20, 179 CTC_GEN_SERIAL_SZ = 16, 180 CTC_FILETYPE_ASN1 = 2, 181 CTC_FILETYPE_PEM = 1, 182 CTC_FILETYPE_DEFAULT = 2, 183 #ifdef WOLFSSL_CERT_EXT 184 /* AKID could contains: hash + (Option) AuthCertIssuer,AuthCertSerialNum 185 * We support only hash */ 186 CTC_MAX_SKID_SIZE = 32, /* SHA256_DIGEST_SIZE */ 187 CTC_MAX_AKID_SIZE = 32, /* SHA256_DIGEST_SIZE */ 188 CTC_MAX_CERTPOL_SZ = 200, /* RFC 5280 Section 4.2.1.4 */ 189 CTC_MAX_CERTPOL_NB = 2, /* Max number of Certificate Policy */ 190 CTC_MAX_CRLINFO_SZ = WC_CTC_MAX_CRLINFO_SZ, /* Arbitrary size that should be 191 * enough for at least two 192 * distribution points. */ 193 #endif /* WOLFSSL_CERT_EXT */ 194 WOLF_ENUM_DUMMY_LAST_ELEMENT(Ctc_Misc) 195 }; 196 197 /* DER buffer */ 198 typedef struct DerBuffer { 199 byte* buffer; 200 void* heap; 201 word32 length; 202 int type; /* enum CertType */ 203 int dynType; /* DYNAMIC_TYPE_* */ 204 } DerBuffer; 205 206 typedef struct WOLFSSL_ASN1_TIME { 207 unsigned char data[CTC_DATE_SIZE]; /* date bytes */ 208 int length; 209 int type; 210 } WOLFSSL_ASN1_TIME; 211 212 enum { 213 IV_SZ = 32, /* max iv sz */ 214 #ifdef OPENSSL_ALL 215 NAME_SZ = 160, /* larger max one line, allows for longer 216 encryption password support */ 217 #else 218 NAME_SZ = 80, /* max one line */ 219 #endif 220 221 PEM_PASS_READ = 0, 222 PEM_PASS_WRITE = 1 223 }; 224 225 typedef int (wc_pem_password_cb)(char* passwd, int sz, int rw, void* userdata); 226 #ifndef OPENSSL_COEXIST 227 /* In the past, wc_pem_password_cb was called pem_password_cb, which is the same 228 * name as an identical typedef in OpenSSL. We don't want to break existing code 229 * that uses the name pem_password_cb, so we define it here as a macro alias for 230 * wc_pem_password_cb. In cases where a user needs to use both OpenSSL and 231 * wolfSSL headers in the same code, they should define OPENSSL_COEXIST to 232 * avoid errors stemming from the typedef being declared twice. */ 233 #define pem_password_cb wc_pem_password_cb 234 #endif 235 236 typedef struct EncryptedInfo { 237 long consumed; /* tracks PEM bytes consumed */ 238 239 #ifdef WOLFSSL_ENCRYPTED_KEYS 240 wc_pem_password_cb* passwd_cb; 241 void* passwd_userdata; 242 243 int cipherType; 244 word32 keySz; 245 word32 ivSz; /* salt or encrypted IV size */ 246 247 char name[NAME_SZ]; /* cipher name, such as "DES-CBC" */ 248 byte iv[IV_SZ]; /* salt or encrypted IV */ 249 250 WC_BITFIELD set:1; /* if encryption set */ 251 #endif 252 } EncryptedInfo; 253 254 255 #define WOLFSSL_ASN1_INTEGER_MAX 20 256 typedef struct WOLFSSL_ASN1_INTEGER { 257 /* size can be increased set at 20 for tag, length then to hold at least 16 258 * byte type */ 259 unsigned char intData[WOLFSSL_ASN1_INTEGER_MAX]; 260 /* ASN_INTEGER | LENGTH | hex of number */ 261 unsigned char negative; /* negative number flag */ 262 263 unsigned char* data; 264 unsigned int dataMax; /* max size of data buffer */ 265 WC_BITFIELD isDynamic:1; /* flag for if data pointer dynamic (1 is yes 0 is no) */ 266 267 int length; /* Length of DER encoding. */ 268 int type; /* ASN.1 type. Includes negative flag. */ 269 } WOLFSSL_ASN1_INTEGER; 270 271 272 #if defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_CERT_EXT) 273 #ifdef WOLFSSL_EKU_OID 274 #ifndef CTC_MAX_EKU_NB 275 #define CTC_MAX_EKU_NB 1 276 #endif 277 #ifndef CTC_MAX_EKU_OID_SZ 278 #define CTC_MAX_EKU_OID_SZ 30 279 #endif 280 #else 281 #undef CTC_MAX_EKU_OID_SZ 282 #define CTC_MAX_EKU_OID_SZ 0 283 #endif 284 #endif /* WOLFSSL_CERT_GEN || WOLFSSL_CERT_EXT */ 285 286 #ifdef WOLFSSL_MULTI_ATTRIB 287 #ifndef CTC_MAX_ATTRIB 288 #define CTC_MAX_ATTRIB 4 289 #endif 290 291 /* ASN Encoded Name field */ 292 typedef struct NameAttrib { 293 int sz; /* actual string value length */ 294 int id; /* id of name */ 295 int type; /* enc of name */ 296 char value[CTC_NAME_SIZE]; /* name */ 297 } NameAttrib; 298 #endif /* WOLFSSL_MULTI_ATTRIB */ 299 300 #ifdef WOLFSSL_CUSTOM_OID 301 typedef struct CertOidField { 302 byte* oid; 303 byte* val; 304 int oidSz; 305 int valSz; 306 char enc; 307 } CertOidField; 308 309 typedef struct CertExtension { 310 char* oid; 311 byte crit; 312 byte* val; 313 int valSz; 314 } CertExtension; 315 #endif 316 317 #if defined(WOLFSSL_CERT_GEN) || defined(OPENSSL_EXTRA) || \ 318 defined(OPENSSL_EXTRA_X509_SMALL) || defined(WOLFSSL_CERT_EXT) || \ 319 defined(WOLFSSL_CERT_REQ) 320 typedef struct CertName { 321 char country[CTC_NAME_SIZE]; 322 char countryEnc; 323 char state[CTC_NAME_SIZE]; 324 char stateEnc; 325 char street[CTC_NAME_SIZE]; 326 char streetEnc; 327 char locality[CTC_NAME_SIZE]; 328 char localityEnc; 329 char sur[CTC_NAME_SIZE]; 330 char surEnc; 331 #ifdef WOLFSSL_CERT_NAME_ALL 332 char givenName[CTC_NAME_SIZE]; 333 char givenNameEnc; 334 char initials[CTC_NAME_SIZE]; 335 char initialsEnc; 336 char dnQualifier[CTC_NAME_SIZE]; 337 char dnQualifierEnc; 338 char dnName[CTC_NAME_SIZE]; 339 char dnNameEnc; 340 #endif /* WOLFSSL_CERT_NAME_ALL */ 341 char org[CTC_NAME_SIZE]; 342 char orgEnc; 343 char unit[CTC_NAME_SIZE]; 344 char unitEnc; 345 char commonName[CTC_NAME_SIZE]; 346 char commonNameEnc; 347 char serialDev[CTC_NAME_SIZE]; 348 char serialDevEnc; 349 char userId[CTC_NAME_SIZE]; 350 char userIdEnc; 351 char postalCode[CTC_NAME_SIZE]; 352 char postalCodeEnc; 353 #ifdef WOLFSSL_CERT_EXT 354 char busCat[CTC_NAME_SIZE]; 355 char busCatEnc; 356 char joiC[CTC_NAME_SIZE]; 357 char joiCEnc; 358 char joiSt[CTC_NAME_SIZE]; 359 char joiStEnc; 360 #endif 361 char email[CTC_NAME_SIZE]; /* !!!! email has to be last !!!! */ 362 #ifdef WOLFSSL_MULTI_ATTRIB 363 NameAttrib name[CTC_MAX_ATTRIB]; 364 #endif 365 #ifdef WOLFSSL_CUSTOM_OID 366 CertOidField custom; 367 #endif 368 } CertName; 369 #endif /* WOLFSSL_CERT_GEN || OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL*/ 370 371 #ifndef NUM_CUSTOM_EXT 372 #define NUM_CUSTOM_EXT 16 373 #endif /* NUM_CUSTOM_EXT */ 374 375 /* for user to fill for certificate generation */ 376 typedef struct Cert { 377 int version; /* x509 version */ 378 byte serial[CTC_SERIAL_SIZE]; /* serial number */ 379 int serialSz; /* serial size */ 380 int sigType; /* signature algo type */ 381 #if defined(WOLFSSL_CERT_GEN) || defined(OPENSSL_EXTRA) \ 382 || defined(OPENSSL_EXTRA_X509_SMALL) 383 CertName issuer; /* issuer info */ 384 CertName subject; /* subject info */ 385 #endif /* WOLFSSL_CERT_GEN || OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */ 386 int daysValid; /* validity days */ 387 int selfSigned; /* self signed flag */ 388 int isCA; /* is this going to be a CA */ 389 byte pathLen; /* max depth of valid certification 390 * paths that include this cert */ 391 /* internal use only */ 392 int bodySz; /* pre sign total size */ 393 int keyType; /* public key type of subject */ 394 #ifdef WOLFSSL_ALT_NAMES 395 byte altNames[CTC_MAX_ALT_SIZE]; /* altNames copy */ 396 int altNamesSz; /* altNames size in bytes */ 397 #endif 398 byte beforeDate[CTC_DATE_SIZE]; /* before date copy */ 399 int beforeDateSz; /* size of copy */ 400 byte afterDate[CTC_DATE_SIZE]; /* after date copy */ 401 int afterDateSz; /* size of copy */ 402 #ifdef WOLFSSL_CERT_EXT 403 byte skid[CTC_MAX_SKID_SIZE]; /* Subject Key Identifier */ 404 int skidSz; /* SKID size in bytes */ 405 byte akid[CTC_MAX_AKID_SIZE 406 #ifdef WOLFSSL_AKID_NAME 407 + sizeof(CertName) + CTC_SERIAL_SIZE 408 #endif 409 ]; /* Authority Key 410 * Identifier */ 411 int akidSz; /* AKID size in bytes */ 412 #ifdef WOLFSSL_AKID_NAME 413 byte rawAkid; /* Set to true if akid is a 414 * AuthorityKeyIdentifier object. 415 * Set to false if akid is just a 416 * KeyIdentifier object. */ 417 #endif 418 word16 keyUsage; /* Key Usage */ 419 byte extKeyUsage; /* Extended Key Usage */ 420 #ifndef IGNORE_NETSCAPE_CERT_TYPE 421 byte nsCertType; /* Netscape Certificate Type */ 422 #endif 423 #ifdef WOLFSSL_EKU_OID 424 /* Extended Key Usage OIDs */ 425 byte extKeyUsageOID[CTC_MAX_EKU_NB][CTC_MAX_EKU_OID_SZ]; 426 byte extKeyUsageOIDSz[CTC_MAX_EKU_NB]; 427 #endif 428 char certPolicies[CTC_MAX_CERTPOL_NB][CTC_MAX_CERTPOL_SZ]; 429 word16 certPoliciesNb; /* Number of Cert Policy */ 430 byte crlInfo[CTC_MAX_CRLINFO_SZ]; /* CRL Distribution points */ 431 int crlInfoSz; 432 #endif 433 #if defined(WOLFSSL_CERT_EXT) || defined(OPENSSL_EXTRA) || \ 434 defined(WOLFSSL_CERT_REQ) 435 byte issRaw[sizeof(CertName)]; /* raw issuer info */ 436 byte sbjRaw[sizeof(CertName)]; /* raw subject info */ 437 #endif 438 #ifdef WOLFSSL_DUAL_ALG_CERTS 439 /* These will not point to managed buffers. They will point to buffers that 440 * are managed by others. No cleanup necessary. */ 441 /* Subject Alternative Public Key Info */ 442 byte *sapkiDer; 443 int sapkiLen; 444 byte sapkiCrit; 445 /* Alternative Signature Algorithm */ 446 byte *altSigAlgDer; 447 int altSigAlgLen; 448 byte altSigAlgCrit; 449 /* Alternative Signature Value */ 450 byte *altSigValDer; 451 int altSigValLen; 452 byte altSigValCrit; 453 #endif /* WOLFSSL_DUAL_ALG_CERTS */ 454 #ifdef WOLFSSL_CERT_REQ 455 char challengePw[CTC_NAME_SIZE]; 456 char unstructuredName[CTC_NAME_SIZE]; 457 int challengePwPrintableString; /* encode as PrintableString */ 458 #endif /* WOLFSSL_CERT_REQ */ 459 #ifdef WOLFSSL_CUSTOM_OID 460 /* user oid and value to go in req extensions */ 461 CertOidField extCustom; 462 463 /* Extensions to go into X.509 certificates */ 464 CertExtension customCertExt[NUM_CUSTOM_EXT]; 465 int customCertExtCount; 466 #endif /* WOLFSSL_CUSTOM_OID */ 467 void* decodedCert; /* internal DecodedCert allocated from heap */ 468 byte* der; /* Pointer to buffer of current DecodedCert cache */ 469 void* heap; /* heap hint */ 470 WC_BITFIELD basicConstSet:1; /* Indicator for when Basic Constraint is set */ 471 byte basicConstCrit; /* Indicator of criticality of Basic Constraints extension */ 472 #ifdef WOLFSSL_ALLOW_ENCODING_CA_FALSE 473 WC_BITFIELD isCaSet:1; /* Indicator for when isCA is set */ 474 #endif 475 WC_BITFIELD pathLenSet:1; /* Indicator for when path length is set */ 476 #ifdef WOLFSSL_ALT_NAMES 477 WC_BITFIELD altNamesCrit:1; /* Indicator of criticality of SAN extension */ 478 #endif 479 } Cert; 480 481 482 /* Initialize and Set Certificate defaults: 483 version = 3 (0x2) 484 serial = 0 (Will be randomly generated) 485 sigType = SHA_WITH_RSA 486 issuer = blank 487 daysValid = 500 488 selfSigned = 1 (true) use subject as issuer 489 subject = blank 490 isCA = 0 (false) 491 keyType = RSA_KEY (default) 492 */ 493 WOLFSSL_ABI WOLFSSL_API int wc_InitCert(Cert* cert); 494 WOLFSSL_ABI WOLFSSL_API Cert* wc_CertNew(void* heap); 495 WOLFSSL_ABI WOLFSSL_API void wc_CertFree(Cert* cert); 496 WOLFSSL_API int wc_InitCert_ex(Cert* cert, void* heap, int devId); 497 WOLFSSL_API int wc_MakeCert_ex(Cert* cert, byte* derBuffer, word32 derSz, 498 int keyType, void* key, WC_RNG* rng); 499 WOLFSSL_ABI 500 WOLFSSL_API int wc_MakeCert(Cert* cert, byte* derBuffer, word32 derSz, 501 RsaKey* rsaKey, ecc_key* eccKey, WC_RNG* rng); 502 #ifdef WOLFSSL_CERT_REQ 503 WOLFSSL_API int wc_MakeCertReq_ex(Cert* cert, byte* derBuffer, word32 derSz, 504 int keyType, void* key); 505 WOLFSSL_ABI 506 WOLFSSL_API int wc_MakeCertReq(Cert* cert, byte* derBuffer, word32 derSz, 507 RsaKey* rsaKey, ecc_key* eccKey); 508 #endif 509 WOLFSSL_API int wc_SignCert_ex(int requestSz, int sType, byte* buf, 510 word32 buffSz, int keyType, void* key, 511 WC_RNG* rng); 512 WOLFSSL_API int wc_SignCert(int requestSz, int sType, byte* buf, word32 buffSz, 513 RsaKey* rsaKey, ecc_key* eccKey, WC_RNG* rng); 514 #ifdef WOLFSSL_DUAL_ALG_CERTS 515 WOLFSSL_API int wc_MakeSigWithBitStr(byte *sig, int sigSz, int sType, byte* buf, 516 word32 bufSz, int keyType, void* key, 517 WC_RNG* rng); 518 #endif 519 WOLFSSL_ABI 520 WOLFSSL_API int wc_MakeSelfCert(Cert* cert, byte* buf, word32 buffSz, 521 RsaKey* key, WC_RNG* rng); 522 WOLFSSL_ABI WOLFSSL_API int wc_SetIssuer(Cert* cert, const char* issuerFile); 523 WOLFSSL_ABI WOLFSSL_API int wc_SetSubject(Cert* cert, const char* subjectFile); 524 #ifdef WOLFSSL_ALT_NAMES 525 WOLFSSL_ABI WOLFSSL_API int wc_SetAltNames(Cert* cert, const char* file); 526 #endif 527 528 #ifdef WOLFSSL_CERT_GEN_CACHE 529 WOLFSSL_ABI WOLFSSL_API void wc_SetCert_Free(Cert* cert); 530 #endif 531 532 WOLFSSL_ABI 533 WOLFSSL_API int wc_SetIssuerBuffer(Cert* cert, const byte* der, int derSz); 534 WOLFSSL_ABI 535 WOLFSSL_API int wc_SetSubjectBuffer(Cert* cert, const byte* der, int derSz); 536 WOLFSSL_ABI 537 WOLFSSL_API int wc_SetAltNamesBuffer(Cert* cert, const byte* der, int derSz); 538 WOLFSSL_ABI 539 WOLFSSL_API int wc_SetDatesBuffer(Cert* cert, const byte* der, int derSz); 540 541 #ifndef NO_ASN_TIME 542 WOLFSSL_API int wc_GetCertDates(Cert* cert, struct tm* before, 543 struct tm* after); 544 #endif 545 546 #ifdef WOLFSSL_CERT_EXT 547 WOLFSSL_API int wc_SetAuthKeyIdFromPublicKey_ex(Cert *cert, int keyType, 548 void* key); 549 WOLFSSL_API int wc_SetAuthKeyIdFromPublicKey(Cert *cert, RsaKey *rsakey, 550 ecc_key *eckey); 551 WOLFSSL_API int wc_SetAuthKeyIdFromCert(Cert *cert, const byte *der, int derSz); 552 WOLFSSL_API int wc_SetAuthKeyId(Cert *cert, const char* file); 553 WOLFSSL_API int wc_SetSubjectKeyIdFromPublicKey_ex(Cert *cert, int keyType, 554 void* key); 555 WOLFSSL_API int wc_SetSubjectKeyIdFromPublicKey(Cert *cert, RsaKey *rsakey, 556 ecc_key *eckey); 557 WOLFSSL_API int wc_SetSubjectKeyId(Cert *cert, const char* file); 558 WOLFSSL_ABI WOLFSSL_API int wc_GetSubjectRaw(byte **subjectRaw, Cert *cert); 559 WOLFSSL_ABI 560 WOLFSSL_API int wc_SetSubjectRaw(Cert* cert, const byte* der, int derSz); 561 WOLFSSL_ABI 562 WOLFSSL_API int wc_SetIssuerRaw(Cert* cert, const byte* der, int derSz); 563 564 /* Set the KeyUsage. 565 * Value is a string separated tokens with ','. Accepted tokens are : 566 * digitalSignature,nonRepudiation,contentCommitment,keyCertSign,cRLSign, 567 * dataEncipherment,keyAgreement,keyEncipherment,encipherOnly and decipherOnly. 568 * 569 * nonRepudiation and contentCommitment are for the same usage. 570 */ 571 WOLFSSL_API int wc_SetKeyUsage(Cert *cert, const char *value); 572 573 /* Set ExtendedKeyUsage 574 * Value is a string separated tokens with ','. Accepted tokens are : 575 * any,serverAuth,clientAuth,codeSigning,emailProtection,timeStamping,OCSPSigning 576 */ 577 WOLFSSL_API int wc_SetExtKeyUsage(Cert *cert, const char *value); 578 579 580 #ifdef WOLFSSL_EKU_OID 581 /* Set ExtendedKeyUsage with unique OID 582 * oid is expected to be in byte representation 583 */ 584 WOLFSSL_API int wc_SetExtKeyUsageOID(Cert *cert, const char *oid, word32 sz, 585 byte idx, void* heap); 586 #endif /* WOLFSSL_EKU_OID */ 587 588 #if defined(WOLFSSL_ASN_TEMPLATE) && defined(WOLFSSL_CUSTOM_OID) && \ 589 defined(HAVE_OID_ENCODING) 590 WOLFSSL_API int wc_SetCustomExtension(Cert *cert, int critical, const char *oid, 591 const byte *der, word32 derSz); 592 #endif 593 594 #endif /* WOLFSSL_CERT_EXT */ 595 596 WOLFSSL_API int wc_GetDateInfo(const byte* certDate, int certDateSz, 597 const byte** date, byte* format, int* length); 598 #ifndef NO_ASN_TIME 599 WOLFSSL_API int wc_GetDateAsCalendarTime(const byte* date, int length, 600 byte format, struct tm* timearg); 601 #endif 602 603 #if defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM) 604 605 WOLFSSL_API int wc_PemGetHeaderFooter(int type, const char** header, 606 const char** footer); 607 608 #endif 609 610 WOLFSSL_API int wc_AllocDer(DerBuffer** pDer, word32 length, int type, void* heap); 611 WOLFSSL_API void wc_FreeDer(DerBuffer** pDer); 612 613 #ifdef WOLFSSL_PEM_TO_DER 614 WOLFSSL_API int wc_PemToDer(const unsigned char* buff, long longSz, int type, 615 DerBuffer** pDer, void* heap, EncryptedInfo* info, int* keyFormat); 616 617 WOLFSSL_API int wc_KeyPemToDer(const unsigned char* pem, int pemSz, 618 unsigned char* buff, int buffSz, const char* pass); 619 WOLFSSL_API int wc_CertPemToDer(const unsigned char* pem, int pemSz, 620 unsigned char* buff, int buffSz, int type); 621 #endif /* WOLFSSL_PEM_TO_DER */ 622 623 #if defined(WOLFSSL_CERT_EXT) || defined(WOLFSSL_PUB_PEM_TO_DER) 624 #if !defined(NO_FILESYSTEM) && defined(WOLFSSL_PEM_TO_DER) 625 WOLFSSL_API int wc_PemPubKeyToDer(const char* fileName, 626 unsigned char* derBuf, int derSz); 627 WOLFSSL_API int wc_PemPubKeyToDer_ex(const char* fileName, DerBuffer** der); 628 #endif 629 630 WOLFSSL_API int wc_PubKeyPemToDer(const unsigned char* pem, int pemSz, 631 unsigned char* buff, int buffSz); 632 #endif /* WOLFSSL_CERT_EXT || WOLFSSL_PUB_PEM_TO_DER */ 633 634 #ifdef WOLFSSL_CERT_GEN 635 #if !defined(NO_FILESYSTEM) && defined(WOLFSSL_PEM_TO_DER) 636 WOLFSSL_API int wc_PemCertToDer(const char* fileName, 637 unsigned char* derBuf, int derSz); 638 WOLFSSL_API int wc_PemCertToDer_ex(const char* fileName, DerBuffer** der); 639 #endif 640 #endif /* WOLFSSL_CERT_GEN */ 641 642 #ifdef WOLFSSL_DER_TO_PEM 643 WOLFSSL_ABI 644 WOLFSSL_API int wc_DerToPem(const byte* der, word32 derSz, byte* output, 645 word32 outSz, int type); 646 WOLFSSL_API int wc_DerToPemEx(const byte* der, word32 derSz, byte* output, 647 word32 outSz, byte *cipher_info, int type); 648 #endif 649 650 WOLFSSL_API word32 wc_PkcsPad(byte* buf, word32 sz, word32 blockSz); 651 652 #ifndef NO_RSA 653 WOLFSSL_API int wc_RsaPublicKeyDecode_ex(const byte* input, word32* inOutIdx, 654 word32 inSz, const byte** n, word32* nSz, const byte** e, word32* eSz); 655 /* For FIPS v1/v2 and selftest this is in rsa.h */ 656 #if (!defined(HAVE_SELFTEST) || \ 657 (defined(HAVE_SELFTEST) && defined(WOLFSSL_CERT_GEN) && \ 658 !defined(WOLFSSL_KEY_GEN))) && \ 659 (!defined(HAVE_FIPS) || \ 660 !defined(HAVE_FIPS_VERSION) || \ 661 ((HAVE_FIPS_VERSION > 2) && \ 662 (! ((HAVE_FIPS_VERSION == 5) && (HAVE_FIPS_VERSION_MINOR == 0))))) 663 WOLFSSL_API int wc_RsaKeyToPublicDer(RsaKey* key, byte* output, word32 inLen); 664 #endif 665 WOLFSSL_API int wc_RsaPublicKeyDerSize(RsaKey* key, int with_header); 666 WOLFSSL_API int wc_RsaKeyToPublicDer_ex(RsaKey* key, byte* output, word32 inLen, 667 int with_header); 668 669 /* For FIPS v1/v2 and selftest rsa.h is replaced. */ 670 #if defined(HAVE_SELFTEST) || (defined(HAVE_FIPS) && \ 671 (!defined(HAVE_FIPS_VERSION) || (FIPS_VERSION_LE(5,2)))) 672 WOLFSSL_API int wc_RsaPrivateKeyValidate(const byte* input, 673 word32* inOutIdx, int* keySz, word32 inSz); 674 #endif 675 #endif 676 677 #ifndef NO_DSA 678 /* DSA parameter DER helper functions */ 679 WOLFSSL_API int wc_DsaParamsDecode(const byte* input, word32* inOutIdx, DsaKey* key, 680 word32 inSz); 681 WOLFSSL_API int wc_DsaKeyToParamsDer(DsaKey* key, byte* output, 682 word32 inLen); 683 WOLFSSL_API int wc_DsaKeyToParamsDer_ex(DsaKey* key, byte* output, 684 word32* inLen); 685 #endif 686 687 #if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA) 688 WOLFSSL_LOCAL int wc_DhKeyToDer(DhKey* key, byte* output, word32* outSz, int exportPriv); 689 WOLFSSL_API int wc_DhParamsToDer(DhKey* key, byte* out, word32* outSz); 690 WOLFSSL_API int wc_DhPubKeyToDer(DhKey* key, byte* out, word32* outSz); 691 WOLFSSL_API int wc_DhPrivKeyToDer(DhKey* key, byte* out, word32* outSz); 692 #endif 693 694 #ifdef HAVE_ECC 695 /* private key helpers */ 696 WOLFSSL_ABI 697 WOLFSSL_API int wc_EccPrivateKeyDecode(const byte* input, word32* inOutIdx, 698 ecc_key* key, word32 inSz); 699 WOLFSSL_LOCAL int wc_BuildEccKeyDer(ecc_key* key, byte* output, word32 *inLen, 700 int pubIn, int curveIn); 701 WOLFSSL_ABI 702 WOLFSSL_API int wc_EccKeyToDer(ecc_key* key, byte* output, word32 inLen); 703 WOLFSSL_API int wc_EccPrivateKeyToDer(ecc_key* key, byte* output, 704 word32 inLen); 705 WOLFSSL_API int wc_EccKeyDerSize(ecc_key* key, int pub); 706 WOLFSSL_API int wc_EccPrivateKeyToPKCS8(ecc_key* key, byte* output, 707 word32* outLen); 708 WOLFSSL_API int wc_EccKeyToPKCS8(ecc_key* key, byte* output, 709 word32* outLen); 710 711 /* public key helper */ 712 WOLFSSL_ABI 713 WOLFSSL_API int wc_EccPublicKeyDecode(const byte* input, word32* inOutIdx, 714 ecc_key* key, word32 inSz); 715 WOLFSSL_ABI WOLFSSL_API int wc_EccPublicKeyToDer(ecc_key* key, byte* output, 716 word32 inLen, int with_AlgCurve); 717 WOLFSSL_API int wc_EccPublicKeyToDer_ex(ecc_key* key, byte* output, 718 word32 inLen, int with_AlgCurve, 719 int comp); 720 WOLFSSL_API int wc_EccPublicKeyDerSize(ecc_key* key, int with_AlgCurve); 721 #endif 722 723 #ifdef HAVE_ED25519 724 #ifdef HAVE_ED25519_KEY_IMPORT 725 WOLFSSL_API int wc_Ed25519PrivateKeyDecode(const byte* input, word32* inOutIdx, 726 ed25519_key* key, word32 inSz); 727 WOLFSSL_API int wc_Ed25519PublicKeyDecode(const byte* input, word32* inOutIdx, 728 ed25519_key* key, word32 inSz); 729 #endif 730 #ifdef HAVE_ED25519_KEY_EXPORT 731 WOLFSSL_API int wc_Ed25519KeyToDer(ed25519_key* key, byte* output, 732 word32 inLen); 733 WOLFSSL_API int wc_Ed25519PrivateKeyToDer(ed25519_key* key, byte* output, 734 word32 inLen); 735 WOLFSSL_API int wc_Ed25519PublicKeyToDer(ed25519_key* key, byte* output, 736 word32 inLen, int withAlg); 737 #endif 738 #endif /* HAVE_ED25519 */ 739 740 #ifdef HAVE_CURVE25519 741 #ifdef HAVE_CURVE25519_KEY_IMPORT 742 WOLFSSL_API int wc_Curve25519PrivateKeyDecode( 743 const byte* input, word32* inOutIdx, curve25519_key* key, word32 inSz); 744 WOLFSSL_API int wc_Curve25519PublicKeyDecode( 745 const byte* input, word32* inOutIdx, curve25519_key* key, word32 inSz); 746 WOLFSSL_API int wc_Curve25519KeyDecode(const byte *input, word32 *inOutIdx, 747 curve25519_key *key, word32 inSz); 748 #endif 749 #ifdef HAVE_CURVE25519_KEY_EXPORT 750 WOLFSSL_API int wc_Curve25519PrivateKeyToDer( 751 curve25519_key* key, byte* output, word32 inLen); 752 WOLFSSL_API int wc_Curve25519PublicKeyToDer( 753 curve25519_key* key, byte* output, word32 inLen, int withAlg); 754 WOLFSSL_API int wc_Curve25519KeyToDer(curve25519_key* key, byte* output, 755 word32 inLen, int withAlg); 756 #endif 757 #endif /* HAVE_CURVE25519 */ 758 759 #ifdef HAVE_ED448 760 #ifdef HAVE_ED448_KEY_IMPORT 761 WOLFSSL_API int wc_Ed448PrivateKeyDecode( 762 const byte* input, word32* inOutIdx, ed448_key* key, word32 inSz); 763 WOLFSSL_API int wc_Ed448PublicKeyDecode( 764 const byte* input, word32* inOutIdx, ed448_key* key, word32 inSz); 765 #endif 766 #ifdef HAVE_ED448_KEY_EXPORT 767 WOLFSSL_API int wc_Ed448KeyToDer(ed448_key* key, byte* output, word32 inLen); 768 WOLFSSL_API int wc_Ed448PrivateKeyToDer( 769 ed448_key* key, byte* output, word32 inLen); 770 WOLFSSL_API int wc_Ed448PublicKeyToDer( 771 ed448_key* key, byte* output, word32 inLen, int withAlg); 772 #endif 773 #endif /* HAVE_ED448 */ 774 775 #ifdef HAVE_CURVE448 776 #ifdef HAVE_CURVE448_KEY_IMPORT 777 WOLFSSL_API int wc_Curve448PrivateKeyDecode(const byte* input, word32* inOutIdx, 778 curve448_key* key, word32 inSz); 779 WOLFSSL_API int wc_Curve448PublicKeyDecode(const byte* input, word32* inOutIdx, 780 curve448_key* key, word32 inSz); 781 #endif 782 #ifdef HAVE_CURVE448_KEY_EXPORT 783 WOLFSSL_API int wc_Curve448PrivateKeyToDer(curve448_key* key, byte* output, 784 word32 inLen); 785 WOLFSSL_API int wc_Curve448PublicKeyToDer(curve448_key* key, byte* output, 786 word32 inLen, int withAlg); 787 #endif 788 #endif /* HAVE_CURVE448 */ 789 790 791 /* DER encode signature */ 792 WOLFSSL_API word32 wc_EncodeSignature(byte* out, const byte* digest, 793 word32 digSz, int hashOID); 794 WOLFSSL_API int wc_GetCTC_HashOID(int type); 795 796 WOLFSSL_API int wc_GetPkcs8TraditionalOffset(byte* input, 797 word32* inOutIdx, word32 sz); 798 WOLFSSL_API int wc_CreatePKCS8Key(byte* out, word32* outSz, 799 byte* key, word32 keySz, int algoID, const byte* curveOID, 800 word32 oidSz); 801 WOLFSSL_API int wc_EncryptPKCS8Key_ex(byte* key, word32 keySz, byte* out, 802 word32* outSz, const char* password, int passwordSz, int vPKCS, 803 int pbeOid, int encAlgId, byte* salt, word32 saltSz, int itt, 804 int hmacOid, WC_RNG* rng, void* heap); 805 WOLFSSL_API int wc_EncryptPKCS8Key(byte* key, word32 keySz, byte* out, word32* outSz, 806 const char* password, int passwordSz, int vPKCS, int pbeOid, 807 int encAlgId, byte* salt, word32 saltSz, int itt, WC_RNG* rng, 808 void* heap); 809 WOLFSSL_API int wc_DecryptPKCS8Key(byte* input, word32 sz, const char* password, 810 int passwordSz); 811 WOLFSSL_API int wc_CreateEncryptedPKCS8Key(byte* key, word32 keySz, byte* out, 812 word32* outSz, const char* password, int passwordSz, int vPKCS, 813 int pbeOid, int encAlgId, byte* salt, word32 saltSz, int itt, 814 WC_RNG* rng, void* heap); 815 816 #ifndef NO_ASN_TIME 817 /* Time */ 818 /* Returns seconds (Epoch/UTC) 819 * timePtr: is "time_t", which is typically "long" 820 * Example: 821 long lTime; 822 rc = wc_GetTime(&lTime, (word32)sizeof(lTime)); 823 */ 824 WOLFSSL_API int wc_GetTime(void* timePtr, word32 timeSize); 825 826 typedef time_t (*wc_time_cb)(time_t* t); 827 WOLFSSL_API int wc_SetTimeCb(wc_time_cb f); 828 WOLFSSL_API time_t wc_Time(time_t* t); 829 #endif 830 831 #ifdef WOLFSSL_ENCRYPTED_KEYS 832 WOLFSSL_API int wc_EncryptedInfoGet(EncryptedInfo* info, 833 const char* cipherInfo); 834 #endif 835 836 837 #ifdef WOLFSSL_CERT_PIV 838 839 typedef struct _wc_CertPIV { 840 const byte* cert; 841 word32 certSz; 842 const byte* certErrDet; 843 word32 certErrDetSz; 844 const byte* nonce; /* Identiv Only */ 845 word32 nonceSz; /* Identiv Only */ 846 const byte* signedNonce; /* Identiv Only */ 847 word32 signedNonceSz; /* Identiv Only */ 848 849 /* flags */ 850 WC_BITFIELD compression:2; 851 WC_BITFIELD isX509:1; 852 WC_BITFIELD isIdentiv:1; 853 } wc_CertPIV; 854 855 WOLFSSL_API int wc_ParseCertPIV(wc_CertPIV* cert, const byte* buf, word32 totalSz); 856 #endif /* WOLFSSL_CERT_PIV */ 857 858 /* Forward declaration needed, as DecodedCert is defined in asn.h.*/ 859 struct DecodedCert; 860 861 WOLFSSL_API void wc_InitDecodedCert( 862 struct DecodedCert* cert, const byte* source, word32 inSz, void* heap); 863 WOLFSSL_API void wc_FreeDecodedCert(struct DecodedCert* cert); 864 WOLFSSL_API int wc_ParseCert( 865 struct DecodedCert* cert, int type, int verify, void* cm); 866 867 WOLFSSL_API int wc_GetPubKeyDerFromCert(struct DecodedCert* cert, 868 byte* derKey, word32* derKeySz); 869 WOLFSSL_API int wc_GetSubjectPubKeyInfoDerFromCert(const byte* certDer, 870 word32 certDerSz, 871 byte* pubKeyDer, 872 word32* pubKeyDerSz); 873 874 #ifdef WOLFSSL_FPKI 875 WOLFSSL_API int wc_GetUUIDFromCert(struct DecodedCert* cert, 876 byte* uuid, word32* uuidSz); 877 WOLFSSL_API int wc_GetFASCNFromCert(struct DecodedCert* cert, 878 byte* fascn, word32* fascnSz); 879 #endif /* WOLFSSL_FPKI */ 880 881 #ifdef WOLFSSL_DUAL_ALG_CERTS 882 WOLFSSL_API int wc_GeneratePreTBS(struct DecodedCert* cert, byte *der, 883 int derSz); 884 #endif 885 886 #if defined(WOLFSSL_ACERT) 887 /* Forward declaration needed, as DecodedAcert is defined in asn.h.*/ 888 struct DecodedAcert; 889 WOLFSSL_API void wc_InitDecodedAcert(struct DecodedAcert* acert, 890 const byte* source, word32 inSz, 891 void* heap); 892 WOLFSSL_API void wc_FreeDecodedAcert(struct DecodedAcert * acert); 893 WOLFSSL_API int wc_ParseX509Acert(struct DecodedAcert* acert, int verify); 894 WOLFSSL_API int wc_VerifyX509Acert(const byte* acert, word32 acertSz, 895 const byte* pubKey, word32 pubKeySz, 896 int pubKeyOID, void * heap); 897 #endif /* WOLFSSL_ACERT */ 898 899 #if !defined(XFPRINTF) || defined(NO_FILESYSTEM) || \ 900 defined(NO_STDIO_FILESYSTEM) && defined(WOLFSSL_ASN_PRINT) 901 #undef WOLFSSL_ASN_PRINT 902 #endif 903 904 #ifdef WOLFSSL_ASN_PRINT 905 906 enum Asn1PrintOpt { 907 /* Offset into DER/BER data to start decoding from. */ 908 ASN1_PRINT_OPT_OFFSET, 909 /* Length of DER/BER encoding to parse. */ 910 ASN1_PRINT_OPT_LENGTH, 911 /* Number of spaces to indent for each change in depth. */ 912 ASN1_PRINT_OPT_INDENT, 913 /* Draw branches instead of indenting. */ 914 ASN1_PRINT_OPT_DRAW_BRANCH, 915 /* Show raw data of primitive types as octets. */ 916 ASN1_PRINT_OPT_SHOW_DATA, 917 /* Show header data as octets. */ 918 ASN1_PRINT_OPT_SHOW_HEADER_DATA, 919 /* Show the wolfSSL OID value for OBJECT_ID. */ 920 ASN1_PRINT_OPT_SHOW_OID, 921 /* Don't show text representations of primitive types. */ 922 ASN1_PRINT_OPT_SHOW_NO_TEXT, 923 /* Don't show dump text representations of primitive types. */ 924 ASN1_PRINT_OPT_SHOW_NO_DUMP_TEXT 925 }; 926 927 /* ASN.1 print options. */ 928 typedef struct Asn1PrintOptions { 929 /* Offset into DER/BER encoding to start parsing from. */ 930 word32 offset; 931 /* Length of DER/BER encoding to parse. */ 932 word32 length; 933 /* Number of spaces to indent for each change in depth. */ 934 word8 indent; 935 /* Draw branches instead of indenting. */ 936 WC_BITFIELD draw_branch:1; 937 /* Show raw data of primitive types as octets. */ 938 WC_BITFIELD show_data:1; 939 /* Show header data as octets. */ 940 WC_BITFIELD show_header_data:1; 941 /* Show the wolfSSL OID value for OBJECT_ID. */ 942 WC_BITFIELD show_oid:1; 943 /* Don't show text representations of primitive types. */ 944 WC_BITFIELD show_no_text:1; 945 /* Don't show dump text representations of primitive types. */ 946 WC_BITFIELD show_no_dump_text:1; 947 } Asn1PrintOptions; 948 949 /* ASN.1 item data. */ 950 typedef struct Asn1Item { 951 /* Tag of current item. */ 952 unsigned char tag; 953 /* Whether current item is constructed. */ 954 unsigned char cons; 955 /* Length of data in current ASN.1 item. */ 956 word32 len; 957 /* Index into data of ASN.1 item data. */ 958 word32 data_idx; 959 } Asn1Item; 960 961 /* Maximum supported depth of ASN.1 items. */ 962 #define ASN_MAX_DEPTH 16 963 964 typedef const char* (*Asn1OidToNameCb)(unsigned char* oid, word32 len); 965 966 /* ASN.1 parsing state. */ 967 typedef struct Asn1 { 968 /* ASN.1 item data. */ 969 Asn1Item item; 970 /* Current depth of ASN.1 item. */ 971 unsigned char depth; 972 /* End indices of ASN.1 items at different depths. */ 973 word32 end_idx[ASN_MAX_DEPTH]; 974 975 /* Buffer to print. */ 976 unsigned char* data; 977 /* Maximum number of bytes to process. */ 978 word32 max; 979 /* Starting offset of current ASN.1 item. */ 980 word32 offset; 981 /* Current offset into ASN.1 data. */ 982 word32 curr; 983 /* Next part of ASN.1 item expected. */ 984 unsigned char part; 985 986 /* File pointer to print to. */ 987 XFILE file; 988 989 /* Callback to get a name for an hex OID. */ 990 Asn1OidToNameCb nameCb; 991 } Asn1; 992 993 WOLFSSL_API int wc_Asn1PrintOptions_Init(Asn1PrintOptions* opts); 994 WOLFSSL_API int wc_Asn1PrintOptions_Set(Asn1PrintOptions* opts, 995 enum Asn1PrintOpt opt, word32 val); 996 997 WOLFSSL_API int wc_Asn1_Init(Asn1* asn1); 998 WOLFSSL_API int wc_Asn1_SetFile(Asn1* asn1, XFILE file); 999 WOLFSSL_API int wc_Asn1_SetOidToNameCb(Asn1* asn1, Asn1OidToNameCb nameCb); 1000 WOLFSSL_API int wc_Asn1_PrintAll(Asn1* asn1, Asn1PrintOptions* opts, 1001 unsigned char* data, word32 len); 1002 1003 #endif /* WOLFSSL_ASN_PRINT */ 1004 1005 #ifdef __cplusplus 1006 } /* extern "C" */ 1007 #endif 1008 1009 #endif /* WOLF_CRYPT_ASN_PUBLIC_H */