Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: HTTPClient-SSL HTTPClient HTTPClient-SSL http_access ... more
asn.h
00001 /* asn.h 00002 * 00003 * Copyright (C) 2006-2014 wolfSSL Inc. 00004 * 00005 * This file is part of CyaSSL. 00006 * 00007 * CyaSSL is free software; you can redistribute it and/or modify 00008 * it under the terms of the GNU General Public License as published by 00009 * the Free Software Foundation; either version 2 of the License, or 00010 * (at your option) any later version. 00011 * 00012 * CyaSSL is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 * GNU General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU General Public License 00018 * along with this program; if not, write to the Free Software 00019 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA 00020 */ 00021 00022 #ifndef NO_ASN 00023 00024 #ifndef CTAO_CRYPT_ASN_H 00025 #define CTAO_CRYPT_ASN_H 00026 00027 #include <cyassl/ctaocrypt/types.h> 00028 #include <cyassl/ctaocrypt/rsa.h> 00029 #include <cyassl/ctaocrypt/dh.h> 00030 #include <cyassl/ctaocrypt/dsa.h> 00031 #include <cyassl/ctaocrypt/sha.h> 00032 #include <cyassl/ctaocrypt/md5.h> 00033 #include <cyassl/ctaocrypt/asn_public.h> /* public interface */ 00034 #ifdef HAVE_ECC 00035 #include <cyassl/ctaocrypt/ecc.h> 00036 #endif 00037 00038 #ifdef __cplusplus 00039 extern "C" { 00040 #endif 00041 00042 00043 enum { 00044 ISSUER = 0, 00045 SUBJECT = 1, 00046 00047 EXTERNAL_SERIAL_SIZE = 32, 00048 00049 BEFORE = 0, 00050 AFTER = 1 00051 }; 00052 00053 /* ASN Tags */ 00054 enum ASN_Tags { 00055 ASN_BOOLEAN = 0x01, 00056 ASN_INTEGER = 0x02, 00057 ASN_BIT_STRING = 0x03, 00058 ASN_OCTET_STRING = 0x04, 00059 ASN_TAG_NULL = 0x05, 00060 ASN_OBJECT_ID = 0x06, 00061 ASN_ENUMERATED = 0x0a, 00062 ASN_UTF8STRING = 0x0c, 00063 ASN_SEQUENCE = 0x10, 00064 ASN_SET = 0x11, 00065 ASN_UTC_TIME = 0x17, 00066 ASN_OTHER_TYPE = 0x00, 00067 ASN_RFC822_TYPE = 0x01, 00068 ASN_DNS_TYPE = 0x02, 00069 ASN_DIR_TYPE = 0x04, 00070 ASN_GENERALIZED_TIME = 0x18, 00071 CRL_EXTENSIONS = 0xa0, 00072 ASN_EXTENSIONS = 0xa3, 00073 ASN_LONG_LENGTH = 0x80 00074 }; 00075 00076 enum ASN_Flags{ 00077 ASN_CONSTRUCTED = 0x20, 00078 ASN_CONTEXT_SPECIFIC = 0x80 00079 }; 00080 00081 enum DN_Tags { 00082 ASN_COMMON_NAME = 0x03, /* CN */ 00083 ASN_SUR_NAME = 0x04, /* SN */ 00084 ASN_SERIAL_NUMBER = 0x05, /* serialNumber */ 00085 ASN_COUNTRY_NAME = 0x06, /* C */ 00086 ASN_LOCALITY_NAME = 0x07, /* L */ 00087 ASN_STATE_NAME = 0x08, /* ST */ 00088 ASN_ORG_NAME = 0x0a, /* O */ 00089 ASN_ORGUNIT_NAME = 0x0b /* OU */ 00090 }; 00091 00092 enum PBES { 00093 PBE_MD5_DES = 0, 00094 PBE_SHA1_DES = 1, 00095 PBE_SHA1_DES3 = 2, 00096 PBE_SHA1_RC4_128 = 3, 00097 PBES2 = 13 /* algo ID */ 00098 }; 00099 00100 enum ENCRYPTION_TYPES { 00101 DES_TYPE = 0, 00102 DES3_TYPE = 1, 00103 RC4_TYPE = 2 00104 }; 00105 00106 enum ECC_TYPES { 00107 ECC_PREFIX_0 = 160, 00108 ECC_PREFIX_1 = 161 00109 }; 00110 00111 enum Misc_ASN { 00112 ASN_NAME_MAX = 256, 00113 MAX_SALT_SIZE = 64, /* MAX PKCS Salt length */ 00114 MAX_IV_SIZE = 64, /* MAX PKCS Iv length */ 00115 MAX_KEY_SIZE = 64, /* MAX PKCS Key length */ 00116 PKCS5 = 5, /* PKCS oid tag */ 00117 PKCS5v2 = 6, /* PKCS #5 v2.0 */ 00118 PKCS12 = 12, /* PKCS #12 */ 00119 MAX_UNICODE_SZ = 256, 00120 ASN_BOOL_SIZE = 2, /* including type */ 00121 SHA_SIZE = 20, 00122 RSA_INTS = 8, /* RSA ints in private key */ 00123 MIN_DATE_SIZE = 13, 00124 MAX_DATE_SIZE = 32, 00125 ASN_GEN_TIME_SZ = 15, /* 7 numbers * 2 + Zulu tag */ 00126 MAX_ENCODED_SIG_SZ = 512, 00127 MAX_SIG_SZ = 256, 00128 MAX_ALGO_SZ = 20, 00129 MAX_SEQ_SZ = 5, /* enum(seq | con) + length(4) */ 00130 MAX_SET_SZ = 5, /* enum(set | con) + length(4) */ 00131 MAX_OCTET_STR_SZ = 5, /* enum(set | con) + length(4) */ 00132 MAX_EXP_SZ = 5, /* enum(contextspec|con|exp) + length(4) */ 00133 MAX_PRSTR_SZ = 5, /* enum(prstr) + length(4) */ 00134 MAX_VERSION_SZ = 5, /* enum + id + version(byte) + (header(2))*/ 00135 MAX_ENCODED_DIG_SZ = 73, /* sha512 + enum(bit or octet) + legnth(4) */ 00136 MAX_RSA_INT_SZ = 517, /* RSA raw sz 4096 for bits + tag + len(4) */ 00137 MAX_NTRU_KEY_SZ = 610, /* NTRU 112 bit public key */ 00138 MAX_NTRU_ENC_SZ = 628, /* NTRU 112 bit DER public encoding */ 00139 MAX_LENGTH_SZ = 4, /* Max length size for DER encoding */ 00140 MAX_RSA_E_SZ = 16, /* Max RSA public e size */ 00141 MAX_CA_SZ = 32, /* Max encoded CA basic constraint length */ 00142 MAX_SN_SZ = 35, /* Max encoded serial number (INT) length */ 00143 #ifdef CYASSL_CERT_GEN 00144 #ifdef CYASSL_CERT_REQ 00145 /* Max encoded cert req attributes length */ 00146 MAX_ATTRIB_SZ = MAX_SEQ_SZ * 3 + (11 + MAX_SEQ_SZ) * 2 + 00147 MAX_PRSTR_SZ + CTC_NAME_SIZE, /* 11 is the OID size */ 00148 #endif 00149 #ifdef CYASSL_ALT_NAMES 00150 MAX_EXTENSIONS_SZ = 1 + MAX_LENGTH_SZ + CTC_MAX_ALT_SIZE, 00151 #else 00152 MAX_EXTENSIONS_SZ = 1 + MAX_LENGTH_SZ + MAX_CA_SZ, 00153 #endif 00154 /* Max total extensions, id + len + others */ 00155 #endif 00156 MAX_OCSP_EXT_SZ = 58, /* Max OCSP Extension length */ 00157 MAX_OCSP_NONCE_SZ = 18, /* OCSP Nonce size */ 00158 EIGHTK_BUF = 8192, /* Tmp buffer size */ 00159 MAX_PUBLIC_KEY_SZ = MAX_NTRU_ENC_SZ + MAX_ALGO_SZ + MAX_SEQ_SZ * 2 00160 /* use bigger NTRU size */ 00161 }; 00162 00163 00164 enum Oid_Types { 00165 hashType = 0, 00166 sigType = 1, 00167 keyType = 2, 00168 curveType = 3, 00169 blkType = 4 00170 }; 00171 00172 00173 enum Hash_Sum { 00174 MD2h = 646, 00175 MD5h = 649, 00176 SHAh = 88, 00177 SHA256h = 414, 00178 SHA384h = 415, 00179 SHA512h = 416 00180 }; 00181 00182 00183 enum Block_Sum { 00184 DESb = 69, 00185 DES3b = 652 00186 }; 00187 00188 00189 enum Key_Sum { 00190 DSAk = 515, 00191 RSAk = 645, 00192 NTRUk = 364, 00193 ECDSAk = 518 00194 }; 00195 00196 00197 enum Ecc_Sum { 00198 ECC_256R1 = 526, 00199 ECC_384R1 = 210, 00200 ECC_521R1 = 211, 00201 ECC_160R1 = 184, 00202 ECC_192R1 = 520, 00203 ECC_224R1 = 209 00204 }; 00205 00206 00207 enum KDF_Sum { 00208 PBKDF2_OID = 660 00209 }; 00210 00211 00212 enum Extensions_Sum { 00213 BASIC_CA_OID = 133, 00214 ALT_NAMES_OID = 131, 00215 CRL_DIST_OID = 145, 00216 AUTH_INFO_OID = 69, 00217 CA_ISSUER_OID = 117, 00218 AUTH_KEY_OID = 149, 00219 SUBJ_KEY_OID = 128, 00220 CERT_POLICY_OID = 146, 00221 KEY_USAGE_OID = 129, /* 2.5.29.15 */ 00222 INHIBIT_ANY_OID = 168, /* 2.5.29.54 */ 00223 EXT_KEY_USAGE_OID = 151, /* 2.5.29.37 */ 00224 NAME_CONS_OID = 144 /* 2.5.29.30 */ 00225 }; 00226 00227 enum CertificatePolicy_Sum { 00228 CP_ANY_OID = 146 /* id-ce 32 0 */ 00229 }; 00230 00231 enum SepHardwareName_Sum { 00232 HW_NAME_OID = 79 /* 1.3.6.1.5.5.7.8.4 from RFC 4108*/ 00233 }; 00234 00235 enum AuthInfo_Sum { 00236 AIA_OCSP_OID = 116, /* 1.3.6.1.5.5.7.48.1 */ 00237 AIA_CA_ISSUER_OID = 117 /* 1.3.6.1.5.5.7.48.2 */ 00238 }; 00239 00240 enum ExtKeyUsage_Sum { /* From RFC 5280 */ 00241 EKU_ANY_OID = 151, /* 2.5.29.37.0, anyExtendedKeyUsage */ 00242 EKU_SERVER_AUTH_OID = 71, /* 1.3.6.1.5.5.7.3.1, id-kp-serverAuth */ 00243 EKU_CLIENT_AUTH_OID = 72, /* 1.3.6.1.5.5.7.3.2, id-kp-clientAuth */ 00244 EKU_OCSP_SIGN_OID = 79, /* 1.3.6.1.5.5.7.3.9, OCSPSigning */ 00245 }; 00246 00247 00248 enum VerifyType { 00249 NO_VERIFY = 0, 00250 VERIFY = 1 00251 }; 00252 00253 00254 /* Key usage extension bits */ 00255 #define KEYUSE_DIGITAL_SIG 0x0100 00256 #define KEYUSE_CONTENT_COMMIT 0x0080 00257 #define KEYUSE_KEY_ENCIPHER 0x0040 00258 #define KEYUSE_DATA_ENCIPHER 0x0020 00259 #define KEYUSE_KEY_AGREE 0x0010 00260 #define KEYUSE_KEY_CERT_SIGN 0x0008 00261 #define KEYUSE_CRL_SIGN 0x0004 00262 #define KEYUSE_ENCIPHER_ONLY 0x0002 00263 #define KEYUSE_DECIPHER_ONLY 0x0001 00264 00265 #define EXTKEYUSE_ANY 0x08 00266 #define EXTKEYUSE_OCSP_SIGN 0x04 00267 #define EXTKEYUSE_CLIENT_AUTH 0x02 00268 #define EXTKEYUSE_SERVER_AUTH 0x01 00269 00270 typedef struct DNS_entry DNS_entry; 00271 00272 struct DNS_entry { 00273 DNS_entry* next; /* next on DNS list */ 00274 char* name; /* actual DNS name */ 00275 }; 00276 00277 00278 typedef struct Base_entry Base_entry; 00279 00280 struct Base_entry { 00281 Base_entry* next; /* next on name base list */ 00282 char* name; /* actual name base */ 00283 int nameSz; /* name length */ 00284 byte type; /* Name base type (DNS or RFC822) */ 00285 }; 00286 00287 00288 struct DecodedName { 00289 char* fullName; 00290 int fullNameLen; 00291 int entryCount; 00292 int cnIdx; 00293 int cnLen; 00294 int snIdx; 00295 int snLen; 00296 int cIdx; 00297 int cLen; 00298 int lIdx; 00299 int lLen; 00300 int stIdx; 00301 int stLen; 00302 int oIdx; 00303 int oLen; 00304 int ouIdx; 00305 int ouLen; 00306 int emailIdx; 00307 int emailLen; 00308 int uidIdx; 00309 int uidLen; 00310 int serialIdx; 00311 int serialLen; 00312 }; 00313 00314 00315 typedef struct DecodedCert DecodedCert; 00316 typedef struct DecodedName DecodedName; 00317 typedef struct Signer Signer; 00318 00319 00320 struct DecodedCert { 00321 byte* publicKey; 00322 word32 pubKeySize; 00323 int pubKeyStored; 00324 word32 certBegin; /* offset to start of cert */ 00325 word32 sigIndex; /* offset to start of signature */ 00326 word32 sigLength; /* length of signature */ 00327 word32 signatureOID; /* sum of algorithm object id */ 00328 word32 keyOID; /* sum of key algo object id */ 00329 int version; /* cert version, 1 or 3 */ 00330 DNS_entry* altNames; /* alt names list of dns entries */ 00331 #ifndef IGNORE_NAME_CONSTRAINTS 00332 DNS_entry* altEmailNames; /* alt names list of RFC822 entries */ 00333 Base_entry* permittedNames; /* Permitted name bases */ 00334 Base_entry* excludedNames; /* Excluded name bases */ 00335 #endif /* IGNORE_NAME_CONSTRAINTS */ 00336 byte subjectHash[SHA_SIZE]; /* hash of all Names */ 00337 byte issuerHash[SHA_SIZE]; /* hash of all Names */ 00338 #ifdef HAVE_OCSP 00339 byte issuerKeyHash[SHA_SIZE]; /* hash of the public Key */ 00340 #endif /* HAVE_OCSP */ 00341 byte* signature; /* not owned, points into raw cert */ 00342 char* subjectCN; /* CommonName */ 00343 int subjectCNLen; 00344 int subjectCNStored; /* have we saved a copy we own */ 00345 char issuer[ASN_NAME_MAX]; /* full name including common name */ 00346 char subject[ASN_NAME_MAX]; /* full name including common name */ 00347 int verify; /* Default to yes, but could be off */ 00348 byte* source; /* byte buffer holder cert, NOT owner */ 00349 word32 srcIdx; /* current offset into buffer */ 00350 word32 maxIdx; /* max offset based on init size */ 00351 void* heap; /* for user memory overrides */ 00352 byte serial[EXTERNAL_SERIAL_SIZE]; /* raw serial number */ 00353 int serialSz; /* raw serial bytes stored */ 00354 byte* extensions; /* not owned, points into raw cert */ 00355 int extensionsSz; /* length of cert extensions */ 00356 word32 extensionsIdx; /* if want to go back and parse later */ 00357 byte* extAuthInfo; /* Authority Information Access URI */ 00358 int extAuthInfoSz; /* length of the URI */ 00359 byte* extCrlInfo; /* CRL Distribution Points */ 00360 int extCrlInfoSz; /* length of the URI */ 00361 byte extSubjKeyId[SHA_SIZE]; /* Subject Key ID */ 00362 byte extSubjKeyIdSet; /* Set when the SKID was read from cert */ 00363 byte extAuthKeyId[SHA_SIZE]; /* Authority Key ID */ 00364 byte extAuthKeyIdSet; /* Set when the AKID was read from cert */ 00365 #ifndef IGNORE_NAME_CONSTRAINTS 00366 byte extNameConstraintSet; 00367 #endif /* IGNORE_NAME_CONSTRAINTS */ 00368 byte isCA; /* CA basic constraint true */ 00369 byte extKeyUsageSet; 00370 word16 extKeyUsage; /* Key usage bitfield */ 00371 byte extExtKeyUsageSet; /* Extended Key Usage */ 00372 byte extExtKeyUsage; /* Extended Key usage bitfield */ 00373 #ifdef OPENSSL_EXTRA 00374 byte extBasicConstSet; 00375 byte extBasicConstCrit; 00376 byte extBasicConstPlSet; 00377 word32 pathLength; /* CA basic constraint path length, opt */ 00378 byte extSubjAltNameSet; 00379 byte extSubjAltNameCrit; 00380 byte extAuthKeyIdCrit; 00381 #ifndef IGNORE_NAME_CONSTRAINTS 00382 byte extNameConstraintCrit; 00383 #endif /* IGNORE_NAME_CONSTRAINTS */ 00384 byte extSubjKeyIdCrit; 00385 byte extKeyUsageCrit; 00386 byte extExtKeyUsageCrit; 00387 byte* extExtKeyUsageSrc; 00388 word32 extExtKeyUsageSz; 00389 word32 extExtKeyUsageCount; 00390 byte* extAuthKeyIdSrc; 00391 word32 extAuthKeyIdSz; 00392 byte* extSubjKeyIdSrc; 00393 word32 extSubjKeyIdSz; 00394 #endif 00395 #ifdef HAVE_ECC 00396 word32 pkCurveOID; /* Public Key's curve OID */ 00397 #endif /* HAVE_ECC */ 00398 byte* beforeDate; 00399 int beforeDateLen; 00400 byte* afterDate; 00401 int afterDateLen; 00402 #ifdef HAVE_PKCS7 00403 byte* issuerRaw; /* pointer to issuer inside source */ 00404 int issuerRawLen; 00405 #endif 00406 #ifndef IGNORE_NAME_CONSTRAINT 00407 byte* subjectRaw; /* pointer to subject inside source */ 00408 int subjectRawLen; 00409 #endif 00410 #if defined(CYASSL_CERT_GEN) 00411 /* easy access to subject info for other sign */ 00412 char* subjectSN; 00413 int subjectSNLen; 00414 char* subjectC; 00415 int subjectCLen; 00416 char* subjectL; 00417 int subjectLLen; 00418 char* subjectST; 00419 int subjectSTLen; 00420 char* subjectO; 00421 int subjectOLen; 00422 char* subjectOU; 00423 int subjectOULen; 00424 char* subjectEmail; 00425 int subjectEmailLen; 00426 #endif /* CYASSL_CERT_GEN */ 00427 #ifdef OPENSSL_EXTRA 00428 DecodedName issuerName; 00429 DecodedName subjectName; 00430 #endif /* OPENSSL_EXTRA */ 00431 #ifdef CYASSL_SEP 00432 int deviceTypeSz; 00433 byte* deviceType; 00434 int hwTypeSz; 00435 byte* hwType; 00436 int hwSerialNumSz; 00437 byte* hwSerialNum; 00438 #ifdef OPENSSL_EXTRA 00439 byte extCertPolicySet; 00440 byte extCertPolicyCrit; 00441 #endif /* OPENSSL_EXTRA */ 00442 #endif /* CYASSL_SEP */ 00443 }; 00444 00445 00446 #ifdef SHA_DIGEST_SIZE 00447 #define SIGNER_DIGEST_SIZE SHA_DIGEST_SIZE 00448 #else 00449 #define SIGNER_DIGEST_SIZE 20 00450 #endif 00451 00452 /* CA Signers */ 00453 /* if change layout change PERSIST_CERT_CACHE functions too */ 00454 struct Signer { 00455 word32 pubKeySize; 00456 word32 keyOID; /* key type */ 00457 word16 keyUsage; 00458 byte* publicKey; 00459 int nameLen; 00460 char* name; /* common name */ 00461 #ifndef IGNORE_NAME_CONSTRAINTS 00462 Base_entry* permittedNames; 00463 Base_entry* excludedNames; 00464 #endif /* IGNORE_NAME_CONSTRAINTS */ 00465 byte subjectNameHash[SIGNER_DIGEST_SIZE]; 00466 /* sha hash of names in certificate */ 00467 #ifndef NO_SKID 00468 byte subjectKeyIdHash[SIGNER_DIGEST_SIZE]; 00469 /* sha hash of names in certificate */ 00470 #endif 00471 Signer* next; 00472 }; 00473 00474 00475 /* not for public consumption but may use for testing sometimes */ 00476 #ifdef CYASSL_TEST_CERT 00477 #define CYASSL_TEST_API CYASSL_API 00478 #else 00479 #define CYASSL_TEST_API CYASSL_LOCAL 00480 #endif 00481 00482 CYASSL_TEST_API void FreeAltNames(DNS_entry*, void*); 00483 #ifndef IGNORE_NAME_CONSTRAINTS 00484 CYASSL_TEST_API void FreeNameSubtrees(Base_entry*, void*); 00485 #endif /* IGNORE_NAME_CONSTRAINTS */ 00486 CYASSL_TEST_API void InitDecodedCert(DecodedCert*, byte*, word32, void*); 00487 CYASSL_TEST_API void FreeDecodedCert(DecodedCert*); 00488 CYASSL_TEST_API int ParseCert(DecodedCert*, int type, int verify, void* cm); 00489 00490 CYASSL_LOCAL int ParseCertRelative(DecodedCert*, int type, int verify,void* cm); 00491 CYASSL_LOCAL int DecodeToKey(DecodedCert*, int verify); 00492 00493 CYASSL_LOCAL word32 EncodeSignature(byte* out, const byte* digest, word32 digSz, 00494 int hashOID); 00495 00496 CYASSL_LOCAL Signer* MakeSigner(void*); 00497 CYASSL_LOCAL void FreeSigner(Signer*, void*); 00498 CYASSL_LOCAL void FreeSignerTable(Signer**, int, void*); 00499 00500 00501 CYASSL_LOCAL int ToTraditional(byte* buffer, word32 length); 00502 CYASSL_LOCAL int ToTraditionalEnc(byte* buffer, word32 length,const char*, int); 00503 00504 CYASSL_LOCAL int ValidateDate(const byte* date, byte format, int dateType); 00505 00506 /* ASN.1 helper functions */ 00507 CYASSL_LOCAL int GetLength(const byte* input, word32* inOutIdx, int* len, 00508 word32 maxIdx); 00509 CYASSL_LOCAL int GetSequence(const byte* input, word32* inOutIdx, int* len, 00510 word32 maxIdx); 00511 CYASSL_LOCAL int GetSet(const byte* input, word32* inOutIdx, int* len, 00512 word32 maxIdx); 00513 CYASSL_LOCAL int GetMyVersion(const byte* input, word32* inOutIdx, 00514 int* version); 00515 CYASSL_LOCAL int GetInt(mp_int* mpi, const byte* input, word32* inOutIdx, 00516 word32 maxIdx); 00517 CYASSL_LOCAL int GetAlgoId(const byte* input, word32* inOutIdx, word32* oid, 00518 word32 maxIdx); 00519 CYASSL_LOCAL word32 SetLength(word32 length, byte* output); 00520 CYASSL_LOCAL word32 SetSequence(word32 len, byte* output); 00521 CYASSL_LOCAL word32 SetOctetString(word32 len, byte* output); 00522 CYASSL_LOCAL word32 SetImplicit(byte tag, byte number, word32 len,byte* output); 00523 CYASSL_LOCAL word32 SetExplicit(byte number, word32 len, byte* output); 00524 CYASSL_LOCAL word32 SetSet(word32 len, byte* output); 00525 CYASSL_LOCAL word32 SetAlgoID(int algoOID, byte* output, int type, int curveSz); 00526 CYASSL_LOCAL int SetMyVersion(word32 version, byte* output, int header); 00527 CYASSL_LOCAL int SetSerialNumber(const byte* sn, word32 snSz, byte* output); 00528 CYASSL_LOCAL int GetNameHash(const byte* source, word32* idx, byte* hash, 00529 int maxIdx); 00530 00531 #ifdef HAVE_ECC 00532 /* ASN sig helpers */ 00533 CYASSL_LOCAL int StoreECC_DSA_Sig(byte* out, word32* outLen, mp_int* r, 00534 mp_int* s); 00535 CYASSL_LOCAL int DecodeECC_DSA_Sig(const byte* sig, word32 sigLen, 00536 mp_int* r, mp_int* s); 00537 #endif 00538 00539 #ifdef CYASSL_CERT_GEN 00540 00541 enum cert_enums { 00542 NAME_ENTRIES = 8, 00543 JOINT_LEN = 2, 00544 EMAIL_JOINT_LEN = 9, 00545 RSA_KEY = 10, 00546 NTRU_KEY = 11, 00547 ECC_KEY = 12 00548 }; 00549 00550 00551 #endif /* CYASSL_CERT_GEN */ 00552 00553 00554 00555 /* for pointer use */ 00556 typedef struct CertStatus CertStatus; 00557 00558 #ifdef HAVE_OCSP 00559 00560 enum Ocsp_Response_Status { 00561 OCSP_SUCCESSFUL = 0, /* Response has valid confirmations */ 00562 OCSP_MALFORMED_REQUEST = 1, /* Illegal confirmation request */ 00563 OCSP_INTERNAL_ERROR = 2, /* Internal error in issuer */ 00564 OCSP_TRY_LATER = 3, /* Try again later */ 00565 OCSP_SIG_REQUIRED = 5, /* Must sign the request (4 is skipped) */ 00566 OCSP_UNAUTHROIZED = 6 /* Request unauthorized */ 00567 }; 00568 00569 00570 enum Ocsp_Cert_Status { 00571 CERT_GOOD = 0, 00572 CERT_REVOKED = 1, 00573 CERT_UNKNOWN = 2 00574 }; 00575 00576 00577 enum Ocsp_Sums { 00578 OCSP_BASIC_OID = 117, 00579 OCSP_NONCE_OID = 118 00580 }; 00581 00582 00583 typedef struct OcspRequest OcspRequest; 00584 typedef struct OcspResponse OcspResponse; 00585 00586 00587 struct CertStatus { 00588 CertStatus* next; 00589 00590 byte serial[EXTERNAL_SERIAL_SIZE]; 00591 int serialSz; 00592 00593 int status; 00594 00595 byte thisDate[MAX_DATE_SIZE]; 00596 byte nextDate[MAX_DATE_SIZE]; 00597 byte thisDateFormat; 00598 byte nextDateFormat; 00599 }; 00600 00601 00602 struct OcspResponse { 00603 int responseStatus; /* return code from Responder */ 00604 00605 byte* response; /* Pointer to beginning of OCSP Response */ 00606 word32 responseSz; /* length of the OCSP Response */ 00607 00608 byte producedDate[MAX_DATE_SIZE]; 00609 /* Date at which this response was signed */ 00610 byte producedDateFormat; /* format of the producedDate */ 00611 byte* issuerHash; 00612 byte* issuerKeyHash; 00613 00614 byte* cert; 00615 word32 certSz; 00616 00617 byte* sig; /* Pointer to sig in source */ 00618 word32 sigSz; /* Length in octets for the sig */ 00619 word32 sigOID; /* OID for hash used for sig */ 00620 00621 CertStatus* status; /* certificate status to fill out */ 00622 00623 byte* nonce; /* pointer to nonce inside ASN.1 response */ 00624 int nonceSz; /* length of the nonce string */ 00625 00626 byte* source; /* pointer to source buffer, not owned */ 00627 word32 maxIdx; /* max offset based on init size */ 00628 }; 00629 00630 00631 struct OcspRequest { 00632 DecodedCert* cert; 00633 00634 byte useNonce; 00635 byte nonce[MAX_OCSP_NONCE_SZ]; 00636 int nonceSz; 00637 00638 byte* issuerHash; /* pointer to issuerHash in source cert */ 00639 byte* issuerKeyHash; /* pointer to issuerKeyHash in source cert */ 00640 byte* serial; /* pointer to serial number in source cert */ 00641 int serialSz; /* length of the serial number */ 00642 00643 byte* dest; /* pointer to the destination ASN.1 buffer */ 00644 word32 destSz; /* length of the destination buffer */ 00645 }; 00646 00647 00648 CYASSL_LOCAL void InitOcspResponse(OcspResponse*, CertStatus*, byte*, word32); 00649 CYASSL_LOCAL int OcspResponseDecode(OcspResponse*); 00650 00651 CYASSL_LOCAL void InitOcspRequest(OcspRequest*, DecodedCert*, 00652 byte, byte*, word32); 00653 CYASSL_LOCAL int EncodeOcspRequest(OcspRequest*); 00654 00655 CYASSL_LOCAL int CompareOcspReqResp(OcspRequest*, OcspResponse*); 00656 00657 00658 #endif /* HAVE_OCSP */ 00659 00660 00661 /* for pointer use */ 00662 typedef struct RevokedCert RevokedCert; 00663 00664 #ifdef HAVE_CRL 00665 00666 struct RevokedCert { 00667 byte serialNumber[EXTERNAL_SERIAL_SIZE]; 00668 int serialSz; 00669 RevokedCert* next; 00670 }; 00671 00672 typedef struct DecodedCRL DecodedCRL; 00673 00674 struct DecodedCRL { 00675 word32 certBegin; /* offset to start of cert */ 00676 word32 sigIndex; /* offset to start of signature */ 00677 word32 sigLength; /* length of signature */ 00678 word32 signatureOID; /* sum of algorithm object id */ 00679 byte* signature; /* pointer into raw source, not owned */ 00680 byte issuerHash[SHA_DIGEST_SIZE]; /* issuer hash */ 00681 byte crlHash[SHA_DIGEST_SIZE]; /* raw crl data hash */ 00682 byte lastDate[MAX_DATE_SIZE]; /* last date updated */ 00683 byte nextDate[MAX_DATE_SIZE]; /* next update date */ 00684 byte lastDateFormat; /* format of last date */ 00685 byte nextDateFormat; /* format of next date */ 00686 RevokedCert* certs; /* revoked cert list */ 00687 int totalCerts; /* number on list */ 00688 }; 00689 00690 CYASSL_LOCAL void InitDecodedCRL(DecodedCRL*); 00691 CYASSL_LOCAL int ParseCRL(DecodedCRL*, const byte* buff, word32 sz, void* cm); 00692 CYASSL_LOCAL void FreeDecodedCRL(DecodedCRL*); 00693 00694 00695 #endif /* HAVE_CRL */ 00696 00697 00698 #ifdef __cplusplus 00699 } /* extern "C" */ 00700 #endif 00701 00702 #endif /* CTAO_CRYPT_ASN_H */ 00703 00704 #endif /* !NO_ASN */ 00705
Generated on Wed Jul 13 2022 02:18:39 by
 1.7.2
 1.7.2 
    