summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorQu Wenruo <wqu@suse.com>2021-12-27 14:12:08 +0800
committerTom Rini <trini@konsulko.com>2022-01-18 08:31:02 -0500
commit1617165a172ea1768c9cb12cde536f1da252546e (patch)
tree9c4af983adca444808b7e3ff629a377c222150cc /fs
parent7c3fd5c25dd005c5eef54cc629fcbfcf48a04e9a (diff)
fs/btrfs: add dependency on BLAKE2 hash
Now btrfs can utilize the newly intorudced BLAKE2 hash. Signed-off-by: Qu Wenruo <wqu@suse.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/Kconfig1
-rw-r--r--fs/btrfs/crypto/hash.c14
-rw-r--r--fs/btrfs/crypto/hash.h1
-rw-r--r--fs/btrfs/disk-io.c2
4 files changed, 18 insertions, 0 deletions
diff --git a/fs/btrfs/Kconfig b/fs/btrfs/Kconfig
index a0b48c23b3..e31afe595f 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 fb51f6386c..891a2974be 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 d1ba1fa374..f9846038bf 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 eb7736d53e..8043abc1bd 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;