| #ifndef EROFS_FSSUM_H |
| #define EROFS_FSSUM_H |
| #include "erofs/dir.h" |
| |
| #define CS_SIZE 16 |
| #define CHUNKS 128 |
| |
| #define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) |
| #define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y)))) |
| #define H(x, y, z) (((x) ^ (y)) ^ (z)) |
| #define H2(x, y, z) ((x) ^ ((y) ^ (z))) |
| #define I(x, y, z) ((y) ^ ((x) | ~(z))) |
| |
| #define STEP(f, a, b, c, d, x, t, s) \ |
| (a) += f((b), (c), (d)) + (x) + (t); \ |
| (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \ |
| (a) += (b); |
| |
| #define OUT(dst, src) \ |
| (dst)[0] = (unsigned char)(src); \ |
| (dst)[1] = (unsigned char)((src) >> 8); \ |
| (dst)[2] = (unsigned char)((src) >> 16); \ |
| (dst)[3] = (unsigned char)((src) >> 24); |
| |
| #if defined(__i386__) || defined(__x86_64__) || defined(__vax__) |
| #define SET(n) \ |
| (*(MD5_u32plus *)&ptr[(n) * 4]) |
| #define GET(n) \ |
| SET(n) |
| #else |
| #define SET(n) \ |
| (ctx->block[(n)] = \ |
| (MD5_u32plus)ptr[(n) * 4] | \ |
| ((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \ |
| ((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \ |
| ((MD5_u32plus)ptr[(n) * 4 + 3] << 24)) |
| #define GET(n) \ |
| (ctx->block[(n)]) |
| #endif |
| |
| typedef unsigned int MD5_u32plus; |
| |
| struct erofs_MD5_CTX { |
| MD5_u32plus lo, hi; |
| MD5_u32plus a, b, c, d; |
| unsigned char buffer[64]; |
| MD5_u32plus block[16]; |
| }; |
| |
| struct erofs_sum_t { |
| struct erofs_MD5_CTX md5; |
| unsigned char out[16]; |
| }; |
| |
| int erofs_fssum_calculate(struct erofs_dir_context *ctx); |
| |
| #endif |