@@ -142,6 +142,7 @@ def parse_client_hello(body: bytes) -> dict:
142142 approximative en cas de doute.
143143 """
144144 if len (body ) < 34 :
145+ logger .trace ("parse_client_hello: corps trop court ({} octets), ignore" , len (body ))
145146 return {}
146147 version = _tls_version_str (body [0 ], body [1 ])
147148 i = 34 # client_version(2) + random(32)
@@ -159,6 +160,7 @@ def parse_client_hello(body: bytes) -> dict:
159160 i += 1 + comp_len
160161 ext_total_len = _read_u16 (body , i )
161162 if ext_total_len is None :
163+ logger .trace ("parse_client_hello: ClientHello sans extensions, SNI inconnu" )
162164 return {"tls_version" : version }
163165 i += 2
164166 ext_end = min (i + ext_total_len , len (body ))
@@ -180,6 +182,7 @@ def parse_client_hello(body: bytes) -> dict:
180182def parse_server_hello (body : bytes ) -> dict :
181183 """Extrait la version TLS negociee et le cipher suite choisi."""
182184 if len (body ) < 35 :
185+ logger .trace ("parse_server_hello: corps trop court ({} octets), ignore" , len (body ))
183186 return {}
184187 version = _tls_version_str (body [0 ], body [1 ])
185188 i = 34
@@ -193,6 +196,7 @@ def parse_server_hello(body: bytes) -> dict:
193196
194197def parse_alert (body : bytes ) -> dict :
195198 if len (body ) < 2 :
199+ logger .trace ("parse_alert: alerte tronquee ({} octet(s))" , len (body ))
196200 return {}
197201 level = ALERT_LEVELS .get (body [0 ], f"unknown({ body [0 ]} )" )
198202 desc = ALERT_DESCRIPTIONS .get (body [1 ], f"unknown({ body [1 ]} )" )
@@ -210,13 +214,15 @@ def _iter_tls_records(
210214 content_type , major , minor = payload [i ], payload [i + 1 ], payload [i + 2 ]
211215 length = int .from_bytes (payload [i + 3 : i + 5 ], "big" )
212216 if content_type not in TLS_CONTENT_TYPES or major != 3 :
217+ logger .trace ("_iter_tls_records: plus de TLS bien forme a l'offset {} (type {})" , i , content_type )
213218 break
214219 body_start = i + 5
215220 body_end = body_start + length
216221 truncated = body_end > n
217222 body = payload [body_start : min (body_end , n )]
218223 yield content_type , major , minor , length , body , truncated
219224 if truncated :
225+ logger .trace ("_iter_tls_records: record de {} octets tronque a {}" , length , len (body ))
220226 break # le reste est dans un segment suivant, pas de reassemblage ici
221227 i = body_end
222228
@@ -233,6 +239,7 @@ def _iter_handshake_messages(body: bytes) -> Iterator[tuple[int, bytes, bool]]:
233239 msg_start = i + 4
234240 msg_end = msg_start + hlen
235241 if msg_end > n :
242+ logger .trace ("_iter_handshake_messages: message {} tronque ({}/{} octets)" , htype , n - msg_start , hlen )
236243 yield htype , body [msg_start :n ], True
237244 break
238245 yield htype , body [msg_start :msg_end ], False
@@ -251,6 +258,8 @@ def parse_tls_capture(label: str, path: str) -> list[TlsEvent]:
251258 planter tout le run -- coherent avec le reste de netcross_core."""
252259 events : list [TlsEvent ] = []
253260 raw_packets = pcap_parser .parse_capture (path , raise_on_error = False )
261+ logger .debug ("parse_tls_capture: point {}, {} paquet(s) lus depuis {}" , label , len (raw_packets ), path )
262+ tls_segments = 0
254263
255264 for raw in raw_packets :
256265 if raw .proto != "TCP" or not raw .payload :
@@ -259,6 +268,7 @@ def parse_tls_capture(label: str, path: str) -> list[TlsEvent]:
259268 payload = raw .payload
260269 if not _looks_like_tls (payload ):
261270 continue
271+ tls_segments += 1
262272
263273 ts = raw .ts
264274 src , dst = raw .src , raw .dst
@@ -326,6 +336,13 @@ def parse_tls_capture(label: str, path: str) -> list[TlsEvent]:
326336 )
327337 )
328338
339+ logger .debug (
340+ "parse_tls_capture: point {}, {} segment(s) TLS, {} evenement(s) dont {} tronque(s)" ,
341+ label ,
342+ tls_segments ,
343+ len (events ),
344+ sum (1 for ev in events if ev .truncated ),
345+ )
329346 return events
330347
331348
@@ -388,6 +405,12 @@ def build_handshake_status(
388405 elif ev .record_type == "application_data" :
389406 st .application_data_seen = True
390407
408+ logger .debug (
409+ "build_handshake_status: {} evenement(s) -> {} flux sur {} point(s)" ,
410+ len (events ),
411+ sum (len (per_point ) for per_point in status .values ()),
412+ len (status ),
413+ )
391414 return status
392415
393416
@@ -413,6 +436,9 @@ def diagnose_tls(
413436 """
414437 findings : list [TlsFinding ] = []
415438 points = points_order or sorted (status_by_point )
439+ logger .debug (
440+ "diagnose_tls: {} point(s), ordre {}" , len (points ), "fourni" if points_order else "alphabetique (par defaut)"
441+ )
416442
417443 # -- alertes fatales, un constat par point --
418444 for point in points :
@@ -439,6 +465,7 @@ def diagnose_tls(
439465 if st_b is None :
440466 # flux pas vu au point suivant -- hors perimetre de ce module
441467 # (voir netcross_core.analyse pour les pertes)
468+ logger .trace ("diagnose_tls: flux {} absent en {}, ignore" , fid , b )
442469 continue
443470 if st_a .verdict == "complete" and st_b .verdict != "complete" :
444471 broken_here .append ((st_a , st_b ))
@@ -478,10 +505,16 @@ def diagnose_tls(
478505 f .segment ,
479506 )
480507 )
508+ logger .debug (
509+ "diagnose_tls: {} constat(s) dont {} anomalie(s)" ,
510+ len (findings ),
511+ sum (1 for f in findings if f .severity == "anomalie" ),
512+ )
481513 return findings
482514
483515
484516def print_tls_diagnostics (findings : list [TlsFinding ]) -> None :
517+ logger .debug ("print_tls_diagnostics: {} constat(s)" , len (findings ))
485518 print ("=" * 70 )
486519 print ("DIAGNOSTIC TLS -- etat des handshakes par point" )
487520 print ("=" * 70 )
0 commit comments