From 07241d064aaff3cd47234b2c9fe233e74858434d Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Sun, 21 Apr 2024 01:56:38 +0100 Subject: [PATCH] Adiantum encrypting VFS improvements. (#80) Encrypt temporary files. --- embed/exports.txt | 4 +- embed/sqlite3.wasm | Bin 1337280 -> 1336790 bytes vfs/adiantum/README.md | 20 +++++++--- vfs/adiantum/adiantum.go | 7 ++++ vfs/adiantum/api.go | 12 +++--- vfs/adiantum/hbsh.go | 17 ++++----- vfs/api.go | 9 +++++ vfs/memdb/memdb.go | 17 ++++++--- vfs/registry.go | 1 + vfs/tests/mptest/testdata/build.sh | 4 +- vfs/tests/mptest/testdata/exports.txt | 4 +- vfs/tests/mptest/testdata/mptest.wasm.bz2 | 4 +- vfs/tests/speedtest1/speedtest1_test.go | 23 +++++++++++- vfs/tests/speedtest1/testdata/build.sh | 4 +- vfs/tests/speedtest1/testdata/exports.txt | 6 +++ .../speedtest1/testdata/speedtest1.wasm.bz2 | 4 +- vfs/vfs.go | 35 +++++++++--------- 17 files changed, 112 insertions(+), 59 deletions(-) create mode 100644 vfs/tests/speedtest1/testdata/exports.txt diff --git a/embed/exports.txt b/embed/exports.txt index d01ee7e..3b73ddb 100644 --- a/embed/exports.txt +++ b/embed/exports.txt @@ -51,6 +51,7 @@ sqlite3_create_collation_go sqlite3_create_function_go sqlite3_create_module_go sqlite3_create_window_function_go +sqlite3_database_file_object sqlite3_db_config sqlite3_db_name sqlite3_db_readonly @@ -61,9 +62,6 @@ sqlite3_errmsg sqlite3_error_offset sqlite3_errstr sqlite3_exec -sqlite3_filename_database -sqlite3_filename_journal -sqlite3_filename_wal sqlite3_finalize sqlite3_get_autocommit sqlite3_get_auxdata diff --git a/embed/sqlite3.wasm b/embed/sqlite3.wasm index 52b19954d761f283682762113f3e2dd4d5981d7c..bb3a88853f896e452d8b74767b875d2aa608a527 100755 GIT binary patch delta 19762 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 delta 19511 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 [!IMPORTANT] > Adiantum is typically used for disk encryption. > The standard threat model for disk encryption considers an adversary > that can read multiple snapshots of a disk. -> The security property that disk encryption provides is that -> the only information such an adversary can determine is -> whether the data in a sector has or has not changed over time. +> The only security property that disk encryption (and this package) +> provides is that the only information such an adversary can determine +> is whether the data in a sector has or has not changed over time. diff --git a/vfs/adiantum/adiantum.go b/vfs/adiantum/adiantum.go index 39e45bb..acc6503 100644 --- a/vfs/adiantum/adiantum.go +++ b/vfs/adiantum/adiantum.go @@ -1,6 +1,7 @@ package adiantum import ( + "crypto/rand" "sync" "golang.org/x/crypto/argon2" @@ -20,6 +21,12 @@ func (adiantumCreator) HBSH(key []byte) *hbsh.HBSH { } func (adiantumCreator) KDF(text string) []byte { + if text == "" { + key := make([]byte, 32) + n, _ := rand.Read(key) + return key[:n] + } + if key := keyCacheGet(text); key != nil { return key[:] } diff --git a/vfs/adiantum/api.go b/vfs/adiantum/api.go index c5c7db9..ecc95b7 100644 --- a/vfs/adiantum/api.go +++ b/vfs/adiantum/api.go @@ -33,18 +33,20 @@ func Register(name string, base vfs.VFS, cipher HBSHCreator) { if cipher == nil { cipher = adiantumCreator{} } - vfs.Register("adiantum", &hbshVFS{ + vfs.Register(name, &hbshVFS{ VFS: base, hbsh: cipher, }) } -// HBSHCreator creates an [hbsh.HBSH] cipher, +// HBSHCreator creates an [hbsh.HBSH] cipher // given key material. type HBSHCreator interface { - // KDF maps a secret (text) to a key of the appropriate size. - KDF(text string) (key []byte) + // KDF derives an HBSH key from a secret. + // If no secret is given, a random key is generated. + KDF(secret string) (key []byte) - // HBSH creates an HBSH cipher given an appropriate key. + // HBSH creates an HBSH cipher given a key. + // If key is not appropriate, nil is returned. HBSH(key []byte) *hbsh.HBSH } diff --git a/vfs/adiantum/hbsh.go b/vfs/adiantum/hbsh.go index 6b40e41..ec8605b 100644 --- a/vfs/adiantum/hbsh.go +++ b/vfs/adiantum/hbsh.go @@ -18,18 +18,14 @@ type hbshVFS struct { } func (h *hbshVFS) Open(name string, flags vfs.OpenFlag) (vfs.File, vfs.OpenFlag, error) { - return h.OpenParams(name, flags, url.Values{}) + return h.OpenParams(name, flags, nil) } func (h *hbshVFS) OpenParams(name string, flags vfs.OpenFlag, params url.Values) (file vfs.File, _ vfs.OpenFlag, err error) { - encrypt := flags&(0| - vfs.OPEN_MAIN_DB| - vfs.OPEN_MAIN_JOURNAL| - vfs.OPEN_SUBJOURNAL| - vfs.OPEN_WAL) != 0 - var hbsh *hbsh.HBSH - if encrypt { + + // Encrypt everything except super journals. + if flags&vfs.OPEN_SUPER_JOURNAL == 0 { var key []byte if t, ok := params["key"]; ok { key = []byte(t[0]) @@ -37,6 +33,8 @@ func (h *hbshVFS) OpenParams(name string, flags vfs.OpenFlag, params url.Values) key, _ = hex.DecodeString(t[0]) } else if t, ok := params["textkey"]; ok { key = h.hbsh.KDF(t[0]) + } else if name == "" { + key = h.hbsh.KDF("") } if hbsh = h.hbsh.HBSH(key); hbsh == nil { @@ -45,7 +43,6 @@ func (h *hbshVFS) OpenParams(name string, flags vfs.OpenFlag, params url.Values) } if h, ok := h.VFS.(vfs.VFSParams); ok { - delete(params, "vfs") delete(params, "key") delete(params, "hexkey") delete(params, "textkey") @@ -53,7 +50,7 @@ func (h *hbshVFS) OpenParams(name string, flags vfs.OpenFlag, params url.Values) } else { file, flags, err = h.Open(name, flags) } - if err != nil || hbsh == nil { + if err != nil || hbsh == nil || flags&vfs.OPEN_MEMORY != 0 { return file, flags, err } return &hbshFile{File: file, hbsh: hbsh}, flags, err diff --git a/vfs/api.go b/vfs/api.go index f191495..e0484e7 100644 --- a/vfs/api.go +++ b/vfs/api.go @@ -24,6 +24,15 @@ type VFSParams interface { OpenParams(name string, flags OpenFlag, params url.Values) (File, OpenFlag, error) } +// VFSJournal extends VFS with the ability to open journals +// that need a reference to their corresponding database files. +// +// https://sqlite.org/c3ref/database_file_object.html +type VFSJournal interface { + VFS + OpenJournal(name string, flags OpenFlag, db File) (File, OpenFlag, error) +} + // A File represents an open file in the OS interface layer. // // Use sqlite3.ErrorCode or sqlite3.ExtendedErrorCode to return specific error codes to SQLite. diff --git a/vfs/memdb/memdb.go b/vfs/memdb/memdb.go index 4d94083..57d887b 100644 --- a/vfs/memdb/memdb.go +++ b/vfs/memdb/memdb.go @@ -11,12 +11,22 @@ import ( "github.com/ncruces/go-sqlite3/vfs" ) +// Must be a multiple of 64K (the largest page size). +const sectorSize = 65536 + type memVFS struct{} func (memVFS) Open(name string, flags vfs.OpenFlag) (vfs.File, vfs.OpenFlag, error) { - // Allowed file types: + // For simplicity, we do not support reading or writing data + // across "sector" boundaries. + // + // This is not a problem for most SQLite file types: // - databases, which only do page aligned reads/writes; - // - temp journals, used by the sorter, which does the same. + // - temp journals, as used by the sorter, which does the same: + // https://sqlite.org/src/artifact/237840?ln=409-412 + // + // We refuse to open all other file types, + // but returning OPEN_MEMORY means SQLite won't ask us to. const types = vfs.OPEN_MAIN_DB | vfs.OPEN_TRANSIENT_DB | vfs.OPEN_TEMP_DB | @@ -61,9 +71,6 @@ func (memVFS) FullPathname(name string) (string, error) { return name, nil } -// Must be a multiple of 64K (the largest page size). -const sectorSize = 65536 - type memDB struct { // +checklocks:lockMtx pending *memFile diff --git a/vfs/registry.go b/vfs/registry.go index 7009444..42a2106 100644 --- a/vfs/registry.go +++ b/vfs/registry.go @@ -23,6 +23,7 @@ func Find(name string) VFS { } // Register registers a VFS. +// Empty and "os" are reserved names. // // https://sqlite.org/c3ref/vfs_find.html func Register(name string, vfs VFS) { diff --git a/vfs/tests/mptest/testdata/build.sh b/vfs/tests/mptest/testdata/build.sh index 1b5645f..c6fb46f 100755 --- a/vfs/tests/mptest/testdata/build.sh +++ b/vfs/tests/mptest/testdata/build.sh @@ -16,11 +16,11 @@ WASI_SDK="$ROOT/tools/wasi-sdk-22.0/bin" -fno-stack-protector -fno-stack-clash-protection \ -Wl,--stack-first \ -Wl,--import-undefined \ - -D_HAVE_SQLITE_CONFIG_H -DHAVE_USLEEP \ + -D_HAVE_SQLITE_CONFIG_H -DSQLITE_USE_URI \ -DSQLITE_DEFAULT_SYNCHRONOUS=0 \ -DSQLITE_DEFAULT_LOCKING_MODE=0 \ -DSQLITE_NO_SYNC -DSQLITE_THREADSAFE=0 \ - -DSQLITE_OMIT_LOAD_EXTENSION -DSQLITE_USE_URI \ + -DSQLITE_OMIT_LOAD_EXTENSION -DHAVE_USLEEP \ -D_WASI_EMULATED_GETPID -lwasi-emulated-getpid \ $(awk '{print "-Wl,--export="$0}' exports.txt) diff --git a/vfs/tests/mptest/testdata/exports.txt b/vfs/tests/mptest/testdata/exports.txt index 28b4473..8dc0c4c 100644 --- a/vfs/tests/mptest/testdata/exports.txt +++ b/vfs/tests/mptest/testdata/exports.txt @@ -1,8 +1,6 @@ aligned_alloc free malloc -sqlite3_filename_database -sqlite3_filename_journal -sqlite3_filename_wal +sqlite3_database_file_object sqlite3_uri_key sqlite3_uri_parameter \ No newline at end of file diff --git a/vfs/tests/mptest/testdata/mptest.wasm.bz2 b/vfs/tests/mptest/testdata/mptest.wasm.bz2 index 507e831..85a069f 100644 --- a/vfs/tests/mptest/testdata/mptest.wasm.bz2 +++ b/vfs/tests/mptest/testdata/mptest.wasm.bz2 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:35d27c1ec2c14d82ee6757d768435dde8dd0324ed6963fb00889a44364e19071 -size 470365 +oid sha256:afe1db5aea2a3ab996370fa85052cafaae10ab4b2f8154885da2c1d2a8503840 +size 470240 diff --git a/vfs/tests/speedtest1/speedtest1_test.go b/vfs/tests/speedtest1/speedtest1_test.go index 30fca3b..5e4ab4e 100644 --- a/vfs/tests/speedtest1/speedtest1_test.go +++ b/vfs/tests/speedtest1/speedtest1_test.go @@ -21,6 +21,7 @@ import ( "github.com/ncruces/go-sqlite3/internal/util" "github.com/ncruces/go-sqlite3/vfs" + _ "github.com/ncruces/go-sqlite3/vfs/adiantum" _ "github.com/ncruces/go-sqlite3/vfs/memdb" ) @@ -38,8 +39,7 @@ func TestMain(m *testing.M) { initFlags() ctx := context.Background() - cfg := wazero.NewRuntimeConfig().WithMemoryLimitPages(1024) - rt = wazero.NewRuntimeWithConfig(ctx, cfg) + rt = wazero.NewRuntime(ctx) wasi_snapshot_preview1.MustInstantiate(ctx, rt) env := vfs.ExportHostFunctions(rt.NewHostModuleBuilder("env")) _, err := env.Instantiate(ctx) @@ -100,3 +100,22 @@ func Benchmark_speedtest1(b *testing.B) { } mod.Close(ctx) } + +func Benchmark_adiantum(b *testing.B) { + output.Reset() + ctx := util.NewContext(context.Background(), true) + name := "file:" + filepath.Join(b.TempDir(), "test.db") + + "?textkey=correct+horse+battery+staple" + args := append(options, "--vfs", "adiantum", "--size", strconv.Itoa(b.N), name) + cfg := wazero.NewModuleConfig(). + WithArgs(args...).WithName("speedtest1"). + WithStdout(&output).WithStderr(&output). + WithSysWalltime().WithSysNanotime().WithSysNanosleep(). + WithOsyield(runtime.Gosched). + WithRandSource(rand.Reader) + mod, err := rt.InstantiateModule(ctx, module, cfg) + if err != nil { + b.Fatal(err) + } + mod.Close(ctx) +} diff --git a/vfs/tests/speedtest1/testdata/build.sh b/vfs/tests/speedtest1/testdata/build.sh index 9a5c421..875daf6 100755 --- a/vfs/tests/speedtest1/testdata/build.sh +++ b/vfs/tests/speedtest1/testdata/build.sh @@ -16,8 +16,8 @@ WASI_SDK="$ROOT/tools/wasi-sdk-22.0/bin" -fno-stack-protector -fno-stack-clash-protection \ -Wl,--stack-first \ -Wl,--import-undefined \ - -D_HAVE_SQLITE_CONFIG_H \ - -Wl,--export=aligned_alloc + -D_HAVE_SQLITE_CONFIG_H -DSQLITE_USE_URI \ + $(awk '{print "-Wl,--export="$0}' exports.txt) "$BINARYEN/wasm-opt" -g --strip --strip-producers -c -O3 \ speedtest1.wasm -o speedtest1.tmp \ diff --git a/vfs/tests/speedtest1/testdata/exports.txt b/vfs/tests/speedtest1/testdata/exports.txt new file mode 100644 index 0000000..8dc0c4c --- /dev/null +++ b/vfs/tests/speedtest1/testdata/exports.txt @@ -0,0 +1,6 @@ +aligned_alloc +free +malloc +sqlite3_database_file_object +sqlite3_uri_key +sqlite3_uri_parameter \ No newline at end of file diff --git a/vfs/tests/speedtest1/testdata/speedtest1.wasm.bz2 b/vfs/tests/speedtest1/testdata/speedtest1.wasm.bz2 index 2886a97..d953c0c 100644 --- a/vfs/tests/speedtest1/testdata/speedtest1.wasm.bz2 +++ b/vfs/tests/speedtest1/testdata/speedtest1.wasm.bz2 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7f669eede3ba9c9a104d37c3a90ecec26086a87aea54c1f650df202923d75cb9 -size 483426 +oid sha256:e4f9ed81c9497a9d8b91517416d122ae04c2c517d3e0612d869e128dcee3fa81 +size 483519 diff --git a/vfs/vfs.go b/vfs/vfs.go index f7b175d..9f5e7b8 100644 --- a/vfs/vfs.go +++ b/vfs/vfs.go @@ -143,7 +143,10 @@ func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, fla var err error var parsed bool var params url.Values - if pfs, ok := vfs.(VFSParams); ok { + if jfs, ok := vfs.(VFSJournal); ok && flags&(OPEN_WAL|OPEN_MAIN_JOURNAL) != 0 { + db := vfsDatabaseFileObject(ctx, mod, zPath) + file, flags, err = jfs.OpenJournal(path, flags, db) + } else if pfs, ok := vfs.(VFSParams); ok { parsed = true params = vfsURIParameters(ctx, mod, zPath, flags) file, flags, err = pfs.OpenParams(path, flags, params) @@ -387,30 +390,17 @@ func vfsShmUnmap(ctx context.Context, mod api.Module, pFile, bDelete uint32) _Er func vfsURIParameters(ctx context.Context, mod api.Module, zPath uint32, flags OpenFlag) url.Values { switch { case flags&(OPEN_URI|OPEN_MAIN_DB) == OPEN_URI|OPEN_MAIN_DB: - // database file - case flags&(OPEN_MAIN_JOURNAL|OPEN_SUBJOURNAL|OPEN_SUPER_JOURNAL|OPEN_WAL) != 0: + // database file with URI + case flags&(OPEN_WAL|OPEN_MAIN_JOURNAL) != 0: // journal or WAL file default: return nil } - nameDB := mod.ExportedFunction("sqlite3_filename_database") - uriKey := mod.ExportedFunction("sqlite3_uri_key") - uriParam := mod.ExportedFunction("sqlite3_uri_parameter") - if nameDB == nil || uriKey == nil || uriParam == nil { - return nil - } - var stack [2]uint64 var params url.Values - - if flags&OPEN_MAIN_DB == 0 { - stack[0] = uint64(zPath) - if err := nameDB.CallWithStack(ctx, stack[:]); err != nil { - panic(err) - } - zPath = uint32(stack[0]) - } + uriKey := mod.ExportedFunction("sqlite3_uri_key") + uriParam := mod.ExportedFunction("sqlite3_uri_parameter") for i := 0; ; i++ { stack[1] = uint64(i) @@ -438,6 +428,15 @@ func vfsURIParameters(ctx context.Context, mod api.Module, zPath uint32, flags O } } +func vfsDatabaseFileObject(ctx context.Context, mod api.Module, zPath uint32) File { + stack := [...]uint64{uint64(zPath)} + fn := mod.ExportedFunction("sqlite3_database_file_object") + if err := fn.CallWithStack(ctx, stack[:]); err != nil { + panic(err) + } + return vfsFileGet(ctx, mod, uint32(stack[0])) +} + func vfsGet(mod api.Module, pVfs uint32) VFS { var name string if pVfs != 0 {