file-systems: Handle LUKS2 header.

* gnu/build/file-systems.scm (luks-superblock?): Handle LUKS2 header.

Signed-off-by: Danny Milosavljevic <dannym@scratchpost.org>
This commit is contained in:
David Trudgian 2020-01-04 09:19:17 -06:00 committed by Danny Milosavljevic
parent 7f16122efd
commit 7aa28eb339
No known key found for this signature in database
GPG key ID: E71A35542C30BAA5

View file

@ -4,6 +4,7 @@
;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com> ;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2019 Guillaume Le Vaillant <glv@posteo.net> ;;; Copyright © 2019 Guillaume Le Vaillant <glv@posteo.net>
;;; Copyright © 2019 Tobias Geerinckx-Rice <me@tobias.gr> ;;; Copyright © 2019 Tobias Geerinckx-Rice <me@tobias.gr>
;;; Copyright © 2019 David C. Trudgian <dave@trudgian.net>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -343,6 +344,10 @@ (define (check-jfs-file-system device)
;; <https://gitlab.com/cryptsetup/cryptsetup/wikis/Specification>. We follow ;; <https://gitlab.com/cryptsetup/cryptsetup/wikis/Specification>. We follow
;; version 1.2.1 of this document. ;; version 1.2.1 of this document.
;; The LUKS2 header format is described in "LUKS2 On-Disk Format Specification":
;; <https://gitlab.com/cryptsetup/LUKS2-docs/blob/master/luks2_doc_wip.pdf>.
;; It is a WIP document.
(define-syntax %luks-endianness (define-syntax %luks-endianness
;; Endianness of LUKS headers. ;; Endianness of LUKS headers.
(identifier-syntax (endianness big))) (identifier-syntax (endianness big)))
@ -356,12 +361,16 @@ (define %luks-magic
(let ((magic (sub-bytevector sblock 0 6)) (let ((magic (sub-bytevector sblock 0 6))
(version (bytevector-u16-ref sblock 6 %luks-endianness))) (version (bytevector-u16-ref sblock 6 %luks-endianness)))
(and (bytevector=? magic %luks-magic) (and (bytevector=? magic %luks-magic)
(= version 1)))) (or (= version 1) (= version 2)))))
(define (read-luks-header file) (define (read-luks-header file)
"Read a LUKS header from FILE. Return the raw header on success, and #f if "Read a LUKS header from FILE. Return the raw header on success, and #f if
not valid header was found." not valid header was found."
;; Size in bytes of the LUKS header, including key slots. ;; Size in bytes of the LUKS binary header, which includes key slots in
;; LUKS1. In LUKS2 the binary header is partially backward compatible, so
;; that UUID can be extracted as for LUKS1. Keyslots and other metadata are
;; not part of this header in LUKS2, but are included in the JSON metadata
;; area that follows.
(read-superblock file 0 592 luks-superblock?)) (read-superblock file 0 592 luks-superblock?))
(define (luks-header-uuid header) (define (luks-header-uuid header)