mirror of
https://github.com/Mezeporta/Erupe.git
synced 2026-03-28 02:23:37 +01:00
feat(protbot): add headless MHF protocol bot as cmd/protbot
Copy MHBridge into the Erupe module as cmd/protbot/ so it can be built, tested, and maintained alongside the server. The bot implements the full sign → entrance → channel login flow and supports lobby entry, chat, session setup, and quest enumeration. The conn/ package keeps its own Blowfish crypto primitives to avoid importing erupe-ce/config (which requires a config file at init).
This commit is contained in:
52
cmd/protbot/conn/bin8_test.go
Normal file
52
cmd/protbot/conn/bin8_test.go
Normal file
@@ -0,0 +1,52 @@
|
||||
package conn
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
// TestCalcSum32 verifies the checksum against a known input.
|
||||
func TestCalcSum32(t *testing.T) {
|
||||
// Verify determinism: same input gives same output.
|
||||
data := []byte("Hello, MHF!")
|
||||
sum1 := CalcSum32(data)
|
||||
sum2 := CalcSum32(data)
|
||||
if sum1 != sum2 {
|
||||
t.Fatalf("CalcSum32 not deterministic: %08X != %08X", sum1, sum2)
|
||||
}
|
||||
|
||||
// Different inputs produce different outputs (basic sanity).
|
||||
data2 := []byte("Hello, MHF?")
|
||||
sum3 := CalcSum32(data2)
|
||||
if sum1 == sum3 {
|
||||
t.Fatalf("CalcSum32 collision on different inputs: both %08X", sum1)
|
||||
}
|
||||
}
|
||||
|
||||
// TestDecryptBin8RoundTrip verifies that encrypting and decrypting with Bin8
|
||||
// produces the original data. We only have DecryptBin8, but we can verify
|
||||
// the encrypt→decrypt path by implementing encrypt inline here.
|
||||
func TestDecryptBin8RoundTrip(t *testing.T) {
|
||||
original := []byte("Test data for Bin8 encryption round-trip")
|
||||
key := byte(0x42)
|
||||
|
||||
// Encrypt (inline copy of Erupe's EncryptBin8)
|
||||
k := uint32(key)
|
||||
encrypted := make([]byte, len(original))
|
||||
for i := 0; i < len(original); i++ {
|
||||
rotate(&k)
|
||||
tmp := bin8Key[i&7] ^ byte((k>>13)&0xFF)
|
||||
encrypted[i] = original[i] ^ tmp
|
||||
}
|
||||
|
||||
// Decrypt
|
||||
decrypted := DecryptBin8(encrypted, key)
|
||||
|
||||
if len(decrypted) != len(original) {
|
||||
t.Fatalf("length mismatch: got %d, want %d", len(decrypted), len(original))
|
||||
}
|
||||
for i := range original {
|
||||
if decrypted[i] != original[i] {
|
||||
t.Fatalf("byte %d: got 0x%02X, want 0x%02X", i, decrypted[i], original[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user