49 lines
2.4 KiB
PowerShell
49 lines
2.4 KiB
PowerShell
|
|
[Console]::OutputEncoding = [Text.Encoding]::UTF8
|
||
|
|
# Extract AECH (sub=05) / AERE (sub=06) frames from cold2.tsv, diff across rounds
|
||
|
|
$raw = [IO.File]::ReadAllBytes("$env:TEMP\opencode\cold2.tsv")
|
||
|
|
$text = [Text.Encoding]::UTF8.GetString($raw)
|
||
|
|
if ($raw[0] -eq 0xFF -and $raw[1] -eq 0xFE) { $text = [Text.Encoding]::Unicode.GetString($raw) }
|
||
|
|
$lines = $text -split "`r?`n"
|
||
|
|
|
||
|
|
function H2B($hex) { $h = $hex -replace " ",""; $n = $h.Length/2; $b = New-Object byte[] $n; for ($i=0; $i -lt $n; $i++) { $b[$i] = [Convert]::ToByte($h.Substring(2*$i,2),16) }; return $b }
|
||
|
|
|
||
|
|
$chals = @(); $resps = @()
|
||
|
|
foreach ($l in $lines) {
|
||
|
|
$p = $l -split "`t"
|
||
|
|
if ($p.Count -lt 5 -or -not $p[4]) { continue }
|
||
|
|
$b = H2B $p[4]
|
||
|
|
if ($b.Length -lt 0x30) { continue }
|
||
|
|
if ($b[0] -ne 0x45 -or $b[1] -ne 0x4e -or $b[2] -ne 0x65 -or $b[3] -ne 0x74) { continue } # ENet
|
||
|
|
$tag = [Text.Encoding]::ASCII.GetString($b[0x28..0x2B])
|
||
|
|
if ($tag -eq "AECH") { $chals += ,@{ t=[double]$p[0]; src=$p[1]; b=$b } }
|
||
|
|
if ($tag -eq "AERE") { $resps += ,@{ t=[double]$p[0]; src=$p[1]; b=$b } }
|
||
|
|
}
|
||
|
|
Write-Host "AECH challenges: $($chals.Count), AERE responses: $($resps.Count)"
|
||
|
|
foreach ($c in $chals) { Write-Host (" CHAL t={0,8:F3} src={1} len={2}" -f $c.t, $c.src, $c.b.Length) }
|
||
|
|
foreach ($r in $resps) { Write-Host (" RESP t={0,8:F3} src={1} len={2}" -f $r.t, $r.src, $r.b.Length) }
|
||
|
|
|
||
|
|
# diff rounds: varying offset runs
|
||
|
|
function Diff-Frames($frames, $label) {
|
||
|
|
if ($frames.Count -lt 2) { return }
|
||
|
|
$len = $frames[0].b.Length
|
||
|
|
$vary = @()
|
||
|
|
for ($i = 0; $i -lt $len; $i++) {
|
||
|
|
$v = $frames[0].b[$i]; $diff = $false
|
||
|
|
foreach ($f in $frames) { if ($f.b[$i] -ne $v) { $diff = $true; break } }
|
||
|
|
if ($diff) { $vary += $i }
|
||
|
|
}
|
||
|
|
Write-Host "`n=== $label varying offsets ($($vary.Count) bytes) ==="
|
||
|
|
# group into runs
|
||
|
|
$runs = @(); $start = -1; $prev = -2
|
||
|
|
foreach ($o in $vary) { if ($o -ne $prev + 1) { if ($start -ge 0) { $runs += ,"$start-$prev" }; $start = $o }; $prev = $o }
|
||
|
|
if ($start -ge 0) { $runs += ,"$start-$prev" }
|
||
|
|
foreach ($r in $runs) {
|
||
|
|
$a, $bb = $r -split "-"; $a = [int]$a; $bb = [int]$bb
|
||
|
|
$parts = @()
|
||
|
|
foreach ($f in $frames) { $parts += (($f.b[$a..$bb] | ForEach-Object { $_.ToString("x2") }) -join "") }
|
||
|
|
Write-Host (" 0x{0:x2}-0x{1:x2} ({2}B): {3}" -f $a, $bb, ($bb-$a+1), ($parts -join " | "))
|
||
|
|
}
|
||
|
|
}
|
||
|
|
Diff-Frames $chals "CHALLENGES"
|
||
|
|
Diff-Frames $resps "RESPONSES"
|