aboutsummaryrefslogtreecommitdiff
path: root/src/lib/ndpi_utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/ndpi_utils.c')
-rw-r--r--src/lib/ndpi_utils.c93
1 files changed, 77 insertions, 16 deletions
diff --git a/src/lib/ndpi_utils.c b/src/lib/ndpi_utils.c
index 80342b32d..3ed2592b2 100644
--- a/src/lib/ndpi_utils.c
+++ b/src/lib/ndpi_utils.c
@@ -1767,7 +1767,7 @@ const char* ndpi_risk2str(ndpi_risk_enum risk) {
case NDPI_TLS_UNCOMMON_ALPN:
return("Uncommon TLS ALPN");
-
+
case NDPI_TLS_CERT_VALIDITY_TOO_LONG:
return("TLS certificate validity longer than 13 months");
@@ -1787,7 +1787,7 @@ const char* ndpi_severity2str(ndpi_risk_severity s) {
case NDPI_RISK_LOW:
return("Low");
break;
-
+
case NDPI_RISK_MEDIUM:
return("Medium");
break;
@@ -1813,16 +1813,16 @@ u_int16_t ndpi_risk2score(ndpi_risk risk,
u_int32_t i;
*client_score = *server_score = 0; /* Reset values */
-
+
if(risk == 0) return(0);
-
+
for(i = 0; i < NDPI_MAX_RISK; i++) {
ndpi_risk_enum r = (ndpi_risk_enum)i;
if(NDPI_ISSET_BIT(risk, r)) {
ndpi_risk_info *info = ndpi_risk2severity(r);
u_int16_t val = 0, client_score_val;
-
+
switch(info->severity) {
case NDPI_RISK_LOW:
val = NDPI_SCORE_RISK_LOW;
@@ -2016,7 +2016,7 @@ int ndpi_hash_add_entry(ndpi_str_hash *h, char *key, u_int8_t key_len, u_int8_t
if(e == NULL)
return(-2);
-
+
if((e->key = (char*)ndpi_malloc(key_len)) == NULL)
return(-3);
@@ -2043,7 +2043,7 @@ static u_int64_t ndpi_host_ip_risk_ptree_match(struct ndpi_detection_module_stru
if(node)
return(node->value.u.uv64);
- else
+ else
return((u_int64_t)-1);
}
@@ -2052,7 +2052,7 @@ static u_int64_t ndpi_host_ip_risk_ptree_match(struct ndpi_detection_module_stru
static void ndpi_handle_risk_exceptions(struct ndpi_detection_module_struct *ndpi_str,
struct ndpi_flow_struct *flow) {
char *host;
-
+
if(flow->risk == 0) return; /* Nothing to do */
host = ndpi_get_flow_name(flow);
@@ -2061,14 +2061,14 @@ static void ndpi_handle_risk_exceptions(struct ndpi_detection_module_struct *ndp
if(host && (host[0] != '\0')) {
/* Check host exception */
ndpi_automa *automa = &ndpi_str->host_risk_mask_automa;
-
+
if(automa->ac_automa) {
AC_TEXT_t ac_input_text;
AC_REP_t match;
-
+
ac_input_text.astring = host, ac_input_text.length = strlen(host);
ac_input_text.option = 0;
-
+
if(ac_automata_search(automa->ac_automa, &ac_input_text, &match) > 0)
flow->risk &= match.number64;
}
@@ -2081,11 +2081,11 @@ static void ndpi_handle_risk_exceptions(struct ndpi_detection_module_struct *ndp
/* TODO: add IPv6 support */
if(!flow->ip_risk_mask_evaluated) {
flow->host_risk_mask = (u_int64_t)-1; /* No mask */
-
+
if(flow->packet.iph) {
struct ndpi_packet_struct *packet = &flow->packet;
struct in_addr pin;
-
+
pin.s_addr = packet->iph->saddr;
flow->host_risk_mask &= ndpi_host_ip_risk_ptree_match(ndpi_str, &pin);
@@ -2161,13 +2161,74 @@ float ndpi_calculate_entropy(u_int8_t const * const buf, size_t len)
char* ndpi_get_flow_name(struct ndpi_flow_struct *flow) {
if(!flow) goto no_flow_info;
-
+
if(flow->host_server_name[0] != '\0')
return((char*)flow->host_server_name);
-
+
if(flow->protos.tls_quic_stun.tls_quic.client_requested_server_name[0] != '\0')
return(flow->protos.tls_quic_stun.tls_quic.client_requested_server_name);
-
+
no_flow_info:
return((char*)"");
}
+
+/* ******************************************* */
+
+void load_common_alpns(struct ndpi_detection_module_struct *ndpi_str) {
+ /* see: https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml */
+ const char* const common_alpns[] = {
+ "http/0.9", "http/1.0", "http/1.1",
+ "spdy/1", "spdy/2", "spdy/3", "spdy/3.1",
+ "stun.turn", "stun.nat-discovery",
+ "h2", "h2c", "h2-16", "h2-15", "h2-14", "h2-fb",
+ "webrtc", "c-webrtc",
+ "ftp", "imap", "pop3", "managesieve", "coap",
+ "xmpp-client", "xmpp-server",
+ "acme-tls/1",
+ "mqtt", "dot", "ntske/1", "sunrpc",
+ "h3",
+ "smb",
+ "irc",
+
+ /* QUIC ALPNs */
+ "h3-T051", "h3-T050",
+ "h3-32", "h3-30", "h3-29", "h3-28", "h3-27", "h3-24", "h3-22",
+ "hq-30", "hq-29", "hq-28", "hq-27",
+ "h3-fb-05", "h1q-fb",
+ "doq-i00",
+
+ NULL /* end */
+ };
+ u_int i;
+
+ for(i=0; common_alpns[i] != NULL; i++) {
+ AC_PATTERN_t ac_pattern;
+
+ memset(&ac_pattern, 0, sizeof(ac_pattern));
+ ac_pattern.astring = ndpi_strdup((char*)common_alpns[i]);
+ ac_pattern.length = strlen(common_alpns[i]);
+
+ if(ac_automata_add(ndpi_str->common_alpns_automa.ac_automa, &ac_pattern) != ACERR_SUCCESS)
+ printf("%s(): unable to add %s\n", __FUNCTION__, common_alpns[i]);
+ }
+}
+
+/* ******************************************* */
+
+u_int8_t is_a_common_alpn(struct ndpi_detection_module_struct *ndpi_str,
+ const char *alpn_to_check, u_int alpn_to_check_len) {
+ ndpi_automa *automa = &ndpi_str->common_alpns_automa;
+
+ if(automa->ac_automa) {
+ AC_TEXT_t ac_input_text;
+ AC_REP_t match;
+
+ ac_input_text.astring = (char*)alpn_to_check, ac_input_text.length = alpn_to_check_len;
+ ac_input_text.option = 0;
+
+ if(ac_automata_search(automa->ac_automa, &ac_input_text, &match) > 0)
+ return(1);
+ }
+
+ return(0);
+}