@@ -65,6 +65,7 @@ typeset -i SPHINX=1
65
65
typeset -i RESIZER=1
66
66
typeset -i RECOLL=1
67
67
typeset -i QRENCODE=1
68
+ typeset -i ARGON2=1
68
69
69
70
# Default mount options
70
71
typeset MOUNTOPTS=" rw,noatime,nodev"
@@ -840,8 +841,13 @@ usage() {
840
841
_print " --sphx-host host associated with the key (for use with pitchforkedsphinx)"
841
842
}
842
843
843
- [[ $KDF == 1 ]] && {
844
- _print " --kdf forge keys armored against dictionary attacks"
844
+ [[ $KDF == 1 ]] || [[ $ARGON2 == 1 ]] && {
845
+ _print " --kdf forge keys armored against dictionary attacks (pbkdf2 (default), argon2)"
846
+ _print " --kdfiter Number of iterations (meaning depending on KDF algorithm) (pbkdf2, argon2)"
847
+ }
848
+ [[ $ARGON2 == 1 ]] && {
849
+ _print " --kdfmem memory to be used (argon2)"
850
+ _print " --kdfpar number of threads (argon2)"
845
851
}
846
852
847
853
echo
@@ -1313,11 +1319,14 @@ get_lukskey() {
1313
1319
kdf_salt=" ${firstline[(ws:_:)3]} "
1314
1320
kdf_ic=" ${firstline[(ws:_:)4]} "
1315
1321
kdf_mem=" ${firstline[(ws:_:)5]} "
1322
+ kdf_par=" ${firstline[(ws:_:)6]} "
1323
+ # ToDo also parse kdf_len?
1316
1324
_message " Unlocking KDF key protection (::1 kdf::)" $kdf_hash
1317
1325
_verbose " KDF salt: $kdf_salt "
1318
1326
_verbose " KDF ic: $kdf_ic "
1319
1327
_verbose " KDF mem: $kdf_mem "
1320
- _password=$( argon2 $kdf_salt -m $kdf_mem -t $kdf_ic -l 64 -r 2> /dev/null <<< $_password )
1328
+ _verbose " KDF # threads: $kdf_par "
1329
+ _password=$( argon2 $kdf_salt -m $kdf_mem -t $kdf_ic -p $kdf_par -l 64 -r 2> /dev/null <<< $_password )
1321
1330
;;
1322
1331
1323
1332
* )
@@ -1589,50 +1598,68 @@ gen_key() {
1589
1598
fi
1590
1599
1591
1600
header=" "
1592
- [[ $KDF == 1 ]] && {
1601
+ [[ $KDF == 1 ]] || [[ $ARGON2 == 1 ]] && {
1593
1602
{ option_is_set --kdf } && {
1594
- # KDF is a new key strenghtening technique against brute forcing
1603
+ # KDF is a key strengthening technique against brute forcing
1595
1604
# see: https://github.com/dyne/Tomb/issues/82
1596
- itertime=" ` option_value --kdf` "
1605
+ # Two algorithm currently supported:
1606
+ # * pbkdf2 (covers against time)
1607
+ # * argon2 (covers against time, memory and parallelismn)
1608
+
1609
+ # --kdfiter takes one parameter: time cost in seconds
1610
+ # (argon2 has a default of 3 iterations;
1611
+ # the resulting itertime with this default is considered safe enough for pbkdf2)
1612
+ itertime=" ` option_value --kdfiter` "
1613
+ itertime=${itertime:- 3}
1614
+
1597
1615
# removing support of floating points because they can't be type checked well
1598
1616
# if [[ "$itertime" != <-> ]]; then
1599
1617
# unset tombpass
1600
1618
# unset tombpasstmp
1601
- # _warning "Wrong argument for --kdf : must be an integer number (iteration seconds)."
1619
+ # _warning "Wrong argument for --kdfiter : must be an integer number (iteration seconds)."
1602
1620
# _failure "Depending on the speed of machines using this tomb, use 1 to 10, or more"
1603
1621
# return 1
1604
1622
# fi
1605
- # # --kdf takes one parameter: iter time (on present machine) in seconds
1606
1623
1607
- kdftype=" ` option_value --kdftype` "
1624
+ # Generating salt (either via tomb-kdb-pbkdf2 or a shell fallback)
1625
+ if $( command -v tomb-kdb-pbkdf2-gensalt 1> /dev/null 2> /dev/null) ; then
1626
+ kdfsalt=` tomb-kdb-pbkdf2-gensalt`
1627
+ else
1628
+ kdfsalt=$( LC_CTYPE=C tr -cd ' a-f0-9' < /dev/random | head -c 64)
1629
+ fi
1630
+ _message " kdf salt: ::1 kdfsalt::" $kdfsalt
1631
+
1632
+ # --kdf takes one optional parameter: what KDF
1633
+ # (pbkdf being the default)
1634
+ kdftype=" ` option_value --kdf` "
1608
1635
kdftype=${kdftype:- pbkdf2}
1609
1636
case ${kdftype} in
1610
- pbkdf2)
1637
+ pbkdf2)
1611
1638
local -i microseconds
1612
1639
microseconds=$(( itertime * 1000000 ))
1613
- _success " Using KDF, iteration time: ::1 microseconds::" $microseconds
1614
- _message " generating salt"
1615
- pbkdf2_salt=` tomb-kdb-pbkdf2-gensalt`
1640
+ _success " Using pbkdf2 as KDF, iteration time: ::1 microseconds::" $microseconds
1616
1641
_message " calculating iterations"
1617
1642
pbkdf2_iter=` tomb-kdb-pbkdf2-getiter $microseconds `
1618
1643
_message " encoding the password"
1619
1644
# We use a length of 64bytes = 512bits (more than needed!?)
1620
- tombpass=` tomb-kdb-pbkdf2 $pbkdf2_salt $pbkdf2_iter 64 <<< " ${tombpass}" `
1621
-
1622
- header=" _KDF_pbkdf2sha1_${pbkdf2_salt} _${pbkdf2_iter} _64\n"
1645
+ tombpass=` tomb-kdb-pbkdf2 $kdfsalt $pbkdf2_iter 64 <<< " ${tombpass}" `
1646
+ header=" _KDF_pbkdf2sha1_${kdfsalt} _${pbkdf2_iter} _64\n"
1623
1647
;;
1624
- argon2)
1625
- _success " Using KDF Argon2"
1648
+ argon2)
1649
+ _success " Using Argon2 as KDF"
1650
+ _message " iterations: ::1 kdfiterations::" $itertime
1626
1651
kdfmem=" ` option_value --kdfmem` "
1627
1652
kdfmem=${kdfmem:- 18}
1628
1653
_message " memory used: 2^::1 kdfmemory::" $kdfmem
1629
- itertime=" ` option_value --kdf` "
1630
- itertime=${itertime:- 3}
1631
- kdfsalt=` tomb-kdb-pbkdf2-gensalt`
1632
- _message " kdf salt: ::1 kdfsalt::" $kdfsalt
1633
- _message " kdf iterations: ::1 kdfiterations::" $itertime
1634
- tombpass=` argon2 $kdfsalt -m $kdfmem -t $itertime -l 64 -r <<< " ${tombpass}" `
1635
- header=" _KDF_argon2_${kdfsalt} _${itertime} _${kdfmem} _64\n"
1654
+ kdfpar=" ` option_value --kdfpar` "
1655
+ kdfpar=${kdfpar:- 1}
1656
+ _message " parallelismn: ::1 kdfparallel::" $kdfpar
1657
+ tombpass=` argon2 $kdfsalt -m $kdfmem -t $itertime -p $kdfpar -l 64 -r <<< " ${tombpass}" `
1658
+ header=" _KDF_argon2_${kdfsalt} _${itertime} _${kdfmem} _${kdfpar} _64\n"
1659
+ ;;
1660
+ * )
1661
+ _warning " unrecognized KDF ::1::" $kdftype
1662
+ _warning " key won\'t be protected via a KDF implementation"
1636
1663
;;
1637
1664
esac
1638
1665
}
@@ -2095,7 +2122,7 @@ forge_key() {
2095
2122
$destkey $algo
2096
2123
2097
2124
[[ $KDF == 1 ]] && { ! option_is_set -g } && {
2098
- _message " Using KDF to protect the key password ( ` option_value --kdf ` rounds) "
2125
+ _message " Using KDF to protect the key password"
2099
2126
}
2100
2127
2101
2128
TOMBKEYFILE=" $destkey " # Set global variable
@@ -3268,19 +3295,19 @@ main() {
3268
3295
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:)
3269
3296
subcommands_opts[__default]=" "
3270
3297
# -o in open and mount is used to pass alternate mount options
3271
- subcommands_opts[open]=" n -nohook=n k: -kdf: -kdftype: -kdfmem: o: -ignore-swap -tomb-pwd: r: R: -sphx-host: -sphx-user: p -preserve-ownership=p"
3298
+ subcommands_opts[open]=" n -nohook=n k: o: -ignore-swap -tomb-pwd: r: R: -sphx-host: -sphx-user: p -preserve-ownership=p"
3272
3299
subcommands_opts[mount]=${subcommands_opts[open]}
3273
3300
3274
3301
subcommands_opts[create]=" " # deprecated, will issue warning
3275
3302
3276
3303
# -o in forge and lock is used to pass an alternate cipher.
3277
- subcommands_opts[forge]=" -ignore-swap k: -kdf: -kdftype : -kdfmem: o: -tomb-pwd: -use-random r: R: -sphx-host: -sphx-user: "
3304
+ subcommands_opts[forge]=" -ignore-swap k: -kdf:: -kdfiter : -kdfmem: -kdfpar : o: -tomb-pwd: -use-random r: R: -sphx-host: -sphx-user: "
3278
3305
subcommands_opts[dig]=" -ignore-swap s: -size=s "
3279
- subcommands_opts[lock]=" -ignore-swap k: -kdf: -kdftype: -kdfmem: o: -tomb-pwd: r: R: -sphx-host: -sphx-user: -filesystem: "
3280
- subcommands_opts[setkey]=" k: -ignore-swap -kdf: -kdftype: -kdfmem: - tomb-old-pwd: -tomb-pwd: r: R: -sphx-host: -sphx-user: "
3306
+ subcommands_opts[lock]=" -ignore-swap k: o: -tomb-pwd: r: R: -sphx-host: -sphx-user: -filesystem: "
3307
+ subcommands_opts[setkey]=" k: -ignore-swap -tomb-old-pwd: -tomb-pwd: r: R: -sphx-host: -sphx-user: "
3281
3308
subcommands_opts[engrave]=" k: "
3282
3309
3283
- subcommands_opts[passwd]=" k: -ignore-swap -kdf: -kdftype : -kdfmem: -tomb-old-pwd: -tomb-pwd: r: R: -sphx-host: -sphx-user: "
3310
+ subcommands_opts[passwd]=" k: -ignore-swap -kdf:: -kdfiter : -kdfmem: -kdfpar : -tomb-old-pwd: -tomb-pwd: r: R: -sphx-host: -sphx-user: "
3284
3311
subcommands_opts[close]=" "
3285
3312
subcommands_opts[help]=" "
3286
3313
subcommands_opts[slam]=" "
0 commit comments