@@ -66,6 +66,7 @@ typeset -i RECOLL=1
66
66
typeset -i QRENCODE=1
67
67
typeset -i LSOF=1
68
68
typeset -i ACL=1
69
+ typeset -i ARGON2=1
69
70
70
71
# Default mount options
71
72
typeset MOUNTOPTS=" rw,noatime,nodev"
@@ -749,8 +750,13 @@ usage() {
749
750
_print " -R provide GnuPG hidden recipients (separated by comma)"
750
751
_print " --sudo super user exec alternative to sudo (doas or none)"
751
752
752
- [[ $KDF == 1 ]] && {
753
- _print " --kdf forge keys armored against dictionary attacks"
753
+ [[ $KDF == 1 ]] || [[ $ARGON2 == 1 ]] && {
754
+ _print " --kdf forge keys armored against dictionary attacks (pbkdf2, argon2)"
755
+ _print " --kdfiter Number of iterations (meaning depending on KDF algorithm) (pbkdf2, argon2)"
756
+ }
757
+ [[ $ARGON2 == 1 ]] && {
758
+ _print " --kdfmem memory to be used (argon2)"
759
+ _print " --kdfpar number of threads (argon2)"
754
760
}
755
761
756
762
echo
@@ -1225,11 +1231,14 @@ get_lukskey() {
1225
1231
kdf_salt=" ${firstline[(ws:_:)3]} "
1226
1232
kdf_ic=" ${firstline[(ws:_:)4]} "
1227
1233
kdf_mem=" ${firstline[(ws:_:)5]} "
1234
+ kdf_par=" ${firstline[(ws:_:)6]} "
1235
+ # ToDo also parse kdf_len?
1228
1236
_message " Unlocking KDF key protection (::1 kdf::)" $kdf_hash
1229
1237
_verbose " KDF salt: $kdf_salt "
1230
1238
_verbose " KDF ic: $kdf_ic "
1231
1239
_verbose " KDF mem: $kdf_mem "
1232
- _password=$( argon2 $kdf_salt -m $kdf_mem -t $kdf_ic -l 64 -r 2> /dev/null <<< $_password )
1240
+ _verbose " KDF # threads: $kdf_par "
1241
+ _password=$( argon2 $kdf_salt -m $kdf_mem -t $kdf_ic -p $kdf_par -l 64 -r 2> /dev/null <<< $_password )
1233
1242
;;
1234
1243
1235
1244
* )
@@ -1470,50 +1479,58 @@ gen_key() {
1470
1479
fi
1471
1480
1472
1481
header=" "
1473
- [[ $KDF == 1 ]] && {
1482
+ [[ $KDF == 1 ]] || [[ $ARGON2 == 1 ]] && {
1474
1483
{ option_is_set --kdf } && {
1475
- # KDF is a new key strengthening technique against brute forcing
1484
+ # KDF is a key strengthening technique against brute forcing
1476
1485
# see: https://github.com/dyne/Tomb/issues/82
1477
- itertime=" ` option_value --kdf` "
1478
- # removing support of floating points because they can't be type checked well
1479
- # if [[ "$itertime" != <-> ]]; then
1480
- # unset tombpass
1481
- # unset tombpasstmp
1482
- # _warning "Wrong argument for --kdf: must be an integer number (iteration seconds)."
1483
- # _failure "Depending on the speed of machines using this tomb, use 1 to 10, or more"
1484
- # return 1
1485
- # fi
1486
- # # --kdf takes one parameter: iter time (on present machine) in seconds
1487
-
1488
- kdftype=" ` option_value --kdftype` "
1489
- kdftype=${kdftype:- pbkdf2}
1486
+ # Two KDF are currently supported:
1487
+ # * pbkdf2 (time restrictive)
1488
+ # * argon2 (memory, parallelismn restrictive and through those time)
1489
+
1490
+ # --kdfiter takes one integer value as parameter
1491
+ # argon2: # of iterations (default of 3);
1492
+ # pbkdf2: calculates # of iterations to reach this as time cost in seconds
1493
+ itertime=" ` option_value --kdfiter` "
1494
+ itertime=${itertime:- 3}
1495
+
1496
+ # Generating salt (either via tomb-kdb-pbkdf2 or a shell fallback)
1497
+ if $( command -v tomb-kdb-pbkdf2-gensalt 1> /dev/null 2> /dev/null) ; then
1498
+ kdfsalt=` tomb-kdb-pbkdf2-gensalt`
1499
+ else
1500
+ kdfsalt=$( LC_CTYPE=C tr -cd ' a-f0-9' < /dev/random | head -c 64)
1501
+ fi
1502
+ _message " kdf salt: ::1 kdfsalt::" $kdfsalt
1503
+
1504
+ # --kdf takes one parameter: what KDF
1505
+ kdftype=" ` option_value --kdf` "
1490
1506
case ${kdftype} in
1491
- pbkdf2)
1507
+ pbkdf2)
1492
1508
local -i microseconds
1493
1509
microseconds=$(( itertime * 1000000 ))
1494
- _success " Using KDF, iteration time: ::1 microseconds::" $microseconds
1495
- _message " generating salt"
1496
- pbkdf2_salt=` tomb-kdb-pbkdf2-gensalt`
1497
- _message " calculating iterations"
1510
+ _success " Using pbkdf2 as KDF"
1511
+ _message " iteration time: ::1 microseconds::" $microseconds
1498
1512
pbkdf2_iter=` tomb-kdb-pbkdf2-getiter $microseconds `
1499
- _message " encoding the password "
1513
+ _message " iterations: ::1 pbkdf2_iter:: " $pbkdf2_iter
1500
1514
# We use a length of 64bytes = 512bits (more than needed!?)
1501
- tombpass=` tomb-kdb-pbkdf2 $pbkdf2_salt $pbkdf2_iter 64 <<< " ${tombpass}" `
1502
-
1503
- header=" _KDF_pbkdf2sha1_${pbkdf2_salt} _${pbkdf2_iter} _64\n"
1515
+ tombpass=` tomb-kdb-pbkdf2 $kdfsalt $pbkdf2_iter 64 <<< " ${tombpass}" `
1516
+ header=" _KDF_pbkdf2sha1_${kdfsalt} _${pbkdf2_iter} _64\n"
1504
1517
;;
1505
- argon2)
1506
- _success " Using KDF Argon2"
1518
+ argon2)
1519
+ _success " Using Argon2 as KDF"
1520
+ _message " iterations: ::1 kdfiterations::" $itertime
1507
1521
kdfmem=" ` option_value --kdfmem` "
1508
1522
kdfmem=${kdfmem:- 18}
1509
1523
_message " memory used: 2^::1 kdfmemory::" $kdfmem
1510
- itertime=" ` option_value --kdf` "
1511
- itertime=${itertime:- 3}
1512
- kdfsalt=` tomb-kdb-pbkdf2-gensalt`
1513
- _message " kdf salt: ::1 kdfsalt::" $kdfsalt
1514
- _message " kdf iterations: ::1 kdfiterations::" $itertime
1515
- tombpass=` argon2 $kdfsalt -m $kdfmem -t $itertime -l 64 -r <<< " ${tombpass}" `
1516
- header=" _KDF_argon2_${kdfsalt} _${itertime} _${kdfmem} _64\n"
1524
+ kdfpar=" ` option_value --kdfpar` "
1525
+ kdfpar=${kdfpar:- 1}
1526
+ _message " parallelismn: ::1 kdfparallel::" $kdfpar
1527
+ tombpass=` argon2 $kdfsalt -m $kdfmem -t $itertime -p $kdfpar -l 64 -r <<< " ${tombpass}" `
1528
+ header=" _KDF_argon2_${kdfsalt} _${itertime} _${kdfmem} _${kdfpar} _64\n"
1529
+ ;;
1530
+ * )
1531
+ _warning " unrecognized KDF ::1::" $kdftype
1532
+ _warning " key won\'t be protected via a KDF implementation"
1533
+ _warning " only pbkdf2 and argon2 are valid arguments"
1517
1534
;;
1518
1535
esac
1519
1536
}
@@ -1976,7 +1993,7 @@ forge_key() {
1976
1993
$destkey $algo
1977
1994
1978
1995
[[ $KDF == 1 ]] && { ! option_is_set -g } && {
1979
- _message " Using KDF to protect the key password ( ` option_value --kdf ` rounds) "
1996
+ _message " Using KDF to protect the key password"
1980
1997
}
1981
1998
1982
1999
TOMBKEYFILE=" $destkey " # Set global variable
@@ -3129,19 +3146,19 @@ main() {
3129
3146
main_opts=(q -quiet=q D -debug=D h -help=h v -version=v f -force=f -tmp: U: G: T: -no-color -unsafe g -gpgkey=g -sudo:)
3130
3147
subcommands_opts[__default]=" "
3131
3148
# -o in open and mount is used to pass alternate mount options
3132
- subcommands_opts[open]=" n -nohook=n k: -kdf: -kdftype: -kdfmem: o: -ignore-swap -tomb-pwd: r: R: p -preserve-ownership=p"
3149
+ subcommands_opts[open]=" n -nohook=n k: o: -ignore-swap -tomb-pwd: r: R: p -preserve-ownership=p"
3133
3150
subcommands_opts[mount]=${subcommands_opts[open]}
3134
3151
3135
3152
subcommands_opts[create]=" " # deprecated, will issue warning
3136
3153
3137
3154
# -o in forge and lock is used to pass an alternate cipher.
3138
- subcommands_opts[forge]=" -ignore-swap k: -kdf: -kdftype : -kdfmem: o: -tomb-pwd: -use-random r: R: "
3155
+ subcommands_opts[forge]=" -ignore-swap k: -kdf: -kdfiter : -kdfmem: -kdfpar : o: -tomb-pwd: -use-random r: R: "
3139
3156
subcommands_opts[dig]=" -ignore-swap s: -size=s "
3140
- subcommands_opts[lock]=" -ignore-swap k: -kdf: -kdftype: -kdfmem: o: -tomb-pwd: r: R: -filesystem: "
3141
- subcommands_opts[setkey]=" k: -ignore-swap -kdf: -kdftype: -kdfmem: - tomb-old-pwd: -tomb-pwd: r: R: "
3157
+ subcommands_opts[lock]=" -ignore-swap k: o: -tomb-pwd: r: R: -filesystem: "
3158
+ subcommands_opts[setkey]=" k: -ignore-swap -tomb-old-pwd: -tomb-pwd: r: R: "
3142
3159
subcommands_opts[engrave]=" k: "
3143
3160
3144
- subcommands_opts[passwd]=" k: -ignore-swap -kdf: -kdftype : -kdfmem: -tomb-old-pwd: -tomb-pwd: r: R: "
3161
+ subcommands_opts[passwd]=" k: -ignore-swap -kdf: -kdfiter : -kdfmem: -kdfpar : -tomb-old-pwd: -tomb-pwd: r: R: "
3145
3162
subcommands_opts[close]=" "
3146
3163
subcommands_opts[help]=" "
3147
3164
subcommands_opts[slam]=" "
0 commit comments