diff mbox series

[2/2] fs/btrfs: add dependency on BLAKE2 hash

Message ID 20211227061208.54497-2-wqu@suse.com
State Accepted
Commit 1617165a172ea1768c9cb12cde536f1da252546e
Delegated to: Tom Rini
Headers show
Series [1/2] lib: add BLAKE2 hash support | expand

Commit Message

Qu Wenruo Dec. 27, 2021, 6:12 a.m. UTC
Now btrfs can utilize the newly intorudced BLAKE2 hash.

Signed-off-by: Qu Wenruo <wqu@suse.com>
---
 fs/btrfs/Kconfig       |  1 +
 fs/btrfs/crypto/hash.c | 14 ++++++++++++++
 fs/btrfs/crypto/hash.h |  1 +
 fs/btrfs/disk-io.c     |  2 ++
 4 files changed, 18 insertions(+)

Comments

Tom Rini Jan. 18, 2022, 5:39 p.m. UTC | #1
On Mon, Dec 27, 2021 at 02:12:08PM +0800, Qu Wenruo wrote:

> Now btrfs can utilize the newly intorudced BLAKE2 hash.
> 
> Signed-off-by: Qu Wenruo <wqu@suse.com>

Applied to u-boot/master, thanks!
diff mbox series

Patch

diff --git a/fs/btrfs/Kconfig b/fs/btrfs/Kconfig
index a0b48c23b31a..e31afe595f31 100644
--- a/fs/btrfs/Kconfig
+++ b/fs/btrfs/Kconfig
@@ -6,6 +6,7 @@  config FS_BTRFS
 	select ZSTD
 	select RBTREE
 	select SHA256
+	select BLAKE2
 	help
 	  This provides a single-device read-only BTRFS support. BTRFS is a
 	  next-generation Linux file system based on the copy-on-write
diff --git a/fs/btrfs/crypto/hash.c b/fs/btrfs/crypto/hash.c
index fb51f6386cb1..891a2974be05 100644
--- a/fs/btrfs/crypto/hash.c
+++ b/fs/btrfs/crypto/hash.c
@@ -4,6 +4,7 @@ 
 #include <linux/unaligned/access_ok.h>
 #include <linux/types.h>
 #include <u-boot/sha256.h>
+#include <u-boot/blake2.h>
 #include <u-boot/crc.h>
 
 static u32 btrfs_crc32c_table[256];
@@ -39,6 +40,19 @@  int hash_xxhash(const u8 *buf, size_t length, u8 *out)
 	return 0;
 }
 
+/* We use the full CSUM_SIZE(32) for BLAKE2B */
+#define BTRFS_BLAKE2_HASH_SIZE	32
+int hash_blake2(const u8 *buf, size_t length, u8 *out)
+{
+	blake2b_state S;
+
+	blake2b_init(&S, BTRFS_BLAKE2_HASH_SIZE);
+	blake2b_update(&S, buf, length);
+	blake2b_final(&S, out, BTRFS_BLAKE2_HASH_SIZE);
+
+	return 0;
+}
+
 int hash_crc32c(const u8 *buf, size_t length, u8 *out)
 {
 	u32 crc;
diff --git a/fs/btrfs/crypto/hash.h b/fs/btrfs/crypto/hash.h
index d1ba1fa374e3..f9846038bfa3 100644
--- a/fs/btrfs/crypto/hash.h
+++ b/fs/btrfs/crypto/hash.h
@@ -9,6 +9,7 @@  void btrfs_hash_init(void);
 int hash_crc32c(const u8 *buf, size_t length, u8 *out);
 int hash_xxhash(const u8 *buf, size_t length, u8 *out);
 int hash_sha256(const u8 *buf, size_t length, u8 *out);
+int hash_blake2(const u8 *buf, size_t length, u8 *out);
 
 u32 crc32c(u32 seed, const void * data, size_t len);
 
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index eb7736d53e11..8043abc1bd60 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -126,6 +126,8 @@  int btrfs_csum_data(u16 csum_type, const u8 *data, u8 *out, size_t len)
 		return hash_xxhash(data, len, out);
 	case BTRFS_CSUM_TYPE_SHA256:
 		return hash_sha256(data, len, out);
+	case BTRFS_CSUM_TYPE_BLAKE2:
+		return hash_blake2(data, len, out);
 	default:
 		printf("Unknown csum type %d\n", csum_type);
 		return -EINVAL;