Files
incredigo/internal/vault/vault_test.go
T
leetcrypt 425c299359 Initial commit: Incredigo — local-first RAM-only credential custody
v1: discover → migrate → expiry tracking → sealed export/import.

- vault: memguard mlock/DONTDUMP arena, handle indirection, zeroize-on-drop
- discover: registry + 8 read-only scanners (aws, env, netrc, ssh, docker,
  kube, git) and a file/dir harvester (--path)
- sink: gopass streaming insert; length-prefixed bundle framing; Sealer
  interface with three impls — age (default, authenticated), hmac
  (authenticated, openssl-only encrypt-then-MAC), openssl (CBC fallback,
  unauthenticated; OpenSSL 3.x enc refuses AEAD)
- policy: local expiry engine, 60d/8w threshold parser
- audit: redacted append-only JSONL, injectable clock
- export/import: passphrase from no-echo prompt or $INCREDIGO_PASSPHRASE into
  locked memory; secrets stream gopass<->Sealer as bytes, never Go strings
- tests: scanner leak-checks, vault zeroize, bundle round-trip via fake gopass;
  go test ./... green, -race clean

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 07:57:34 -07:00

68 lines
1.3 KiB
Go

package vault
import (
"bytes"
"testing"
)
func TestStoreWipesCallerAndRoundTrips(t *testing.T) {
v := New()
defer v.Purge()
secret := []byte("super-secret-value")
want := append([]byte(nil), secret...)
h := v.Store(secret)
// Store must wipe the caller's slice (memguard NewBufferFromBytes contract).
if !bytes.Equal(secret, make([]byte, len(secret))) {
t.Errorf("Store did not wipe caller slice, got %q", secret)
}
buf, err := v.Open(h)
if err != nil {
t.Fatalf("Open: %v", err)
}
if !bytes.Equal(buf.Bytes(), want) {
t.Errorf("round-trip mismatch: got %q want %q", buf.Bytes(), want)
}
}
func TestForgetZeroizes(t *testing.T) {
v := New()
defer v.Purge()
h := v.Store([]byte("wipe-me"))
buf, err := v.Open(h)
if err != nil {
t.Fatalf("Open: %v", err)
}
if !buf.IsAlive() {
t.Fatal("buffer should be alive before Forget")
}
v.Forget(h)
if buf.IsAlive() {
t.Error("buffer should be destroyed (zeroized) after Forget")
}
if _, err := v.Open(h); err == nil {
t.Error("Open after Forget should return an error for the dead handle")
}
}
func TestPurgeDestroysAll(t *testing.T) {
v := New()
h1 := v.Store([]byte("a"))
h2 := v.Store([]byte("b"))
v.Purge()
if _, err := v.Open(h1); err == nil {
t.Error("h1 should be gone after Purge")
}
if _, err := v.Open(h2); err == nil {
t.Error("h2 should be gone after Purge")
}
}