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) } }