fork of cyassl-lib

Dependents:   TLS_cyassl TLS_cyassl

Committer:
ashleymills
Date:
Thu Sep 05 10:33:04 2013 +0000
Revision:
0:714293de3836
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ashleymills 0:714293de3836 1 /* asn.h
ashleymills 0:714293de3836 2 *
ashleymills 0:714293de3836 3 * Copyright (C) 2006-2013 wolfSSL Inc.
ashleymills 0:714293de3836 4 *
ashleymills 0:714293de3836 5 * This file is part of CyaSSL.
ashleymills 0:714293de3836 6 *
ashleymills 0:714293de3836 7 * CyaSSL is free software; you can redistribute it and/or modify
ashleymills 0:714293de3836 8 * it under the terms of the GNU General Public License as published by
ashleymills 0:714293de3836 9 * the Free Software Foundation; either version 2 of the License, or
ashleymills 0:714293de3836 10 * (at your option) any later version.
ashleymills 0:714293de3836 11 *
ashleymills 0:714293de3836 12 * CyaSSL is distributed in the hope that it will be useful,
ashleymills 0:714293de3836 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ashleymills 0:714293de3836 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ashleymills 0:714293de3836 15 * GNU General Public License for more details.
ashleymills 0:714293de3836 16 *
ashleymills 0:714293de3836 17 * You should have received a copy of the GNU General Public License
ashleymills 0:714293de3836 18 * along with this program; if not, write to the Free Software
ashleymills 0:714293de3836 19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
ashleymills 0:714293de3836 20 */
ashleymills 0:714293de3836 21
ashleymills 0:714293de3836 22 #ifndef NO_ASN
ashleymills 0:714293de3836 23
ashleymills 0:714293de3836 24 #ifndef CTAO_CRYPT_ASN_H
ashleymills 0:714293de3836 25 #define CTAO_CRYPT_ASN_H
ashleymills 0:714293de3836 26
ashleymills 0:714293de3836 27 #include <cyassl/ctaocrypt/types.h>
ashleymills 0:714293de3836 28 #include <cyassl/ctaocrypt/rsa.h>
ashleymills 0:714293de3836 29 #include <cyassl/ctaocrypt/dh.h>
ashleymills 0:714293de3836 30 #include <cyassl/ctaocrypt/dsa.h>
ashleymills 0:714293de3836 31 #include <cyassl/ctaocrypt/sha.h>
ashleymills 0:714293de3836 32 #include <cyassl/ctaocrypt/md5.h>
ashleymills 0:714293de3836 33 #include <cyassl/ctaocrypt/asn_public.h> /* public interface */
ashleymills 0:714293de3836 34 #ifdef HAVE_ECC
ashleymills 0:714293de3836 35 #include <cyassl/ctaocrypt/ecc.h>
ashleymills 0:714293de3836 36 #endif
ashleymills 0:714293de3836 37
ashleymills 0:714293de3836 38 #ifdef __cplusplus
ashleymills 0:714293de3836 39 extern "C" {
ashleymills 0:714293de3836 40 #endif
ashleymills 0:714293de3836 41
ashleymills 0:714293de3836 42
ashleymills 0:714293de3836 43 enum {
ashleymills 0:714293de3836 44 ISSUER = 0,
ashleymills 0:714293de3836 45 SUBJECT = 1,
ashleymills 0:714293de3836 46
ashleymills 0:714293de3836 47 EXTERNAL_SERIAL_SIZE = 32,
ashleymills 0:714293de3836 48
ashleymills 0:714293de3836 49 BEFORE = 0,
ashleymills 0:714293de3836 50 AFTER = 1
ashleymills 0:714293de3836 51 };
ashleymills 0:714293de3836 52
ashleymills 0:714293de3836 53 /* ASN Tags */
ashleymills 0:714293de3836 54 enum ASN_Tags {
ashleymills 0:714293de3836 55 ASN_BOOLEAN = 0x01,
ashleymills 0:714293de3836 56 ASN_INTEGER = 0x02,
ashleymills 0:714293de3836 57 ASN_BIT_STRING = 0x03,
ashleymills 0:714293de3836 58 ASN_OCTET_STRING = 0x04,
ashleymills 0:714293de3836 59 ASN_TAG_NULL = 0x05,
ashleymills 0:714293de3836 60 ASN_OBJECT_ID = 0x06,
ashleymills 0:714293de3836 61 ASN_ENUMERATED = 0x0a,
ashleymills 0:714293de3836 62 ASN_SEQUENCE = 0x10,
ashleymills 0:714293de3836 63 ASN_SET = 0x11,
ashleymills 0:714293de3836 64 ASN_UTC_TIME = 0x17,
ashleymills 0:714293de3836 65 ASN_DNS_TYPE = 0x02,
ashleymills 0:714293de3836 66 ASN_GENERALIZED_TIME = 0x18,
ashleymills 0:714293de3836 67 CRL_EXTENSIONS = 0xa0,
ashleymills 0:714293de3836 68 ASN_EXTENSIONS = 0xa3,
ashleymills 0:714293de3836 69 ASN_LONG_LENGTH = 0x80
ashleymills 0:714293de3836 70 };
ashleymills 0:714293de3836 71
ashleymills 0:714293de3836 72 enum ASN_Flags{
ashleymills 0:714293de3836 73 ASN_CONSTRUCTED = 0x20,
ashleymills 0:714293de3836 74 ASN_CONTEXT_SPECIFIC = 0x80
ashleymills 0:714293de3836 75 };
ashleymills 0:714293de3836 76
ashleymills 0:714293de3836 77 enum DN_Tags {
ashleymills 0:714293de3836 78 ASN_COMMON_NAME = 0x03, /* CN */
ashleymills 0:714293de3836 79 ASN_SUR_NAME = 0x04, /* SN */
ashleymills 0:714293de3836 80 ASN_COUNTRY_NAME = 0x06, /* C */
ashleymills 0:714293de3836 81 ASN_LOCALITY_NAME = 0x07, /* L */
ashleymills 0:714293de3836 82 ASN_STATE_NAME = 0x08, /* ST */
ashleymills 0:714293de3836 83 ASN_ORG_NAME = 0x0a, /* O */
ashleymills 0:714293de3836 84 ASN_ORGUNIT_NAME = 0x0b /* OU */
ashleymills 0:714293de3836 85 };
ashleymills 0:714293de3836 86
ashleymills 0:714293de3836 87 enum PBES {
ashleymills 0:714293de3836 88 PBE_MD5_DES = 0,
ashleymills 0:714293de3836 89 PBE_SHA1_DES = 1,
ashleymills 0:714293de3836 90 PBE_SHA1_DES3 = 2,
ashleymills 0:714293de3836 91 PBE_SHA1_RC4_128 = 3,
ashleymills 0:714293de3836 92 PBES2 = 13 /* algo ID */
ashleymills 0:714293de3836 93 };
ashleymills 0:714293de3836 94
ashleymills 0:714293de3836 95 enum ENCRYPTION_TYPES {
ashleymills 0:714293de3836 96 DES_TYPE = 0,
ashleymills 0:714293de3836 97 DES3_TYPE = 1,
ashleymills 0:714293de3836 98 RC4_TYPE = 2
ashleymills 0:714293de3836 99 };
ashleymills 0:714293de3836 100
ashleymills 0:714293de3836 101 enum ECC_TYPES {
ashleymills 0:714293de3836 102 ECC_PREFIX_0 = 160,
ashleymills 0:714293de3836 103 ECC_PREFIX_1 = 161
ashleymills 0:714293de3836 104 };
ashleymills 0:714293de3836 105
ashleymills 0:714293de3836 106 enum Misc_ASN {
ashleymills 0:714293de3836 107 ASN_NAME_MAX = 256,
ashleymills 0:714293de3836 108 MAX_SALT_SIZE = 64, /* MAX PKCS Salt length */
ashleymills 0:714293de3836 109 MAX_IV_SIZE = 64, /* MAX PKCS Iv length */
ashleymills 0:714293de3836 110 MAX_KEY_SIZE = 64, /* MAX PKCS Key length */
ashleymills 0:714293de3836 111 PKCS5 = 5, /* PKCS oid tag */
ashleymills 0:714293de3836 112 PKCS5v2 = 6, /* PKCS #5 v2.0 */
ashleymills 0:714293de3836 113 PKCS12 = 12, /* PKCS #12 */
ashleymills 0:714293de3836 114 MAX_UNICODE_SZ = 256,
ashleymills 0:714293de3836 115 ASN_BOOL_SIZE = 2, /* including type */
ashleymills 0:714293de3836 116 SHA_SIZE = 20,
ashleymills 0:714293de3836 117 RSA_INTS = 8, /* RSA ints in private key */
ashleymills 0:714293de3836 118 MIN_DATE_SIZE = 13,
ashleymills 0:714293de3836 119 MAX_DATE_SIZE = 32,
ashleymills 0:714293de3836 120 ASN_GEN_TIME_SZ = 15, /* 7 numbers * 2 + Zulu tag */
ashleymills 0:714293de3836 121 MAX_ENCODED_SIG_SZ = 512,
ashleymills 0:714293de3836 122 MAX_SIG_SZ = 256,
ashleymills 0:714293de3836 123 MAX_ALGO_SZ = 20,
ashleymills 0:714293de3836 124 MAX_SEQ_SZ = 5, /* enum(seq | con) + length(4) */
ashleymills 0:714293de3836 125 MAX_SET_SZ = 5, /* enum(set | con) + length(4) */
ashleymills 0:714293de3836 126 MAX_VERSION_SZ = 5, /* enum + id + version(byte) + (header(2))*/
ashleymills 0:714293de3836 127 MAX_ENCODED_DIG_SZ = 73, /* sha512 + enum(bit or octet) + legnth(4) */
ashleymills 0:714293de3836 128 MAX_RSA_INT_SZ = 517, /* RSA raw sz 4096 for bits + tag + len(4) */
ashleymills 0:714293de3836 129 MAX_NTRU_KEY_SZ = 610, /* NTRU 112 bit public key */
ashleymills 0:714293de3836 130 MAX_NTRU_ENC_SZ = 628, /* NTRU 112 bit DER public encoding */
ashleymills 0:714293de3836 131 MAX_LENGTH_SZ = 4, /* Max length size for DER encoding */
ashleymills 0:714293de3836 132 MAX_RSA_E_SZ = 16, /* Max RSA public e size */
ashleymills 0:714293de3836 133 MAX_CA_SZ = 32, /* Max encoded CA basic constraint length */
ashleymills 0:714293de3836 134 MAX_SN_SZ = 35, /* Max encoded serial number (INT) length */
ashleymills 0:714293de3836 135 #ifdef CYASSL_CERT_GEN
ashleymills 0:714293de3836 136 #ifdef CYASSL_ALT_NAMES
ashleymills 0:714293de3836 137 MAX_EXTENSIONS_SZ = 1 + MAX_LENGTH_SZ + CTC_MAX_ALT_SIZE,
ashleymills 0:714293de3836 138 #else
ashleymills 0:714293de3836 139 MAX_EXTENSIONS_SZ = 1 + MAX_LENGTH_SZ + MAX_CA_SZ,
ashleymills 0:714293de3836 140 #endif
ashleymills 0:714293de3836 141 /* Max total extensions, id + len + others */
ashleymills 0:714293de3836 142 #endif
ashleymills 0:714293de3836 143 MAX_OCSP_EXT_SZ = 58, /* Max OCSP Extension length */
ashleymills 0:714293de3836 144 MAX_OCSP_NONCE_SZ = 18, /* OCSP Nonce size */
ashleymills 0:714293de3836 145 EIGHTK_BUF = 8192, /* Tmp buffer size */
ashleymills 0:714293de3836 146 MAX_PUBLIC_KEY_SZ = MAX_NTRU_ENC_SZ + MAX_ALGO_SZ + MAX_SEQ_SZ * 2
ashleymills 0:714293de3836 147 /* use bigger NTRU size */
ashleymills 0:714293de3836 148 };
ashleymills 0:714293de3836 149
ashleymills 0:714293de3836 150
ashleymills 0:714293de3836 151 enum Oid_Types {
ashleymills 0:714293de3836 152 hashType = 0,
ashleymills 0:714293de3836 153 sigType = 1,
ashleymills 0:714293de3836 154 keyType = 2
ashleymills 0:714293de3836 155 };
ashleymills 0:714293de3836 156
ashleymills 0:714293de3836 157
ashleymills 0:714293de3836 158 enum Hash_Sum {
ashleymills 0:714293de3836 159 MD2h = 646,
ashleymills 0:714293de3836 160 MD5h = 649,
ashleymills 0:714293de3836 161 SHAh = 88,
ashleymills 0:714293de3836 162 SHA256h = 414,
ashleymills 0:714293de3836 163 SHA384h = 415,
ashleymills 0:714293de3836 164 SHA512h = 416
ashleymills 0:714293de3836 165 };
ashleymills 0:714293de3836 166
ashleymills 0:714293de3836 167
ashleymills 0:714293de3836 168 enum Key_Sum {
ashleymills 0:714293de3836 169 DSAk = 515,
ashleymills 0:714293de3836 170 RSAk = 645,
ashleymills 0:714293de3836 171 NTRUk = 364,
ashleymills 0:714293de3836 172 ECDSAk = 518
ashleymills 0:714293de3836 173 };
ashleymills 0:714293de3836 174
ashleymills 0:714293de3836 175
ashleymills 0:714293de3836 176 enum Ecc_Sum {
ashleymills 0:714293de3836 177 ECC_256R1 = 526,
ashleymills 0:714293de3836 178 ECC_384R1 = 210,
ashleymills 0:714293de3836 179 ECC_521R1 = 211,
ashleymills 0:714293de3836 180 ECC_160R1 = 184,
ashleymills 0:714293de3836 181 ECC_192R1 = 520,
ashleymills 0:714293de3836 182 ECC_224R1 = 209
ashleymills 0:714293de3836 183 };
ashleymills 0:714293de3836 184
ashleymills 0:714293de3836 185
ashleymills 0:714293de3836 186 enum KDF_Sum {
ashleymills 0:714293de3836 187 PBKDF2_OID = 660
ashleymills 0:714293de3836 188 };
ashleymills 0:714293de3836 189
ashleymills 0:714293de3836 190
ashleymills 0:714293de3836 191 enum Extensions_Sum {
ashleymills 0:714293de3836 192 BASIC_CA_OID = 133,
ashleymills 0:714293de3836 193 ALT_NAMES_OID = 131,
ashleymills 0:714293de3836 194 CRL_DIST_OID = 145,
ashleymills 0:714293de3836 195 AUTH_INFO_OID = 69,
ashleymills 0:714293de3836 196 CA_ISSUER_OID = 117,
ashleymills 0:714293de3836 197 AUTH_KEY_OID = 149,
ashleymills 0:714293de3836 198 SUBJ_KEY_OID = 128
ashleymills 0:714293de3836 199 };
ashleymills 0:714293de3836 200
ashleymills 0:714293de3836 201
ashleymills 0:714293de3836 202 enum VerifyType {
ashleymills 0:714293de3836 203 NO_VERIFY = 0,
ashleymills 0:714293de3836 204 VERIFY = 1
ashleymills 0:714293de3836 205 };
ashleymills 0:714293de3836 206
ashleymills 0:714293de3836 207
ashleymills 0:714293de3836 208 typedef struct DNS_entry DNS_entry;
ashleymills 0:714293de3836 209
ashleymills 0:714293de3836 210 struct DNS_entry {
ashleymills 0:714293de3836 211 DNS_entry* next; /* next on DNS list */
ashleymills 0:714293de3836 212 char* name; /* actual DNS name */
ashleymills 0:714293de3836 213 };
ashleymills 0:714293de3836 214
ashleymills 0:714293de3836 215 typedef struct DecodedCert DecodedCert;
ashleymills 0:714293de3836 216 typedef struct Signer Signer;
ashleymills 0:714293de3836 217
ashleymills 0:714293de3836 218
ashleymills 0:714293de3836 219 struct DecodedCert {
ashleymills 0:714293de3836 220 byte* publicKey;
ashleymills 0:714293de3836 221 word32 pubKeySize;
ashleymills 0:714293de3836 222 int pubKeyStored;
ashleymills 0:714293de3836 223 word32 certBegin; /* offset to start of cert */
ashleymills 0:714293de3836 224 word32 sigIndex; /* offset to start of signature */
ashleymills 0:714293de3836 225 word32 sigLength; /* length of signature */
ashleymills 0:714293de3836 226 word32 signatureOID; /* sum of algorithm object id */
ashleymills 0:714293de3836 227 word32 keyOID; /* sum of key algo object id */
ashleymills 0:714293de3836 228 DNS_entry* altNames; /* alt names list of dns entries */
ashleymills 0:714293de3836 229 byte subjectHash[SHA_SIZE]; /* hash of all Names */
ashleymills 0:714293de3836 230 byte issuerHash[SHA_SIZE]; /* hash of all Names */
ashleymills 0:714293de3836 231 #ifdef HAVE_OCSP
ashleymills 0:714293de3836 232 byte issuerKeyHash[SHA_SIZE]; /* hash of the public Key */
ashleymills 0:714293de3836 233 #endif /* HAVE_OCSP */
ashleymills 0:714293de3836 234 byte* signature; /* not owned, points into raw cert */
ashleymills 0:714293de3836 235 char* subjectCN; /* CommonName */
ashleymills 0:714293de3836 236 int subjectCNLen;
ashleymills 0:714293de3836 237 int subjectCNStored; /* have we saved a copy we own */
ashleymills 0:714293de3836 238 char issuer[ASN_NAME_MAX]; /* full name including common name */
ashleymills 0:714293de3836 239 char subject[ASN_NAME_MAX]; /* full name including common name */
ashleymills 0:714293de3836 240 int verify; /* Default to yes, but could be off */
ashleymills 0:714293de3836 241 byte* source; /* byte buffer holder cert, NOT owner */
ashleymills 0:714293de3836 242 word32 srcIdx; /* current offset into buffer */
ashleymills 0:714293de3836 243 word32 maxIdx; /* max offset based on init size */
ashleymills 0:714293de3836 244 void* heap; /* for user memory overrides */
ashleymills 0:714293de3836 245 byte serial[EXTERNAL_SERIAL_SIZE]; /* raw serial number */
ashleymills 0:714293de3836 246 int serialSz; /* raw serial bytes stored */
ashleymills 0:714293de3836 247 byte* extensions; /* not owned, points into raw cert */
ashleymills 0:714293de3836 248 int extensionsSz; /* length of cert extensions */
ashleymills 0:714293de3836 249 word32 extensionsIdx; /* if want to go back and parse later */
ashleymills 0:714293de3836 250 byte* extAuthInfo; /* Authority Information Access URI */
ashleymills 0:714293de3836 251 int extAuthInfoSz; /* length of the URI */
ashleymills 0:714293de3836 252 byte* extCrlInfo; /* CRL Distribution Points */
ashleymills 0:714293de3836 253 int extCrlInfoSz; /* length of the URI */
ashleymills 0:714293de3836 254 byte extSubjKeyId[SHA_SIZE]; /* Subject Key ID */
ashleymills 0:714293de3836 255 byte extSubjKeyIdSet; /* Set when the SKID was read from cert */
ashleymills 0:714293de3836 256 byte extAuthKeyId[SHA_SIZE]; /* Authority Key ID */
ashleymills 0:714293de3836 257 byte extAuthKeyIdSet; /* Set when the AKID was read from cert */
ashleymills 0:714293de3836 258 byte isCA; /* CA basic constraint true */
ashleymills 0:714293de3836 259 #ifdef CYASSL_CERT_GEN
ashleymills 0:714293de3836 260 /* easy access to subject info for other sign */
ashleymills 0:714293de3836 261 char* subjectSN;
ashleymills 0:714293de3836 262 int subjectSNLen;
ashleymills 0:714293de3836 263 char* subjectC;
ashleymills 0:714293de3836 264 int subjectCLen;
ashleymills 0:714293de3836 265 char* subjectL;
ashleymills 0:714293de3836 266 int subjectLLen;
ashleymills 0:714293de3836 267 char* subjectST;
ashleymills 0:714293de3836 268 int subjectSTLen;
ashleymills 0:714293de3836 269 char* subjectO;
ashleymills 0:714293de3836 270 int subjectOLen;
ashleymills 0:714293de3836 271 char* subjectOU;
ashleymills 0:714293de3836 272 int subjectOULen;
ashleymills 0:714293de3836 273 char* subjectEmail;
ashleymills 0:714293de3836 274 int subjectEmailLen;
ashleymills 0:714293de3836 275 byte* beforeDate;
ashleymills 0:714293de3836 276 int beforeDateLen;
ashleymills 0:714293de3836 277 byte* afterDate;
ashleymills 0:714293de3836 278 int afterDateLen;
ashleymills 0:714293de3836 279 #endif /* CYASSL_CERT_GEN */
ashleymills 0:714293de3836 280 };
ashleymills 0:714293de3836 281
ashleymills 0:714293de3836 282 #ifdef SHA_DIGEST_SIZE
ashleymills 0:714293de3836 283 #define SIGNER_DIGEST_SIZE SHA_DIGEST_SIZE
ashleymills 0:714293de3836 284 #else
ashleymills 0:714293de3836 285 #define SIGNER_DIGEST_SIZE 20
ashleymills 0:714293de3836 286 #endif
ashleymills 0:714293de3836 287
ashleymills 0:714293de3836 288 /* CA Signers */
ashleymills 0:714293de3836 289 /* if change layout change PERSIST_CERT_CACHE functions too */
ashleymills 0:714293de3836 290 struct Signer {
ashleymills 0:714293de3836 291 word32 pubKeySize;
ashleymills 0:714293de3836 292 word32 keyOID; /* key type */
ashleymills 0:714293de3836 293 byte* publicKey;
ashleymills 0:714293de3836 294 int nameLen;
ashleymills 0:714293de3836 295 char* name; /* common name */
ashleymills 0:714293de3836 296 byte subjectNameHash[SIGNER_DIGEST_SIZE];
ashleymills 0:714293de3836 297 /* sha hash of names in certificate */
ashleymills 0:714293de3836 298 #ifndef NO_SKID
ashleymills 0:714293de3836 299 byte subjectKeyIdHash[SIGNER_DIGEST_SIZE];
ashleymills 0:714293de3836 300 /* sha hash of names in certificate */
ashleymills 0:714293de3836 301 #endif
ashleymills 0:714293de3836 302 Signer* next;
ashleymills 0:714293de3836 303 };
ashleymills 0:714293de3836 304
ashleymills 0:714293de3836 305
ashleymills 0:714293de3836 306 /* not for public consumption but may use for testing sometimes */
ashleymills 0:714293de3836 307 #ifdef CYASSL_TEST_CERT
ashleymills 0:714293de3836 308 #define CYASSL_TEST_API CYASSL_API
ashleymills 0:714293de3836 309 #else
ashleymills 0:714293de3836 310 #define CYASSL_TEST_API CYASSL_LOCAL
ashleymills 0:714293de3836 311 #endif
ashleymills 0:714293de3836 312
ashleymills 0:714293de3836 313 CYASSL_TEST_API void FreeAltNames(DNS_entry*, void*);
ashleymills 0:714293de3836 314 CYASSL_TEST_API void InitDecodedCert(DecodedCert*, byte*, word32, void*);
ashleymills 0:714293de3836 315 CYASSL_TEST_API void FreeDecodedCert(DecodedCert*);
ashleymills 0:714293de3836 316 CYASSL_TEST_API int ParseCert(DecodedCert*, int type, int verify, void* cm);
ashleymills 0:714293de3836 317
ashleymills 0:714293de3836 318 CYASSL_LOCAL int ParseCertRelative(DecodedCert*, int type, int verify,void* cm);
ashleymills 0:714293de3836 319 CYASSL_LOCAL int DecodeToKey(DecodedCert*, int verify);
ashleymills 0:714293de3836 320
ashleymills 0:714293de3836 321 CYASSL_LOCAL word32 EncodeSignature(byte* out, const byte* digest, word32 digSz,
ashleymills 0:714293de3836 322 int hashOID);
ashleymills 0:714293de3836 323
ashleymills 0:714293de3836 324 CYASSL_LOCAL Signer* MakeSigner(void*);
ashleymills 0:714293de3836 325 CYASSL_LOCAL void FreeSigner(Signer*, void*);
ashleymills 0:714293de3836 326 CYASSL_LOCAL void FreeSignerTable(Signer**, int, void*);
ashleymills 0:714293de3836 327
ashleymills 0:714293de3836 328
ashleymills 0:714293de3836 329 CYASSL_LOCAL int ToTraditional(byte* buffer, word32 length);
ashleymills 0:714293de3836 330 CYASSL_LOCAL int ToTraditionalEnc(byte* buffer, word32 length,const char*, int);
ashleymills 0:714293de3836 331
ashleymills 0:714293de3836 332 CYASSL_LOCAL int ValidateDate(const byte* date, byte format, int dateType);
ashleymills 0:714293de3836 333
ashleymills 0:714293de3836 334 #ifdef HAVE_ECC
ashleymills 0:714293de3836 335 /* ASN sig helpers */
ashleymills 0:714293de3836 336 CYASSL_LOCAL int StoreECC_DSA_Sig(byte* out, word32* outLen, mp_int* r,
ashleymills 0:714293de3836 337 mp_int* s);
ashleymills 0:714293de3836 338 CYASSL_LOCAL int DecodeECC_DSA_Sig(const byte* sig, word32 sigLen,
ashleymills 0:714293de3836 339 mp_int* r, mp_int* s);
ashleymills 0:714293de3836 340 /* private key helpers */
ashleymills 0:714293de3836 341 CYASSL_LOCAL int EccPrivateKeyDecode(const byte* input,word32* inOutIdx,
ashleymills 0:714293de3836 342 ecc_key*,word32);
ashleymills 0:714293de3836 343 #endif
ashleymills 0:714293de3836 344
ashleymills 0:714293de3836 345 #ifdef CYASSL_CERT_GEN
ashleymills 0:714293de3836 346
ashleymills 0:714293de3836 347 enum cert_enums {
ashleymills 0:714293de3836 348 NAME_ENTRIES = 8,
ashleymills 0:714293de3836 349 JOINT_LEN = 2,
ashleymills 0:714293de3836 350 EMAIL_JOINT_LEN = 9,
ashleymills 0:714293de3836 351 RSA_KEY = 10,
ashleymills 0:714293de3836 352 NTRU_KEY = 11
ashleymills 0:714293de3836 353 };
ashleymills 0:714293de3836 354
ashleymills 0:714293de3836 355
ashleymills 0:714293de3836 356 #endif /* CYASSL_CERT_GEN */
ashleymills 0:714293de3836 357
ashleymills 0:714293de3836 358
ashleymills 0:714293de3836 359
ashleymills 0:714293de3836 360 /* for pointer use */
ashleymills 0:714293de3836 361 typedef struct CertStatus CertStatus;
ashleymills 0:714293de3836 362
ashleymills 0:714293de3836 363 #ifdef HAVE_OCSP
ashleymills 0:714293de3836 364
ashleymills 0:714293de3836 365 enum Ocsp_Response_Status {
ashleymills 0:714293de3836 366 OCSP_SUCCESSFUL = 0, /* Response has valid confirmations */
ashleymills 0:714293de3836 367 OCSP_MALFORMED_REQUEST = 1, /* Illegal confirmation request */
ashleymills 0:714293de3836 368 OCSP_INTERNAL_ERROR = 2, /* Internal error in issuer */
ashleymills 0:714293de3836 369 OCSP_TRY_LATER = 3, /* Try again later */
ashleymills 0:714293de3836 370 OCSP_SIG_REQUIRED = 5, /* Must sign the request (4 is skipped) */
ashleymills 0:714293de3836 371 OCSP_UNAUTHROIZED = 6 /* Request unauthorized */
ashleymills 0:714293de3836 372 };
ashleymills 0:714293de3836 373
ashleymills 0:714293de3836 374
ashleymills 0:714293de3836 375 enum Ocsp_Cert_Status {
ashleymills 0:714293de3836 376 CERT_GOOD = 0,
ashleymills 0:714293de3836 377 CERT_REVOKED = 1,
ashleymills 0:714293de3836 378 CERT_UNKNOWN = 2
ashleymills 0:714293de3836 379 };
ashleymills 0:714293de3836 380
ashleymills 0:714293de3836 381
ashleymills 0:714293de3836 382 enum Ocsp_Sums {
ashleymills 0:714293de3836 383 OCSP_BASIC_OID = 117,
ashleymills 0:714293de3836 384 OCSP_NONCE_OID = 118
ashleymills 0:714293de3836 385 };
ashleymills 0:714293de3836 386
ashleymills 0:714293de3836 387
ashleymills 0:714293de3836 388 typedef struct OcspRequest OcspRequest;
ashleymills 0:714293de3836 389 typedef struct OcspResponse OcspResponse;
ashleymills 0:714293de3836 390
ashleymills 0:714293de3836 391
ashleymills 0:714293de3836 392 struct CertStatus {
ashleymills 0:714293de3836 393 CertStatus* next;
ashleymills 0:714293de3836 394
ashleymills 0:714293de3836 395 byte serial[EXTERNAL_SERIAL_SIZE];
ashleymills 0:714293de3836 396 int serialSz;
ashleymills 0:714293de3836 397
ashleymills 0:714293de3836 398 int status;
ashleymills 0:714293de3836 399
ashleymills 0:714293de3836 400 byte thisDate[MAX_DATE_SIZE];
ashleymills 0:714293de3836 401 byte nextDate[MAX_DATE_SIZE];
ashleymills 0:714293de3836 402 byte thisDateFormat;
ashleymills 0:714293de3836 403 byte nextDateFormat;
ashleymills 0:714293de3836 404 };
ashleymills 0:714293de3836 405
ashleymills 0:714293de3836 406
ashleymills 0:714293de3836 407 struct OcspResponse {
ashleymills 0:714293de3836 408 int responseStatus; /* return code from Responder */
ashleymills 0:714293de3836 409
ashleymills 0:714293de3836 410 byte* response; /* Pointer to beginning of OCSP Response */
ashleymills 0:714293de3836 411 word32 responseSz; /* length of the OCSP Response */
ashleymills 0:714293de3836 412
ashleymills 0:714293de3836 413 byte producedDate[MAX_DATE_SIZE];
ashleymills 0:714293de3836 414 /* Date at which this response was signed */
ashleymills 0:714293de3836 415 byte producedDateFormat; /* format of the producedDate */
ashleymills 0:714293de3836 416 byte* issuerHash;
ashleymills 0:714293de3836 417 byte* issuerKeyHash;
ashleymills 0:714293de3836 418
ashleymills 0:714293de3836 419 byte* cert;
ashleymills 0:714293de3836 420 word32 certSz;
ashleymills 0:714293de3836 421
ashleymills 0:714293de3836 422 byte* sig; /* Pointer to sig in source */
ashleymills 0:714293de3836 423 word32 sigSz; /* Length in octets for the sig */
ashleymills 0:714293de3836 424 word32 sigOID; /* OID for hash used for sig */
ashleymills 0:714293de3836 425
ashleymills 0:714293de3836 426 CertStatus* status; /* certificate status to fill out */
ashleymills 0:714293de3836 427
ashleymills 0:714293de3836 428 byte* nonce; /* pointer to nonce inside ASN.1 response */
ashleymills 0:714293de3836 429 int nonceSz; /* length of the nonce string */
ashleymills 0:714293de3836 430
ashleymills 0:714293de3836 431 byte* source; /* pointer to source buffer, not owned */
ashleymills 0:714293de3836 432 word32 maxIdx; /* max offset based on init size */
ashleymills 0:714293de3836 433 };
ashleymills 0:714293de3836 434
ashleymills 0:714293de3836 435
ashleymills 0:714293de3836 436 struct OcspRequest {
ashleymills 0:714293de3836 437 DecodedCert* cert;
ashleymills 0:714293de3836 438
ashleymills 0:714293de3836 439 byte useNonce;
ashleymills 0:714293de3836 440 byte nonce[MAX_OCSP_NONCE_SZ];
ashleymills 0:714293de3836 441 int nonceSz;
ashleymills 0:714293de3836 442
ashleymills 0:714293de3836 443 byte* issuerHash; /* pointer to issuerHash in source cert */
ashleymills 0:714293de3836 444 byte* issuerKeyHash; /* pointer to issuerKeyHash in source cert */
ashleymills 0:714293de3836 445 byte* serial; /* pointer to serial number in source cert */
ashleymills 0:714293de3836 446 int serialSz; /* length of the serial number */
ashleymills 0:714293de3836 447
ashleymills 0:714293de3836 448 byte* dest; /* pointer to the destination ASN.1 buffer */
ashleymills 0:714293de3836 449 word32 destSz; /* length of the destination buffer */
ashleymills 0:714293de3836 450 };
ashleymills 0:714293de3836 451
ashleymills 0:714293de3836 452
ashleymills 0:714293de3836 453 CYASSL_LOCAL void InitOcspResponse(OcspResponse*, CertStatus*, byte*, word32);
ashleymills 0:714293de3836 454 CYASSL_LOCAL int OcspResponseDecode(OcspResponse*);
ashleymills 0:714293de3836 455
ashleymills 0:714293de3836 456 CYASSL_LOCAL void InitOcspRequest(OcspRequest*, DecodedCert*,
ashleymills 0:714293de3836 457 byte, byte*, word32);
ashleymills 0:714293de3836 458 CYASSL_LOCAL int EncodeOcspRequest(OcspRequest*);
ashleymills 0:714293de3836 459
ashleymills 0:714293de3836 460 CYASSL_LOCAL int CompareOcspReqResp(OcspRequest*, OcspResponse*);
ashleymills 0:714293de3836 461
ashleymills 0:714293de3836 462
ashleymills 0:714293de3836 463 #endif /* HAVE_OCSP */
ashleymills 0:714293de3836 464
ashleymills 0:714293de3836 465
ashleymills 0:714293de3836 466 /* for pointer use */
ashleymills 0:714293de3836 467 typedef struct RevokedCert RevokedCert;
ashleymills 0:714293de3836 468
ashleymills 0:714293de3836 469 #ifdef HAVE_CRL
ashleymills 0:714293de3836 470
ashleymills 0:714293de3836 471 struct RevokedCert {
ashleymills 0:714293de3836 472 byte serialNumber[EXTERNAL_SERIAL_SIZE];
ashleymills 0:714293de3836 473 int serialSz;
ashleymills 0:714293de3836 474 RevokedCert* next;
ashleymills 0:714293de3836 475 };
ashleymills 0:714293de3836 476
ashleymills 0:714293de3836 477 typedef struct DecodedCRL DecodedCRL;
ashleymills 0:714293de3836 478
ashleymills 0:714293de3836 479 struct DecodedCRL {
ashleymills 0:714293de3836 480 word32 certBegin; /* offset to start of cert */
ashleymills 0:714293de3836 481 word32 sigIndex; /* offset to start of signature */
ashleymills 0:714293de3836 482 word32 sigLength; /* length of signature */
ashleymills 0:714293de3836 483 word32 signatureOID; /* sum of algorithm object id */
ashleymills 0:714293de3836 484 byte* signature; /* pointer into raw source, not owned */
ashleymills 0:714293de3836 485 byte issuerHash[SHA_DIGEST_SIZE]; /* issuer hash */
ashleymills 0:714293de3836 486 byte crlHash[SHA_DIGEST_SIZE]; /* raw crl data hash */
ashleymills 0:714293de3836 487 byte lastDate[MAX_DATE_SIZE]; /* last date updated */
ashleymills 0:714293de3836 488 byte nextDate[MAX_DATE_SIZE]; /* next update date */
ashleymills 0:714293de3836 489 byte lastDateFormat; /* format of last date */
ashleymills 0:714293de3836 490 byte nextDateFormat; /* format of next date */
ashleymills 0:714293de3836 491 RevokedCert* certs; /* revoked cert list */
ashleymills 0:714293de3836 492 int totalCerts; /* number on list */
ashleymills 0:714293de3836 493 };
ashleymills 0:714293de3836 494
ashleymills 0:714293de3836 495 CYASSL_LOCAL void InitDecodedCRL(DecodedCRL*);
ashleymills 0:714293de3836 496 CYASSL_LOCAL int ParseCRL(DecodedCRL*, const byte* buff, word32 sz, void* cm);
ashleymills 0:714293de3836 497 CYASSL_LOCAL void FreeDecodedCRL(DecodedCRL*);
ashleymills 0:714293de3836 498
ashleymills 0:714293de3836 499
ashleymills 0:714293de3836 500 #endif /* HAVE_CRL */
ashleymills 0:714293de3836 501
ashleymills 0:714293de3836 502
ashleymills 0:714293de3836 503 #ifdef __cplusplus
ashleymills 0:714293de3836 504 } /* extern "C" */
ashleymills 0:714293de3836 505 #endif
ashleymills 0:714293de3836 506
ashleymills 0:714293de3836 507 #endif /* CTAO_CRYPT_ASN_H */
ashleymills 0:714293de3836 508
ashleymills 0:714293de3836 509 #endif /* !NO_ASN */