diff options
author | Jakob Unterwurzacher | 2016-09-19 23:40:43 +0200 |
---|---|---|
committer | Jakob Unterwurzacher | 2016-09-25 16:43:17 +0200 |
commit | be9dfe3a894bd00a2157bfc3dd19e98bcc171691 (patch) | |
tree | e8eb9a0858af41aaeb41b11ea379a074417fca03 /internal/fusefrontend_reverse/diriv.go | |
parent | 10f38e88707f3a1f1ad69769219839a30a80c165 (diff) |
reverse: implement dynamic diriv
Introduce a unique per-directory diriv that is generated
by hashing the encrypted directory path.
Diffstat (limited to 'internal/fusefrontend_reverse/diriv.go')
-rw-r--r-- | internal/fusefrontend_reverse/diriv.go | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/internal/fusefrontend_reverse/diriv.go b/internal/fusefrontend_reverse/diriv.go new file mode 100644 index 0000000..c4a93e4 --- /dev/null +++ b/internal/fusefrontend_reverse/diriv.go @@ -0,0 +1,42 @@ +package fusefrontend_reverse + +import ( + "crypto/sha256" + + "github.com/hanwen/go-fuse/fuse" + "github.com/hanwen/go-fuse/fuse/nodefs" + + "github.com/rfjakob/gocryptfs/internal/nametransform" +) + +// deriveDirIV derives the DirIV from the directory path by simply hashing it +func deriveDirIV(dirPath string) []byte { + hash := sha256.Sum256([]byte(dirPath)) + return hash[:nametransform.DirIVLen] +} + +type dirIVFile struct { + // Embed nodefs.defaultFile for a ENOSYS implementation of all methods + nodefs.File + // file content + content []byte +} + +func NewDirIVFile(dirPath string) (nodefs.File, fuse.Status) { + return &dirIVFile{ + File: nodefs.NewDefaultFile(), + content: deriveDirIV(dirPath), + }, fuse.OK +} + +// Read - FUSE call +func (f *dirIVFile) Read(buf []byte, off int64) (resultData fuse.ReadResult, status fuse.Status) { + if off >= int64(len(f.content)) { + return nil, fuse.OK + } + end := int(off) + len(buf) + if end > len(f.content) { + end = len(f.content) + } + return fuse.ReadResultData(f.content[off:end]), fuse.OK +} |