1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6 * http://www.samsung.com/
8 * Portions of this code from linux/fs/ext3/hash.c
10 * Copyright (C) 2002 by Theodore Ts'o
12 #include <linux/types.h>
14 #include <linux/f2fs_fs.h>
15 #include <linux/cryptohash.h>
16 #include <linux/pagemap.h>
21 * Hashing code copied from ext3
23 #define DELTA 0x9E3779B9
25 static void TEA_transform(unsigned int buf
[4], unsigned int const in
[])
28 __u32 b0
= buf
[0], b1
= buf
[1];
29 __u32 a
= in
[0], b
= in
[1], c
= in
[2], d
= in
[3];
34 b0
+= ((b1
<< 4)+a
) ^ (b1
+sum
) ^ ((b1
>> 5)+b
);
35 b1
+= ((b0
<< 4)+c
) ^ (b0
+sum
) ^ ((b0
>> 5)+d
);
42 static void str2hashbuf(const unsigned char *msg
, size_t len
,
43 unsigned int *buf
, int num
)
48 pad
= (__u32
)len
| ((__u32
)len
<< 8);
54 for (i
= 0; i
< len
; i
++) {
57 val
= msg
[i
] + (val
<< 8);
70 f2fs_hash_t
f2fs_dentry_hash(const struct qstr
*name_info
,
71 struct fscrypt_name
*fname
)
74 f2fs_hash_t f2fs_hash
;
75 const unsigned char *p
;
77 const unsigned char *name
= name_info
->name
;
78 size_t len
= name_info
->len
;
80 /* encrypted bigname case */
81 if (fname
&& !fname
->disk_name
.name
)
82 return cpu_to_le32(fname
->hash
);
84 if (is_dot_dotdot(name_info
))
87 /* Initialize the default seed for the hash checksum functions */
95 str2hashbuf(p
, len
, in
, 4);
96 TEA_transform(buf
, in
);
103 f2fs_hash
= cpu_to_le32(hash
& ~F2FS_HASH_COL_BIT
);