package kdbx
import (
"strings"
"testing"
"time"
)
// A file whose header asks for more work than the limits allow is refused
// from its header alone — by Inspect, and by Open before any derivation.
func TestOverLimitKDFIsRefusedBeforeAnyWork(t *testing.T) {
saved := MaxArgon2Iterations
MaxArgon2Iterations = 10_000 // only to be able to write the file
data, err := New("Heavy", KDFParams{MemoryKiB: 8, Iterations: 5_000, Lanes: 1}).Marshal("pw-123456")
MaxArgon2Iterations = saved
if err != nil {
t.Fatal(err)
}
if err := Inspect(data); err == nil || !strings.Contains(err.Error(), "passes") {
t.Fatalf("Inspect = %v", err)
}
start := time.Now()
if _, err := Open(data, "pw-123456"); err == nil {
t.Fatal("Open accepted an over-limit file")
}
if time.Since(start) > 100*time.Millisecond {
t.Fatal("Open did the work before refusing")
}
// Within the limits, Inspect agrees with Open.
ok, err := New("Light", KDFParams{MemoryKiB: 64, Iterations: 1, Lanes: 1}).Marshal("pw-123456")
if err != nil {
t.Fatal(err)
}
if err := Inspect(ok); err != nil {
t.Fatalf("Inspect refused a normal file: %v", err)
}
}
func TestDeepOrHugeXMLIsRefused(t *testing.T) {
deep := strings.Repeat("", MaxXMLDepth+1) + strings.Repeat("", MaxXMLDepth+1)
if _, err := parseXML([]byte(deep)); err == nil || !strings.Contains(err.Error(), "deeper") {
t.Fatalf("deep xml: %v", err)
}
saved := MaxXMLNodes
MaxXMLNodes = 100
defer func() { MaxXMLNodes = saved }()
wide := "" + strings.Repeat("", 200) + ""
if _, err := parseXML([]byte(wide)); err == nil || !strings.Contains(err.Error(), "elements") {
t.Fatalf("wide xml: %v", err)
}
}