ssldump/ssl/ssl.enums.c
William Robinet 799f945887
Minor lint
2023-08-20 12:27:52 +02:00

1759 lines
66 KiB
C

#include <json.h>
#include <openssl/md5.h>
#include "network.h"
#include "ssl_h.h"
#include "sslprint.h"
#include "sslxprint.h"
#ifdef OPENSSL
#include <openssl/ssl.h>
#endif
#include "ssl.enums.h"
static int decode_extension(ssl_obj *ssl, int dir, segment *seg, Data *data);
static int decode_server_name(ssl_obj *ssl, int dir, segment *seg, Data *data);
static int decode_ContentType_ChangeCipherSpec(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
struct json_object *jobj;
jobj = ssl->cur_json_st;
json_object_object_add(jobj, "msg_type",
json_object_new_string("ChangeCipherSpec"));
ssl_process_change_cipher_spec(ssl, ssl->decoder, dir);
if(dir == DIR_I2R) {
ssl->i_state = SSL_ST_SENT_CHANGE_CIPHER_SPEC;
} else {
ssl->r_state = SSL_ST_SENT_CHANGE_CIPHER_SPEC;
}
LF;
return 0;
}
static int decode_ContentType_Alert(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
int r;
struct json_object *jobj;
if(ssl->record_encryption == REC_CIPHERTEXT) {
LF;
return 0;
}
if(data->len != 2) {
fprintf(stderr, "Wrong length for alert message: %d\n", data->len);
ERETURN(R_EOD);
}
jobj = ssl->cur_json_st;
json_object_object_add(jobj, "msg_type", json_object_new_string("Alert"));
P_(P_HL) {
LF;
SSL_DECODE_ENUM(ssl, "level", 1, AlertLevel_decoder, P_HL, data, 0);
LF;
SSL_DECODE_ENUM(ssl, "value", 1, AlertDescription_decoder, P_HL, data, 0);
LF;
}
else {
SSL_DECODE_ENUM(ssl, 0, 1, AlertLevel_decoder, SSL_PRINT_ALL, data, 0);
SSL_DECODE_ENUM(ssl, 0, 1, AlertDescription_decoder, SSL_PRINT_ALL, data,
0);
LF;
}
return 0;
}
static int decode_ContentType_Handshake(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
extern decoder HandshakeType_decoder[];
int r;
UINT4 t, l;
int rs = 0;
Data d;
struct json_object *jobj;
if(ssl->record_encryption == REC_CIPHERTEXT) {
LF;
return 0;
}
while(data->len > 0) {
SSL_DECODE_UINT8(ssl, 0, 0, data, &t);
SSL_DECODE_UINT24(ssl, 0, 0, data, &l);
if(data->len < l) {
fprintf(stderr, "Error: short handshake length: expected %d got %d\n", l,
data->len);
ERETURN(R_EOD);
}
jobj = ssl->cur_json_st;
json_object_object_add(jobj, "msg_type",
json_object_new_string("Handshake"));
d.data = data->data;
d.len = l;
data->len -= l;
data->data += l;
P_(P_HL) {
if(!rs) {
LF;
rs = 1;
}
}
ssl_decode_switch(ssl, HandshakeType_decoder, t, dir, seg, &d);
}
return 0;
}
static int decode_ContentType_application_data(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
int r;
Data d;
struct json_object *jobj;
jobj = ssl->cur_json_st;
json_object_object_add(jobj, "msg_type",
json_object_new_string("application data"));
SSL_DECODE_OPAQUE_ARRAY(ssl, "data", data->len, 0, data, &d);
if(NET_print_flags & NET_PRINT_JSON) {
json_object_object_add(jobj, "msg_data",
json_object_new_string_len((char *)d.data, d.len));
} else
P_(P_AD) { print_data(ssl, &d); }
else {
LF;
}
return 0;
}
decoder ContentType_decoder[] = {
{20, "ChangeCipherSpec", decode_ContentType_ChangeCipherSpec},
{21, "Alert", decode_ContentType_Alert},
{22, "Handshake", decode_ContentType_Handshake},
{23, "application_data", decode_ContentType_application_data},
{-1}};
static int decode_HandshakeType_HelloRequest(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
struct json_object *jobj;
jobj = ssl->cur_json_st;
json_object_object_add(jobj, "handshake_type",
json_object_new_string("HelloRequest"));
LF;
return 0;
}
static int decode_HandshakeType_ClientHello(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
struct json_object *jobj;
jobj = ssl->cur_json_st;
json_object_object_add(jobj, "handshake_type",
json_object_new_string("ClientHello"));
UINT4 vj, vn, cs, cslen, complen, comp, odd, exlen, ex;
Data session_id, random;
int r;
char *ja3_fp = NULL;
char *ja3_str = NULL;
char *ja3_ver_str = NULL;
char *ja3_cs_str = NULL;
char *ja3_ex_str = NULL;
char *ja3_ec_str = NULL;
char *ja3_ecp_str = NULL;
ssl->cur_ja3_ec_str = NULL;
ssl->cur_ja3_ecp_str = NULL;
extern decoder cipher_suite_decoder[];
extern decoder compression_method_decoder[];
extern decoder extension_decoder[];
LF;
ssl_update_handshake_messages(ssl, data);
SSL_DECODE_UINT8(ssl, 0, 0, data, &vj);
SSL_DECODE_UINT8(ssl, 0, 0, data, &vn);
ja3_ver_str = calloc(7, sizeof(char));
snprintf(ja3_ver_str, 7, "%u", ((vj & 0xff) << 8) | (vn & 0xff));
P_(P_HL) {
explain(ssl, "Version %d.%d ", vj, vn);
LF;
}
SSL_DECODE_OPAQUE_ARRAY(ssl, "random", 32, P_ND, data, &random);
ssl_set_client_random(ssl->decoder, random.data, random.len);
SSL_DECODE_OPAQUE_ARRAY(ssl, "session_id", -32, 0, data, &session_id);
ssl_set_client_session_id(ssl->decoder, session_id.data, session_id.len);
P_(P_HL) {
if(session_id.len)
exdump(ssl, "resume ", &session_id);
}
ssl_process_client_session_id(ssl, ssl->decoder, session_id.data,
session_id.len);
P_(P_HL) {
SSL_DECODE_UINT16(ssl, "cipher Suites len", 0, data, &cslen);
explain(ssl, "cipher suites\n");
odd = cslen % 2;
if(odd) {
printf("Wrong cipher suites length, fixing ...\n");
cslen -= odd;
}
for(; cslen; cslen -= 2) {
if(ssl_decode_enum(ssl, 0, 2, cipher_suite_decoder, 0, data, &cs))
return 1;
ssl_print_cipher_suite(ssl, (vj << 8) | vn, P_HL, cs);
if(!ja3_cs_str)
ja3_cs_str = calloc(7, 1);
else
ja3_cs_str = realloc(ja3_cs_str, strlen(ja3_cs_str) + 7);
snprintf(ja3_cs_str + strlen(ja3_cs_str), 7, "%u-", cs);
LF;
}
if(ja3_cs_str && ja3_cs_str[strlen(ja3_cs_str) - 1] == '-')
ja3_cs_str[strlen(ja3_cs_str) - 1] = '\0';
}
SSL_DECODE_UINT8(ssl, "compressionMethod len", 0, data, &complen);
if(complen) {
explain(ssl, "compression methods\n");
for(; complen; complen--) {
SSL_DECODE_ENUM(ssl, 0, 1, compression_method_decoder, P_HL, data, &comp);
LF;
}
}
SSL_DECODE_UINT16(ssl, "extensions len", 0, data, &exlen);
if(exlen) {
explain(ssl, "extensions\n");
while(data->len) {
SSL_DECODE_UINT16(ssl, "extension type", 0, data, &ex);
if(!ja3_ex_str)
ja3_ex_str = calloc(7, 1);
else
ja3_ex_str = realloc(ja3_ex_str, strlen(ja3_ex_str) + 7);
snprintf(ja3_ex_str + strlen(ja3_ex_str), 7, "%u-", ex);
if(ssl_decode_switch(ssl, extension_decoder, ex, dir, seg, data) ==
R_NOT_FOUND) {
decode_extension(ssl, dir, seg, data);
P_(P_RH) {
explain(ssl, "Extension type: %u not yet implemented in ssldump\n",
ex);
}
continue;
}
LF;
}
if(ja3_ex_str && ja3_ex_str[strlen(ja3_ex_str) - 1] == '-')
ja3_ex_str[strlen(ja3_ex_str) - 1] = '\0';
}
ja3_ec_str = ssl->cur_ja3_ec_str;
ja3_ecp_str = ssl->cur_ja3_ecp_str;
if(!ja3_ver_str) {
ja3_ver_str = calloc(1, 1);
*ja3_ver_str = '\0';
}
if(!ja3_cs_str) {
ja3_cs_str = calloc(1, 1);
*ja3_cs_str = '\0';
}
if(!ja3_ex_str) {
ja3_ex_str = calloc(1, 1);
*ja3_ex_str = '\0';
}
if(!ja3_ec_str) {
ja3_ec_str = calloc(1, 1);
*ja3_ec_str = '\0';
}
if(!ja3_ecp_str) {
ja3_ecp_str = calloc(1, 1);
*ja3_ecp_str = '\0';
}
int ja3_str_len = strlen(ja3_ver_str) + 1 + strlen(ja3_cs_str) + 1 +
strlen(ja3_ex_str) + 1 + strlen(ja3_ec_str) + 1 +
strlen(ja3_ecp_str) + 1;
ja3_str = calloc(ja3_str_len, 1);
snprintf(ja3_str, ja3_str_len, "%s,%s,%s,%s,%s", ja3_ver_str, ja3_cs_str,
ja3_ex_str, ja3_ec_str, ja3_ecp_str);
EVP_MD_CTX *mdctx;
const EVP_MD *md;
unsigned char md_value[EVP_MAX_MD_SIZE];
unsigned int md_len, i;
md = EVP_get_digestbyname("MD5");
mdctx = EVP_MD_CTX_new();
EVP_DigestInit_ex(mdctx, md, NULL);
EVP_DigestUpdate(mdctx, ja3_str, strlen(ja3_str));
EVP_DigestFinal_ex(mdctx, md_value, &md_len);
EVP_MD_CTX_free(mdctx);
ja3_fp = calloc(33, 1);
*ja3_fp = '\0';
for(i = 0; i < 16; i++) {
snprintf(ja3_fp + strlen(ja3_fp), 3, "%02x", md_value[i]);
}
json_object_object_add(jobj, "ja3_str", json_object_new_string(ja3_str));
json_object_object_add(jobj, "ja3_fp", json_object_new_string(ja3_fp));
explain(ssl, "ja3 string: %s\n", ja3_str);
explain(ssl, "ja3 fingerprint: %s\n", ja3_fp);
free(ja3_fp);
free(ja3_str);
free(ja3_ver_str);
free(ja3_cs_str);
free(ja3_ex_str);
free(ja3_ec_str);
free(ja3_ecp_str);
return 0;
}
static int decode_HandshakeType_ServerHello(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
int r;
Data rnd, session_id;
UINT4 vj, vn, exlen, ex;
char *ja3s_fp = NULL;
char *ja3s_str = NULL;
char *ja3s_ver_str = NULL;
char *ja3s_c_str = NULL;
char *ja3s_ex_str = NULL;
extern decoder extension_decoder[];
struct json_object *jobj;
jobj = ssl->cur_json_st;
json_object_object_add(jobj, "handshake_type",
json_object_new_string("ServerHello"));
LF;
ssl_update_handshake_messages(ssl, data);
SSL_DECODE_UINT8(ssl, 0, 0, data, &vj);
SSL_DECODE_UINT8(ssl, 0, 0, data, &vn);
ja3s_ver_str = calloc(7, sizeof(char));
snprintf(ja3s_ver_str, 7, "%u", ((vj & 0xff) << 8) | (vn & 0xff));
ssl->version = vj * 256 + vn;
P_(P_HL) {
explain(ssl, "Version %d.%d ", vj, vn);
LF;
}
SSL_DECODE_OPAQUE_ARRAY(ssl, "random", 32, P_ND, data, &rnd);
ssl_set_server_random(ssl->decoder, rnd.data, rnd.len);
SSL_DECODE_OPAQUE_ARRAY(ssl, "session_id", -32, P_HL, data, &session_id);
SSL_DECODE_ENUM(ssl, "cipherSuite", 2, cipher_suite_decoder, 0, data,
&ssl->cipher_suite);
P_(P_HL) {
explain(ssl, "cipherSuite ");
ssl_print_cipher_suite(ssl, ssl->version, P_HL, ssl->cipher_suite);
}
ssl_find_cipher(ssl->cipher_suite, &ssl->cs);
ja3s_c_str = calloc(6, 1);
snprintf(ja3s_c_str, 6, "%u", ssl->cipher_suite);
P_(P_HL) LF;
SSL_DECODE_ENUM(ssl, "compressionMethod", 1, compression_method_decoder, P_HL,
data, 0);
P_(P_HL) LF;
SSL_DECODE_UINT16(ssl, "extensions len", 0, data, &exlen);
if(exlen) {
explain(ssl, "extensions\n");
while(data->len) {
SSL_DECODE_UINT16(ssl, "extension type", 0, data, &ex);
if(!ja3s_ex_str)
ja3s_ex_str = calloc(7, 1);
else
ja3s_ex_str = realloc(ja3s_ex_str, strlen(ja3s_ex_str) + 7);
snprintf(ja3s_ex_str + strlen(ja3s_ex_str), 7, "%u-", ex);
if(ssl_decode_switch(ssl, extension_decoder, ex, dir, seg, data) ==
R_NOT_FOUND) {
decode_extension(ssl, dir, seg, data);
P_(P_RH) {
explain(ssl, "Extension type: %u not yet implemented in ssldump,\n",
ex);
}
continue;
}
LF;
}
if(ja3s_ex_str && ja3s_ex_str[strlen(ja3s_ex_str) - 1] == '-')
ja3s_ex_str[strlen(ja3s_ex_str) - 1] = '\0';
}
if(ssl->version == TLSV13_VERSION) {
// tls version is known in server hello for tls1.3 hence generate keying
// material here
ssl_tls13_generate_keying_material(ssl, ssl->decoder);
}
ssl_process_server_session_id(ssl, ssl->decoder, session_id.data,
session_id.len);
if(!ja3s_ver_str) {
ja3s_ver_str = calloc(1, 1);
*ja3s_ver_str = '\0';
}
if(!ja3s_c_str) {
ja3s_c_str = calloc(1, 1);
*ja3s_c_str = '\0';
}
if(!ja3s_ex_str) {
ja3s_ex_str = calloc(1, 1);
*ja3s_ex_str = '\0';
}
int ja3s_str_len = strlen(ja3s_ver_str) + 1 + strlen(ja3s_c_str) + 1 +
strlen(ja3s_ex_str) + 1;
ja3s_str = calloc(ja3s_str_len, 1);
snprintf(ja3s_str, ja3s_str_len, "%s,%s,%s", ja3s_ver_str, ja3s_c_str,
ja3s_ex_str);
EVP_MD_CTX *mdctx;
const EVP_MD *md;
unsigned char md_value[EVP_MAX_MD_SIZE];
unsigned int md_len, i;
md = EVP_get_digestbyname("MD5");
mdctx = EVP_MD_CTX_new();
EVP_DigestInit_ex(mdctx, md, NULL);
EVP_DigestUpdate(mdctx, ja3s_str, strlen(ja3s_str));
EVP_DigestFinal_ex(mdctx, md_value, &md_len);
EVP_MD_CTX_free(mdctx);
ja3s_fp = calloc(33, 1);
*ja3s_fp = '\0';
for(i = 0; i < 16; i++) {
snprintf(ja3s_fp + strlen(ja3s_fp), 3, "%02x", md_value[i]);
}
json_object_object_add(jobj, "ja3s_str", json_object_new_string(ja3s_str));
json_object_object_add(jobj, "ja3s_fp", json_object_new_string(ja3s_fp));
explain(ssl, "ja3s string: %s\n", ja3s_str);
explain(ssl, "ja3s fingerprint: %s\n", ja3s_fp);
free(ja3s_fp);
free(ja3s_str);
free(ja3s_ver_str);
free(ja3s_c_str);
free(ja3s_ex_str);
return 0;
}
static int decode_HandshakeType_Certificate(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
UINT4 len, exlen, ex;
Data cert;
int r;
struct json_object *jobj;
jobj = ssl->cur_json_st;
json_object_object_add(jobj, "handshake_type",
json_object_new_string("Certificate"));
extern decoder extension_decoder[];
LF;
ssl_update_handshake_messages(ssl, data);
if(ssl->version == TLSV13_VERSION) {
SSL_DECODE_OPAQUE_ARRAY(ssl, "certificate request context", -((1 << 7) - 1),
0, data, NULL);
}
SSL_DECODE_UINT24(ssl, "certificates len", 0, data, &len);
json_object_object_add(jobj, "cert_chain", json_object_new_array());
while(len) {
SSL_DECODE_OPAQUE_ARRAY(ssl, "certificate", -((1 << 23) - 1), 0, data,
&cert);
sslx_print_certificate(ssl, &cert, P_ND);
len -= (cert.len + 3);
if(ssl->version == TLSV13_VERSION) { // TLS 1.3 has certificate extensions
SSL_DECODE_UINT16(ssl, "certificate extensions len", 0, data, &exlen);
len -= 2;
while(exlen) {
SSL_DECODE_UINT16(ssl, "extension type", 0, data, &ex);
len -= (2 + ex);
if(ssl_decode_switch(ssl, extension_decoder, ex, dir, seg, data) ==
R_NOT_FOUND) {
decode_extension(ssl, dir, seg, data);
P_(P_RH) {
explain(ssl, "Extension type: %u not yet implemented in ssldump\n",
ex);
}
continue;
}
LF;
}
}
}
return 0;
}
static int decode_HandshakeType_SessionTicket(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
int r;
UINT4 exlen, ex, val;
extern decoder extension_decoder[];
SSL_DECODE_UINT32(ssl, "ticket_lifetime", P_HL, data, &val);
if(ssl->version == TLSV13_VERSION) {
SSL_DECODE_UINT32(ssl, "ticket_age_add", P_HL, data, &val);
SSL_DECODE_OPAQUE_ARRAY(ssl, "ticket_nonce", -((1 << 7) - 1), P_ND, data,
NULL);
}
SSL_DECODE_OPAQUE_ARRAY(ssl, "ticket", -((1 << 15) - 1), P_ND, data, NULL);
if(ssl->version == TLSV13_VERSION) {
SSL_DECODE_UINT16(ssl, "exlen", 0, data, &exlen);
if(exlen) {
while(data->len) {
SSL_DECODE_UINT16(ssl, "extension type", 0, data, &ex);
if(ssl_decode_switch(ssl, extension_decoder, ex, dir, seg, data) ==
R_NOT_FOUND) {
if((r = decode_extension(ssl, dir, seg, data)))
ERETURN(r);
P_(P_RH) {
explain(ssl, "Extension type: %u not yet implemented in ssldump\n",
ex);
}
continue;
}
LF;
}
}
}
return 0;
}
static int decode_HandshakeType_EncryptedExtensions(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
int r;
UINT4 exlen, ex;
extern decoder extension_decoder[];
SSL_DECODE_UINT16(ssl, 0, 0, data, &exlen);
LF;
if(exlen) {
while(data->len) {
SSL_DECODE_UINT16(ssl, "extension type", 0, data, &ex);
if(ssl_decode_switch(ssl, extension_decoder, ex, dir, seg, data) ==
R_NOT_FOUND) {
decode_extension(ssl, dir, seg, data);
P_(P_RH) {
explain(ssl, "Extension type: %u not yet implemented in ssldump\n",
ex);
}
continue;
}
LF;
}
}
return 0;
}
static int decode_HandshakeType_ServerKeyExchange(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
int r;
struct json_object *jobj;
jobj = ssl->cur_json_st;
json_object_object_add(jobj, "handshake_type",
json_object_new_string("ServerKeyExchange"));
LF;
ssl_update_handshake_messages(ssl, data);
if(ssl->cs) {
P_(P_ND) { explain(ssl, "params\n"); }
INDENT_INCR;
switch(ssl->cs->kex) {
case KEX_DH:
SSL_DECODE_OPAQUE_ARRAY(ssl, "DH_p", -((1 << 15) - 1), P_ND, data, 0);
SSL_DECODE_OPAQUE_ARRAY(ssl, "DH_g", -((1 << 15) - 1), P_ND, data, 0);
SSL_DECODE_OPAQUE_ARRAY(ssl, "DH_Ys", -((1 << 15) - 1), P_ND, data, 0);
break;
case KEX_RSA:
SSL_DECODE_OPAQUE_ARRAY(ssl, "RSA_modulus", -((1 << 15) - 1), P_ND,
data, 0);
SSL_DECODE_OPAQUE_ARRAY(ssl, "RSA_exponent", -((1 << 15) - 1), P_ND,
data, 0);
break;
}
INDENT_POP;
SSL_DECODE_OPAQUE_ARRAY(ssl, "signature", -((1 << 15) - 1), P_ND, data, 0);
}
return 0;
}
static int decode_HandshakeType_CertificateRequest(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
UINT4 len;
Data ca;
int r;
struct json_object *jobj;
jobj = ssl->cur_json_st;
json_object_object_add(jobj, "handshake_type",
json_object_new_string("CertificateRequest"));
LF;
ssl_update_handshake_messages(ssl, data);
SSL_DECODE_UINT8(ssl, "certificate_types len", 0, data, &len);
for(; len; len--) {
SSL_DECODE_ENUM(ssl, "certificate_types", 1,
client_certificate_type_decoder, P_HL, data, 0);
P_(P_HL) { LF; }
};
SSL_DECODE_UINT16(ssl, "certificate_authorities len", 0, data, &len);
while(len) {
SSL_DECODE_OPAQUE_ARRAY(ssl, "certificate_authorities", -((1 << 15) - 1), 0,
data, &ca);
explain(ssl, "certificate_authority\n");
INDENT_INCR;
sslx_print_dn(ssl, &ca, P_HL);
INDENT_POP;
len -= (ca.len + 2);
}
return 0;
}
static int decode_HandshakeType_ServerHelloDone(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
struct json_object *jobj;
jobj = ssl->cur_json_st;
json_object_object_add(jobj, "handshake_type",
json_object_new_string("ServerHelloDone"));
LF;
ssl_update_handshake_messages(ssl, data);
return 0;
}
static int decode_HandshakeType_CertificateVerify(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
int r;
UINT4 signature_type;
struct json_object *jobj;
jobj = ssl->cur_json_st;
json_object_object_add(jobj, "handshake_type",
json_object_new_string("CertificateVerify"));
LF;
ssl_update_handshake_messages(ssl, data);
if(ssl->version == TLSV13_VERSION) {
SSL_DECODE_UINT16(ssl, "signature_type", P_HL, data, &signature_type);
}
SSL_DECODE_OPAQUE_ARRAY(ssl, "Signature", -((1 << 15) - 1), P_HL, data, 0);
return 0;
}
static int decode_HandshakeType_ClientKeyExchange(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
int r;
Data pms;
struct json_object *jobj;
jobj = ssl->cur_json_st;
json_object_object_add(jobj, "handshake_type",
json_object_new_string("ClientKeyExchange"));
LF;
ssl_update_handshake_messages(ssl, data);
if(ssl->cs) {
switch(ssl->cs->kex) {
case KEX_RSA:
if(ssl->version > 768) {
SSL_DECODE_OPAQUE_ARRAY(ssl, "EncryptedPreMasterSecret",
-((1 << 15) - 1), P_ND, data, &pms);
} else {
SSL_DECODE_OPAQUE_ARRAY(ssl, "EncryptedPreMasterSecret", data->len,
P_ND, data, &pms);
}
ssl_process_client_key_exchange(ssl, ssl->decoder, pms.data, pms.len);
break;
case KEX_DH:
SSL_DECODE_OPAQUE_ARRAY(ssl, "DiffieHellmanClientPublicValue",
-((1 << 7) - 1), P_HL, data, 0);
ssl_process_client_key_exchange(ssl, ssl->decoder, NULL, 0);
}
}
return 0;
}
static int decode_HandshakeType_Finished(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
int r;
struct json_object *jobj;
jobj = ssl->cur_json_st;
json_object_object_add(jobj, "handshake_type",
json_object_new_string("Finished"));
LF;
switch(ssl->version) {
case 0x300:
SSL_DECODE_OPAQUE_ARRAY(ssl, "md5_hash", 16, P_ND, data, 0);
SSL_DECODE_OPAQUE_ARRAY(ssl, "sha_hash", 20, P_ND, data, 0);
break;
case 0x301:
SSL_DECODE_OPAQUE_ARRAY(ssl, "verify_data", 12, P_ND, data, 0);
P_(P_ND)
LF;
break;
}
ssl_process_handshake_finished(ssl, ssl->decoder, data);
return 0;
}
static int decode_HandshakeType_KeyUpdate(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
LF;
ssl_tls13_update_keying_material(ssl, ssl->decoder, dir);
return 0;
}
decoder HandshakeType_decoder[] = {
{0, "HelloRequest", decode_HandshakeType_HelloRequest},
{1, "ClientHello", decode_HandshakeType_ClientHello},
{2, "ServerHello", decode_HandshakeType_ServerHello},
{4, "SessionTicket", decode_HandshakeType_SessionTicket},
{8, "EncryptedExtensions", decode_HandshakeType_EncryptedExtensions},
{11, "Certificate", decode_HandshakeType_Certificate},
{12, "ServerKeyExchange", decode_HandshakeType_ServerKeyExchange},
{13, "CertificateRequest", decode_HandshakeType_CertificateRequest},
{14, "ServerHelloDone", decode_HandshakeType_ServerHelloDone},
{15, "CertificateVerify", decode_HandshakeType_CertificateVerify},
{16, "ClientKeyExchange", decode_HandshakeType_ClientKeyExchange},
{20, "Finished", decode_HandshakeType_Finished},
{24, "KeyUpdate", decode_HandshakeType_KeyUpdate},
{-1}};
decoder cipher_suite_decoder[] = {
// https://www.iana.org/assignments/tls-parameters/tls-parameters.txt
{0, "TLS_NULL_WITH_NULL_NULL", 0},
{1, "TLS_RSA_WITH_NULL_MD5", 0},
{2, "TLS_RSA_WITH_NULL_SHA", 0},
{3, "TLS_RSA_EXPORT_WITH_RC4_40_MD5", 0},
{4, "TLS_RSA_WITH_RC4_128_MD5", 0},
{5, "TLS_RSA_WITH_RC4_128_SHA", 0},
{6, "TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5", 0},
{7, "TLS_RSA_WITH_IDEA_CBC_SHA", 0},
{8, "TLS_RSA_EXPORT_WITH_DES40_CBC_SHA", 0},
{9, "TLS_RSA_WITH_DES_CBC_SHA", 0},
{10, "TLS_RSA_WITH_3DES_EDE_CBC_SHA", 0},
{11, "TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA", 0},
{12, "TLS_DH_DSS_WITH_DES_CBC_SHA", 0},
{13, "TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA", 0},
{14, "TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA", 0},
{15, "TLS_DH_RSA_WITH_DES_CBC_SHA", 0},
{16, "TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA", 0},
{17, "TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", 0},
{18, "TLS_DHE_DSS_WITH_DES_CBC_SHA", 0},
{19, "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA", 0},
{20, "TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", 0},
{21, "TLS_DHE_RSA_WITH_DES_CBC_SHA", 0},
{22, "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA", 0},
{23, "TLS_DH_anon_EXPORT_WITH_RC4_40_MD5", 0},
{24, "TLS_DH_anon_WITH_RC4_128_MD5", 0},
{25, "TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA", 0},
{26, "TLS_DH_anon_WITH_DES_CBC_SHA", 0},
{27, "TLS_DH_anon_WITH_3DES_EDE_CBC_SHA", 0},
{30, "TLS_KRB5_WITH_DES_CBC_SHA", 0},
{31, "TLS_KRB5_WITH_3DES_EDE_CBC_SHA", 0},
{32, "TLS_KRB5_WITH_RC4_128_SHA", 0},
{33, "TLS_KRB5_WITH_IDEA_CBC_SHA", 0},
{34, "TLS_KRB5_WITH_DES_CBC_MD5", 0},
{35, "TLS_KRB5_WITH_3DES_EDE_CBC_MD5", 0},
{36, "TLS_KRB5_WITH_RC4_128_MD5", 0},
{37, "TLS_KRB5_WITH_IDEA_CBC_MD5", 0},
{38, "TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA", 0},
{39, "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA", 0},
{40, "TLS_KRB5_EXPORT_WITH_RC4_40_SHA", 0},
{41, "TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5", 0},
{42, "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5", 0},
{43, "TLS_KRB5_EXPORT_WITH_RC4_40_MD5", 0},
{44, "TLS_PSK_WITH_NULL_SHA", 0},
{45, "TLS_DHE_PSK_WITH_NULL_SHA", 0},
{46, "TLS_RSA_PSK_WITH_NULL_SHA", 0},
{47, "TLS_RSA_WITH_AES_128_CBC_SHA", 0},
{48, "TLS_DH_DSS_WITH_AES_128_CBC_SHA", 0},
{49, "TLS_DH_RSA_WITH_AES_128_CBC_SHA", 0},
{50, "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", 0},
{51, "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", 0},
{52, "TLS_DH_anon_WITH_AES_128_CBC_SHA", 0},
{53, "TLS_RSA_WITH_AES_256_CBC_SHA", 0},
{54, "TLS_DH_DSS_WITH_AES_256_CBC_SHA", 0},
{55, "TLS_DH_RSA_WITH_AES_256_CBC_SHA", 0},
{56, "TLS_DHE_DSS_WITH_AES_256_CBC_SHA", 0},
{57, "TLS_DHE_RSA_WITH_AES_256_CBC_SHA", 0},
{58, "TLS_DH_anon_WITH_AES_256_CBC_SHA", 0},
{59, "TLS_RSA_WITH_NULL_SHA256", 0},
{60, "TLS_RSA_WITH_AES_128_CBC_SHA256", 0},
{61, "TLS_RSA_WITH_AES_256_CBC_SHA256", 0},
{62, "TLS_DH_DSS_WITH_AES_128_CBC_SHA256", 0},
{63, "TLS_DH_RSA_WITH_AES_128_CBC_SHA256", 0},
{64, "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256", 0},
{65, "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA", 0},
{66, "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA", 0},
{67, "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA", 0},
{68, "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA", 0},
{69, "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA", 0},
{70, "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA", 0},
{103, "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256", 0},
{104, "TLS_DH_DSS_WITH_AES_256_CBC_SHA256", 0},
{105, "TLS_DH_RSA_WITH_AES_256_CBC_SHA256", 0},
{106, "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256", 0},
{107, "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256", 0},
{108, "TLS_DH_anon_WITH_AES_128_CBC_SHA256", 0},
{109, "TLS_DH_anon_WITH_AES_256_CBC_SHA256", 0},
{132, "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA", 0},
{133, "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA", 0},
{134, "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA", 0},
{135, "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA", 0},
{136, "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA", 0},
{137, "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA", 0},
{138, "TLS_PSK_WITH_RC4_128_SHA", 0},
{139, "TLS_PSK_WITH_3DES_EDE_CBC_SHA", 0},
{140, "TLS_PSK_WITH_AES_128_CBC_SHA", 0},
{141, "TLS_PSK_WITH_AES_256_CBC_SHA", 0},
{142, "TLS_DHE_PSK_WITH_RC4_128_SHA", 0},
{143, "TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA", 0},
{144, "TLS_DHE_PSK_WITH_AES_128_CBC_SHA", 0},
{145, "TLS_DHE_PSK_WITH_AES_256_CBC_SHA", 0},
{146, "TLS_RSA_PSK_WITH_RC4_128_SHA", 0},
{147, "TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA", 0},
{148, "TLS_RSA_PSK_WITH_AES_128_CBC_SHA", 0},
{149, "TLS_RSA_PSK_WITH_AES_256_CBC_SHA", 0},
{150, "TLS_RSA_WITH_SEED_CBC_SHA", 0},
{151, "TLS_DH_DSS_WITH_SEED_CBC_SHA", 0},
{152, "TLS_DH_RSA_WITH_SEED_CBC_SHA", 0},
{153, "TLS_DHE_DSS_WITH_SEED_CBC_SHA", 0},
{154, "TLS_DHE_RSA_WITH_SEED_CBC_SHA", 0},
{155, "TLS_DH_anon_WITH_SEED_CBC_SHA", 0},
{156, "TLS_RSA_WITH_AES_128_GCM_SHA256", 0},
{157, "TLS_RSA_WITH_AES_256_GCM_SHA384", 0},
{158, "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256", 0},
{159, "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384", 0},
{160, "TLS_DH_RSA_WITH_AES_128_GCM_SHA256", 0},
{161, "TLS_DH_RSA_WITH_AES_256_GCM_SHA384", 0},
{162, "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256", 0},
{163, "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384", 0},
{164, "TLS_DH_DSS_WITH_AES_128_GCM_SHA256", 0},
{165, "TLS_DH_DSS_WITH_AES_256_GCM_SHA384", 0},
{166, "TLS_DH_anon_WITH_AES_128_GCM_SHA256", 0},
{167, "TLS_DH_anon_WITH_AES_256_GCM_SHA384", 0},
{168, "TLS_PSK_WITH_AES_128_GCM_SHA256", 0},
{169, "TLS_PSK_WITH_AES_256_GCM_SHA384", 0},
{170, "TLS_DHE_PSK_WITH_AES_128_GCM_SHA256", 0},
{171, "TLS_DHE_PSK_WITH_AES_256_GCM_SHA384", 0},
{172, "TLS_RSA_PSK_WITH_AES_128_GCM_SHA256", 0},
{173, "TLS_RSA_PSK_WITH_AES_256_GCM_SHA384", 0},
{174, "TLS_PSK_WITH_AES_128_CBC_SHA256", 0},
{175, "TLS_PSK_WITH_AES_256_CBC_SHA384", 0},
{176, "TLS_PSK_WITH_NULL_SHA256", 0},
{177, "TLS_PSK_WITH_NULL_SHA384", 0},
{178, "TLS_DHE_PSK_WITH_AES_128_CBC_SHA256", 0},
{179, "TLS_DHE_PSK_WITH_AES_256_CBC_SHA384", 0},
{180, "TLS_DHE_PSK_WITH_NULL_SHA256", 0},
{181, "TLS_DHE_PSK_WITH_NULL_SHA384", 0},
{182, "TLS_RSA_PSK_WITH_AES_128_CBC_SHA256", 0},
{183, "TLS_RSA_PSK_WITH_AES_256_CBC_SHA384", 0},
{184, "TLS_RSA_PSK_WITH_NULL_SHA256", 0},
{185, "TLS_RSA_PSK_WITH_NULL_SHA384", 0},
{186, "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256", 0},
{187, "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256", 0},
{188, "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256", 0},
{189, "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256", 0},
{190, "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256", 0},
{191, "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256", 0},
{192, "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256", 0},
{193, "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256", 0},
{194, "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256", 0},
{195, "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256", 0},
{196, "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256", 0},
{197, "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256", 0},
{255, "TLS_EMPTY_RENEGOTIATION_INFO_SCSV", 0},
{4865, "TLS_AES_128_GCM_SHA256", 0},
{4866, "TLS_AES_256_GCM_SHA384", 0},
{4867, "TLS_CHACHA20_POLY1305_SHA256", 0},
{4868, "TLS_AES_128_CCM_SHA256", 0},
{4869, "TLS_AES_128_CCM_8_SHA256", 0},
{22016, "TLS_FALLBACK_SCSV", 0},
{49153, "TLS_ECDH_ECDSA_WITH_NULL_SHA", 0},
{49154, "TLS_ECDH_ECDSA_WITH_RC4_128_SHA", 0},
{49155, "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA", 0},
{49156, "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA", 0},
{49157, "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA", 0},
{49158, "TLS_ECDHE_ECDSA_WITH_NULL_SHA", 0},
{49159, "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", 0},
{49160, "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA", 0},
{49161, "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", 0},
{49162, "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", 0},
{49163, "TLS_ECDH_RSA_WITH_NULL_SHA", 0},
{49164, "TLS_ECDH_RSA_WITH_RC4_128_SHA", 0},
{49165, "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA", 0},
{49166, "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA", 0},
{49167, "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA", 0},
{49168, "TLS_ECDHE_RSA_WITH_NULL_SHA", 0},
{49169, "TLS_ECDHE_RSA_WITH_RC4_128_SHA", 0},
{49170, "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", 0},
{49171, "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", 0},
{49172, "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", 0},
{49173, "TLS_ECDH_anon_WITH_NULL_SHA", 0},
{49174, "TLS_ECDH_anon_WITH_RC4_128_SHA", 0},
{49175, "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", 0},
{49176, "TLS_ECDH_anon_WITH_AES_128_CBC_SHA", 0},
{49177, "TLS_ECDH_anon_WITH_AES_256_CBC_SHA", 0},
{49178, "TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA", 0},
{49179, "TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA", 0},
{49180, "TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA", 0},
{49181, "TLS_SRP_SHA_WITH_AES_128_CBC_SHA", 0},
{49182, "TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA", 0},
{49183, "TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA", 0},
{49184, "TLS_SRP_SHA_WITH_AES_256_CBC_SHA", 0},
{49185, "TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA", 0},
{49186, "TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA", 0},
{49187, "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", 0},
{49188, "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", 0},
{49189, "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256", 0},
{49190, "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384", 0},
{49191, "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", 0},
{49192, "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384", 0},
{49193, "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256", 0},
{49194, "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384", 0},
{49195, "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", 0},
{49196, "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", 0},
{49197, "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256", 0},
{49198, "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384", 0},
{49199, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", 0},
{49200, "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", 0},
{49201, "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256", 0},
{49202, "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384", 0},
{49203, "TLS_ECDHE_PSK_WITH_RC4_128_SHA", 0},
{49204, "TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA", 0},
{49205, "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA", 0},
{49206, "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA", 0},
{49207, "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256", 0},
{49208, "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384", 0},
{49209, "TLS_ECDHE_PSK_WITH_NULL_SHA", 0},
{49210, "TLS_ECDHE_PSK_WITH_NULL_SHA256", 0},
{49211, "TLS_ECDHE_PSK_WITH_NULL_SHA384", 0},
{49212, "TLS_RSA_WITH_ARIA_128_CBC_SHA256", 0},
{49213, "TLS_RSA_WITH_ARIA_256_CBC_SHA384", 0},
{49214, "TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256", 0},
{49215, "TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384", 0},
{49216, "TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256", 0},
{49217, "TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384", 0},
{49218, "TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256", 0},
{49219, "TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384", 0},
{49220, "TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256", 0},
{49221, "TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384", 0},
{49222, "TLS_DH_anon_WITH_ARIA_128_CBC_SHA256", 0},
{49223, "TLS_DH_anon_WITH_ARIA_256_CBC_SHA384", 0},
{49224, "TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256", 0},
{49225, "TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384", 0},
{49226, "TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256", 0},
{49227, "TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384", 0},
{49228, "TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256", 0},
{49229, "TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384", 0},
{49230, "TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256", 0},
{49231, "TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384", 0},
{49232, "TLS_RSA_WITH_ARIA_128_GCM_SHA256", 0},
{49233, "TLS_RSA_WITH_ARIA_256_GCM_SHA384", 0},
{49234, "TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256", 0},
{49235, "TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384", 0},
{49236, "TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256", 0},
{49237, "TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384", 0},
{49238, "TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256", 0},
{49239, "TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384", 0},
{49240, "TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256", 0},
{49241, "TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384", 0},
{49242, "TLS_DH_anon_WITH_ARIA_128_GCM_SHA256", 0},
{49243, "TLS_DH_anon_WITH_ARIA_256_GCM_SHA384", 0},
{49244, "TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256", 0},
{49245, "TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384", 0},
{49246, "TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256", 0},
{49247, "TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384", 0},
{49248, "TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256", 0},
{49249, "TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384", 0},
{49250, "TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256", 0},
{49251, "TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384", 0},
{49252, "TLS_PSK_WITH_ARIA_128_CBC_SHA256", 0},
{49253, "TLS_PSK_WITH_ARIA_256_CBC_SHA384", 0},
{49254, "TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256", 0},
{49255, "TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384", 0},
{49256, "TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256", 0},
{49257, "TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384", 0},
{49258, "TLS_PSK_WITH_ARIA_128_GCM_SHA256", 0},
{49259, "TLS_PSK_WITH_ARIA_256_GCM_SHA384", 0},
{49260, "TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256", 0},
{49261, "TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384", 0},
{49262, "TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256", 0},
{49263, "TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384", 0},
{49264, "TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256", 0},
{49265, "TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384", 0},
{49266, "TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256", 0},
{49267, "TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384", 0},
{49268, "TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256", 0},
{49269, "TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384", 0},
{49270, "TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256", 0},
{49271, "TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384", 0},
{49272, "TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256", 0},
{49273, "TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384", 0},
{49274, "TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256", 0},
{49275, "TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384", 0},
{49276, "TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256", 0},
{49277, "TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384", 0},
{49278, "TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256", 0},
{49279, "TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384", 0},
{49280, "TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256", 0},
{49281, "TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384", 0},
{49282, "TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256", 0},
{49283, "TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384", 0},
{49284, "TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256", 0},
{49285, "TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384", 0},
{49286, "TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256", 0},
{49287, "TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384", 0},
{49288, "TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256", 0},
{49289, "TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384", 0},
{49290, "TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256", 0},
{49291, "TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384", 0},
{49292, "TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256", 0},
{49293, "TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384", 0},
{49294, "TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256", 0},
{49295, "TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384", 0},
{49296, "TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256", 0},
{49297, "TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384", 0},
{49298, "TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256", 0},
{49299, "TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384", 0},
{49300, "TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256", 0},
{49301, "TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384", 0},
{49302, "TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256", 0},
{49303, "TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384", 0},
{49304, "TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256", 0},
{49305, "TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384", 0},
{49306, "TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256", 0},
{49307, "TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384", 0},
{49308, "TLS_RSA_WITH_AES_128_CCM", 0},
{49309, "TLS_RSA_WITH_AES_256_CCM", 0},
{49310, "TLS_DHE_RSA_WITH_AES_128_CCM", 0},
{49311, "TLS_DHE_RSA_WITH_AES_256_CCM", 0},
{49312, "TLS_RSA_WITH_AES_128_CCM_8", 0},
{49313, "TLS_RSA_WITH_AES_256_CCM_8", 0},
{49314, "TLS_DHE_RSA_WITH_AES_128_CCM_8", 0},
{49315, "TLS_DHE_RSA_WITH_AES_256_CCM_8", 0},
{49316, "TLS_PSK_WITH_AES_128_CCM", 0},
{49317, "TLS_PSK_WITH_AES_256_CCM", 0},
{49318, "TLS_DHE_PSK_WITH_AES_128_CCM", 0},
{49319, "TLS_DHE_PSK_WITH_AES_256_CCM", 0},
{49320, "TLS_PSK_WITH_AES_128_CCM_8", 0},
{49321, "TLS_PSK_WITH_AES_256_CCM_8", 0},
{49322, "TLS_PSK_DHE_WITH_AES_128_CCM_8", 0},
{49323, "TLS_PSK_DHE_WITH_AES_256_CCM_8", 0},
{49324, "TLS_ECDHE_ECDSA_WITH_AES_128_CCM", 0},
{49325, "TLS_ECDHE_ECDSA_WITH_AES_256_CCM", 0},
{49326, "TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8", 0},
{49327, "TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8", 0},
{52392, "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256", 0},
{52393, "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256", 0},
{52394, "TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256", 0},
{52395, "TLS_PSK_WITH_CHACHA20_POLY1305_SHA256", 0},
{52396, "TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256", 0},
{52397, "TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256", 0},
{52398, "TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256", 0},
// DRAFT-IETF-TLS-ECC
{71, "TLS_ECDH_ECDSA_WITH_NULL_SHA", 0},
{72, "TLS_ECDH_ECDSA_WITH_RC4_128_SHA", 0},
{73, "TLS_ECDH_ECDSA_WITH_DES_CBC_SHA", 0},
{74, "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA", 0},
{75, "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA", 0},
{76, "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA", 0},
{75, "TLS_ECDH_ECDSA_EXPORT_WITH_RC4_40_SHA", 0},
{76, "TLS_ECDH_ECDSA_EXPORT_WITH_RC4_56_SHA", 0},
{77, "TLS_ECDH_RSA_WITH_NULL_SHA", 0},
{78, "TLS_ECDH_RSA_WITH_RC4_128_SHA", 0},
{79, "TLS_ECDH_RSA_WITH_DES_CBC_SHA", 0},
{80, "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA", 0},
{81, "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA", 0},
{82, "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA", 0},
{83, "TLS_ECDH_RSA_EXPORT_WITH_RC4_40_SHA", 0},
{84, "TLS_ECDH_RSA_EXPORT_WITH_RC4_56_SHA", 0},
{85, "TLS_ECDH_anon_NULL_WITH_SHA", 0},
{86, "TLS_ECDH_anon_WITH_RC4_128_SHA", 0},
{87, "TLS_ECDH_anon_WITH_DES_CBC_SHA", 0},
{88, "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", 0},
{89, "TLS_ECDH_anon_EXPORT_WITH_DES40_CBC_SHA", 0},
{90, "TLS_ECDH_anon_EXPORT_WITH_RC4_40_SHA", 0},
// DRAFT-IETF-TLS-56-BIT-CIPHERSUITES
{96, "TLS_RSA_EXPORT1024_WITH_RC4_56_MD5", 0},
{97, "TLS_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5", 0},
{98, "TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA", 0},
{99, "TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA", 0},
{100, "TLS_RSA_EXPORT1024_WITH_RC4_56_SHA", 0},
{101, "TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA", 0},
{102, "TLS_DHE_DSS_WITH_RC4_128_SHA", 0},
// FIPS SSL (Netscape)
{65278, "SSL_RSA_FIPS_WITH_DES_CBC_SHA", 0},
{65279, "SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA", 0},
// SSL 2.0
{65664, "SSL2_RC4_128_WITH_MD5", 0},
{131200, "SSL2_RC4_128_EXPORT40_WITH_MD5", 0},
{196736, "SSL2_RC2_CBC_128_CBC_WITH_MD5", 0},
{262272, "SSL2_RC2_128_CBC_EXPORT40_WITH_MD5", 0},
{327808, "SSL2_IDEA_128_CBC_WITH_MD5", 0},
{393280, "SSL2_DES_64_CBC_WITH_MD5", 0},
{393536, "SSL2_DES_64_CBC_WITH_SHA", 0},
{458944, "SSL2_DES_192_EDE3_CBC_WITH_MD5", 0},
{459200, "SSL2_DES_192_EDE3_CBC_WITH_SHA", 0},
{524416, "SSL2_RC4_64_WITH_MD5", 0},
{2570, "GREASE 0x0A0A", 0},
{6682, "GREASE 0x1A1A", 0},
{10794, "GREASE 0x2A2A", 0},
{14906, "GREASE 0x3A3A", 0},
{19018, "GREASE 0x4A4A", 0},
{23130, "GREASE 0x5A5A", 0},
{27242, "GREASE 0x6A6A", 0},
{31354, "GREASE 0x7A7A", 0},
{35466, "GREASE 0x8A8A", 0},
{39578, "GREASE 0x9A9A", 0},
{43690, "GREASE 0xAAAA", 0},
{47802, "GREASE 0xBABA", 0},
{51914, "GREASE 0xCACA", 0},
{56026, "GREASE 0xDADA", 0},
{60138, "GREASE 0xEAEA", 0},
{64250, "GREASE 0xFAFA", 0},
{-1}};
static int decode_AlertLevel_warning(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
struct json_object *jobj;
jobj = ssl->cur_json_st;
json_object_object_add(jobj, "alert_level",
json_object_new_string("warning"));
return 0;
}
static int decode_AlertLevel_fatal(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
struct json_object *jobj;
jobj = ssl->cur_json_st;
json_object_object_add(jobj, "alert_level", json_object_new_string("fatal"));
return 0;
}
decoder AlertLevel_decoder[] = {{1, "warning", decode_AlertLevel_warning},
{2, "fatal", decode_AlertLevel_fatal},
{-1}};
static int decode_AlertDescription_close_notify(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_unexpected_message(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_bad_record_mac(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_decryption_failed(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_record_overflow(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_decompression_failure(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_handshake_failure(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_bad_certificate(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_unsupported_certificate(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_certificate_revoked(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_certificate_expired(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_certificate_unknown(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_illegal_parameter(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_unknown_ca(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_access_denied(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_decode_error(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_decrypt_error(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_export_restriction(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_protocol_version(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_insufficient_security(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_internal_error(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_user_canceled(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_AlertDescription_no_renegotiation(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
decoder AlertDescription_decoder[] = {
{0, "close_notify", decode_AlertDescription_close_notify},
{10, "unexpected_message", decode_AlertDescription_unexpected_message},
{20, "bad_record_mac", decode_AlertDescription_bad_record_mac},
{21, "decryption_failed", decode_AlertDescription_decryption_failed},
{22, "record_overflow", decode_AlertDescription_record_overflow},
{30, "decompression_failure",
decode_AlertDescription_decompression_failure},
{40, "handshake_failure", decode_AlertDescription_handshake_failure},
{42, "bad_certificate", decode_AlertDescription_bad_certificate},
{43, "unsupported_certificate",
decode_AlertDescription_unsupported_certificate},
{44, "certificate_revoked", decode_AlertDescription_certificate_revoked},
{45, "certificate_expired", decode_AlertDescription_certificate_expired},
{46, "certificate_unknown", decode_AlertDescription_certificate_unknown},
{47, "illegal_parameter", decode_AlertDescription_illegal_parameter},
{48, "unknown_ca", decode_AlertDescription_unknown_ca},
{49, "access_denied", decode_AlertDescription_access_denied},
{50, "decode_error", decode_AlertDescription_decode_error},
{51, "decrypt_error", decode_AlertDescription_decrypt_error},
{60, "export_restriction", decode_AlertDescription_export_restriction},
{70, "protocol_version", decode_AlertDescription_protocol_version},
{71, "insufficient_security",
decode_AlertDescription_insufficient_security},
{80, "internal_error", decode_AlertDescription_internal_error},
{90, "user_canceled", decode_AlertDescription_user_canceled},
{100, "no_renegotiation", decode_AlertDescription_no_renegotiation},
{-1}};
decoder compression_method_decoder[] = {{0, "NULL", 0}, {-1}};
static int decode_client_certificate_type_rsa_sign(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_client_certificate_type_dss_sign(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_client_certificate_type_rsa_fixed_dh(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
static int decode_client_certificate_type_dss_fixed_dh(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
return 0;
}
decoder client_certificate_type_decoder[] = {
{1, "rsa_sign", decode_client_certificate_type_rsa_sign},
{2, "dss_sign", decode_client_certificate_type_dss_sign},
{3, "rsa_fixed_dh", decode_client_certificate_type_rsa_fixed_dh},
{4, "dss_fixed_dh", decode_client_certificate_type_dss_fixed_dh},
{-1}};
static int decode_extension_server_name(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
UINT4 t, l;
int r, p;
extern decoder server_name_type_decoder[];
SSL_DECODE_UINT16(ssl, "extension length", 0, data, &l);
if(dir == DIR_I2R) {
SSL_DECODE_UINT16(ssl, "server name list length", 0, data, &l);
LF;
while(l) {
p = data->len;
SSL_DECODE_UINT8(ssl, "server name type", 0, data, &t);
if(ssl_decode_switch(ssl, server_name_type_decoder, t, dir, seg, data) ==
R_NOT_FOUND) {
decode_server_name(ssl, dir, seg, data);
P_(P_RH) {
explain(ssl, "Server Name type: %u not yet implemented in ssldump\n",
t);
}
continue;
}
l -= (p - data->len);
}
} else {
data->len -= l;
data->data += l;
}
return 0;
}
static int decode_extension_encrypt_then_mac(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
int r, *etm;
UINT4 l;
etm = &ssl->extensions->encrypt_then_mac;
SSL_DECODE_UINT16(ssl, "extension length", 0, data, &l);
data->len -= l;
data->data += l;
dir == DIR_I2R ? *etm = 1 : ++*etm;
return 0;
}
static int decode_extension_extended_master_secret(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
int r, *ems;
UINT4 l;
ems = &ssl->extensions->extended_master_secret;
SSL_DECODE_UINT16(ssl, "extension length", 0, data, &l);
data->len -= l;
data->data += l;
dir == DIR_I2R ? *ems = 1 : ++*ems;
return 0;
}
static int decode_extension(ssl_obj *ssl, int dir, segment *seg, Data *data) {
int r;
UINT4 l;
SSL_DECODE_UINT16(ssl, "extension length", 0, data, &l);
data->len -= l;
data->data += l;
return 0;
}
decoder supported_groups_decoder[] = {
{0x0017, "secp256r1", 0}, {0x0018, "secp384r1", 0},
{0x0019, "secp521r1", 0}, {0x001d, "x25519", 0},
{0x001e, "x448", 0}, {0x0100, "ffdhe2048", 0},
{0x0101, "ffdhe3072", 0}, {0x0102, "ffdhe4096", 0},
{0x0103, "ffdhe6144", 0}, {0x0104, "ffdhe8192", 0},
};
// Extension #10 supported_groups (renamed from "elliptic_curves")
static int decode_extension_supported_groups(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
int r, p;
UINT4 l, g;
char *ja3_ec_str = NULL;
SSL_DECODE_UINT16(ssl, "extension length", 0, data, &l);
if(dir == DIR_I2R) {
SSL_DECODE_UINT16(ssl, "supported_groups list length", 0, data, &l);
LF;
while(l) {
p = data->len;
SSL_DECODE_ENUM(ssl, "supported group", 2, supported_groups_decoder,
SSL_PRINT_ALL, data, &g);
LF;
if(!ja3_ec_str)
ja3_ec_str = calloc(7, 1);
else
ja3_ec_str = realloc(ja3_ec_str, strlen(ja3_ec_str) + 7);
snprintf(ja3_ec_str + strlen(ja3_ec_str), 7, "%u-", g);
l -= (p - data->len);
}
if(ja3_ec_str && ja3_ec_str[strlen(ja3_ec_str) - 1] == '-')
ja3_ec_str[strlen(ja3_ec_str) - 1] = '\0';
} else {
data->len -= l;
data->data += l;
}
ssl->cur_ja3_ec_str = ja3_ec_str;
return 0;
}
decoder ec_point_formats_decoder[] = {{
0,
"uncompressed",
0,
},
{
1,
"ansiX962_compressed_prime",
0,
},
{
2,
"ansiX962_compressed_char2",
0,
}};
// Extension #11 ec_point_formats
static int decode_extension_ec_point_formats(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
int r, p;
UINT4 l, f;
char *ja3_ecp_str = NULL;
SSL_DECODE_UINT16(ssl, "extension length", 0, data, &l);
if(dir == DIR_I2R) {
SSL_DECODE_UINT8(ssl, "ec_point_formats list length", 0, data, &l);
LF;
while(l) {
p = data->len;
SSL_DECODE_ENUM(ssl, "ec point format", 1, ec_point_formats_decoder,
SSL_PRINT_ALL, data, &f);
LF;
if(!ja3_ecp_str)
ja3_ecp_str = calloc(5, 1);
else
ja3_ecp_str = realloc(ja3_ecp_str, strlen(ja3_ecp_str) + 5);
snprintf(ja3_ecp_str + strlen(ja3_ecp_str), 5, "%u-", f);
l -= (p - data->len);
}
if(ja3_ecp_str && ja3_ecp_str[strlen(ja3_ecp_str) - 1] == '-')
ja3_ecp_str[strlen(ja3_ecp_str) - 1] = '\0';
} else {
data->len -= l;
data->data += l;
}
ssl->cur_ja3_ecp_str = ja3_ecp_str;
return 0;
}
static int decode_extension_supported_versions(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
int r;
UINT4 len, version;
SSL_DECODE_UINT16(ssl, "extensions length", 0, data, &len);
LF;
if(dir == DIR_I2R)
SSL_DECODE_UINT8(ssl, "supported versions length", 0, data,
&len); // client sends extension<..>
while(len) {
SSL_DECODE_UINT16(ssl, "supported version", 0, data, &version);
explain(ssl, "version: %u.%u", (version >> 8) & 0xff, version & 0xff);
len -= 2;
if(len)
printf("\n");
}
if(dir == DIR_R2I)
ssl->version = version; // Server sets the tls version
return 0;
}
decoder tls13_certificate_types[] = {{0, "x509", 0},
{1, "openpgp", 0},
{2, "raw public key", 0},
{3, "1609 dot 2", 0}};
static int decode_extension_client_certificate_type(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
int r;
UINT4 len, certificate_type;
SSL_DECODE_UINT16(ssl, "extensions length", 0, data, &len);
LF;
if(dir == DIR_I2R)
SSL_DECODE_UINT8(ssl, "client certificates length", 0, data,
&len); // client sends certificates<..>
while(len) {
SSL_DECODE_ENUM(ssl, "certificate type", 1, tls13_certificate_types,
SSL_PRINT_ALL, data, &certificate_type);
len -= 1;
data += 1;
if(len)
printf("\n");
}
if(dir == DIR_R2I)
ssl->extensions->client_certificate_type =
certificate_type; // Server sets the client_certificate_type
return 0;
}
static int decode_extension_server_certificate_type(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
int r;
UINT4 len, certificate_type;
SSL_DECODE_UINT16(ssl, "extensions length", 0, data, &len);
LF;
if(dir == DIR_I2R)
SSL_DECODE_UINT8(ssl, "server certificates length", 0, data,
&len); // client sends certificates<..>
while(len) {
SSL_DECODE_ENUM(ssl, "certificate type", 1, tls13_certificate_types,
SSL_PRINT_ALL, data, &certificate_type);
len -= 1;
data += 1;
if(len)
printf("\n");
}
if(dir == DIR_R2I)
ssl->extensions->server_certificate_type =
certificate_type; // Server sets the server_certificate_type
return 0;
}
decoder extension_decoder[] = {
{
0,
"server_name",
decode_extension_server_name,
},
{1, "max_fragment_length", decode_extension},
{2, "client_certificate_url", decode_extension},
{3, "trusted_ca_keys", decode_extension},
{4, "truncated_hmac", decode_extension},
{5, "status_request", decode_extension},
{6, "user_mapping", decode_extension},
{7, "client_authz", decode_extension},
{8, "server_authz", decode_extension},
{9, "cert_type", decode_extension},
{10, "supported_groups", decode_extension_supported_groups},
{11, "ec_point_formats", decode_extension_ec_point_formats},
{12, "srp", decode_extension},
{13, "signature_algorithms", decode_extension},
{14, "use_srtp", decode_extension},
{15, "heartbeat", decode_extension},
{16, "application_layer_protocol_negotiation", decode_extension},
{17, "status_request_v2", decode_extension},
{18, "signed_certificate_timestamp", decode_extension},
{19, "client_certificate_type", decode_extension_client_certificate_type},
{20, "server_certificate_type", decode_extension_server_certificate_type},
{21, "padding", decode_extension},
{22, "encrypt_then_mac", decode_extension_encrypt_then_mac},
{23, "extended_master_secret", decode_extension_extended_master_secret},
{24, "token_binding", decode_extension},
{25, "cached_info", decode_extension},
{26, "tls_lts", decode_extension},
{27, "compress_certificate", decode_extension},
{28, "record_size_limit", decode_extension},
{29, "pwd_protect", decode_extension},
{30, "pwd_clear", decode_extension},
{31, "password_salt", decode_extension},
{32, "ticket_pinning", decode_extension},
{33, "tls_cert_with_extern_psk", decode_extension},
{34, "delegated_credentials", decode_extension},
{35, "session_ticket", decode_extension},
{36, "TLMSP", decode_extension},
{37, "TLMSP_proxying", decode_extension},
{38, "TLMSP_delegate", decode_extension},
{39, "supported_ekt_ciphers", decode_extension},
{41, "pre_shared_key", decode_extension},
{42, "early_data", decode_extension},
{43, "supported_versions", decode_extension_supported_versions},
{44, "cookie", decode_extension},
{45, "psk_key_exchange_modes", decode_extension},
{47, "certificate_authorities", decode_extension},
{48, "oid_filters", decode_extension},
{49, "post_handshake_auth", decode_extension},
{50, "signature_algorithms_cert", decode_extension},
{51, "key_share", decode_extension},
{52, "transparency_info", decode_extension},
{53, "connection_id", decode_extension},
{55, "external_id_hash", decode_extension},
{56, "external_session_id", decode_extension},
{13172, "next_protocol_negotiation", decode_extension},
{0xff01, "renegotiation_info", decode_extension},
{-1}};
static int decode_server_name_type_host_name(ssl_obj *ssl,
int dir,
segment *seg,
Data *data) {
int r;
UINT4 l;
SSL_DECODE_UINT16(ssl, "server name length", 0, data, &l);
if(!(NET_print_flags & NET_PRINT_JSON))
printf(": %.*s", l, data->data);
/* Possibly use data->data to set/modify ssl->server_name */
if(l != 0) {
char *server_name;
server_name = calloc(l + 1, sizeof(char));
if(server_name != NULL) {
if(ssl->server_name)
free(ssl->server_name);
if(l > data->len)
l = data->len;
memcpy(server_name, data->data, l);
ssl->server_name = server_name;
}
}
data->len -= l;
data->data += l;
return 0;
}
static int decode_server_name(ssl_obj *ssl, int dir, segment *seg, Data *data) {
int r;
UINT4 l;
SSL_DECODE_UINT16(ssl, "server name length", 0, data, &l);
data->len -= l;
data->data += l;
return 0;
}
decoder server_name_type_decoder[] = {
{0, "host_name", decode_server_name_type_host_name},
{-1}};