-devrandom: make flag a no-op
Commitf3c777d5ea
added the `-devrandom` option: commitf3c777d5ea
Author: @slackner Date: Sun Nov 19 13:30:04 2017 +0100 main: Add '-devrandom' commandline option Allows to use /dev/random for generating the master key instead of the default Go implementation. When the kernel random generator has been properly initialized both are considered equally secure, however: * Versions of Go prior to 1.9 just fall back to /dev/urandom if the getrandom() syscall would be blocking (Go Bug #19274) * Kernel versions prior to 3.17 do not support getrandom(), and there is no check if the random generator has been properly initialized before reading from /dev/urandom This is especially useful for embedded hardware with low-entroy. Please note that generation of the master key might block indefinitely if the kernel cannot harvest enough entropy. We now require Go v1.13 and Kernel versions should have also moved on. Make the flag a no-op. https://github.com/rfjakob/gocryptfs/issues/596
This commit is contained in:
parent
b3d26b7264
commit
61ef6b00a6
@ -114,11 +114,10 @@ leaks information about identical file names across directories
|
|||||||
The resulting `gocryptfs.conf` has "DirIV" missing from "FeatureFlags".
|
The resulting `gocryptfs.conf` has "DirIV" missing from "FeatureFlags".
|
||||||
|
|
||||||
#### -devrandom
|
#### -devrandom
|
||||||
Use `/dev/random` for generating the master key instead of the default Go
|
Obsolete and ignored on gocryptfs v2.2 and later.
|
||||||
implementation. This is especially useful on embedded systems with Go versions
|
|
||||||
prior to 1.9, which fall back to weak random data when the getrandom syscall
|
See https://github.com/rfjakob/gocryptfs/commit/f3c777d5eaa682d878c638192311e52f9c204294
|
||||||
is blocking. Using this option can block indefinitely when the kernel cannot
|
and https://github.com/rfjakob/gocryptfs/issues/596 for background info.
|
||||||
harvest enough entropy.
|
|
||||||
|
|
||||||
#### -hkdf
|
#### -hkdf
|
||||||
Use HKDF to derive separate keys for content and name encryption from
|
Use HKDF to derive separate keys for content and name encryption from
|
||||||
|
14
cli_args.go
14
cli_args.go
@ -30,7 +30,7 @@ type argContainer struct {
|
|||||||
plaintextnames, quiet, nosyslog, wpanic,
|
plaintextnames, quiet, nosyslog, wpanic,
|
||||||
longnames, allow_other, reverse, aessiv, nonempty, raw64,
|
longnames, allow_other, reverse, aessiv, nonempty, raw64,
|
||||||
noprealloc, speed, hkdf, serialize_reads, forcedecode, hh, info,
|
noprealloc, speed, hkdf, serialize_reads, forcedecode, hh, info,
|
||||||
sharedstorage, devrandom, fsck, one_file_system, deterministic_names,
|
sharedstorage, fsck, one_file_system, deterministic_names,
|
||||||
xchacha bool
|
xchacha bool
|
||||||
// Mount options with opposites
|
// Mount options with opposites
|
||||||
dev, nodev, suid, nosuid, exec, noexec, rw, ro, kernel_cache, acl bool
|
dev, nodev, suid, nosuid, exec, noexec, rw, ro, kernel_cache, acl bool
|
||||||
@ -177,7 +177,6 @@ func parseCliOpts(osArgs []string) (args argContainer) {
|
|||||||
flagSet.BoolVar(&args.hh, "hh", false, "Show this long help text")
|
flagSet.BoolVar(&args.hh, "hh", false, "Show this long help text")
|
||||||
flagSet.BoolVar(&args.info, "info", false, "Display information about CIPHERDIR")
|
flagSet.BoolVar(&args.info, "info", false, "Display information about CIPHERDIR")
|
||||||
flagSet.BoolVar(&args.sharedstorage, "sharedstorage", false, "Make concurrent access to a shared CIPHERDIR safer")
|
flagSet.BoolVar(&args.sharedstorage, "sharedstorage", false, "Make concurrent access to a shared CIPHERDIR safer")
|
||||||
flagSet.BoolVar(&args.devrandom, "devrandom", false, "Use /dev/random for generating master key")
|
|
||||||
flagSet.BoolVar(&args.fsck, "fsck", false, "Run a filesystem check on CIPHERDIR")
|
flagSet.BoolVar(&args.fsck, "fsck", false, "Run a filesystem check on CIPHERDIR")
|
||||||
flagSet.BoolVar(&args.one_file_system, "one-file-system", false, "Don't cross filesystem boundaries")
|
flagSet.BoolVar(&args.one_file_system, "one-file-system", false, "Don't cross filesystem boundaries")
|
||||||
flagSet.BoolVar(&args.deterministic_names, "deterministic-names", false, "Disable diriv file name randomisation")
|
flagSet.BoolVar(&args.deterministic_names, "deterministic-names", false, "Disable diriv file name randomisation")
|
||||||
@ -228,11 +227,16 @@ func parseCliOpts(osArgs []string) (args argContainer) {
|
|||||||
flagSet.DurationVar(&args.idle, "idle", 0, "Auto-unmount after specified idle duration (ignored in reverse mode). "+
|
flagSet.DurationVar(&args.idle, "idle", 0, "Auto-unmount after specified idle duration (ignored in reverse mode). "+
|
||||||
"Durations are specified like \"500s\" or \"2h45m\". 0 means stay mounted indefinitely.")
|
"Durations are specified like \"500s\" or \"2h45m\". 0 means stay mounted indefinitely.")
|
||||||
|
|
||||||
var nofail bool
|
|
||||||
flagSet.BoolVar(&nofail, "nofail", false, "Ignored for /etc/fstab compatibility")
|
|
||||||
|
|
||||||
var dummyString string
|
var dummyString string
|
||||||
flagSet.StringVar(&dummyString, "o", "", "For compatibility with mount(1), options can be also passed as a comma-separated list to -o on the end.")
|
flagSet.StringVar(&dummyString, "o", "", "For compatibility with mount(1), options can be also passed as a comma-separated list to -o on the end.")
|
||||||
|
|
||||||
|
// Ignored flags
|
||||||
|
{
|
||||||
|
var tmp bool
|
||||||
|
flagSet.BoolVar(&tmp, "nofail", false, "Ignored for /etc/fstab compatibility")
|
||||||
|
flagSet.BoolVar(&tmp, "devrandom", false, "Deprecated (ignored for compatibility)")
|
||||||
|
}
|
||||||
|
|
||||||
// Actual parsing
|
// Actual parsing
|
||||||
err = flagSet.Parse(osArgsPreprocessed[1:])
|
err = flagSet.Parse(osArgsPreprocessed[1:])
|
||||||
if err == flag.ErrHelp {
|
if err == flag.ErrHelp {
|
||||||
|
@ -93,7 +93,6 @@ func initDir(args *argContainer) {
|
|||||||
LogN: args.scryptn,
|
LogN: args.scryptn,
|
||||||
Creator: creator,
|
Creator: creator,
|
||||||
AESSIV: args.aessiv,
|
AESSIV: args.aessiv,
|
||||||
Devrandom: args.devrandom,
|
|
||||||
Fido2CredentialID: fido2CredentialID,
|
Fido2CredentialID: fido2CredentialID,
|
||||||
Fido2HmacSalt: fido2HmacSalt,
|
Fido2HmacSalt: fido2HmacSalt,
|
||||||
DeterministicNames: args.deterministic_names,
|
DeterministicNames: args.deterministic_names,
|
||||||
|
@ -5,9 +5,7 @@ package configfile
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"os"
|
"os"
|
||||||
@ -61,21 +59,6 @@ type ConfFile struct {
|
|||||||
filename string
|
filename string
|
||||||
}
|
}
|
||||||
|
|
||||||
// randBytesDevRandom gets "n" random bytes from /dev/random or panics
|
|
||||||
func randBytesDevRandom(n int) []byte {
|
|
||||||
f, err := os.Open("/dev/random")
|
|
||||||
if err != nil {
|
|
||||||
log.Panic("Failed to open /dev/random: " + err.Error())
|
|
||||||
}
|
|
||||||
defer f.Close()
|
|
||||||
b := make([]byte, n)
|
|
||||||
_, err = io.ReadFull(f, b)
|
|
||||||
if err != nil {
|
|
||||||
log.Panic("Failed to read random bytes: " + err.Error())
|
|
||||||
}
|
|
||||||
return b
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateArgs exists because the argument list to Create became too long.
|
// CreateArgs exists because the argument list to Create became too long.
|
||||||
type CreateArgs struct {
|
type CreateArgs struct {
|
||||||
Filename string
|
Filename string
|
||||||
@ -84,7 +67,6 @@ type CreateArgs struct {
|
|||||||
LogN int
|
LogN int
|
||||||
Creator string
|
Creator string
|
||||||
AESSIV bool
|
AESSIV bool
|
||||||
Devrandom bool
|
|
||||||
Fido2CredentialID []byte
|
Fido2CredentialID []byte
|
||||||
Fido2HmacSalt []byte
|
Fido2HmacSalt []byte
|
||||||
DeterministicNames bool
|
DeterministicNames bool
|
||||||
@ -136,12 +118,7 @@ func Create(args *CreateArgs) error {
|
|||||||
}
|
}
|
||||||
{
|
{
|
||||||
// Generate new random master key
|
// Generate new random master key
|
||||||
var key []byte
|
key := cryptocore.RandBytes(cryptocore.KeyLen)
|
||||||
if args.Devrandom {
|
|
||||||
key = randBytesDevRandom(cryptocore.KeyLen)
|
|
||||||
} else {
|
|
||||||
key = cryptocore.RandBytes(cryptocore.KeyLen)
|
|
||||||
}
|
|
||||||
tlog.PrintMasterkeyReminder(key)
|
tlog.PrintMasterkeyReminder(key)
|
||||||
// Encrypt it using the password
|
// Encrypt it using the password
|
||||||
// This sets ScryptObject and EncryptedKey
|
// This sets ScryptObject and EncryptedKey
|
||||||
|
@ -86,18 +86,6 @@ func TestCreateConfDefault(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCreateConfDevRandom(t *testing.T) {
|
|
||||||
err := Create(&CreateArgs{
|
|
||||||
Filename: "config_test/tmp.conf",
|
|
||||||
Password: testPw,
|
|
||||||
LogN: 10,
|
|
||||||
Creator: "test",
|
|
||||||
Devrandom: true})
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCreateConfPlaintextnames(t *testing.T) {
|
func TestCreateConfPlaintextnames(t *testing.T) {
|
||||||
err := Create(&CreateArgs{
|
err := Create(&CreateArgs{
|
||||||
Filename: "config_test/tmp.conf",
|
Filename: "config_test/tmp.conf",
|
||||||
|
Loading…
Reference in New Issue
Block a user