Skip to content

Commit 2c30bc9

Browse files
committed
Don't panic.
1 parent 9d2194b commit 2c30bc9

File tree

2 files changed

+44
-27
lines changed

2 files changed

+44
-27
lines changed

vfs/adiantum/adiantum.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ const pepper = "github.com/ncruces/go-sqlite3/vfs/adiantum"
1313
type adiantumCreator struct{}
1414

1515
func (adiantumCreator) HBSH(key []byte) *hbsh.HBSH {
16+
if len(key) != 32 {
17+
return nil
18+
}
1619
return adiantum.New(key)
1720
}
1821

vfs/adiantum/hbsh.go

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -22,29 +22,41 @@ func (h *hbshVFS) Open(name string, flags vfs.OpenFlag) (vfs.File, vfs.OpenFlag,
2222
}
2323

2424
func (h *hbshVFS) OpenParams(name string, flags vfs.OpenFlag, params url.Values) (file vfs.File, _ vfs.OpenFlag, err error) {
25+
encrypt := flags&(0|
26+
vfs.OPEN_MAIN_DB|
27+
vfs.OPEN_MAIN_JOURNAL|
28+
vfs.OPEN_SUBJOURNAL|
29+
vfs.OPEN_WAL) != 0
30+
31+
var hbsh *hbsh.HBSH
32+
if encrypt {
33+
var key []byte
34+
if t, ok := params["key"]; ok {
35+
key = []byte(t[0])
36+
} else if t, ok := params["hexkey"]; ok {
37+
key, _ = hex.DecodeString(t[0])
38+
} else if t, ok := params["textkey"]; ok {
39+
key = h.hbsh.KDF(t[0])
40+
}
41+
42+
if hbsh = h.hbsh.HBSH(key); hbsh == nil {
43+
return nil, flags, sqlite3.NOTADB
44+
}
45+
}
46+
2547
if h, ok := h.VFS.(vfs.VFSParams); ok {
48+
delete(params, "vfs")
49+
delete(params, "key")
50+
delete(params, "hexkey")
51+
delete(params, "textkey")
2652
file, flags, err = h.OpenParams(name, flags, params)
2753
} else {
2854
file, flags, err = h.Open(name, flags)
2955
}
30-
if err != nil || flags&(0|
31-
vfs.OPEN_MAIN_DB|
32-
vfs.OPEN_MAIN_JOURNAL|
33-
vfs.OPEN_SUBJOURNAL|
34-
vfs.OPEN_WAL) == 0 {
56+
if err != nil || hbsh == nil {
3557
return file, flags, err
3658
}
37-
38-
var key []byte
39-
if t, ok := params["key"]; ok {
40-
key = []byte(t[0])
41-
} else if t, ok := params["hexkey"]; ok {
42-
key, err = hex.DecodeString(t[0])
43-
} else if t, ok := params["textkey"]; ok {
44-
key = h.hbsh.KDF(t[0])
45-
}
46-
47-
return &hbshFile{File: file, hbsh: h.hbsh.HBSH(key)}, flags, err
59+
return &hbshFile{File: file, hbsh: hbsh}, flags, err
4860
}
4961

5062
const (
@@ -93,20 +105,22 @@ func (h *hbshFile) WriteAt(p []byte, off int64) (n int, err error) {
93105
binary.LittleEndian.PutUint64(h.tweak[:], uint64(min))
94106
data := h.block[:]
95107

96-
if min < off || len(p[n:]) < blockSize {
108+
if off > min || len(p[n:]) < blockSize {
97109
// Read full block.
98110
m, err := h.File.ReadAt(h.block[:], min)
99-
switch {
100-
case m == 0 && err == io.EOF:
101-
clear(data)
102-
case m != blockSize:
103-
return n, err
104-
default:
105-
// Partial update.
106-
data = h.hbsh.Decrypt(h.block[:], h.tweak[:])
107-
if off > min {
108-
data = data[off-min:]
111+
if m != blockSize {
112+
if err != io.EOF {
113+
return n, err
109114
}
115+
// Writing past the EOF.
116+
// A partially written block is corrupt,
117+
// and also considered to be past the EOF.
118+
clear(data)
119+
}
120+
121+
data = h.hbsh.Decrypt(h.block[:], h.tweak[:])
122+
if off > min {
123+
data = data[off-min:]
110124
}
111125
}
112126

0 commit comments

Comments
 (0)