v0.1 - initial commit
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
package winpwn
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestFindXORKeyAvoidsBadChars(t *testing.T) {
|
||||
data := []byte{0x00, 0x0A, 0x0D, 0x41, 0x42}
|
||||
badChars := []byte{0x00, 0x0A, 0x0D}
|
||||
|
||||
key, err := FindXORKey(data, badChars)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
encoded := Xor(data, []byte{key})
|
||||
if HasBadChars(encoded, badChars) {
|
||||
t.Errorf("encoded output %x still contains a bad char (key=0x%02x)", encoded, key)
|
||||
}
|
||||
}
|
||||
|
||||
func TestEncodeXORRoundTrip(t *testing.T) {
|
||||
data := []byte("the quick brown fox")
|
||||
badChars := []byte{0x00, 0x0A, 0x0D, 0x20} // also avoid spaces, for fun
|
||||
|
||||
encoded, key, err := EncodeXOR(data, badChars)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if HasBadChars(encoded, badChars) {
|
||||
t.Errorf("encoded output still has bad chars")
|
||||
}
|
||||
|
||||
decoded := Xor(encoded, []byte{key})
|
||||
if !bytes.Equal(decoded, data) {
|
||||
t.Errorf("decoded = %q, want %q", decoded, data)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFindXORKeyImpossible(t *testing.T) {
|
||||
// Every byte 0..255 appears in data, so no key can avoid every byte
|
||||
// being a bad char if badChars also covers every value the key could
|
||||
// produce -- construct a case that's provably impossible: data
|
||||
// contains every byte value, and badChars also contains every byte
|
||||
// value, so any key XORed against some data byte lands on a bad byte.
|
||||
data := make([]byte, 256)
|
||||
for i := range data {
|
||||
data[i] = byte(i)
|
||||
}
|
||||
badChars := data // all 256 values are "bad"
|
||||
|
||||
if _, err := FindXORKey(data, badChars); err == nil {
|
||||
t.Error("expected an error when every byte value is both present and forbidden")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user