zeek/src/analyzer/protocol/ssl/spicy/SSL.spicy

2041 lines
82 KiB
Text

# Copyright (c) 2024 by the Zeek Project. See LICENSE for details.
module SSL;
import spicy;
public function get_certificate_fuid(is_client: bool, pos: uint32): string &cxxname="ssl_get_certificate_fuid";
public function get_ocsp_fuid(): string &cxxname="ssl_get_ocsp_fuid";
public function is_partial_tcp(): bool &cxxname="ssl_is_partial_tcp";
type ContentType = enum {
change_cipher_spec = 20,
alert = 21,
handshake = 22,
application_data = 23,
heartbeat = 24,
};
type HandshakeType = enum {
hello_request = 0,
client_hello = 1,
server_hello = 2,
hello_verify_request = 3, #DTLS
NewSessionTicket = 4,
certificate = 11,
server_key_exchange = 12,
certificate_request = 13,
server_hello_done = 14,
certificate_verify = 15,
client_key_exchange = 16,
finished = 20,
certificate_url = 21, # RFC 3546
certificate_status = 22, # RFC 3546
};
type SSL2ProtocolMessages = enum {
ssl_error = 0,
ssl_client_hello = 1,
ssl_client_master_key = 2,
ssl_client_finished = 3,
ssl_server_hello = 4,
ssl_server_verify = 5,
ssl_server_finished = 6,
ssl_request_certificate = 7,
ssl_client_certificate = 8,
};
type Extensions = enum {
server_name = 0,
max_fragment_length = 1,
client_certificate_url = 2,
trusted_ca_keys = 3,
truncated_hmac = 4,
status_request = 5,
user_mapping = 6,
client_authz = 7,
server_authz = 8,
cert_type = 9,
supported_groups = 10, # old name: elliptic_curves - draft-ietf-tls-negotiated-ff-dhe
ec_point_formats = 11,
srp = 12,
signature_algorithms = 13,
use_srtp = 14,
heartbeat = 15,
application_layer_protocol_negotiation = 16,
status_request_v2 = 17,
signed_certificate_timestamp = 18,
client_certificate_type = 19,
server_certificate_type = 20,
padding = 21,
encrypt_then_mac = 22,
extended_master_secret = 23,
token_binding = 24, # temporary till 2017-03-06 - draft-ietf-tokbind-negotiation
cached_info = 25,
SessionTicket_TLS = 35,
key_share_old = 40, # new for TLS 1.3, used in some of the drafts. Did not make it into the RFC. Was used for extended_random before.
pre_shared_key = 41, # new for 1.3, see RFC 8446
early_data = 42, # new for 1.3, see RFC 8446
supported_versions = 43, # new for 1.3, see RFC 8446
cookie = 44, # new for 1.3, see RFC 8446
psk_key_exchange_modes = 45, # new for 1.3, see RFC 8446
TicketEarlyDataInfo = 46, # new for 1.3 drafts, e.g. draft-16. Did not make it into the final RFC
certificate_authorities = 47, # new for 1.3, see RFC 8446
oid_filters = 48, # new for 1.3, see RFC 8446
post_handshake_auth = 49, # new for 1.3, see RFC 8446
signature_algorithms_cert = 50, # new for 1.3, see RFC 8446
key_share = 51, # new for 1.3, see RFC 8446
transparency_info = 52, # temporary - draft-ietf-trans-rfc6962-bis-34
connection_id = 53, # temporary -d draft-ietf-tls-dtls-connection-id
external_id_hash = 55, # temporary - RFC-ietf-mmusic-sdp-uks-07
external_session_id = 56, # temporary - RFC-ietf-mmusic-sdp-uks-07
quic_transport_parameters = 57, # temporary - draft-ietf-quic-tls-32
next_protocol_negotiation = 13172,
origin_bound_certificates = 13175,
encrypted_client_certificates = 13180,
channel_id = 30031,
channel_id_new = 30032,
padding_old = 35655,
renegotiation_info = 65281,
};
# type ECPointFormat = enum {
# uncompressed = 0,
# ansiX962_compressed_prime = 1,
# ansiX962_compressed_char2 =2
# };
type ECCurveType = enum {
EXPLICIT_PRIME = 1,
EXPLICIT_CHAR = 2,
NAMED_CURVE = 3,
};
# type NamedCurve = enum {
# sect163k1 = 1, sect163r1 = 2, sect163r2 = 3,
# sect193r1 = 4, sect193r2 = 5, sect233k1 = 6,
# sect233r1 = 7, sect239k1 = 8, sect283k1 = 9,
# sect283r1 = 10, sect409k1 = 11, sect409r1 = 12,
# sect571k1 = 13, sect571r1 = 14, secp160k1 = 15,
# secp160r1 = 16, secp160r2 = 17, secp192k1 = 18,
# secp192r1 = 19, secp224k1 = 20, secp224r1 = 21,
# secp256k1 = 22, secp256r1 = 23, secp384r1 = 24,
# secp521r1 = 25,
# arbitrary_explicit_prime_curves = 0xFF01,
# arbitrary_explicit_char2_curves = 0xFF02
# };
type HeartbeatMode = enum {
peer_allowed_to_send = 1,
peer_not_allowed_to_send = 2,
};
type NameType = enum {
host_name = 0,
};
# type AlertLevel = enum {
# warning= 1, fatal= 2
# };
# type AlertDescription = enum {
# close_notify = 0,
# unexpected_message = 10,
# bad_record_mac = 20,
# decryption_failed_RESERVED = 21,
# record_overflow = 22,
# decompression_failure = 30,
# handshake_failure = 40,
# no_certificate_RESERVED = 41,
# bad_certificate = 42,
# unsupported_certificate = 43,
# certificate_revoked = 44,
# certificate_expired = 45,
# certificate_unknown = 46,
# illegal_parameter = 47,
# unknown_ca = 48,
# access_denied = 49,
# decode_error = 50,
# decrypt_error = 51,
# export_restriction_RESERVED = 60,
# protocol_version = 70,
# insufficient_security = 71,
# internal_error = 80,
# user_canceled = 90,
# no_renegotiation = 100,
# unsupported_extension = 110
# };
# type HashAlgorithm = enum {
# none = 0, md5= 1, sha1= 2, sha224= 3, sha256= 4, sha384= 5,
# sha512 = 6
# };
# type SignatureAlgorithm = enum {
# anonymous = 0, rsa= 1, dsa= 2, ecdsa= 3
# };
const UNKNOWN_VERSION: uint16 = 0x0000;
const SSLv2 = 0x0002;
const SSLv3 = 0x0300;
const TLSv10 = 0x0301;
const TLSv11 = 0x0302;
const TLSv12 = 0x0303;
const TLSv13 = 0x0304;
const TLSv13_draft = 0x7F00;
const DTLSv10 = 0xFEFF;
# DTLSv11 does not exist.
const DTLSv12 = 0xFEFD;
const DTLSv13 = 0xFEFC;
# type ClientCertificateType = enum {
# rsa_sign = 1, dss_sign = 2, rsa_fixed_dh = 3, dss_fixed_dh = 4,
# rsa_ephemeral_dh_RESERVED = 5, dss_ephemeral_dh_RESERVED = 6,
# fortezza_dms_RESERVED = 20
# };
type TLSCiphers = enum {
NO_CHOSEN_CIPHER = 0xFFFFFF,
TLS_NULL_WITH_NULL_NULL = 0x0000,
TLS_RSA_WITH_NULL_MD5 = 0x0001,
TLS_RSA_WITH_NULL_SHA = 0x0002,
TLS_RSA_EXPORT_WITH_RC4_40_MD5 = 0x0003,
TLS_RSA_WITH_RC4_128_MD5 = 0x0004,
TLS_RSA_WITH_RC4_128_SHA = 0x0005,
TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 = 0x0006,
TLS_RSA_WITH_IDEA_CBC_SHA = 0x0007,
TLS_RSA_EXPORT_WITH_DES40_CBC_SHA = 0x0008,
TLS_RSA_WITH_DES_CBC_SHA = 0x0009,
TLS_RSA_WITH_3DES_EDE_CBC_SHA = 0x000A,
TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA = 0x000B,
TLS_DH_DSS_WITH_DES_CBC_SHA = 0x000C,
TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA = 0x000D,
TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA = 0x000E,
TLS_DH_RSA_WITH_DES_CBC_SHA = 0x000F,
TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA = 0x0010,
TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA = 0x0011,
TLS_DHE_DSS_WITH_DES_CBC_SHA = 0x0012,
TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = 0x0013,
TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA = 0x0014,
TLS_DHE_RSA_WITH_DES_CBC_SHA = 0x0015,
TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = 0x0016,
TLS_DH_ANON_EXPORT_WITH_RC4_40_MD5 = 0x0017,
TLS_DH_ANON_WITH_RC4_128_MD5 = 0x0018,
TLS_DH_ANON_EXPORT_WITH_DES40_CBC_SHA = 0x0019,
TLS_DH_ANON_WITH_DES_CBC_SHA = 0x001A,
TLS_DH_ANON_WITH_3DES_EDE_CBC_SHA = 0x001B,
TLS_KRB5_WITH_DES_CBC_SHA = 0x001E,
TLS_KRB5_WITH_3DES_EDE_CBC_SHA = 0x001F,
TLS_KRB5_WITH_RC4_128_SHA = 0x0020,
TLS_KRB5_WITH_IDEA_CBC_SHA = 0x0021,
TLS_KRB5_WITH_DES_CBC_MD5 = 0x0022,
TLS_KRB5_WITH_3DES_EDE_CBC_MD5 = 0x0023,
TLS_KRB5_WITH_RC4_128_MD5 = 0x0024,
TLS_KRB5_WITH_IDEA_CBC_MD5 = 0x0025,
TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA = 0x0026,
TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA = 0x0027,
TLS_KRB5_EXPORT_WITH_RC4_40_SHA = 0x0028,
TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5 = 0x0029,
TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5 = 0x002A,
TLS_KRB5_EXPORT_WITH_RC4_40_MD5 = 0x002B,
TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F,
TLS_DH_DSS_WITH_AES_128_CBC_SHA = 0x0030,
TLS_DH_RSA_WITH_AES_128_CBC_SHA = 0x0031,
TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032,
TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033,
TLS_DH_ANON_WITH_AES_128_CBC_SHA = 0x0034,
TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035,
TLS_DH_DSS_WITH_AES_256_CBC_SHA = 0x0036,
TLS_DH_RSA_WITH_AES_256_CBC_SHA = 0x0037,
TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038,
TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039,
TLS_DH_ANON_WITH_AES_256_CBC_SHA = 0x003A,
TLS_RSA_WITH_NULL_SHA256 = 0x003B,
TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C,
TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D,
TLS_DH_DSS_WITH_AES_128_CBC_SHA256 = 0x003E,
TLS_DH_RSA_WITH_AES_128_CBC_SHA256 = 0x003F,
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040,
TLS_RSA_WITH_CAMELLIA_128_CBC_SHA = 0x0041,
TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA = 0x0042,
TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA = 0x0043,
TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA = 0x0044,
TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA = 0x0045,
TLS_DH_ANON_WITH_CAMELLIA_128_CBC_SHA = 0x0046,
TLS_RSA_EXPORT1024_WITH_RC4_56_MD5 = 0x0060,
TLS_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5 = 0x0061,
TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA = 0x0062,
TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA = 0x0063,
TLS_RSA_EXPORT1024_WITH_RC4_56_SHA = 0x0064,
TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA = 0x0065,
TLS_DHE_DSS_WITH_RC4_128_SHA = 0x0066,
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067,
TLS_DH_DSS_WITH_AES_256_CBC_SHA256 = 0x0068,
TLS_DH_RSA_WITH_AES_256_CBC_SHA256 = 0x0069,
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A,
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B,
TLS_DH_ANON_WITH_AES_128_CBC_SHA256 = 0x006C,
TLS_DH_ANON_WITH_AES_256_CBC_SHA256 = 0x006D,
# draft-ietf-tls-openpgp-keys-06
TLS_DHE_DSS_WITH_3DES_EDE_CBC_RMD = 0x0072,
TLS_DHE_DSS_WITH_AES_128_CBC_RMD = 0x0073,
TLS_DHE_DSS_WITH_AES_256_CBC_RMD = 0x0074,
TLS_DHE_RSA_WITH_3DES_EDE_CBC_RMD = 0x0077,
TLS_DHE_RSA_WITH_AES_128_CBC_RMD = 0x0078,
TLS_DHE_RSA_WITH_AES_256_CBC_RMD = 0x0079,
TLS_RSA_WITH_3DES_EDE_CBC_RMD = 0x007C,
TLS_RSA_WITH_AES_128_CBC_RMD = 0x007D,
TLS_RSA_WITH_AES_256_CBC_RMD = 0x007E,
# draft-chudov-cryptopro-cptls-04
TLS_GOSTR341094_WITH_28147_CNT_IMIT = 0x0080,
TLS_GOSTR341001_WITH_28147_CNT_IMIT = 0x0081,
TLS_GOSTR341094_WITH_NULL_GOSTR3411 = 0x0082,
TLS_GOSTR341001_WITH_NULL_GOSTR3411 = 0x0083,
TLS_RSA_WITH_CAMELLIA_256_CBC_SHA = 0x0084,
TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA = 0x0085,
TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA = 0x0086,
TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA = 0x0087,
TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA = 0x0088,
TLS_DH_ANON_WITH_CAMELLIA_256_CBC_SHA = 0x0089,
TLS_PSK_WITH_RC4_128_SHA = 0x008A,
TLS_PSK_WITH_3DES_EDE_CBC_SHA = 0x008B,
TLS_PSK_WITH_AES_128_CBC_SHA = 0x008C,
TLS_PSK_WITH_AES_256_CBC_SHA = 0x008D,
TLS_DHE_PSK_WITH_RC4_128_SHA = 0x008E,
TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA = 0x008F,
TLS_DHE_PSK_WITH_AES_128_CBC_SHA = 0x0090,
TLS_DHE_PSK_WITH_AES_256_CBC_SHA = 0x0091,
TLS_RSA_PSK_WITH_RC4_128_SHA = 0x0092,
TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA = 0x0093,
TLS_RSA_PSK_WITH_AES_128_CBC_SHA = 0x0094,
TLS_RSA_PSK_WITH_AES_256_CBC_SHA = 0x0095,
TLS_RSA_WITH_SEED_CBC_SHA = 0x0096,
TLS_DH_DSS_WITH_SEED_CBC_SHA = 0x0097,
TLS_DH_RSA_WITH_SEED_CBC_SHA = 0x0098,
TLS_DHE_DSS_WITH_SEED_CBC_SHA = 0x0099,
TLS_DHE_RSA_WITH_SEED_CBC_SHA = 0x009A,
TLS_DH_ANON_WITH_SEED_CBC_SHA = 0x009B,
TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C,
TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D,
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E,
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F,
TLS_DH_RSA_WITH_AES_128_GCM_SHA256 = 0x00A0,
TLS_DH_RSA_WITH_AES_256_GCM_SHA384 = 0x00A1,
TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2,
TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3,
TLS_DH_DSS_WITH_AES_128_GCM_SHA256 = 0x00A4,
TLS_DH_DSS_WITH_AES_256_GCM_SHA384 = 0x00A5,
TLS_DH_ANON_WITH_AES_128_GCM_SHA256 = 0x00A6,
TLS_DH_ANON_WITH_AES_256_GCM_SHA384 = 0x00A7,
TLS_PSK_WITH_AES_128_GCM_SHA256 = 0x00A8,
TLS_PSK_WITH_AES_256_GCM_SHA384 = 0x00A9,
TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 = 0x00AA,
TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 = 0x00AB,
TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 = 0x00AC,
TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 = 0x00AD,
TLS_PSK_WITH_AES_128_CBC_SHA256 = 0x00AE,
TLS_PSK_WITH_AES_256_CBC_SHA384 = 0x00AF,
TLS_PSK_WITH_NULL_SHA256 = 0x00B0,
TLS_PSK_WITH_NULL_SHA384 = 0x00B1,
TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 = 0x00B2,
TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 = 0x00B3,
TLS_DHE_PSK_WITH_NULL_SHA256 = 0x00B4,
TLS_DHE_PSK_WITH_NULL_SHA384 = 0x00B5,
TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 = 0x00B6,
TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 = 0x00B7,
TLS_RSA_PSK_WITH_NULL_SHA256 = 0x00B8,
TLS_RSA_PSK_WITH_NULL_SHA384 = 0x00B9,
TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 = 0x00BA,
TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256 = 0x00BB,
TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256 = 0x00BC,
TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 = 0x00BD,
TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 = 0x00BE,
TLS_DH_ANON_WITH_CAMELLIA_128_CBC_SHA256 = 0x00BF,
TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 = 0x00C0,
TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256 = 0x00C1,
TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256 = 0x00C2,
TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 = 0x00C3,
TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 = 0x00C4,
TLS_DH_ANON_WITH_CAMELLIA_256_CBC_SHA256 = 0x00C5,
# draft-bmoeller-tls-downgrade-scsv-01
TLS_FALLBACK_SCSV = 0x5600,
# RFC 4492
TLS_ECDH_ECDSA_WITH_NULL_SHA = 0xC001,
TLS_ECDH_ECDSA_WITH_RC4_128_SHA = 0xC002,
TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA = 0xC003,
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA = 0xC004,
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA = 0xC005,
TLS_ECDHE_ECDSA_WITH_NULL_SHA = 0xC006,
TLS_ECDHE_ECDSA_WITH_RC4_128_SHA = 0xC007,
TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA = 0xC008,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A,
TLS_ECDH_RSA_WITH_NULL_SHA = 0xC00B,
TLS_ECDH_RSA_WITH_RC4_128_SHA = 0xC00C,
TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA = 0xC00D,
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA = 0xC00E,
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA = 0xC00F,
TLS_ECDHE_RSA_WITH_NULL_SHA = 0xC010,
TLS_ECDHE_RSA_WITH_RC4_128_SHA = 0xC011,
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA = 0xC012,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014,
TLS_ECDH_ANON_WITH_NULL_SHA = 0xC015,
TLS_ECDH_ANON_WITH_RC4_128_SHA = 0xC016,
TLS_ECDH_ANON_WITH_3DES_EDE_CBC_SHA = 0xC017,
TLS_ECDH_ANON_WITH_AES_128_CBC_SHA = 0xC018,
TLS_ECDH_ANON_WITH_AES_256_CBC_SHA = 0xC019,
TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA = 0xC01A,
TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA = 0xC01B,
TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA = 0xC01C,
TLS_SRP_SHA_WITH_AES_128_CBC_SHA = 0xC01D,
TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA = 0xC01E,
TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA = 0xC01F,
TLS_SRP_SHA_WITH_AES_256_CBC_SHA = 0xC020,
TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA = 0xC021,
TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA = 0xC022,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024,
TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC025,
TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC026,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028,
TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 = 0xC029,
TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 = 0xC02A,
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B,
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C,
TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02D,
TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02E,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F,
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030,
TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 = 0xC031,
TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 = 0xC032,
TLS_ECDHE_PSK_WITH_RC4_128_SHA = 0xC033,
TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA = 0xC034,
TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA = 0xC035,
TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA = 0xC036,
TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 = 0xC037,
TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 = 0xC038,
TLS_ECDHE_PSK_WITH_NULL_SHA = 0xC039,
TLS_ECDHE_PSK_WITH_NULL_SHA256 = 0xC03A,
TLS_ECDHE_PSK_WITH_NULL_SHA384 = 0xC03B,
# RFC 6209
TLS_RSA_WITH_ARIA_128_CBC_SHA256 = 0xC03C,
TLS_RSA_WITH_ARIA_256_CBC_SHA384 = 0xC03D,
TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256 = 0xC03E,
TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384 = 0xC03F,
TLSDH_RSA_WITH_ARIA_128_CBC_SHA256 = 0xC040,
TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384 = 0xC041,
TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256 = 0xC042,
TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384 = 0xC043,
TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256 = 0xC044,
TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384 = 0xC045,
TLS_DH_ANON_WITH_ARIA_128_CBC_SHA256 = 0xC046,
TLS_DH_ANON_WITH_ARIA_256_CBC_SHA384 = 0xC047,
TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256 = 0xC048,
TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384 = 0xC049,
TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256 = 0xC04A,
TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384 = 0xC04B,
TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256 = 0xC04C,
TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384 = 0xC04D,
TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256 = 0xC04E,
TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384 = 0xC04F,
TLS_RSA_WITH_ARIA_128_GCM_SHA256 = 0xC050,
TLS_RSA_WITH_ARIA_256_GCM_SHA384 = 0xC051,
TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256 = 0xC052,
TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384 = 0xC053,
TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256 = 0xC054,
TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384 = 0xC055,
TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256 = 0xC056,
TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384 = 0xC057,
TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256 = 0xC058,
TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384 = 0xC059,
TLS_DH_ANON_WITH_ARIA_128_GCM_SHA256 = 0xC05A,
TLS_DH_ANON_WITH_ARIA_256_GCM_SHA384 = 0xC05B,
TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 = 0xC05C,
TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 = 0xC05D,
TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 = 0xC05E,
TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 = 0xC05F,
TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 = 0xC060,
TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 = 0xC061,
TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 = 0xC062,
TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 = 0xC063,
TLS_PSK_WITH_ARIA_128_CBC_SHA256 = 0xC064,
TLS_PSK_WITH_ARIA_256_CBC_SHA384 = 0xC065,
TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256 = 0xC066,
TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384 = 0xC067,
TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256 = 0xC068,
TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384 = 0xC069,
TLS_PSK_WITH_ARIA_128_GCM_SHA256 = 0xC06A,
TLS_PSK_WITH_ARIA_256_GCM_SHA384 = 0xC06B,
TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256 = 0xC06C,
TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384 = 0xC06D,
TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256 = 0xC06E,
TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384 = 0xC06F,
TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256 = 0xC070,
TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384 = 0xC071,
# RFC 6367
TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 = 0xC072,
TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 = 0xC073,
TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 = 0xC074,
TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 = 0xC075,
TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 = 0xC076,
TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 = 0xC077,
TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 = 0xC078,
TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 = 0xC079,
TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 = 0xC07A,
TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 = 0xC07B,
TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 = 0xC07C,
TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 = 0xC07D,
TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256 = 0xC07E,
TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384 = 0xC07F,
TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256 = 0xC080,
TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384 = 0xC081,
TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256 = 0xC082,
TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384 = 0xC083,
TLS_DH_ANON_WITH_CAMELLIA_128_GCM_SHA256 = 0xC084,
TLS_DH_ANON_WITH_CAMELLIA_256_GCM_SHA384 = 0xC085,
TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 = 0xC086,
TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 = 0xC087,
TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 = 0xC088,
TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 = 0xC089,
TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 = 0xC08A,
TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 = 0xC08B,
TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 = 0xC08C,
TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 = 0xC08D,
TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 = 0xC08E,
TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 = 0xC08F,
TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 = 0xC090,
TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 = 0xC091,
TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 = 0xC092,
TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 = 0xC093,
TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 = 0xC094,
TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 = 0xC095,
TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 = 0xC096,
TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 = 0xC097,
TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 = 0xC098,
TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 = 0xC099,
TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 = 0xC09A,
TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 = 0xC09B,
# RFC 6655
TLS_RSA_WITH_AES_128_CCM = 0xC09C,
TLS_RSA_WITH_AES_256_CCM = 0xC09D,
TLS_DHE_RSA_WITH_AES_128_CCM = 0xC09E,
TLS_DHE_RSA_WITH_AES_256_CCM = 0xC09F,
TLS_RSA_WITH_AES_128_CCM_8 = 0xC0A0,
TLS_RSA_WITH_AES_256_CCM_8 = 0xC0A1,
TLS_DHE_RSA_WITH_AES_128_CCM_8 = 0xC0A2,
TLS_DHE_RSA_WITH_AES_256_CCM_8 = 0xC0A3,
TLS_PSK_WITH_AES_128_CCM = 0xC0A4,
TLS_PSK_WITH_AES_256_CCM = 0xC0A5,
TLS_DHE_PSK_WITH_AES_128_CCM = 0xC0A6,
TLS_DHE_PSK_WITH_AES_256_CCM = 0xC0A7,
TLS_PSK_WITH_AES_128_CCM_8 = 0xC0A8,
TLS_PSK_WITH_AES_256_CCM_8 = 0xC0A9,
TLS_PSK_DHE_WITH_AES_128_CCM_8 = 0xC0AA,
TLS_PSK_DHE_WITH_AES_256_CCM_8 = 0xC0AB,
TLS_ECDHE_ECDSA_WITH_AES_128_CCM = 0xC0AC,
TLS_ECDHE_ECDSA_WITH_AES_256_CCM = 0xC0AD,
TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 = 0xC0AE,
TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 = 0xC0AF,
# draft-agl-tls-chacha20poly1305-02
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256_OLD = 0xCC13,
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256_OLD = 0xCC14,
TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256_OLD = 0xCC15,
# RFC 7905
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCA8,
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCA9,
TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCAA,
TLS_PSK_WITH_CHACHA20_POLY1305_SHA256 = 0xCCAB,
TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 = 0xCCAC,
TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 = 0xCCAD,
TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256 = 0xCCAE,
# draft-ietf-tls-ecdhe-psk-aead-05 & RFC8442
TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256 = 0xD001,
TLS_ECDHE_PSK_WITH_AES_256_GCM_SHA384 = 0xD002,
TLS_ECDHE_PSK_WITH_AES_128_CCM_8_SHA256 = 0xD003,
TLS_ECDHE_PSK_WITH_AES_128_CCM_SHA256_OLD = 0xD004,
TLS_ECDHE_PSK_WITH_AES_128_CCM_SHA256 = 0xD005,
};
type Share = unit {
# is the direction not the normal way round?
var flipped: bool;
var flip_already_alerted: bool;
# version as seen in server_hello (for signature and hash-alg choice)
var chosen_version_sh_outer: uint16;
# final negotiated version - can e.g. be used to distinguished tls 1.3
var negotiated_version: uint16;
# set to true if chosen version is identified as a tls 1.3 version
var tls_13: bool;
var chosen_cipher: uint16;
var ccs_seen: uint8;
var invalid_dtls_version_count: uint32;
# var skipping: bool;
var client_encrypted: bool;
var server_encrypted: bool;
var both_sides_encrypted_first_time: bool;
var established: bool;
var client_certificate_depth: uint32;
var server_certificate_depth: uint32;
};
function get_encrypted(sh: Share): bool {
if (get_direction(sh))
return sh.client_encrypted;
else
return sh.server_encrypted;
}
function startEncryption(handshakesink: sink&, alertsink: sink&, inout sh: Share) {
local old_state: bool;
if (get_direction(sh)) {
old_state = sh.client_encrypted;
sh.client_encrypted = True;
} else {
old_state = sh.server_encrypted;
sh.server_encrypted = True;
}
# let's see if it was not encrypted in the past....
if (old_state == False) {
# disconnect the sinks here? probably yes...
# print "Closing sink";
handshakesink.close();
alertsink.close();
if (sh.client_encrypted && sh.server_encrypted) {
# print "Encrypted first time";
sh.both_sides_encrypted_first_time = True;
sh.established = True;
}
}
}
# This function is called several times in certain circumstances.
# If it is called twice, it is first called due to the outer version in
# the server hello - and then again due to the supported_versions
# field in the server hello.
function set_version(version: uint16, inout sh: Share): bool {
sh.negotiated_version = version;
if (version == TLSv13 || version / 0xFF == 0x7F)
sh.tls_13 = True;
return True;
}
# check for partial connection - and at the moment just disable the analyzer
# in that case, for 1:1 equivalence with binpac.
function check_partial(): bool {
if (is_partial_tcp()) {
zeek::skip_input();
return True;
}
return False;
}
# public type TLSMessage = unit {
# %context = Share;
#
# m: Message(False);
# };
#
public type DTLSMessage = unit {
# %context = Share;
#
# m: Message(True);
: skip bytes &eod;
on %init {
zeek::skip_input();
# spicy::decline_input("No DTLS support");
}
};
public type Message = unit {
%context = Share;
sink handshakesink;
sink alertsink;
var record_version: uint16;
var dtls: bool = False;
var partial: bool = False;
var first_packet: bool = True; # needed for SSLv2, which sadly is quite stateful.
on %init {
self.handshakesink.connect(new Handshake(self, self.context()));
self.alertsink.connect(new Alert(self.context()));
self.partial = check_partial();
}
: skip bytes &eod if(self.partial);
fragment: RecordFragmentChoice(self.handshakesink, self.alertsink, self, self.context())[];
};
function is_dtls_version(version: uint16): bool {
if (version == DTLSv10 || version == DTLSv12)
return True;
return False;
}
# Determine if this is SSL or TLS.
type RecordFragmentChoice = unit(handshakesink: sink&, alertsink: sink&, inout msg: Message, inout sh: Share) {
firstbyte: uint8;
# 0x80 in the first byte is a pretty god clue that this is SSLv2 - it can't be anything newer.
# In theory, the SSLv2 header can also have a 0 there if using a 3-byte size field; we don't have
# any practical examples of that, and the old analyzer never supported it even in the times that SSLv2
# existed. So we are ignoring this here.
switch ((self.firstbyte & 0x80) == 0x80) {
True -> ssl2record: SSL2Record(self.firstbyte, msg, sh);
False -> fragment: TLSRecordFragmentChoice(self.firstbyte, handshakesink, alertsink, msg, sh);
};
};
type SSL2Record = unit(lengthone: uint8, inout msg: Message, inout sh: Share) {
lengthtwo: uint8;
var length: uint16;
on lengthtwo {
self.length = (cast<uint16>(lengthone) & 0x7F) << 8 | self.lengthtwo;
}
message_type: uint8;
switch (SSL2ProtocolMessages(self.message_type)) {
SSL2ProtocolMessages::ssl_client_hello -> client_hello: SSL2ClientHello(self.length, msg, sh) &max-size=self.length;
SSL2ProtocolMessages::ssl_server_hello -> server_hello: SSL2ServerHello(self.length, msg, sh) &max-size=self.length;
SSL2ProtocolMessages::ssl_client_master_key -> client_master_key: SSL2ClientMasterKey(self.length, sh);
SSL2ProtocolMessages::ssl_server_verify -> : skip bytes &size=self.length;
SSL2ProtocolMessages::ssl_request_certificate -> : skip bytes &size=self.length;
SSL2ProtocolMessages::ssl_client_certificate -> : skip bytes &size=self.length;
} if(get_encrypted(sh) == False);
: skip bytes &size=self.length if(get_encrypted(sh) == True);
on %done {
msg.first_packet = False;
}
on %init {
if (sh.negotiated_version != UNKNOWN_VERSION && sh.negotiated_version != SSLv2) {
spicy::decline_input("Late switch to SSLv2 record");
}
}
};
type SSL2ClientMasterKey = unit(length: uint16, inout sh: Share) {
: skip bytes &size=length;
on %init {
sh.client_encrypted = True;
sh.server_encrypted = True;
sh.established = True;
zeek::skip_input();
}
};
# For TLS-y protocols - determine how to continue
type TLSRecordFragmentChoice = unit(content_type: uint8, handshakesink: sink&, alertsink: sink&, inout msg: Message, inout sh: Share) {
# content_type: uint8; # &convert=ContentType($$);
version: uint16;
switch (is_dtls_version(self.version)) {
True -> dtlsfragment: DTLSRecordFragment(content_type, handshakesink, alertsink, msg, sh);
False -> tlsfragment: TLSRecordFragment(content_type, handshakesink, alertsink, msg, sh);
};
on version {
msg.record_version = self.version;
if (is_dtls_version(self.version)) {
msg.dtls = True;
}
}
};
type TLSRecordFragment = unit(content_type: uint8, handshakesink: sink&, alertsink: sink&, inout msg: Message, inout sh: Share) {
record: PlaintextRecord(content_type, handshakesink, alertsink, msg, sh);
};
type DTLSRecordFragment = unit(content_type: uint8, handshakesink: sink&, alertsink: sink&, inout msg: Message, inout sh: Share) {
# the epoch signalizes that a changecipherspec message has been received. Hence, everything with
# an epoch > 0 should be encrypted
epoch: uint16;
sequence_number: bytes &size=6; # uint48
record: PlaintextRecord(content_type, handshakesink, alertsink, msg, sh);
};
type PlaintextRecord = unit(content_type: uint8, handshakesink: sink&, alertsink: sink&, inout msg: Message, inout sh: Share) {
var encrypted: bool;
length: uint16 {
self.encrypted = determine_encryption_on(self, content_type, handshakesink, alertsink, sh);
}
# convenient triggers to hang stuff in the evt file from. Two of them for event ordering :)
trigger_zero: void;
trigger_one: void;
switch (ContentType(content_type)) {
ContentType::handshake -> : bytes &size=self.length -> handshakesink;
ContentType::application_data -> {
switch (self.encrypted) {
False -> appdata: bytes &size=self.length;
True -> : skip bytes &size=self.length;
};
}
ContentType::change_cipher_spec -> ccs: bytes &size=self.length;
ContentType::heartbeat -> hn: Heartbeat(sh, self.length);
ContentType::alert -> : bytes &size=self.length -> alertsink;
* -> unhandled: skip bytes &size=self.length;
};
trigger_two: void;
on ccs {
# I know this looks a bit weird. Basically - in TLS 1.3, CCS is meaningless
# fluff that just is used to pretend to TLS 1.2 devices listening in that
# yes, this is TLS. Since we want to know which packets come after this,
# and since we do have special handling for TLS 1.3 - let's ignore it in
# that case.
if (sh.tls_13)
return;
# print "CCS accepted";
sh.ccs_seen++; # used in TLS.evt
startEncryption(handshakesink, alertsink, sh);
}
on trigger_two {
if (sh.both_sides_encrypted_first_time && content_type != 20)
sh.both_sides_encrypted_first_time = False;
}
};
## So - this falls a bit under the envelope of dirty hack - but I don't
## really have a better idea. This function determines if a packet should
## be handled as an encrypted or as a plaintext packet.
##
## For TLS 1.2 and below - this is relatively straightforward. Everything
## that arrives before CCS (Change Cipher Spec) is a plaintext record. And
## everything that arrives after CCS will be encrypted.
##
## TLS 1.3, however, messes this up a bunch. Some clients still choose to
## send a CCS message. The message, however, is pretty much meaningless
## from a protocol perspective - and just ignored by the other side. Also -
## it is not necessary to send it and some implementations just don't.
##
## So - what we do here is that we enable the encrypted flag when we get
## the first application data in a connection that negotiated TLS 1.3.
##
## This is correct insofar as the packet will be encrypted. We sadly loose
## a bit of context here - we can't really say when we get the first packet
## that uses the final cryptographic key material - and will contain content
## data. We just don't have that information available in TLS 1.3 anymore.
##
## Currently this returns True if the connection is encrypted, or in an otherwise
## unclear state (e.g. no known version for the connection), and False if the
## packet should be in plaintext
function determine_encryption_on(pr: PlaintextRecord, content_type: uint8, handshakesink: sink&, alertsink: sink&, inout sh: Share): bool {
if (get_encrypted(sh))
return True;
## let's ignore 0-length packets
if (pr.length == 0)
return False;
if (content_type != 23) # application_data
return False;
## in theory, we should check for TLS13 or draft-TLS13 instead of doing the reverse.
## But - people use weird version numbers. And all of those weird version numbers are
## some sort of TLS1.3. So - let's do it this way round instead.
if (sh.tls_13) {
startEncryption(handshakesink, alertsink, sh);
return True;
}
return False;
}
type Heartbeat = unit(sh: Share, length: uint16) {
tpe: uint8;
payload_length: uint16; # don't trust this one - there might still be people testing.
data: bytes &size=(length - 3);
};
# note - this will mostly be garbage because it is encrypted.
public type Alert = unit(sh: Share&) {
alerts: Alert_message(sh)[];
};
type Alert_message = unit(sh: Share&) {
level: uint8; # &convert=AlertLevel($$);
description: uint8; # &convert=AlertDescription($$);
};
type Handshake = unit(inout msg: Message, sh: Share&) {
handshakes: Handshake_message(msg, sh)[];
};
type Handshake_message = unit(inout msg: Message, inout sh: Share) {
msg_type: uint8;
# msg_type: uint8 &parse-from=self.msg_type_raw &convert=HandshakeType($$);
# msg_type: uint8 &convert=HandshakeType($$);
length: bytes &size=3 &convert=$$.to_uint(spicy::ByteOrder::Network);
# TODO: in theory, we need a reassembly step here for DTLS...
fragment_offset: bytes &size=3 &convert=$$.to_uint(spicy::ByteOrder::Network) if(msg.dtls);
fragment_length: bytes &size=3 &convert=$$.to_uint(spicy::ByteOrder::Network) if(msg.dtls);
# This indirection in a way seems a bit unnecessary, but I don't se a nice way around it.
# We need to make sure that the length of the inner message cannot extend beyond the length
# of this message. In binpac we did this by attaching an &size field to the unit that self-referred
# to itself.
switch (HandshakeType(self.msg_type)) {
HandshakeType::hello_request -> hr: HelloRequest(sh) &max-size=self.length;
HandshakeType::client_hello -> client_hello: ClientHello(self.length, msg, sh) &max-size=self.length;
HandshakeType::server_hello_done -> : bytes &size=self.length; # TODO: raise error if != 0
HandshakeType::hello_verify_request -> hello_verify_request: HelloVerifyRequest &max-size=self.length;
HandshakeType::server_hello -> server_hello: ServerHelloChoice(self.length, msg, sh) &max-size=self.length;
HandshakeType::certificate -> certificate: Certificate(sh) &max-size=self.length;
HandshakeType::certificate_request -> certificate_request: CertificateRequest(sh) &max-size=self.length;
HandshakeType::certificate_verify -> : bytes &size=self.length; # opaque encrypted data
HandshakeType::client_key_exchange -> client_key_exchange: ClientKeyExchange(sh, self.length) &max-size=self.length;
HandshakeType::server_key_exchange -> server_key_exchange: ServerKeyExchange(sh, self.length) &max-size=self.length;
HandshakeType::NewSessionTicket -> session_ticket: NewSessionTicket &max-size=self.length;
HandshakeType::certificate_status -> certificate_status: CertificateStatus &max-size=self.length;
* -> unhandled: skip bytes &size=self.length;
};
};
type HelloRequest = unit(inout sh: Share) {
# empty
direction_check: DirectionCheck(sh, False); # should be sent by responder
};
type DirectionCheck = unit(inout sh: Share, desired: bool) {
var was_flipped: bool;
on %init {
self.was_flipped = check_direction(sh, desired);
}
};
type CertificateRequest = unit(sh: Share) {
certificate_types_len: uint8;
certificate_types: uint8[self.certificate_types_len];
switch (uses_signature_and_hashalgorithm(sh)) {
True -> supported_signature_algorithms: SignatureAlgorithms(sh);
False -> : bytes &size=0;
};
certificate_authorities_len: uint16;
certificate_authorities: CertificateAuthority[] &size=self.certificate_authorities_len &convert=convert_certificate_authorities($$);
};
type CertificateAuthority = unit {
certificate_authority_len: uint16;
certificate_authority: bytes &size=self.certificate_authority_len;
};
type HelloVerifyRequest = unit {
version: uint16;
cookie_length: uint8;
cookie: bytes &size=self.cookie_length;
};
type CertificateStatus = unit {
status_type: uint8; # 1 = ocsp, everything else is undefined
length: bytes &size=3 &convert=$$.to_uint(spicy::ByteOrder::Network);
response: bytes &size=self.length;
on %done {
if (self.status_type == 1) {
zeek::file_begin("application/ocsp-response", get_ocsp_fuid());
zeek::file_data_in(self.response);
zeek::file_end();
}
}
};
type Random = unit {
gmt_unix_time: uint32;
random_bytes: bytes &size=28;
};
type ClientHelloCookie = unit {
cookie_len: uint8;
cookie: bytes &size=self.cookie_len;
};
type uint24 = unit {
a: bytes &size=3;
} &convert=$$.a.to_uint(spicy::ByteOrder::Big);
type SSL2ClientHello = unit(len: uint64, msg: Message, inout sh: Share) {
direction_check: DirectionCheck(sh, True); # should be sent by originator
client_version: uint16;
ciphers_len: uint16;
session_len: uint16;
chal_len: uint16;
ciphers: uint24[self.ciphers_len / 3];
session_id: bytes &size=self.session_len;
challenge: bytes &size=self.chal_len;
on client_version {
if (self.client_version != SSLv2 && self.client_version != SSLv3 && self.client_version != TLSv10 && self.client_version != TLSv11 && self.client_version != TLSv12) {
spicy::decline_input("Invalid version in SSL client hello. Version: %s, self.client_version"); # Version: " + self.client_version);
zeek::skip_input();
}
}
on %init {
if (msg.first_packet == False) {
spicy::decline_input("SSLv2 client hello late in connection");
}
}
};
type SSL2ServerHello = unit(len: uint64, msg: Message, inout sh: Share) {
direction_check: DirectionCheck(sh, False); # should be sent by responder
session_id_hit: uint8 &requires=($$ < 2);
certificate_type: uint8 &requires=($$ == 1); # X509 certificate
server_version: uint16 &requires=($$ == 2); # Has to be version 2, everything else uses new server hello format
cert_len: uint16;
ciphers_len: uint16;
conn_id_len: uint16;
cert_data: bytes &size=self.cert_len;
ciphers: uint24[self.ciphers_len / 3];
conn_id_data: bytes &size=self.conn_id_len;
on %init {
if (msg.first_packet == False) {
spicy::decline_input("SSLv2 server hello late in connection");
}
}
on %done {
sh.chosen_version_sh_outer = self.server_version;
set_version(self.server_version, sh);
zeek::file_begin("application/x-x509-user-cert", get_certificate_fuid(get_direction(sh), get_and_increase_certificate_depth(sh)));
zeek::file_data_in(self.cert_data);
zeek::file_end();
}
};
type ClientHello = unit(len: uint64, msg: Message, inout sh: Share) {
direction_check: DirectionCheck(sh, True); # should be sent by originator
client_version: uint16;
random: Random;
session_id_length: uint8;
session_id: bytes &size=self.session_id_length;
dtls_cookie: ClientHelloCookie if(self.client_version == DTLSv10 || self.client_version == DTLSv12);
cipher_suites_length: uint16;
cipher_suites: uint16[self.cipher_suites_length / 2];
compression_methods_length: uint8;
compression_methods: uint8[self.compression_methods_length];
extensions_length: uint16 if(len > self.offset() + 2);
extensions: Extension(sh, True)[] &size=self.extensions_length if(len > self.offset() + 2);
};
# Draft versions of TLS 1.3 had a different server hello - distinguish here
type ServerHelloChoice = unit(len: uint64, msg: Message, inout sh: Share) {
direction_check: DirectionCheck(sh, False); # should be sent by responder
sv: bitfield(16) {
server_version0: 0..7;
server_version1: 8..15;
server_version: 0..15;
} {
# print "Got server version", self.sv.server_version0, self.sv.server_version1, self.sv.server_version;
sh.chosen_version_sh_outer = self.sv.server_version;
set_version(self.sv.server_version, sh);
# print "set chosen version", self.sv.server_version, sh.chosen_version_sh_outer;
if (self.sv.server_version1 == 0x7F) {
# print "TLS 13 draft";
# map any draft version to draft 00
self.negotiated_version = 0x7F00;
} else {
self.negotiated_version = self.sv.server_version;
}
}
var negotiated_version: uint16;
switch (self.negotiated_version) {
TLSv13,
TLSv13_draft,
0x7F00 -> sh_one_three: ServerHelloOneThree(len, msg, sh, self.sv.server_version);
* -> sh_normal: ServerHello(len, msg, sh, self.sv.server_version);
};
};
# Draft versions of TLS 1.3 had a different server hello.
type ServerHelloOneThree = unit(len: uint64, msg: Message, inout sh: Share, server_version: uint16) {
random_bytes: bytes &size=32;
gmt_unix_time: uint32 &parse-from=self.random_bytes;
cipher_suite: uint16;
extensions_length: uint16 if(len > self.offset() + 2);
extensions: Extension(sh, False)[] &size=self.extensions_length if(len > self.offset() + 2);
on cipher_suite {
sh.chosen_cipher = self.cipher_suite;
# print "set chosen cipher", self.cipher_suite, sh.chosen_cipher;
}
};
type ServerHello = unit(len: uint64, msg: Message, inout sh: Share, server_version: uint16) {
random_bytes: bytes &size=32;
gmt_unix_time: uint32 &parse-from=self.random_bytes;
session_id_length: uint8;
session_id: bytes &size=self.session_id_length;
cipher_suite: uint16;
compression_method: uint8;
extensions_length: uint16 if(len > self.offset() + 2);
extensions: Extension(sh, False)[] &size=self.extensions_length if(len > self.offset() + 2);
on cipher_suite {
sh.chosen_cipher = self.cipher_suite;
# print "set chosen cipher", self.cipher_suite, sh.chosen_cipher;
}
};
type Extension = unit(inout sh: Share, client_hello: bool) {
code: uint16;
length: uint16;
# position is re-set, just after parsing raw, so that the remainder of the unit can parse the raw data.
# raw data is needed for an event.
raw: bytes &size=self.length;
switch (Extensions(self.code)) {
# Extensions::next_protocol_negotiation -> :bytes &size=self.extension_size; # alert if != 0
Extensions::ec_point_formats -> ec_point_formats: EcPointsFormat_extension(sh) &max-size=self.length if(self.length > 0);
Extensions::supported_groups -> elliptic_curves: EllipticCurveList(sh) &max-size=self.length if(self.length > 0);
Extensions::SessionTicket_TLS -> ticket_data: bytes &size=self.length; # ticket data
Extensions::heartbeat -> heartbeat: uint8 &convert=HeartbeatMode($$) &max-size=self.length if(self.length > 0);
Extensions::signature_algorithms -> signature_algorithms: SignatureAlgorithms(sh) &max-size=self.length if(self.length > 0);
Extensions::renegotiation_info -> renegotiation_info: RenegotiationInfo &max-size=self.length if(self.length > 0);
Extensions::server_name -> server_name: ServerNameList(sh) &max-size=self.length if(self.length > 0);
Extensions::application_layer_protocol_negotiation -> application_layer_protocol_negotiation: ProtocolNameList(sh) &max-size=self.length if(self.length > 0);
Extensions::status_request -> status_request: StatusRequest(self.length) &max-size=self.length if(self.length > 0);
Extensions::signed_certificate_timestamp -> signed_certificate_timestamp: SignedCertificateTimestampList(sh) &max-size=self.length if(self.length > 0);
Extensions::key_share_old -> key_share_old: KeyShare(client_hello, sh, self.length) &max-size=self.length if(self.length > 0);
Extensions::key_share -> key_share: KeyShare(client_hello, sh, self.length) &max-size=self.length if(self.length > 0);
Extensions::supported_versions -> supported_versions: SupportedVersionsSelector(sh, client_hello) &max-size=self.length if(self.length > 0);
Extensions::psk_key_exchange_modes -> psk_key_exchange_modes: PSKKeyExchangeModes(sh) &max-size=self.length if(self.length > 0);
Extensions::pre_shared_key -> pre_shared_key: PreSharedKey(sh, client_hello) &max-size=self.length if(self.length > 0);
* -> unknown: bytes &size=self.length;
};
on raw {
self.set_input(self.input() + 4);
}
};
type SelectedPreSharedKeyIdentity = unit(sh: Share) {
selected_identity: uint16;
};
type PSKIdentity = unit {
length: uint16;
identity: bytes &size=self.length;
obfuscated_ticket_age: uint32;
};
type PSKIdentitiesList = unit {
length: uint16;
identities: PSKIdentity[] &size=self.length;
};
type PSKBinder = unit {
length: uint8;
binder: bytes &size=self.length;
};
type PSKBindersList = unit {
length: uint16;
binders: PSKBinder[] &size=self.length;
};
type OfferedPsks = unit(sh: Share) {
identities: PSKIdentitiesList &convert=convert_identities($$);
binders: PSKBindersList &convert=convert_binders($$);
};
type PreSharedKey = unit(sh: Share, client_hello: bool) {
switch (client_hello) {
True -> offered_psks: OfferedPsks(sh);
False -> selected_identity: SelectedPreSharedKeyIdentity(sh);
};
};
type PSKKeyExchangeModes = unit(sh: Share) {
length: uint8;
modes: uint8[self.length];
};
type SupportedVersionsSelector = unit(inout sh: Share, client_hello: bool) {
switch (client_hello) {
True -> a: SupportedVersions(sh);
False -> b: OneSupportedVersion(sh);
};
};
type SupportedVersions = unit(sh: Share) {
length: uint8;
versions: uint16[self.length / 2];
};
# If the server sends it, this is the authoritative version. Set it.
type OneSupportedVersion = unit(inout sh: Share) {
version: uint16;
on version {
# print "Setting version to ", self.version;
set_version(self.version, sh);
}
};
type KeyShareEntry = unit {
namedgroup: uint16;
key_exchange_length: uint16;
key_exchange: bytes &size=self.key_exchange_length;
};
type ServerHelloKeyShare = unit(sh: Share) {
keyshare: KeyShareEntry;
};
type HelloRetryRequestKeyShare = unit(sh: Share) {
namedgroup: uint16;
};
type ServerHelloKeyShareChoice = unit(sh: Share, length: uint16) {
switch (length) {
2 -> hrr: HelloRetryRequestKeyShare(sh);
* -> server: ServerHelloKeyShare(sh);
};
};
type ClientHelloKeyShare = unit(sh: Share) {
length: uint16;
keyshares: KeyShareEntry[] &size=self.length;
var named_groups: vector<uint16>;
on keyshares {
self.named_groups = convert_clienthellokeyshare(self.keyshares);
}
};
type KeyShare = unit(client_hello: bool, sh: Share, length: uint16) {
switch (client_hello) {
True -> client_hello_keyshare: ClientHelloKeyShare(sh);
False -> server_hello_keyshare: ServerHelloKeyShareChoice(sh, length);
};
};
type SignedCertificateTimestampList = unit(sh: Share) {
length: uint16;
SCTs: SignedCertificateTimestamp(sh)[] &size=self.length;
};
type SignedCertificateTimestamp = unit(sh: Share) {
# before - framing
length: uint16;
# from here: SignedCertificateTimestamp
version: uint8;
logid: bytes &size=32;
timestamp: uint64;
extensions_length: uint16; # extensions are not actually defined yet, so we cannot parse them
extensions: bytes &size=self.extensions_length;
digitally_signed_algorithms: SignatureAndHashAlgorithm;
digitally_signed_signature_length: uint16;
digitally_signed_signature: bytes &size=self.digitally_signed_signature_length;
};
type StatusRequest = unit(len: uint16) {
status_type: uint8; # 1 -> ocsp.
switch (self.status_type) {
1 -> {
responder_id_list_length: uint16;
responder_id_list: bytes &size=self.responder_id_list_length;
request_extensions_list: uint16;
request_extensions: bytes &size=self.request_extensions_list; # asn1 encoded
}
* -> : bytes &size=(len - 1); # we do not know this type...
};
};
type ProtocolName = unit {
length: uint8;
name: bytes &size=self.length;
};
type ProtocolNameList = unit(sh: Share) {
length: uint16;
protocol_name_list: ProtocolName[] &size=self.length &convert=convert_protocol_name_list($$);
};
type ServerName = unit {
name_type: uint8 &convert=NameType($$);
switch (self.name_type) {
NameType::host_name -> {
host_name_length: uint16;
host_name: bytes &size=self.host_name_length;
}
* -> : bytes &eod; # just swallow everything. This is not optimal, but... well, there is not much to be done.
};
};
type ServerNameList = unit(sh: Share) {
length: uint16;
server_name_list: ServerName[] &size=self.length &convert=SSL::convert_server_names($$);
};
type EcPointsFormat_extension = unit(sh: Share) {
length: uint8;
ec_point_format_list: uint8[self.length];
};
type EllipticCurveList = unit(sh: Share) {
length: uint16;
elliptic_curve_list: uint16[self.length / 2]; # when possible - convert to enum
};
type SignatureAndHashAlgorithm = unit {
hash: uint8; # &convert=HashAlgorithm($$);
signature: uint8; # &convert=SignatureAlgorithm($$);
};
type SignatureAlgorithms = unit(sh: Share) {
length: uint16;
supported_signature_algorithms: SignatureAndHashAlgorithm[] &size=self.length;
var supported_signature_algorithms_converted: vector<tuple<uint8, uint8>>;
on supported_signature_algorithms {
self.supported_signature_algorithms_converted = convert_signature_algorithms(self.supported_signature_algorithms);
}
};
type RenegotiationInfo = unit {
length: uint8;
renegotiated_connection: bytes &size=self.length;
};
# The server key exchange contains the server public key exchange values, and a
# signature over those values for non-anonymous exchanges. The server key
# exchange messages is only sent for ECDHE, ECDH-anon, DHE, and DH-anon cipher
# suites.
type ServerKeyExchange = unit(sh: Share, len: uint64) {
switch (TLSCiphers(sh.chosen_cipher)) {
# ECDHE suites
TLSCiphers::TLS_ECDHE_ECDSA_WITH_NULL_SHA,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
TLSCiphers::TLS_ECDHE_RSA_WITH_NULL_SHA,
TLSCiphers::TLS_ECDHE_RSA_WITH_RC4_128_SHA,
TLSCiphers::TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
TLSCiphers::TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
TLSCiphers::TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
TLSCiphers::TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
TLSCiphers::TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
TLSCiphers::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLSCiphers::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
TLSCiphers::TLS_ECDHE_PSK_WITH_RC4_128_SHA,
TLSCiphers::TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA,
TLSCiphers::TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA,
TLSCiphers::TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA,
TLSCiphers::TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256,
TLSCiphers::TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384,
TLSCiphers::TLS_ECDHE_PSK_WITH_NULL_SHA,
TLSCiphers::TLS_ECDHE_PSK_WITH_NULL_SHA256,
TLSCiphers::TLS_ECDHE_PSK_WITH_NULL_SHA384,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384,
TLSCiphers::TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256,
TLSCiphers::TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384,
TLSCiphers::TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256,
TLSCiphers::TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384,
TLSCiphers::TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256,
TLSCiphers::TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384,
TLSCiphers::TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,
TLSCiphers::TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384,
TLSCiphers::TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256,
TLSCiphers::TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384,
TLSCiphers::TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256,
TLSCiphers::TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_128_CCM,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_256_CCM,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8,
TLSCiphers::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256_OLD,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256_OLD,
TLSCiphers::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
TLSCiphers::TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256,
TLSCiphers::TLS_ECDHE_PSK_WITH_AES_256_GCM_SHA384,
TLSCiphers::TLS_ECDHE_PSK_WITH_AES_128_CCM_8_SHA256,
TLSCiphers::TLS_ECDHE_PSK_WITH_AES_128_CCM_SHA256 -> ecdhe_server_key_exchange: EcdheServerKeyExchange(len, sh);
# ECDH-anon suites
TLSCiphers::TLS_ECDH_ANON_WITH_NULL_SHA,
TLSCiphers::TLS_ECDH_ANON_WITH_RC4_128_SHA,
TLSCiphers::TLS_ECDH_ANON_WITH_3DES_EDE_CBC_SHA,
TLSCiphers::TLS_ECDH_ANON_WITH_AES_128_CBC_SHA,
TLSCiphers::TLS_ECDH_ANON_WITH_AES_256_CBC_SHA
# ECDH non-anon suites do not send a ServerKeyExchange
-> ecdh_anon_server_key_exchange: EcdhAnonServerKeyExchange(len);
# DHE suites
TLSCiphers::TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA,
TLSCiphers::TLS_DHE_DSS_WITH_DES_CBC_SHA,
TLSCiphers::TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,
TLSCiphers::TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,
TLSCiphers::TLS_DHE_RSA_WITH_DES_CBC_SHA,
TLSCiphers::TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,
TLSCiphers::TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
TLSCiphers::TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
TLSCiphers::TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
TLSCiphers::TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
TLSCiphers::TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,
TLSCiphers::TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA,
TLSCiphers::TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,
TLSCiphers::TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA,
TLSCiphers::TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA,
TLSCiphers::TLS_DHE_DSS_WITH_RC4_128_SHA,
TLSCiphers::TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,
TLSCiphers::TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,
TLSCiphers::TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,
TLSCiphers::TLS_DHE_DSS_WITH_3DES_EDE_CBC_RMD,
TLSCiphers::TLS_DHE_DSS_WITH_AES_128_CBC_RMD,
TLSCiphers::TLS_DHE_DSS_WITH_AES_256_CBC_RMD,
TLSCiphers::TLS_DHE_RSA_WITH_3DES_EDE_CBC_RMD,
TLSCiphers::TLS_DHE_RSA_WITH_AES_128_CBC_RMD,
TLSCiphers::TLS_DHE_RSA_WITH_AES_256_CBC_RMD,
TLSCiphers::TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA,
TLSCiphers::TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,
TLSCiphers::TLS_DHE_PSK_WITH_RC4_128_SHA,
TLSCiphers::TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA,
TLSCiphers::TLS_DHE_PSK_WITH_AES_128_CBC_SHA,
TLSCiphers::TLS_DHE_PSK_WITH_AES_256_CBC_SHA,
TLSCiphers::TLS_DHE_DSS_WITH_SEED_CBC_SHA,
TLSCiphers::TLS_DHE_RSA_WITH_SEED_CBC_SHA,
TLSCiphers::TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
TLSCiphers::TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
TLSCiphers::TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,
TLSCiphers::TLS_DHE_DSS_WITH_AES_256_GCM_SHA384,
TLSCiphers::TLS_DHE_PSK_WITH_AES_128_GCM_SHA256,
TLSCiphers::TLS_DHE_PSK_WITH_AES_256_GCM_SHA384,
TLSCiphers::TLS_DHE_PSK_WITH_AES_128_CBC_SHA256,
TLSCiphers::TLS_DHE_PSK_WITH_AES_256_CBC_SHA384,
TLSCiphers::TLS_DHE_PSK_WITH_NULL_SHA256,
TLSCiphers::TLS_DHE_PSK_WITH_NULL_SHA384,
TLSCiphers::TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256,
TLSCiphers::TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,
TLSCiphers::TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256,
TLSCiphers::TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256,
TLSCiphers::TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256,
TLSCiphers::TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384,
TLSCiphers::TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256,
TLSCiphers::TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384,
TLSCiphers::TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256,
TLSCiphers::TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384,
TLSCiphers::TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256,
TLSCiphers::TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384,
TLSCiphers::TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256,
TLSCiphers::TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384,
TLSCiphers::TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256,
TLSCiphers::TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384,
TLSCiphers::TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256,
TLSCiphers::TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384,
TLSCiphers::TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256,
TLSCiphers::TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384,
TLSCiphers::TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256,
TLSCiphers::TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384,
TLSCiphers::TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256,
TLSCiphers::TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384,
TLSCiphers::TLS_DHE_RSA_WITH_AES_128_CCM,
TLSCiphers::TLS_DHE_RSA_WITH_AES_256_CCM,
TLSCiphers::TLS_DHE_RSA_WITH_AES_128_CCM_8,
TLSCiphers::TLS_DHE_RSA_WITH_AES_256_CCM_8,
TLSCiphers::TLS_DHE_PSK_WITH_AES_128_CCM,
TLSCiphers::TLS_DHE_PSK_WITH_AES_256_CCM,
TLSCiphers::TLS_PSK_DHE_WITH_AES_128_CCM_8,
TLSCiphers::TLS_PSK_DHE_WITH_AES_256_CCM_8,
TLSCiphers::TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256_OLD,
TLSCiphers::TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
TLSCiphers::TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 -> dhe_server_key_exchange: DheServerKeyExchange(sh);
# DH-anon suites
TLSCiphers::TLS_DH_ANON_EXPORT_WITH_RC4_40_MD5,
TLSCiphers::TLS_DH_ANON_WITH_RC4_128_MD5,
TLSCiphers::TLS_DH_ANON_EXPORT_WITH_DES40_CBC_SHA,
TLSCiphers::TLS_DH_ANON_WITH_DES_CBC_SHA,
TLSCiphers::TLS_DH_ANON_WITH_3DES_EDE_CBC_SHA,
TLSCiphers::TLS_DH_ANON_WITH_AES_128_CBC_SHA,
TLSCiphers::TLS_DH_ANON_WITH_AES_256_CBC_SHA,
TLSCiphers::TLS_DH_ANON_WITH_CAMELLIA_128_CBC_SHA,
TLSCiphers::TLS_DH_ANON_WITH_AES_128_CBC_SHA256,
TLSCiphers::TLS_DH_ANON_WITH_AES_256_CBC_SHA256,
TLSCiphers::TLS_DH_ANON_WITH_CAMELLIA_256_CBC_SHA,
TLSCiphers::TLS_DH_ANON_WITH_SEED_CBC_SHA,
TLSCiphers::TLS_DH_ANON_WITH_AES_128_GCM_SHA256,
TLSCiphers::TLS_DH_ANON_WITH_AES_256_GCM_SHA384,
TLSCiphers::TLS_DH_ANON_WITH_CAMELLIA_128_CBC_SHA256,
TLSCiphers::TLS_DH_ANON_WITH_CAMELLIA_256_CBC_SHA256,
TLSCiphers::TLS_DH_ANON_WITH_ARIA_128_CBC_SHA256,
TLSCiphers::TLS_DH_ANON_WITH_ARIA_256_CBC_SHA384,
TLSCiphers::TLS_DH_ANON_WITH_ARIA_128_GCM_SHA256,
TLSCiphers::TLS_DH_ANON_WITH_ARIA_256_GCM_SHA384,
TLSCiphers::TLS_DH_ANON_WITH_CAMELLIA_128_GCM_SHA256,
TLSCiphers::TLS_DH_ANON_WITH_CAMELLIA_256_GCM_SHA384
# DH non-anon suites do not send a ServerKeyExchange
-> dh_anon_server_key_exchange: DhAnonServerKeyExchange(len);
* -> key: bytes &size=len;
};
};
# Parse an ECDHE ServerKeyExchange message, which contains a signature over the
# parameters. Parsing explicit curve parameters from the server is not
# currently supported.
type EcdheServerKeyExchange = unit(len: uint64, sh: Share) {
curve_type: uint8;
switch (ECCurveType(self.curve_type)) {
ECCurveType::NAMED_CURVE -> {
params: ServerECDHParamsAndSignature;
signed_params: ServerKeyExchangeSignature(sh);
}
* -> : bytes &size=len - 1;
};
};
public function uses_signature_and_hashalgorithm(sh: Share): bool {
# larger TLS11 and not DTLSv10
if (sh.chosen_version_sh_outer > TLSv11 && sh.chosen_version_sh_outer != DTLSv10)
return True;
return False;
}
type ServerKeyExchangeSignature = unit(sh: Share) {
switch (uses_signature_and_hashalgorithm(sh)) {
True -> algorithm: SignatureAndHashAlgorithm;
False -> : bytes &size=0;
};
signature_length: uint16;
signature: bytes &size=self.signature_length;
};
# Parse an ECDH-anon ServerKeyExchange message, which does not contain a
# signature over the parameters. Parsing explicit curve parameters from the
# server is not currently supported.
type EcdhAnonServerKeyExchange = unit(len: uint64) {
curve_type: uint8;
switch (ECCurveType(self.curve_type)) {
ECCurveType::NAMED_CURVE -> params: ServerECDHParamsAndSignature;
* -> : bytes &size=len - 1;
};
};
type ServerECDHParamsAndSignature = unit {
curve: uint16;
point_length: uint8;
point: bytes &size=self.point_length;
};
# Parse a DHE ServerKeyExchange message, which contains a signature over the
# parameters.
type DheServerKeyExchange = unit(sh: Share) {
dh_p_length: uint16;
dh_p: bytes &size=self.dh_p_length;
dh_g_length: uint16;
dh_g: bytes &size=self.dh_g_length;
dh_Ys_length: uint16;
dh_Ys: bytes &size=self.dh_Ys_length;
signed_params: ServerKeyExchangeSignature(sh);
};
# Parse a DH-anon ServerKeyExchange message, which does not contain a
# signature over the parameters.
type DhAnonServerKeyExchange = unit(len: uint64) {
dh_p_length: uint16;
dh_p: bytes &size=self.dh_p_length;
dh_g_length: uint16;
dh_g: bytes &size=self.dh_g_length;
dh_Ys_length: uint16;
dh_Ys: bytes &size=self.dh_Ys_length;
data: bytes &size=len - (2 + self.dh_p_length + 2 + self.dh_g_length + 2 + self.dh_Ys_length);
};
# Parse a ClientKeyExchange message. For RSA cipher suites, this consists of an
# encrypted pre-master secret. For DH, DH-anon, and DHE cipher suites, this
# consists of the client public finite-field Diffie-Hellman value. For ECDH,
# ECDH-anon, and ECDHE cipher suites, this consists of the client public
# elliptic curve point.
type ClientKeyExchange = unit(sh: Share, len: uint64) {
switch (TLSCiphers(sh.chosen_cipher)) {
# RSA suites
TLSCiphers::TLS_RSA_WITH_NULL_MD5,
TLSCiphers::TLS_RSA_WITH_NULL_SHA,
TLSCiphers::TLS_RSA_EXPORT_WITH_RC4_40_MD5,
TLSCiphers::TLS_RSA_WITH_RC4_128_MD5,
TLSCiphers::TLS_RSA_WITH_RC4_128_SHA,
TLSCiphers::TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5,
TLSCiphers::TLS_RSA_WITH_IDEA_CBC_SHA,
TLSCiphers::TLS_RSA_EXPORT_WITH_DES40_CBC_SHA,
TLSCiphers::TLS_RSA_WITH_DES_CBC_SHA,
TLSCiphers::TLS_RSA_WITH_3DES_EDE_CBC_SHA,
TLSCiphers::TLS_RSA_WITH_AES_128_CBC_SHA,
TLSCiphers::TLS_RSA_WITH_AES_256_CBC_SHA,
TLSCiphers::TLS_RSA_WITH_NULL_SHA256,
TLSCiphers::TLS_RSA_WITH_AES_128_CBC_SHA256,
TLSCiphers::TLS_RSA_WITH_AES_256_CBC_SHA256,
TLSCiphers::TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,
TLSCiphers::TLS_RSA_EXPORT1024_WITH_RC4_56_MD5,
TLSCiphers::TLS_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5,
TLSCiphers::TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA,
TLSCiphers::TLS_RSA_EXPORT1024_WITH_RC4_56_SHA,
TLSCiphers::TLS_RSA_WITH_3DES_EDE_CBC_RMD,
TLSCiphers::TLS_RSA_WITH_AES_128_CBC_RMD,
TLSCiphers::TLS_RSA_WITH_AES_256_CBC_RMD,
TLSCiphers::TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,
TLSCiphers::TLS_RSA_PSK_WITH_RC4_128_SHA,
TLSCiphers::TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA,
TLSCiphers::TLS_RSA_PSK_WITH_AES_128_CBC_SHA,
TLSCiphers::TLS_RSA_PSK_WITH_AES_256_CBC_SHA,
TLSCiphers::TLS_RSA_WITH_SEED_CBC_SHA,
TLSCiphers::TLS_RSA_WITH_AES_128_GCM_SHA256,
TLSCiphers::TLS_RSA_WITH_AES_256_GCM_SHA384,
TLSCiphers::TLS_RSA_PSK_WITH_AES_128_CBC_SHA256,
TLSCiphers::TLS_RSA_PSK_WITH_AES_256_CBC_SHA384,
TLSCiphers::TLS_RSA_PSK_WITH_NULL_SHA256,
TLSCiphers::TLS_RSA_PSK_WITH_NULL_SHA384,
TLSCiphers::TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256,
TLSCiphers::TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256,
TLSCiphers::TLS_RSA_WITH_ARIA_128_CBC_SHA256,
TLSCiphers::TLS_RSA_WITH_ARIA_256_CBC_SHA384,
TLSCiphers::TLS_RSA_WITH_ARIA_128_GCM_SHA256,
TLSCiphers::TLS_RSA_WITH_ARIA_256_GCM_SHA384,
TLSCiphers::TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256,
TLSCiphers::TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384,
TLSCiphers::TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256,
TLSCiphers::TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384,
TLSCiphers::TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256,
TLSCiphers::TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384,
TLSCiphers::TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256,
TLSCiphers::TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384,
TLSCiphers::TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256,
TLSCiphers::TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384,
TLSCiphers::TLS_RSA_WITH_AES_128_CCM,
TLSCiphers::TLS_RSA_WITH_AES_256_CCM,
TLSCiphers::TLS_RSA_WITH_AES_128_CCM_8,
TLSCiphers::TLS_RSA_WITH_AES_256_CCM_8 -> rsa_client_key_exchange: RsaClientKeyExchange(len);
#ECHDE
TLSCiphers::TLS_ECDHE_ECDSA_WITH_NULL_SHA,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
TLSCiphers::TLS_ECDHE_RSA_WITH_NULL_SHA,
TLSCiphers::TLS_ECDHE_RSA_WITH_RC4_128_SHA,
TLSCiphers::TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
TLSCiphers::TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
TLSCiphers::TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
TLSCiphers::TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
TLSCiphers::TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
TLSCiphers::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLSCiphers::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
TLSCiphers::TLS_ECDHE_PSK_WITH_RC4_128_SHA,
TLSCiphers::TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA,
TLSCiphers::TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA,
TLSCiphers::TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA,
TLSCiphers::TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256,
TLSCiphers::TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384,
TLSCiphers::TLS_ECDHE_PSK_WITH_NULL_SHA,
TLSCiphers::TLS_ECDHE_PSK_WITH_NULL_SHA256,
TLSCiphers::TLS_ECDHE_PSK_WITH_NULL_SHA384,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384,
TLSCiphers::TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256,
TLSCiphers::TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384,
TLSCiphers::TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256,
TLSCiphers::TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384,
TLSCiphers::TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256,
TLSCiphers::TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384,
TLSCiphers::TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,
TLSCiphers::TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384,
TLSCiphers::TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256,
TLSCiphers::TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384,
TLSCiphers::TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256,
TLSCiphers::TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_128_CCM,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_256_CCM,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8,
TLSCiphers::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256_OLD,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256_OLD,
TLSCiphers::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
TLSCiphers::TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
TLSCiphers::TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256,
TLSCiphers::TLS_ECDHE_PSK_WITH_AES_256_GCM_SHA384,
TLSCiphers::TLS_ECDHE_PSK_WITH_AES_128_CCM_8_SHA256,
TLSCiphers::TLS_ECDHE_PSK_WITH_AES_128_CCM_SHA256_OLD,
TLSCiphers::TLS_ECDHE_PSK_WITH_AES_128_CCM_SHA256 -> ecdh_client_key_exchange: EcdhClientKeyExchange(len);
# DHE suites
TLSCiphers::TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA,
TLSCiphers::TLS_DHE_DSS_WITH_DES_CBC_SHA,
TLSCiphers::TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,
TLSCiphers::TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,
TLSCiphers::TLS_DHE_RSA_WITH_DES_CBC_SHA,
TLSCiphers::TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,
TLSCiphers::TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
TLSCiphers::TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
TLSCiphers::TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
TLSCiphers::TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
TLSCiphers::TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,
TLSCiphers::TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA,
TLSCiphers::TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,
TLSCiphers::TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA,
TLSCiphers::TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA,
TLSCiphers::TLS_DHE_DSS_WITH_RC4_128_SHA,
TLSCiphers::TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,
TLSCiphers::TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,
TLSCiphers::TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,
TLSCiphers::TLS_DHE_DSS_WITH_3DES_EDE_CBC_RMD,
TLSCiphers::TLS_DHE_DSS_WITH_AES_128_CBC_RMD,
TLSCiphers::TLS_DHE_DSS_WITH_AES_256_CBC_RMD,
TLSCiphers::TLS_DHE_RSA_WITH_3DES_EDE_CBC_RMD,
TLSCiphers::TLS_DHE_RSA_WITH_AES_128_CBC_RMD,
TLSCiphers::TLS_DHE_RSA_WITH_AES_256_CBC_RMD,
TLSCiphers::TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA,
TLSCiphers::TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,
TLSCiphers::TLS_DHE_PSK_WITH_RC4_128_SHA,
TLSCiphers::TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA,
TLSCiphers::TLS_DHE_PSK_WITH_AES_128_CBC_SHA,
TLSCiphers::TLS_DHE_PSK_WITH_AES_256_CBC_SHA,
TLSCiphers::TLS_DHE_DSS_WITH_SEED_CBC_SHA,
TLSCiphers::TLS_DHE_RSA_WITH_SEED_CBC_SHA,
TLSCiphers::TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
TLSCiphers::TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
TLSCiphers::TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,
TLSCiphers::TLS_DHE_DSS_WITH_AES_256_GCM_SHA384,
TLSCiphers::TLS_DHE_PSK_WITH_AES_128_GCM_SHA256,
TLSCiphers::TLS_DHE_PSK_WITH_AES_256_GCM_SHA384,
TLSCiphers::TLS_DHE_PSK_WITH_AES_128_CBC_SHA256,
TLSCiphers::TLS_DHE_PSK_WITH_AES_256_CBC_SHA384,
TLSCiphers::TLS_DHE_PSK_WITH_NULL_SHA256,
TLSCiphers::TLS_DHE_PSK_WITH_NULL_SHA384,
TLSCiphers::TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256,
TLSCiphers::TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,
TLSCiphers::TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256,
TLSCiphers::TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256,
TLSCiphers::TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256,
TLSCiphers::TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384,
TLSCiphers::TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256,
TLSCiphers::TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384,
TLSCiphers::TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256,
TLSCiphers::TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384,
TLSCiphers::TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256,
TLSCiphers::TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384,
TLSCiphers::TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256,
TLSCiphers::TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384,
TLSCiphers::TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256,
TLSCiphers::TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384,
TLSCiphers::TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256,
TLSCiphers::TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384,
TLSCiphers::TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256,
TLSCiphers::TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384,
TLSCiphers::TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256,
TLSCiphers::TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384,
TLSCiphers::TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256,
TLSCiphers::TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384,
TLSCiphers::TLS_DHE_RSA_WITH_AES_128_CCM,
TLSCiphers::TLS_DHE_RSA_WITH_AES_256_CCM,
TLSCiphers::TLS_DHE_RSA_WITH_AES_128_CCM_8,
TLSCiphers::TLS_DHE_RSA_WITH_AES_256_CCM_8,
TLSCiphers::TLS_DHE_PSK_WITH_AES_128_CCM,
TLSCiphers::TLS_DHE_PSK_WITH_AES_256_CCM,
TLSCiphers::TLS_PSK_DHE_WITH_AES_128_CCM_8,
TLSCiphers::TLS_PSK_DHE_WITH_AES_256_CCM_8,
TLSCiphers::TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256_OLD,
TLSCiphers::TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
TLSCiphers::TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256,
# DH-anon suites
TLSCiphers::TLS_DH_ANON_EXPORT_WITH_RC4_40_MD5,
TLSCiphers::TLS_DH_ANON_WITH_RC4_128_MD5,
TLSCiphers::TLS_DH_ANON_EXPORT_WITH_DES40_CBC_SHA,
TLSCiphers::TLS_DH_ANON_WITH_DES_CBC_SHA,
TLSCiphers::TLS_DH_ANON_WITH_3DES_EDE_CBC_SHA,
TLSCiphers::TLS_DH_ANON_WITH_AES_128_CBC_SHA,
TLSCiphers::TLS_DH_ANON_WITH_AES_256_CBC_SHA,
TLSCiphers::TLS_DH_ANON_WITH_CAMELLIA_128_CBC_SHA,
TLSCiphers::TLS_DH_ANON_WITH_AES_128_CBC_SHA256,
TLSCiphers::TLS_DH_ANON_WITH_AES_256_CBC_SHA256,
TLSCiphers::TLS_DH_ANON_WITH_CAMELLIA_256_CBC_SHA,
TLSCiphers::TLS_DH_ANON_WITH_SEED_CBC_SHA,
TLSCiphers::TLS_DH_ANON_WITH_AES_128_GCM_SHA256,
TLSCiphers::TLS_DH_ANON_WITH_AES_256_GCM_SHA384,
TLSCiphers::TLS_DH_ANON_WITH_CAMELLIA_128_CBC_SHA256,
TLSCiphers::TLS_DH_ANON_WITH_CAMELLIA_256_CBC_SHA256,
TLSCiphers::TLS_DH_ANON_WITH_ARIA_128_CBC_SHA256,
TLSCiphers::TLS_DH_ANON_WITH_ARIA_256_CBC_SHA384,
TLSCiphers::TLS_DH_ANON_WITH_ARIA_128_GCM_SHA256,
TLSCiphers::TLS_DH_ANON_WITH_ARIA_256_GCM_SHA384,
TLSCiphers::TLS_DH_ANON_WITH_CAMELLIA_128_GCM_SHA256,
TLSCiphers::TLS_DH_ANON_WITH_CAMELLIA_256_GCM_SHA384 -> dh_server_key_exchange: DhClientKeyExchange(len);
* -> key: bytes &size=len;
};
};
type RsaClientKeyExchange = unit(len: uint64) {
rsa_pms: bytes &size=len;
};
type DhClientKeyExchange = unit(len: uint64) {
dh_Yc: bytes &size=len;
};
type EcdhClientKeyExchange = unit(len: uint64) {
point: bytes &size=len;
};
type NewSessionTicket = unit {
ticket_lifetime_hint: uint32;
ticket_length: uint16;
ticket: bytes &size=self.ticket_length;
};
type Certificate = unit(inout sh: Share) {
length: bytes &size=3 &convert=$$.to_uint(spicy::ByteOrder::Network);
certificate_list: SingleCertificate[] &size=self.length;
};
type SingleCertificate = unit {
length: bytes &size=3 &convert=$$.to_uint(spicy::ByteOrder::Network);
cert: bytes &size=self.length; # certificates, forward to whatever
};
# Conversion and Zeek related functions
import zeek;
public function convert_server_names(snl: vector<ServerName>): vector<bytes> {
local out: vector<bytes>;
for (i in snl)
out.push_back(i.host_name);
return out;
}
public function convert_signature_algorithms(sa: vector<SignatureAndHashAlgorithm>): vector<tuple<HashAlgorithm: uint8, SignatureAlgorithm: uint8>> {
local out: vector<tuple<uint8, uint8>>;
for (i in sa)
out.push_back(tuple(i.hash, i.signature));
return out;
}
public function create_empty_sigmature_algorithms(): vector<tuple<HashAlgorithm: uint8, SignatureAlgorithm: uint8>> {
local out: vector<tuple<uint8, uint8>>;
return out;
}
public function convert_clienthellokeyshare(ks: vector<KeyShareEntry>): vector<uint16> {
local out: vector<uint16>;
for (i in ks)
out.push_back(i.namedgroup);
return out;
}
public function convert_binders(bi: SSL::PSKBindersList): vector<bytes> {
local out: vector<bytes>;
for (i in bi.binders)
out.push_back(i.binder);
return out;
}
public function convert_identities(id: SSL::PSKIdentitiesList): vector<tuple<identity: bytes, obfuscated_ticket_age: uint32>> {
local out: vector<tuple<bytes, uint32>>;
for (i in id.identities)
out.push_back(tuple(i.identity, i.obfuscated_ticket_age));
return out;
}
public function convert_protocol_name_list(pns: vector<ProtocolName>): vector<bytes> {
local out: vector<bytes>;
for (i in pns)
out.push_back(i.name);
return out;
}
public function convert_certificate_authorities(c: vector<CertificateAuthority>): vector<bytes> {
local out: vector<bytes>;
for (i in c)
out.push_back(i.certificate_authority);
return out;
}
# returns true for the "client"
public function get_direction(sh: Share): bool {
if (sh.flipped)
return !zeek::is_orig();
else
return zeek::is_orig();
}
# returns the current certificate depth and increases it by one
public function get_and_increase_certificate_depth(inout sh: Share): uint32 {
local certificate_depth: uint32 = 0;
if (get_direction(sh)) {
certificate_depth = sh.client_certificate_depth;
sh.client_certificate_depth += 1;
} else {
certificate_depth = sh.server_certificate_depth;
sh.server_certificate_depth += 1;
}
return certificate_depth;
}
# If this function returns True, you have to send the ssl_connection_flipped event!
public function check_direction(inout sh: Share, desired: bool): bool {
if (sh.flipped) {
if (desired == zeek::is_orig()) {
# well, I guess we get to flip it back - and alert on this
sh.flipped = False;
if (!sh.flip_already_alerted) {
sh.flip_already_alerted = True;
zeek::weird("SSL_unclear_connection_direction");
}
return True;
}
} else {
if (desired != zeek::is_orig()) {
sh.flipped = True;
return True;
}
}
return False;
}
on SSL::SSL2ClientHello::%done {
spicy::accept_input();
}
on SSL::SSL2ServerHello::%done {
spicy::accept_input();
}
on SSL::ClientHello::%done {
spicy::accept_input();
}
on SSL::ClientHello::%error(emsg: string) {
spicy::decline_input("error while parsing TLS client hello - " + emsg);
}
on SSL::ServerHello::%done {
spicy::accept_input();
}
on SSL::ServerHello::%error(emsg: string) {
spicy::decline_input("error while parsing TLS server hello - " + emsg);
}
#on SSL::Handshake_message::%error(emsg: string) {
# spicy::decline_input("lalala");
#}
on SSL::Handshake::%error(emsg: string) {
spicy::decline_input(emsg);
}
on SSL::Certificate::%done {
local first: bool = True;
for (i in self.certificate_list) {
if (first)
zeek::file_begin("application/x-x509-user-cert", get_certificate_fuid(get_direction(sh), get_and_increase_certificate_depth(sh)));
else
zeek::file_begin("application/x-x509-ca-cert", get_certificate_fuid(get_direction(sh), get_and_increase_certificate_depth(sh)));
zeek::file_data_in(i.cert);
zeek::file_end();
first = False;
}
}
# Debug stuff
# on RecordFragmentChoice::content_type {
# print "RecordFragmentChoice: Content type", self.content_type;
# }
#
# on PlaintextRecord::unhandled {
# print "PlaintextRecord: Unhandled content type", content_type;
# }
#
# on Handshake_message::msg_type {
# print "Handshake message", self.msg_type;
# }
#
# on Handshake_message::unhandled {
# print "Unhandled handshake message of type ", self.msg_type;
# }
#
# on Handshake_message::%error(emsg: string) {
# print "Error in handshake message of type", self.msg_type, self, emsg;
# print self;
# }
#
# on ClientHello::%error(emsg: string) {
# print "Error in client hello", emsg;
# print self;
# }
#
# on ServerHello::%error(emsg: string) {
# print "Error in server hello", emsg;
# print self;
# }
#
# on PlaintextRecord::%error(emsg: string) {
# print "Error in plaintextrecord", emsg;
# print self;
# }
#
# on Extension::code {
# print "Extension", self.code, client_hello;
# }
#
# on Extension::unknown {
# print "Unknown extension", self.code;
# }
#
# on Extension::%error(emsg: string) {
# print "Error parsing extension with code", self.code, emsg;
# }