Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 15 Jul 2021 16:25:50 GMT
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 0fcafe8516d1 - main - eli: Zero pad bytes that arise when certain auth algorithms are used
Message-ID:  <202107151625.16FGPoSk046285@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=0fcafe8516d170852aa73f029a6a28bed1e29292

commit 0fcafe8516d170852aa73f029a6a28bed1e29292
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2021-07-15 16:23:04 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2021-07-15 16:23:04 +0000

    eli: Zero pad bytes that arise when certain auth algorithms are used
    
    When authentication is configured, GELI ensures that the amount of data
    per sector is a multiple of 16 bytes.  This is done in
    eli_metadata_softc().  When the digest size is not a multiple of 16
    bytes, this leaves some extra pad bytes at the end of every sector, and
    they were not being zeroed before being written to disk.  In particular,
    this happens with the HMAC/SHA1, HMAC/RIPEMD160 and HMAC/SHA384 data
    authentication algorithms.
    
    This change ensures that they are zeroed before being written to disk.
    
    Reported by:    KMSAN
    Reviewed by:    delphij, asomers
    MFC after:      2 weeks
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D31170
---
 sys/geom/eli/g_eli_integrity.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/sys/geom/eli/g_eli_integrity.c b/sys/geom/eli/g_eli_integrity.c
index e79ec136aa2e..e97924b8df08 100644
--- a/sys/geom/eli/g_eli_integrity.c
+++ b/sys/geom/eli/g_eli_integrity.c
@@ -515,6 +515,17 @@ g_eli_auth_run(struct g_eli_worker *wr, struct bio *bp)
 			if (bp->bio_cmd == BIO_WRITE)
 				memset(data + sc->sc_alen + data_secsize, 0,
 				    encr_secsize - sc->sc_alen - data_secsize);
+		} else if (data_secsize + sc->sc_alen != encr_secsize) {
+			/*
+			 * If the HMAC size is not a multiple of 128 bits, the
+			 * per-sector data size is rounded down to ensure that
+			 * encryption can be performed without requiring any
+			 * padding.  In this case, each sector contains unused
+			 * bytes.
+			 */
+			if (bp->bio_cmd == BIO_WRITE)
+				memset(data + sc->sc_alen + data_secsize, 0,
+				    encr_secsize - sc->sc_alen - data_secsize);
 		}
 
 		if (bp->bio_cmd == BIO_WRITE) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202107151625.16FGPoSk046285>