Hi, On Thu, 20 Apr 2023 at 20:02:27 +0200, Cyril Brulebois wrote: >> * Backport upstream MR !498, let it mature in sid for a few >> weeks then upload 2:2.6.1-4~deb12u1 via t-p-u. There are only 2 >> upstream commits to cherry-pick and neither is large nor intrusive; >> moreover like the commits previously cherry-picked they are no-op on >> “normal” systems (only systems without swap are affected). For >> convenience I attach a debdiff for 2:2.6.1-3~deb12u2 and you'll also >> find binary packages for amd64 at >> https://people.debian.org/~guilhem/tmp/cryptsetup_2.6.1-3~deb12u2/ >> Tested: autopkgtests (incl. full upstream test suite), d-i in both >> graphical and text install on VMs with 1024M RAM (now memory cost >> won't exceed ~250M resp. ~300M thus leaving plenty of headroom for >> the rest). > > Since you're happy with that approach, let's go for an upload to > unstable for the time being, I'll conduct some tests shortly, and once > it's indeed confirmed to work fine, go via t-p-u (because of the same > fun as before with some library) so that it can be used for rc3 (if it's > ready by then — we haven't really defined when it's going to happen > besides “somewhen before end of April”).
Just uploaded 2:2.6.1-4 to sid, and locally prepared a rebuild for
bookworm (2:2.6.1-4~deb12u1).
Comparing PBKDF benchmark results obtained using default settings
(guided “encrypted LVM” partitioning scheme) between the last 3 releases
and 1, 2, or 4G RAM (the first luksDump is what I got out of d-i, the
second shows benchmark results on the final system — with swap), I get
the following parameters (summary at the bottom).
Buster (debian-10.12.0-amd64-netinst.iso, text install), 1024M RAM:
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2i
Time cost: 4
Memory: 504962
Threads: 2
root@debian:~# cryptsetup luksConvertKey /dev/vda5 <<<test
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2i
Time cost: 8
Memory: 505350
Threads: 2
Buster (debian-10.12.0-amd64-netinst.iso, text install), 2048M RAM:
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2i
Time cost: 4
Memory: 538914
Threads: 2
root@debian:~# cryptsetup luksConvertKey /dev/vda5 <<<test
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2i
Time cost: 4
Memory: 1021446
Threads: 2
Buster (debian-10.12.0-amd64-netinst.iso, text install), 4096M RAM:
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2i
Time cost: 4
Memory: 533886
Threads: 2
root@debian:~# cryptsetup luksConvertKey /dev/vda5 <<<test
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2i
Time cost: 4
Memory: 1048576
Threads: 2
Bullseye (debian-11.6.0-amd64-netinst.iso, text install), 1024M RAM:
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2i
Time cost: 4
Memory: 499892
Threads: 2
root@debian:~# cryptsetup luksConvertKey /dev/vda5 <<<test
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2i
Time cost: 8
Memory: 499888
Threads: 2
Bullseye (debian-11.6.0-amd64-netinst.iso, text install), 2048M RAM:
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2i
Time cost: 4
Memory: 582804
Threads: 2
root@debian:~# cryptsetup luksConvertKey /dev/vda5 <<<test
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2i
Time cost: 4
Memory: 1015216
Threads: 2
Bullseye (debian-11.6.0-amd64-netinst.iso, text install), 4096M RAM:
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2i
Time cost: 4
Memory: 518981
Threads: 2
root@debian:~# cryptsetup luksConvertKey /dev/vda5 <<<test
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2i
Time cost: 4
Memory: 948373
Threads: 2
Bookworm (debian-bookworm-DI-rc1-amd64-netinst.iso, text install), 1024M RAM:
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2id
Time cost: 5
Memory: 489820
Threads: 2
root@debian:~# cryptsetup luksConvertKey /dev/vda5 <<<test
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2id
Time cost: 8
Memory: 490598
Threads: 2
Bookworm (debian-bookworm-DI-rc1-amd64-netinst.iso, text install), 2048M RAM:
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2id
Time cost: 4
Memory: 553835
Threads: 2
root@debian:~# cryptsetup luksConvertKey /dev/vda5 <<<test
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2id
Time cost: 4
Memory: 1005926
Threads: 2
Bookworm (debian-bookworm-DI-rc1-amd64-netinst.iso, text install), 4096M RAM:
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2id
Time cost: 4
Memory: 546642
Threads: 2
root@debian:~# cryptsetup luksConvertKey /dev/vda5 <<<test
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2id
Time cost: 4
Memory: 1048576
Threads: 2
Bookworm (debian-bookworm-DI-rc1-amd64-netinst.iso + cryptsetup
2:2.6.1-4~deb12u1,
graphical install), 1024M RAM:
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2id
Time cost: 10
Memory: 223780
Threads: 2
root@debian:~# cryptsetup luksConvertKey /dev/vda5 <<<test
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2id
Time cost: 8
Memory: 490598
Threads: 2
Bookworm (debian-bookworm-DI-rc1-amd64-netinst.iso + cryptsetup
2:2.6.1-4~deb12u1,
text install), 1024M RAM:
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2id
Time cost: 8
Memory: 294302
Threads: 2
root@debian:~# cryptsetup luksConvertKey /dev/vda5 <<<test
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2id
Time cost: 8
Memory: 490598
Threads: 2
Bookworm (debian-bookworm-DI-rc1-amd64-netinst.iso + cryptsetup
2:2.6.1-4~deb12u1,
text install), 2048M RAM:
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2id
Time cost: 4
Memory: 590553
Threads: 2
root@debian:~# cryptsetup luksConvertKey /dev/vda5 <<<test
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2id
Time cost: 4
Memory: 1005926
Threads: 2
Bookworm (debian-bookworm-DI-rc1-amd64-netinst.iso + cryptsetup
2:2.6.1-4~deb12u1,
text install), 4096M RAM:
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2id
Time cost: 4
Memory: 613826
Threads: 2
root@debian:~# cryptsetup luksConvertKey /dev/vda5 <<<test
root@debian:~# cryptsetup luksDump /dev/vda5 | grep -A3 PBKDF
PBKDF: argon2id
Time cost: 4
Memory: 1048576
Threads: 2
Bottom line:
* The upstream patches in the patch-queue (the 2 backported earlier
from upstream MR !490 plus the new other two from upstream MR !498)
only affect systems with <2G RAM (i.e., those where half the amount
of physical memory is lower than DEFAULT_LUKS2_MEMORY_KB). And only
those without swap. On such systems the memory cost is set to a
lower value at the expense of a higher time cost, which is the
intended behavior; it appear to leave enough head-room for the
graphical installer to succeed with 1G RAM, so I believe the errata
can be removed if the changes makes it to bookworm.
* I was surprised to see the memory cost settle at ~550-600M on systems
with a decent amount of RAM in d-i. Would have expected to see 1G
here just like after running `cryptsetup luksConvertKey` in the
normal system. I get a similarily low memory cost after dropping to
a rescue shell early in d-i and running `luksFormat` manually:
~ # grep -c ^processor /proc/cpuinfo
6
~ # free
total used free shared buff/cache
available
Mem: 6062584 107888 5647804 260000 306892
5543168
Swap: 0 0 0
~ # echo test | cryptsetup luksFormat --debug --batch-mode /dev/sda
[…]
# Running argon2id() benchmark.
# PBKDF benchmark: memory cost = 65536, iterations = 4, threads = 4
(took 229 ms)
# PBKDF benchmark: memory cost = 71545, iterations = 4, threads = 4
(took 242 ms)
# PBKDF benchmark: memory cost = 73910, iterations = 4, threads = 4
(took 249 ms)
# PBKDF benchmark: memory cost = 74206, iterations = 4, threads = 4
(took 246 ms)
# PBKDF benchmark: memory cost = 75412, iterations = 4, threads = 4
(took 254 ms)
# PBKDF benchmark: memory cost = 593795, iterations = 4, threads = 4
(took 3527 ms)
# PBKDF benchmark: memory cost = 336713, iterations = 4, threads = 4
(took 1196 ms)
# PBKDF benchmark: memory cost = 563065, iterations = 4, threads = 4
(took 2035 ms)
# Benchmark returns argon2id() 4 iterations, 563065 memory, 4 threads
(for 512-bits key).
[…]
I think what happens here is that compared to the final system d-i is
a bit crippled so the 2s threshold is reached earlier in the
benchmark. For comparison, running the benchmark in the initramfs
shell of the final system (after installation, but also without
swap):
(initramfs) free
total used free shared buff/cache
available
Mem: 6064140 66752 5797144 56 200244
5675728
Swap: 0 0 0
(initramfs) echo test | cryptsetup luksConvertKey --debug --batch-mode
/dev/sda5
[…]
# Running argon2id() benchmark.
# PBKDF benchmark: memory cost = 65536, iterations = 4, threads = 4
(took 94 ms)
# PBKDF benchmark: memory cost = 174297, iterations = 4, threads = 4
(took 239 ms)
# PBKDF benchmark: memory cost = 182319, iterations = 4, threads = 4
(took 242 ms)
# PBKDF benchmark: memory cost = 188346, iterations = 4, threads = 4
(took 243 ms)
# PBKDF benchmark: memory cost = 193771, iterations = 4, threads = 4
(took 232 ms)
# PBKDF benchmark: memory cost = 208804, iterations = 4, threads = 4
(took 274 ms)
# PBKDF benchmark: memory cost = 1048576, iterations = 5, threads = 4
(took 1721 ms)
# Benchmark returns argon2id() 5 iterations, 1048576 memory, 4 threads
(for 512-bits key).
[…]
And now in the final system fully booted (same result as in initramfs):
root@debian:~# free -h
total used free shared buff/cache
available
Mem: 5.8Gi 270Mi 5.6Gi 476Ki 78Mi
5.5Gi
Swap: 975Mi 0B 975Mi
root@debian:~# cryptsetup luksConvertKey --debug --batch-mode /dev/sda5
<<<test
[…]
# Running argon2id() benchmark.
# PBKDF benchmark: memory cost = 65536, iterations = 4, threads = 4
(took 93 ms)
# PBKDF benchmark: memory cost = 176172, iterations = 4, threads = 4
(took 248 ms)
# PBKDF benchmark: memory cost = 177592, iterations = 4, threads = 4
(took 242 ms)
# PBKDF benchmark: memory cost = 183462, iterations = 4, threads = 4
(took 226 ms)
# PBKDF benchmark: memory cost = 202944, iterations = 4, threads = 4
(took 274 ms)
# PBKDF benchmark: memory cost = 1048576, iterations = 5, threads = 4
(took 1795 ms)
# Benchmark returns argon2id() 5 iterations, 1048576 memory, 4 threads
(for 512-bits key).
[…]
Never noticed that before, but that's not a regression since buster
and bullseye both have the same behavior. (At least in my test VMs;
didn't compare on real hardware.)
Cheers
--
Guilhem.
signature.asc
Description: PGP signature

