Re-design of the original gocryptfs code to work as a library.
Go to file
Jakob Unterwurzacher 798e5eb5e7 tests: create all-zero gocryptfs.diriv in resetTmpDir()
Tests were failing because this file was missing
2015-11-27 21:51:40 +01:00
cryptfs diriv: Move WriteDirIV() to cryptfs; add locking to Mkdir, Rmdir 2015-11-27 21:48:58 +01:00
integration_tests tests: create all-zero gocryptfs.diriv in resetTmpDir() 2015-11-27 21:51:40 +01:00
openssl_benchmark Run go fmt 2015-10-07 22:59:36 +02:00
pathfs_frontend diriv: Move WriteDirIV() to cryptfs; add locking to Mkdir, Rmdir 2015-11-27 21:48:58 +01:00
.drone.yml Add drone.io CI config 2015-11-22 21:07:38 +01:00
.gitignore Add MANPAGE.md and MANPAGE-render.bash 2015-11-11 09:15:14 +01:00
.travis.yml Revert "Travis CI: build using build.bash" 2015-11-14 18:27:06 +01:00
benchmark.bash tests: move integration tests to separate directory 2015-11-12 21:02:44 +01:00
build.bash Bake version string into binary, add "--version" switch 2015-11-01 14:04:29 +01:00
checkdir.go Refactor cli argument handling 2015-11-14 21:25:10 +01:00
daemonize.go Refactor cli argument handling 2015-11-14 21:25:10 +01:00
LICENSE Add MIT LICENSE 2015-10-11 23:15:03 +02:00
main.go diriv: Create gocryptfs.diriv in every directory 2015-11-25 20:57:16 +01:00
MANPAGE-render.bash Add MANPAGE.md and MANPAGE-render.bash 2015-11-11 09:15:14 +01:00
MANPAGE.md Add "-extpass" cli option and associated tests 2015-11-15 13:42:04 +01:00
masterkey.go Refactor cli argument handling 2015-11-14 21:25:10 +01:00
package.bash package.bash: add architecture to filename 2015-11-01 15:33:54 +01:00
password.go diriv: Create gocryptfs.diriv in every directory 2015-11-25 20:57:16 +01:00
README.md README: link to use .../tags instead of ../releases 2015-11-15 16:10:45 +01:00
SECURITY.md Add file header (on-disk-format change) 2015-11-01 01:38:27 +01:00
sendusr1.go Use new arg "-notifypid" for more robust daemonization 2015-11-09 23:33:35 +01:00
test.bash tests: move integration tests to separate directory 2015-11-12 21:02:44 +01:00
TODO.md Use new arg "-notifypid" for more robust daemonization 2015-11-09 23:33:35 +01:00
XFSTESTS.md Fix link in XFSTESTS.md 2015-10-11 23:18:02 +02:00

GoCryptFS Build Status Release Status

An encrypted overlay filesystem written in Go.

gocryptfs is built on top the excellent go-fuse FUSE library and its LoopbackFileSystem API.

This project was inspired by EncFS and strives to fix its security issues (see EncFS tickets 9, 13, 14, 16). For details on the security of gocryptfs see the SECURITY.md document.

Current Status

Beta. You are advised to keep a backup of your data outside of gocryptfs, in addition to storing the master key in a safe place (the master key is printed when mounting).

That said, I am dogfooding on gocryptfs for some time now. In fact, all gocryptfs development happens inside a mounted gocryptfs filesystem, with no issues so far.

Only Linux is supported at the moment. Help wanted for a Mac OS X port.

Testing

gocryptfs comes with is own test suite that is constantly expanded as features are added. Run it using ./test.bash. It takes about 30 seconds and requires FUSE as it mounts several test filesystems.

In addition, I have ported xfstests to FUSE, the result is the fuse-xfstests project. gocryptfs passes the "generic" tests with one exception, results: XFSTESTS.md

A lot of work has gone into this. The testing has found bugs in gocryptfs as well as in go-fuse.

The one exception is generic/035, see go-fuse issue 55 for details. While this is a POSIX violation, I do not see any real-world impact.

Install

$ go get github.com/rfjakob/gocryptfs

Use

Quickstart:

$ mkdir cipher plain
$ $GOPATH/bin/gocryptfs --init cipher
  [...]
$ $GOPATH/bin/gocryptfs cipher plain
  [...]
$ echo test > plain/test.txt
$ ls -l cipher
  total 8
  -rw-rw-r--. 1 user  user   33  7. Okt 23:23 0ao8Hyyf1A-A88sfNvkUxA==
  -rw-rw-r--. 1 user  user  233  7. Okt 23:23 gocryptfs.conf
$ fusermount -u plain

See MANPAGE.md for a description of available options. If you already have gocryptfs installed, run ./MANPAGE-render.bash to bring up the rendered manpage in the pager (requires pandoc).

Storage Overhead

  • Empty files take 0 bytes on disk
  • 18 byte file header for non-empty files (2 bytes version, 16 bytes random file id)
  • 28 bytes of storage overhead per 4kB block (12 byte nonce, 16 bytes auth tag)

Performance

gocryptfs uses openssl through spacemonkeygo/openssl for a 3x speedup compared to Go's builtin AES-GCM implementation (see go-vs-openssl.md for details).

Run ./benchmark.bash to run the benchmarks.

The output should look like this:

./benchmark.bash
gocryptfs v0.3.1-30-gd69e0df-dirty; on-disk format 2
PASS
BenchmarkStreamWrite-2	     100	  12246070 ns/op	  85.63 MB/s
BenchmarkStreamRead-2 	     200	   9125990 ns/op	 114.90 MB/s
BenchmarkCreate0B-2   	   10000	    101284 ns/op
BenchmarkCreate1B-2   	   10000	    178356 ns/op	   0.01 MB/s
BenchmarkCreate100B-2 	    5000	    361014 ns/op	   0.28 MB/s
BenchmarkCreate4kB-2  	    5000	    375035 ns/op	  10.92 MB/s
BenchmarkCreate10kB-2 	    3000	    491071 ns/op	  20.85 MB/s
ok  	github.com/rfjakob/gocryptfs/integration_tests	17.216s

Changelog

v0.4

  • New command-line options:
  • -plaintextnames: disables filename encryption, added on user request
  • -extpass: calls an external program for prompting for the password
  • -config: allows to specify a custom gocryptfs.conf path
  • Add FeatureFlags gocryptfs.conf paramter
  • This is a config format change, hence the on-disk format is incremented
  • Used for ext4-style filesystem feature flags. This should help avoid future format changes. The first user is -plaintextnames.
  • On-disk format 2

v0.3

  • Add file header that contains a random id to authenticate blocks
  • This is an on-disk-format change
  • On-disk format 1

v0.2

  • Replace bash daemonization wrapper with native Go implementation
  • Better user feedback on mount failures

v0.1

  • First release
  • On-disk format 0

See https://github.com/rfjakob/gocryptfs/tags for the release dates and associated git tags.