Index | Thread | Search

From:
aiden@kaizenos.com
Subject:
Add SHA-512 support to mtree
To:
tech@openbsd.org
Date:
Sun, 1 Jun 2025 21:47:39 +0100

Download raw body.

Thread
Hi @tech

The following diff adds SHA-512 support to mtree.
Would this be welcome?

Thanks


diff /usr/src
path + /usr/src
commit - 225f0e6a7aa305433103bcae9018d1fe77e2fd53
blob - dc051e65d60a0801b9446c6a1171db442dce60a3
file + usr.sbin/mtree/create.c
--- usr.sbin/mtree/create.c
+++ usr.sbin/mtree/create.c
@@ -234,6 +234,15 @@ statf(int indent, FTSENT *p)
 		else
 			output(indent, &offset, "sha256digest=%s", sha256digest);
 	}
+	if (keys & F_SHA512 && S_ISREG(p->fts_statp->st_mode)) {
+		char *sha512digest, buf[SHA512_DIGEST_STRING_LENGTH];
+
+		sha512digest = SHA512File(p->fts_accpath,buf);
+		if (!sha512digest)
+			error("%s: %s", p->fts_accpath, strerror(errno));
+		else
+			output(indent, &offset, "sha512digest=%s", sha512digest);
+	}
 	if (keys & F_SLINK &&
 	    (p->fts_info == FTS_SL || p->fts_info == FTS_SLNONE)) {
 		name = rlink(p->fts_accpath);
commit - 225f0e6a7aa305433103bcae9018d1fe77e2fd53
blob - b79dfc9cbf69851d77791f9677f8ab2cf74cb014
file + usr.sbin/mtree/misc.c
--- usr.sbin/mtree/misc.c
+++ usr.sbin/mtree/misc.c
@@ -65,6 +65,7 @@ static KEY keylist[] = {
 	{"rmd160digest",F_RMD160,	NEEDVALUE},
 	{"sha1digest",	F_SHA1,		NEEDVALUE},
 	{"sha256digest",F_SHA256,	NEEDVALUE},
+	{"sha512digest",F_SHA512,	NEEDVALUE},
 	{"size",	F_SIZE,		NEEDVALUE},
 	{"time",	F_TIME,		NEEDVALUE},
 	{"type",	F_TYPE,		NEEDVALUE},
commit - 225f0e6a7aa305433103bcae9018d1fe77e2fd53
blob - 4968238d0d8a35196f6a62e3db65eb975b4cc181
file + usr.sbin/mtree/mtree.8
--- usr.sbin/mtree/mtree.8
+++ usr.sbin/mtree/mtree.8
@@ -195,6 +195,8 @@ The RIPEMD-160 message digest of the file.
 The SHA-1 message digest of the file.
 .It Cm sha256digest
 The SHA-256 message digest of the file.
+.It Cm sha512digest
+The SHA-512 message digest of the file.
 .It Cm size
 The size, in bytes, of the file.
 .It Cm time
commit - 225f0e6a7aa305433103bcae9018d1fe77e2fd53
blob - 2957d30876d4f0edba23dfd473fa5bd83dec6b92
file + usr.sbin/mtree/mtree.h
--- usr.sbin/mtree/mtree.h
+++ usr.sbin/mtree/mtree.h
@@ -54,6 +54,7 @@ typedef struct _node {
 	char	*rmd160digest;			/* RIPEMD-160 digest */
 	char	*sha1digest;			/* SHA-1 digest */
 	char	*sha256digest;			/* SHA-256 digest */
+	char	*sha512digest;			/* SHA-512 digest */
 	char	*slink;				/* symbolic link reference */
 	uid_t	st_uid;				/* uid */
 	gid_t	st_gid;				/* gid */
@@ -84,6 +85,7 @@ typedef struct _node {
 #define	F_FLAGS		0x080000		/* file flags */
 #define	F_NOCHANGE	0x100000		/* do not change owner/mode */
 #define	F_SHA256	0x200000		/* SHA-256 digest */
+#define	F_SHA512	0x400000		/* SHA-512 digest */
 	u_int32_t flags;			/* items set */
 
 #define	F_BLOCK	0x001				/* block special */
commit - 225f0e6a7aa305433103bcae9018d1fe77e2fd53
blob - 88af6a050743baa20abc08445a8afc5c02898912
file + usr.sbin/mtree/spec.c
--- usr.sbin/mtree/spec.c
+++ usr.sbin/mtree/spec.c
@@ -237,6 +237,11 @@ set(char *t, NODE *ip)
 			if (!ip->sha256digest)
 				error("%s", strerror(errno));
 			break;
+		case F_SHA512:
+			ip->sha512digest = strdup(val);
+			if (!ip->sha512digest)
+				error("%s", strerror(errno));
+			break;
 		case F_SIZE:
 			ip->st_size = strtoll(val, &ep, 10);
 			if (*ep)