1 /* Private header file of libSSL. 2 * Various and sundry protocol constants. DON'T CHANGE THESE. These 3 * values are defined by the SSL 3.0 protocol specification. 4 * 5 * This Source Code Form is subject to the terms of the Mozilla Public 6 * License, v. 2.0. If a copy of the MPL was not distributed with this 7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 8 9 #ifndef __ssl3proto_h_ 10 #define __ssl3proto_h_ 11 12 typedef PRUint8 SSL3Opaque; 13 14 typedef PRUint16 SSL3ProtocolVersion; 15 /* version numbers are defined in sslproto.h */ 16 17 typedef PRUint16 ssl3CipherSuite; 18 /* The cipher suites are defined in sslproto.h */ 19 20 #define MAX_CERT_TYPES 10 21 #define MAX_COMPRESSION_METHODS 10 22 #define MAX_MAC_LENGTH 64 23 #define MAX_PADDING_LENGTH 64 24 #define MAX_KEY_LENGTH 64 25 #define EXPORT_KEY_LENGTH 5 26 #define SSL3_RANDOM_LENGTH 32 27 28 #define SSL3_RECORD_HEADER_LENGTH 5 29 30 /* SSL3_RECORD_HEADER_LENGTH + epoch/sequence_number */ 31 #define DTLS_RECORD_HEADER_LENGTH 13 32 33 #define MAX_FRAGMENT_LENGTH 16384 34 35 typedef enum { 36 content_change_cipher_spec = 20, 37 content_alert = 21, 38 content_handshake = 22, 39 content_application_data = 23 40 } SSL3ContentType; 41 42 typedef struct { 43 SSL3ContentType type; 44 SSL3ProtocolVersion version; 45 PRUint16 length; 46 SECItem fragment; 47 } SSL3Plaintext; 48 49 typedef struct { 50 SSL3ContentType type; 51 SSL3ProtocolVersion version; 52 PRUint16 length; 53 SECItem fragment; 54 } SSL3Compressed; 55 56 typedef struct { 57 SECItem content; 58 SSL3Opaque MAC[MAX_MAC_LENGTH]; 59 } SSL3GenericStreamCipher; 60 61 typedef struct { 62 SECItem content; 63 SSL3Opaque MAC[MAX_MAC_LENGTH]; 64 PRUint8 padding[MAX_PADDING_LENGTH]; 65 PRUint8 padding_length; 66 } SSL3GenericBlockCipher; 67 68 typedef enum { change_cipher_spec_choice = 1 } SSL3ChangeCipherSpecChoice; 69 70 typedef struct { 71 SSL3ChangeCipherSpecChoice choice; 72 } SSL3ChangeCipherSpec; 73 74 typedef enum { alert_warning = 1, alert_fatal = 2 } SSL3AlertLevel; 75 76 typedef enum { 77 close_notify = 0, 78 unexpected_message = 10, 79 bad_record_mac = 20, 80 decryption_failed_RESERVED = 21, /* do not send; see RFC 5246 */ 81 record_overflow = 22, /* TLS only */ 82 decompression_failure = 30, 83 handshake_failure = 40, 84 no_certificate = 41, /* SSL3 only, NOT TLS */ 85 bad_certificate = 42, 86 unsupported_certificate = 43, 87 certificate_revoked = 44, 88 certificate_expired = 45, 89 certificate_unknown = 46, 90 illegal_parameter = 47, 91 92 /* All alerts below are TLS only. */ 93 unknown_ca = 48, 94 access_denied = 49, 95 decode_error = 50, 96 decrypt_error = 51, 97 export_restriction = 60, 98 protocol_version = 70, 99 insufficient_security = 71, 100 internal_error = 80, 101 inappropriate_fallback = 86, /* could also be sent for SSLv3 */ 102 user_canceled = 90, 103 no_renegotiation = 100, 104 105 /* Alerts for client hello extensions */ 106 unsupported_extension = 110, 107 certificate_unobtainable = 111, 108 unrecognized_name = 112, 109 bad_certificate_status_response = 113, 110 bad_certificate_hash_value = 114 111 112 } SSL3AlertDescription; 113 114 typedef struct { 115 SSL3AlertLevel level; 116 SSL3AlertDescription description; 117 } SSL3Alert; 118 119 typedef enum { 120 hello_request = 0, 121 client_hello = 1, 122 server_hello = 2, 123 hello_verify_request = 3, 124 new_session_ticket = 4, 125 certificate = 11, 126 server_key_exchange = 12, 127 certificate_request = 13, 128 server_hello_done = 14, 129 certificate_verify = 15, 130 client_key_exchange = 16, 131 finished = 20, 132 certificate_status = 22, 133 next_proto = 67, 134 encrypted_extensions= 203 135 } SSL3HandshakeType; 136 137 typedef struct { 138 PRUint8 empty; 139 } SSL3HelloRequest; 140 141 typedef struct { 142 SSL3Opaque rand[SSL3_RANDOM_LENGTH]; 143 } SSL3Random; 144 145 typedef struct { 146 SSL3Opaque id[32]; 147 PRUint8 length; 148 } SSL3SessionID; 149 150 typedef struct { 151 SSL3ProtocolVersion client_version; 152 SSL3Random random; 153 SSL3SessionID session_id; 154 SECItem cipher_suites; 155 PRUint8 cm_count; 156 SSLCompressionMethod compression_methods[MAX_COMPRESSION_METHODS]; 157 } SSL3ClientHello; 158 159 typedef struct { 160 SSL3ProtocolVersion server_version; 161 SSL3Random random; 162 SSL3SessionID session_id; 163 ssl3CipherSuite cipher_suite; 164 SSLCompressionMethod compression_method; 165 } SSL3ServerHello; 166 167 typedef struct { 168 SECItem list; 169 } SSL3Certificate; 170 171 /* SSL3SignType moved to ssl.h */ 172 173 /* The SSL key exchange method used */ 174 typedef enum { 175 kea_null, 176 kea_rsa, 177 kea_rsa_export, 178 kea_rsa_export_1024, 179 kea_dh_dss, 180 kea_dh_dss_export, 181 kea_dh_rsa, 182 kea_dh_rsa_export, 183 kea_dhe_dss, 184 kea_dhe_dss_export, 185 kea_dhe_rsa, 186 kea_dhe_rsa_export, 187 kea_dh_anon, 188 kea_dh_anon_export, 189 kea_rsa_fips, 190 kea_ecdh_ecdsa, 191 kea_ecdhe_ecdsa, 192 kea_ecdh_rsa, 193 kea_ecdhe_rsa, 194 kea_ecdh_anon 195 } SSL3KeyExchangeAlgorithm; 196 197 typedef struct { 198 SECItem modulus; 199 SECItem exponent; 200 } SSL3ServerRSAParams; 201 202 typedef struct { 203 SECItem p; 204 SECItem g; 205 SECItem Ys; 206 } SSL3ServerDHParams; 207 208 typedef struct { 209 union { 210 SSL3ServerDHParams dh; 211 SSL3ServerRSAParams rsa; 212 } u; 213 } SSL3ServerParams; 214 215 /* This enum reflects HashAlgorithm enum from 216 * https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 217 * 218 * When updating, be sure to also update ssl3_TLSHashAlgorithmToOID. */ 219 enum { 220 tls_hash_md5 = 1, 221 tls_hash_sha1 = 2, 222 tls_hash_sha224 = 3, 223 tls_hash_sha256 = 4, 224 tls_hash_sha384 = 5, 225 tls_hash_sha512 = 6 226 }; 227 228 /* This enum reflects SignatureAlgorithm enum from 229 * https://tools.ietf.org/html/rfc5246#section-7.4.1.4.1 */ 230 typedef enum { 231 tls_sig_rsa = 1, 232 tls_sig_dsa = 2, 233 tls_sig_ecdsa = 3 234 } TLSSignatureAlgorithm; 235 236 typedef struct { 237 SECOidTag hashAlg; 238 TLSSignatureAlgorithm sigAlg; 239 } SSL3SignatureAndHashAlgorithm; 240 241 /* SSL3HashesIndividually contains a combination MD5/SHA1 hash, as used in TLS 242 * prior to 1.2. */ 243 typedef struct { 244 PRUint8 md5[16]; 245 PRUint8 sha[20]; 246 } SSL3HashesIndividually; 247 248 /* SSL3Hashes contains an SSL hash value. The digest is contained in |u.raw| 249 * which, if |hashAlg==SEC_OID_UNKNOWN| is also a SSL3HashesIndividually 250 * struct. */ 251 typedef struct { 252 unsigned int len; 253 SECOidTag hashAlg; 254 union { 255 PRUint8 raw[64]; 256 SSL3HashesIndividually s; 257 } u; 258 } SSL3Hashes; 259 260 typedef struct { 261 union { 262 SSL3Opaque anonymous; 263 SSL3Hashes certified; 264 } u; 265 } SSL3ServerKeyExchange; 266 267 typedef enum { 268 ct_RSA_sign = 1, 269 ct_DSS_sign = 2, 270 ct_RSA_fixed_DH = 3, 271 ct_DSS_fixed_DH = 4, 272 ct_RSA_ephemeral_DH = 5, 273 ct_DSS_ephemeral_DH = 6, 274 ct_ECDSA_sign = 64, 275 ct_RSA_fixed_ECDH = 65, 276 ct_ECDSA_fixed_ECDH = 66 277 278 } SSL3ClientCertificateType; 279 280 typedef SECItem *SSL3DistinquishedName; 281 282 typedef struct { 283 SSL3Opaque client_version[2]; 284 SSL3Opaque random[46]; 285 } SSL3RSAPreMasterSecret; 286 287 typedef SECItem SSL3EncryptedPreMasterSecret; 288 289 290 typedef SSL3Opaque SSL3MasterSecret[48]; 291 292 typedef enum { implicit, explicit } SSL3PublicValueEncoding; 293 294 typedef struct { 295 union { 296 SSL3Opaque implicit; 297 SECItem explicit; 298 } dh_public; 299 } SSL3ClientDiffieHellmanPublic; 300 301 typedef struct { 302 union { 303 SSL3EncryptedPreMasterSecret rsa; 304 SSL3ClientDiffieHellmanPublic diffie_helman; 305 } exchange_keys; 306 } SSL3ClientKeyExchange; 307 308 typedef SSL3Hashes SSL3PreSignedCertificateVerify; 309 310 typedef SECItem SSL3CertificateVerify; 311 312 typedef enum { 313 sender_client = 0x434c4e54, 314 sender_server = 0x53525652 315 } SSL3Sender; 316 317 typedef SSL3HashesIndividually SSL3Finished; 318 319 typedef struct { 320 SSL3Opaque verify_data[12]; 321 } TLSFinished; 322 323 /* 324 * TLS extension related data structures and constants. 325 */ 326 327 /* SessionTicket extension related data structures. */ 328 329 /* NewSessionTicket handshake message. */ 330 typedef struct { 331 PRUint32 received_timestamp; 332 PRUint32 ticket_lifetime_hint; 333 SECItem ticket; 334 } NewSessionTicket; 335 336 typedef enum { 337 CLIENT_AUTH_ANONYMOUS = 0, 338 CLIENT_AUTH_CERTIFICATE = 1 339 } ClientAuthenticationType; 340 341 typedef struct { 342 ClientAuthenticationType client_auth_type; 343 union { 344 SSL3Opaque *certificate_list; 345 } identity; 346 } ClientIdentity; 347 348 #define SESS_TICKET_KEY_NAME_LEN 16 349 #define SESS_TICKET_KEY_NAME_PREFIX "NSS!" 350 #define SESS_TICKET_KEY_NAME_PREFIX_LEN 4 351 #define SESS_TICKET_KEY_VAR_NAME_LEN 12 352 353 typedef struct { 354 unsigned char *key_name; 355 unsigned char *iv; 356 SECItem encrypted_state; 357 unsigned char *mac; 358 } EncryptedSessionTicket; 359 360 #define TLS_EX_SESS_TICKET_MAC_LENGTH 32 361 362 #define TLS_STE_NO_SERVER_NAME -1 363 364 #endif /* __ssl3proto_h_ */ 365