iPreparation for variable length dedup support - dedup - deduplicating backup program Err bitreich.org 70 hgit clone git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/ URL:git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/ bitreich.org 70 1Log /scm/dedup/log.gph bitreich.org 70 1Files /scm/dedup/files.gph bitreich.org 70 1Refs /scm/dedup/refs.gph bitreich.org 70 1Tags /scm/dedup/tag bitreich.org 70 1README /scm/dedup/file/README.gph bitreich.org 70 1LICENSE /scm/dedup/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit c0597760335a6dfcfeb37a023f6362567079ba7f /scm/dedup/commit/c0597760335a6dfcfeb37a023f6362567079ba7f.gph bitreich.org 70 1parent 367c26efe780933f7fc2201384d8e1c0feb8a77a /scm/dedup/commit/367c26efe780933f7fc2201384d8e1c0feb8a77a.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Fri, 15 Feb 2019 16:54:09 +0000 Err bitreich.org 70 i Err bitreich.org 70 iPreparation for variable length dedup support Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M LICENSE | 3 ++- Err bitreich.org 70 i M Makefile | 10 +++++----- Err bitreich.org 70 i M TODO | 3 ++- Err bitreich.org 70 i M dedup.1 | 1 + Err bitreich.org 70 i M dedup.c | 586 +++++++++++++++++-------------- Err bitreich.org 70 i D sha256.c | 261 ------------------------------- Err bitreich.org 70 i D sha256.h | 24 ------------------------ Err bitreich.org 70 i Err bitreich.org 70 i7 files changed, 331 insertions(+), 557 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/LICENSE b/LICENSE /scm/dedup/file/LICENSE.gph bitreich.org 70 i@@ -1,4 +1,5 @@ Err bitreich.org 70 i-© 2018 Dimitris Papastamos Err bitreich.org 70 i+© 2019 Dimitris Papastamos Err bitreich.org 70 i+© 2019 z3bra Err bitreich.org 70 i Err bitreich.org 70 i Permission to use, copy, modify, and distribute this software for any Err bitreich.org 70 i purpose with or without fee is hereby granted, provided that the above Err bitreich.org 70 1diff --git a/Makefile b/Makefile /scm/dedup/file/Makefile.gph bitreich.org 70 i@@ -1,18 +1,18 @@ Err bitreich.org 70 i VERSION = 0.0 Err bitreich.org 70 i PREFIX = /usr/local Err bitreich.org 70 i MANPREFIX = $(PREFIX)/man Err bitreich.org 70 i-SRC = dedup.c sha256.c Err bitreich.org 70 i-OBJ = dedup.o sha256.o Err bitreich.org 70 i+SRC = dedup.c Err bitreich.org 70 i+OBJ = dedup.o Err bitreich.org 70 i BIN = dedup Err bitreich.org 70 i DISTFILES = $(SRC) LICENSE Makefile README arg.h dedup.1 tree.h Err bitreich.org 70 i Err bitreich.org 70 i CFLAGS = -g -Wall Err bitreich.org 70 i-CPPFLAGS = -I/usr/local/include Err bitreich.org 70 i+CPPFLAGS = -I/usr/local/include -D_FILE_OFFSET_BITS=64 Err bitreich.org 70 i+LDLIBS = -lcrypto Err bitreich.org 70 i Err bitreich.org 70 i all: $(BIN) Err bitreich.org 70 i Err bitreich.org 70 i-dedup.o: arg.h sha256.h tree.h Err bitreich.org 70 i-sha256.o: sha256.h Err bitreich.org 70 i+dedup.o: arg.h tree.h Err bitreich.org 70 i Err bitreich.org 70 i clean: Err bitreich.org 70 i rm -f $(OBJ) $(BIN) $(BIN)-$(VERSION).tar.gz Err bitreich.org 70 1diff --git a/TODO b/TODO /scm/dedup/file/TODO.gph bitreich.org 70 i@@ -1,4 +1,5 @@ Err bitreich.org 70 i endianness agnostic Err bitreich.org 70 i version field in entry header Err bitreich.org 70 i-lseek64 support Err bitreich.org 70 i look into variable-length dedup Err bitreich.org 70 i+file locking Err bitreich.org 70 i+overflow checks Err bitreich.org 70 1diff --git a/dedup.1 b/dedup.1 /scm/dedup/file/dedup.1.gph bitreich.org 70 i@@ -31,3 +31,4 @@ files will be created. Err bitreich.org 70 i .El Err bitreich.org 70 i .Sh AUTHORS Err bitreich.org 70 i .An Dimitris Papastamos Aq Mt sin@2f30.org , Err bitreich.org 70 i+.An z3bra Aq Mt contactatz3bradotorg . Err bitreich.org 70 1diff --git a/dedup.c b/dedup.c /scm/dedup/file/dedup.c.gph bitreich.org 70 i@@ -7,47 +7,59 @@ Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i #include "arg.h" Err bitreich.org 70 i-#include "sha256.h" Err bitreich.org 70 i #include "tree.h" Err bitreich.org 70 i Err bitreich.org 70 i #define INDEXF ".index" Err bitreich.org 70 i #define STOREF ".store" Err bitreich.org 70 i #define CACHEF ".cache" Err bitreich.org 70 i Err bitreich.org 70 i-#define BLKSIZ 4096 Err bitreich.org 70 i+#define BLKSIZ 65536 Err bitreich.org 70 i+#define WINSIZ 4095 Err bitreich.org 70 i+#define MDSIZ SHA256_DIGEST_LENGTH Err bitreich.org 70 i+ Err bitreich.org 70 i+#define ROTL(x, y) (((x) << (y)) | ((x) >> (32 - (y)))) Err bitreich.org 70 i+ Err bitreich.org 70 i+enum { Err bitreich.org 70 i+ WALK_CONTINUE, Err bitreich.org 70 i+ WALK_STOP Err bitreich.org 70 i+}; Err bitreich.org 70 i Err bitreich.org 70 i+/* index file header */ Err bitreich.org 70 i struct enthdr { Err bitreich.org 70 i uint64_t flags; Err bitreich.org 70 i uint64_t nents; Err bitreich.org 70 i-} __attribute__((packed)); Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+/* block descriptor */ Err bitreich.org 70 i+struct bdescr { Err bitreich.org 70 i+ uint8_t md[MDSIZ]; Err bitreich.org 70 i+ uint64_t offset; Err bitreich.org 70 i+ uint64_t size; Err bitreich.org 70 i+}; Err bitreich.org 70 i Err bitreich.org 70 i+/* index file entry */ Err bitreich.org 70 i struct ent { Err bitreich.org 70 i uint64_t size; Err bitreich.org 70 i- uint8_t reserved[7]; Err bitreich.org 70 i- uint8_t md[32]; Err bitreich.org 70 i+ uint8_t md[MDSIZ]; /* hash of file */ Err bitreich.org 70 i uint64_t nblks; Err bitreich.org 70 i- uint64_t blks[]; Err bitreich.org 70 i-} __attribute__((packed)); Err bitreich.org 70 i+ struct bdescr bdescr[]; Err bitreich.org 70 i+}; Err bitreich.org 70 i Err bitreich.org 70 i-struct blk { Err bitreich.org 70 i- uint8_t md[32]; Err bitreich.org 70 i- uint64_t size; Err bitreich.org 70 i- uint8_t data[BLKSIZ]; Err bitreich.org 70 i-} __attribute__((packed)); Err bitreich.org 70 i- Err bitreich.org 70 i-struct cache_data { Err bitreich.org 70 i- uint8_t md[32]; Err bitreich.org 70 i- uint64_t blkidx; Err bitreich.org 70 i-} __attribute__((packed)); Err bitreich.org 70 i- Err bitreich.org 70 i-struct cache_ent { Err bitreich.org 70 i- struct cache_data data; Err bitreich.org 70 i- int dirty; Err bitreich.org 70 i- RB_ENTRY(cache_ent) e; Err bitreich.org 70 i+/* cache entry */ Err bitreich.org 70 i+struct cent { Err bitreich.org 70 i+ struct bdescr bdescr; Err bitreich.org 70 i+ RB_ENTRY(cent) e; Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+struct extract_args { Err bitreich.org 70 i+ uint8_t *md; Err bitreich.org 70 i+ int fd; Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i-RB_HEAD(cache, cache_ent) cache_head; Err bitreich.org 70 i+RB_HEAD(cache, cent) cache_head; Err bitreich.org 70 i struct enthdr enthdr; Err bitreich.org 70 i int ifd; Err bitreich.org 70 i int sfd; Err bitreich.org 70 i@@ -55,58 +67,101 @@ int cfd; Err bitreich.org 70 i int verbose; Err bitreich.org 70 i char *argv0; Err bitreich.org 70 i Err bitreich.org 70 i-void Err bitreich.org 70 i-dump_md(const uint8_t *md, size_t len) Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * Static table for use in buzhash algorithm. Err bitreich.org 70 i+ * 256 * 32 bits randomly generated unique integers Err bitreich.org 70 i+ */ Err bitreich.org 70 i+uint32_t buz[] = { Err bitreich.org 70 i+ 0xbc9fa594,0x30a8f827,0xced627a7,0xdb46a745,0xcfa4a9e8,0x77cccb59,0xddb66276,0x3adc532f, Err bitreich.org 70 i+ 0xfe8b67d3,0x8155b59e,0x0c893666,0x1d757009,0x17394ee4,0x85d94c07,0xcacd52da,0x076c6f79, Err bitreich.org 70 i+ 0xead0a798,0x6c7ccb4a,0x2639a1b8,0x3aa5ae32,0x3e6218d2,0xb290d980,0xa5149521,0x4b426119, Err bitreich.org 70 i+ 0xd3230fc7,0x677c1cc4,0x2b64603c,0x01fe92a8,0xbe358296,0xa7e7fac7,0xf509bf41,0x04b017ad, Err bitreich.org 70 i+ 0xf900344c,0x8e14e202,0xb2a6e9b4,0x3db3c311,0x960286a8,0xf6bf0468,0xed54ec94,0xf358070c, Err bitreich.org 70 i+ 0x6a4795dd,0x3f7b925c,0x5e13a060,0xfaecbafe,0x03c8bb55,0x8a56ba88,0x633e3b49,0xe036bbbe, Err bitreich.org 70 i+ 0x1ed3dbb5,0x76e8ad74,0x79d346ab,0x44b4ccc4,0x71eb22d3,0xa1aa3f24,0x50e05b81,0xa3b450d3, Err bitreich.org 70 i+ 0x7f5caffb,0xa1990650,0x54c44800,0xda134b65,0x72362eea,0xbd12b8e6,0xf7c99fdc,0x020d48c7, Err bitreich.org 70 i+ 0x9d9c3d46,0x32b75615,0xe61923cf,0xadc09d8f,0xab11376b,0xd66fe4cd,0xb3b086b6,0xb8345b9f, Err bitreich.org 70 i+ 0x59029667,0xae0e937c,0xcbd4d4ba,0x720bb3fb,0x5f7d2ca3,0xec24ba15,0x6b40109b,0xf0a54587, Err bitreich.org 70 i+ 0x3acf9420,0x466e981d,0xc66dc124,0x150ef7b4,0xc3ce718e,0x136774f5,0x46684ab4,0xb4b490f0, Err bitreich.org 70 i+ 0x26508a8b,0xf12febc8,0x4b99171b,0xfc373c84,0x339b5677,0x41703ff3,0x7cadbbd7,0x15ea24e2, Err bitreich.org 70 i+ 0x7a2f9783,0xed6a383a,0x649eb072,0x79970941,0x2abd28ad,0x4375e00c,0x9df084f7,0x6fdeec6c, Err bitreich.org 70 i+ 0x6619ac6d,0x7d256f4d,0x9b8e658a,0x3d7627e9,0xd5a98d45,0x15f84223,0x9b6acef5,0xf876be67, Err bitreich.org 70 i+ 0xe3ae7089,0x84e2b64a,0x6818a969,0x86e9ba4e,0xa24a5b57,0x61570cf1,0xa5f8fc91,0x879d8383, Err bitreich.org 70 i+ 0x91b13866,0x75e87961,0x16db8138,0x5a2ff6b8,0x8f664e9b,0x894e1496,0x88235c5b,0xcdb3b580, Err bitreich.org 70 i+ 0xa2e80109,0xb0f88a82,0xd12cd340,0x93fbc37d,0xf4d1eb82,0xce42f309,0x16ffd2c2,0xb4dfef2b, Err bitreich.org 70 i+ 0xb8b1a33e,0x4708a5e6,0xba66dd88,0xa9ec0da6,0x6f8ee2c9,0xad8b9993,0x1d6a25a8,0x1f3d08ce, Err bitreich.org 70 i+ 0x149c04e7,0x5cd1fa51,0xb84c89c7,0xeced6f8c,0xe328b30f,0x084fa836,0x6d1bb1b7,0x94c78ea5, Err bitreich.org 70 i+ 0x14973034,0xf1a1bcef,0x48b798d2,0xded9ca9e,0x5fd965d0,0x92544eb1,0x5e80f189,0xcbbf5e15, Err bitreich.org 70 i+ 0x4d8121f0,0x5dd3b92f,0xd9ea98fb,0x2dbf5644,0x0fbcb9b7,0x20a1db53,0x7c3fcc98,0x36744fbd, Err bitreich.org 70 i+ 0xced08954,0x8e7c5efe,0x3c5f6733,0x657477be,0x3630a02d,0x38bcbda0,0xb7702575,0x4a7f4bce, Err bitreich.org 70 i+ 0x0e7660fe,0x4dcb91b5,0x4fd7ffd3,0x041821c1,0xa846a181,0xc8048e9e,0xd4b05072,0x986e0509, Err bitreich.org 70 i+ 0xa00aaeeb,0x02e3526a,0x2fac4843,0xfa98e805,0x923ecd8d,0x395d9546,0x8674c3cd,0xae5a8a71, Err bitreich.org 70 i+ 0x966dfe45,0x5c9ceba5,0x0830a1cf,0xa1750981,0x8f604480,0x28ea0c9a,0x0da12413,0x98b0b3c5, Err bitreich.org 70 i+ 0xa21d473a,0x96ce4308,0xe9a1001b,0x8bbacb44,0x18bad3f4,0xe3121acb,0x46a9b45f,0x92cd9704, Err bitreich.org 70 i+ 0xc1a7c619,0x3281e361,0x462e8c79,0x9e572f93,0x7239e5f0,0x67d8e6ba,0x13747ce3,0xf01ee64a, Err bitreich.org 70 i+ 0xe7d0ae12,0xeea04088,0xe5b36767,0x17558eae,0x678ffbe6,0xe0bbc866,0x0c24adec,0xa9cbb869, Err bitreich.org 70 i+ 0x3fd44ee1,0x9ca4ca06,0x04c0ef00,0x04589a21,0x9cf9c819,0x976f6ca1,0x8a30e66a,0x004d6f7e, Err bitreich.org 70 i+ 0x384c8851,0x5bc97eb8,0xc6c49339,0x5aa386c7,0x74bdf8af,0x9b713750,0x4112f8c2,0x2895dae1, Err bitreich.org 70 i+ 0xf576d905,0x9de98bce,0xb2b26bcd,0xd46707a0,0x147fbb46,0xa52c6e50,0xe43128fc,0x374ad964, Err bitreich.org 70 i+ 0x8dfd4d53,0xc4d0c087,0x31dfb5ca,0xa44589b5,0x6b637e2e,0x663f6b45,0xd2d8baa0,0x1dac7e4c Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Buzhash: https://en.wikipedia.org/wiki/Rolling_hash#Cyclic_polynomial */ Err bitreich.org 70 i+uint32_t Err bitreich.org 70 i+buzh_init(uint8_t *buf, size_t size) Err bitreich.org 70 i { Err bitreich.org 70 i size_t i; Err bitreich.org 70 i+ uint32_t fp = 0; Err bitreich.org 70 i Err bitreich.org 70 i- for (i = 0; i < len; i++) Err bitreich.org 70 i- fprintf(stderr, "%02x", md[i]); Err bitreich.org 70 i+ for (i = size - 1; i > 0; i--, buf++) Err bitreich.org 70 i+ fp ^= ROTL(buz[*buf], i % 32); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return fp ^ buz[*buf]; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-void Err bitreich.org 70 i-dump_enthdr(struct enthdr *hdr) Err bitreich.org 70 i+uint32_t Err bitreich.org 70 i+buzh_update(uint32_t fp, uint8_t in, uint8_t out, size_t size) Err bitreich.org 70 i { Err bitreich.org 70 i- fprintf(stderr, "hdr->flags = %llx\n", Err bitreich.org 70 i- (unsigned long long)hdr->flags); Err bitreich.org 70 i- fprintf(stderr, "hdr->nents = %llx\n", Err bitreich.org 70 i- (unsigned long long)hdr->nents); Err bitreich.org 70 i+ return ROTL(fp, 1) ^ ROTL(buz[out], size % 32) ^ buz[in]; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-void Err bitreich.org 70 i-dump_ent(struct ent *ent) Err bitreich.org 70 i+uint64_t Err bitreich.org 70 i+chunk_blk(uint8_t *buf, size_t size) Err bitreich.org 70 i { Err bitreich.org 70 i- uint64_t i; Err bitreich.org 70 i- Err bitreich.org 70 i- fprintf(stderr, "ent->size: %llu\n", (unsigned long long)ent->size); Err bitreich.org 70 i- fprintf(stderr, "ent->md: "); Err bitreich.org 70 i- dump_md(ent->md, sizeof(ent->md)); Err bitreich.org 70 i- fputc('\n', stderr); Err bitreich.org 70 i- if (verbose) { Err bitreich.org 70 i- fprintf(stderr, "ent->nblks: %llu\n", Err bitreich.org 70 i- (unsigned long long)ent->nblks); Err bitreich.org 70 i- for (i = 0; i < ent->nblks; i++) Err bitreich.org 70 i- fprintf(stderr, "ent->blks[%llu]: %llu\n", Err bitreich.org 70 i- (unsigned long long)i, Err bitreich.org 70 i- (unsigned long long)ent->blks[i]); Err bitreich.org 70 i+ size_t i; Err bitreich.org 70 i+ uint32_t fp; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Err bitreich.org 70 i+ * Chunking blocks is decided using a rolling hash + binary pattern. Err bitreich.org 70 i+ * The buzhash algorithm is used to "fingerprint" a fixed size window. Err bitreich.org 70 i+ * Once the lower 13 bits of this fingerprint are all zeros, Err bitreich.org 70 i+ * the block is chunked. Err bitreich.org 70 i+ * If the pattern can't be matched, then we return the buffer size. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ fp = buzh_init(buf, WINSIZ); Err bitreich.org 70 i+ for (i = 1; i < size - WINSIZ; i++) { Err bitreich.org 70 i+ fp = buzh_update(fp, buf[i - 1], buf[i + WINSIZ], WINSIZ); Err bitreich.org 70 i+ if ((fp & 0x00001fff) == 0) Err bitreich.org 70 i+ return i + WINSIZ; Err bitreich.org 70 i } Err bitreich.org 70 i+ return size; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i-dump_blk(struct blk *blk) Err bitreich.org 70 i+print_md(const uint8_t *md, size_t size) Err bitreich.org 70 i { Err bitreich.org 70 i- fprintf(stderr, "blk->md: "); Err bitreich.org 70 i- dump_md(blk->md, sizeof(blk->md)); Err bitreich.org 70 i- putchar('\n'); Err bitreich.org 70 i- fprintf(stderr, "blk->size: %llu\n", (unsigned long long)blk->size); Err bitreich.org 70 i+ size_t i; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = 0; i < size; i++) Err bitreich.org 70 i+ fprintf(stderr, "%02x", md[i]); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i str2bin(char *s, uint8_t *d) Err bitreich.org 70 i { Err bitreich.org 70 i- size_t i, len = strlen(s) / 2; Err bitreich.org 70 i+ size_t i, size = strlen(s) / 2; Err bitreich.org 70 i Err bitreich.org 70 i- for (i = 0; i < len; i++, s += 2) Err bitreich.org 70 i+ for (i = 0; i < size; i++, s += 2) Err bitreich.org 70 i sscanf(s, "%2hhx", &d[i]); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -151,64 +206,68 @@ xwrite(int fd, const void *buf, size_t nbytes) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i-cache_ent_cmp(struct cache_ent *e1, struct cache_ent *e2) Err bitreich.org 70 i+cent_cmp(struct cent *e1, struct cent *e2) Err bitreich.org 70 i { Err bitreich.org 70 i int r; Err bitreich.org 70 i Err bitreich.org 70 i- r = memcmp(e1->data.md, e2->data.md, sizeof(e1->data.md)); Err bitreich.org 70 i+ r = memcmp(e1->bdescr.md, e2->bdescr.md, sizeof(e1->bdescr.md)); Err bitreich.org 70 i if (r > 0) Err bitreich.org 70 i return 1; Err bitreich.org 70 i else if (r < 0) Err bitreich.org 70 i return -1; Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i-RB_PROTOTYPE(cache, cache_ent, e, cache_ent_cmp); Err bitreich.org 70 i-RB_GENERATE(cache, cache_ent, e, cache_ent_cmp); Err bitreich.org 70 i+RB_PROTOTYPE(cache, cent, e, cent_cmp); Err bitreich.org 70 i+RB_GENERATE(cache, cent, e, cent_cmp); Err bitreich.org 70 i Err bitreich.org 70 i-struct cache_ent * Err bitreich.org 70 i-alloc_cache_ent(uint8_t *md, uint64_t blkidx) Err bitreich.org 70 i+struct cent * Err bitreich.org 70 i+alloc_cent(void) Err bitreich.org 70 i { Err bitreich.org 70 i- struct cache_ent *ent; Err bitreich.org 70 i+ struct cent *ent; Err bitreich.org 70 i Err bitreich.org 70 i ent = calloc(1, sizeof(*ent)); Err bitreich.org 70 i if (ent == NULL) Err bitreich.org 70 i- err(1, "malloc"); Err bitreich.org 70 i- memcpy(&ent->data.md, md, sizeof(ent->data.md)); Err bitreich.org 70 i- ent->data.blkidx = blkidx; Err bitreich.org 70 i+ err(1, "calloc"); Err bitreich.org 70 i return ent; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i-add_cache_ent(struct cache_ent *ent) Err bitreich.org 70 i+add_cent(struct cent *cent) Err bitreich.org 70 i { Err bitreich.org 70 i- RB_INSERT(cache, &cache_head, ent); Err bitreich.org 70 i+ RB_INSERT(cache, &cache_head, cent); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i flush_cache(void) Err bitreich.org 70 i { Err bitreich.org 70 i- struct cache_ent *ent; Err bitreich.org 70 i+ struct cent *cent; Err bitreich.org 70 i Err bitreich.org 70 i- RB_FOREACH(ent, cache, &cache_head) { Err bitreich.org 70 i- if (!ent->dirty) Err bitreich.org 70 i- continue; Err bitreich.org 70 i- lseek(cfd, ent->data.blkidx * sizeof(ent->data), SEEK_SET); Err bitreich.org 70 i- xwrite(cfd, &ent->data, sizeof(ent->data)); Err bitreich.org 70 i- ent->dirty = 0; Err bitreich.org 70 i- } Err bitreich.org 70 i+ lseek(cfd, 0, SEEK_SET); Err bitreich.org 70 i+ RB_FOREACH(cent, cache, &cache_head) Err bitreich.org 70 i+ xwrite(cfd, ¢->bdescr, sizeof(cent->bdescr)); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i free_cache(void) Err bitreich.org 70 i { Err bitreich.org 70 i- struct cache_ent *ent, *tmp; Err bitreich.org 70 i+ struct cent *cent, *tmp; Err bitreich.org 70 i Err bitreich.org 70 i- RB_FOREACH_SAFE(ent, cache, &cache_head, tmp) { Err bitreich.org 70 i- RB_REMOVE(cache, &cache_head, ent); Err bitreich.org 70 i- free(ent); Err bitreich.org 70 i+ RB_FOREACH_SAFE(cent, cache, &cache_head, tmp) { Err bitreich.org 70 i+ RB_REMOVE(cache, &cache_head, cent); Err bitreich.org 70 i+ free(cent); Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+uint64_t Err bitreich.org 70 i+cache_nents(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct stat sb; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (fstat(cfd, &sb) < 0) Err bitreich.org 70 i+ err(1, "fstat"); Err bitreich.org 70 i+ return sb.st_size / sizeof(struct bdescr); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i void Err bitreich.org 70 i append_ent(struct ent *ent) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -220,7 +279,7 @@ append_ent(struct ent *ent) Err bitreich.org 70 i /* Append entry */ Err bitreich.org 70 i lseek(ifd, 0, SEEK_END); Err bitreich.org 70 i ent->size = sizeof(*ent); Err bitreich.org 70 i- ent->size += ent->nblks * sizeof(ent->blks[0]); Err bitreich.org 70 i+ ent->size += ent->nblks * sizeof(ent->bdescr[0]); Err bitreich.org 70 i xwrite(ifd, ent, ent->size); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -231,7 +290,7 @@ alloc_ent(void) Err bitreich.org 70 i Err bitreich.org 70 i ent = calloc(1, sizeof(*ent)); Err bitreich.org 70 i if (ent == NULL) Err bitreich.org 70 i- err(1, "malloc"); Err bitreich.org 70 i+ err(1, "calloc"); Err bitreich.org 70 i return ent; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -241,271 +300,265 @@ grow_ent(struct ent *ent, uint64_t nblks) Err bitreich.org 70 i size_t size; Err bitreich.org 70 i Err bitreich.org 70 i size = sizeof(*ent); Err bitreich.org 70 i- size += nblks * sizeof(ent->blks[0]); Err bitreich.org 70 i+ size += nblks * sizeof(ent->bdescr[0]); Err bitreich.org 70 i ent = realloc(ent, size); Err bitreich.org 70 i if (ent == NULL) Err bitreich.org 70 i err(1, "realloc"); Err bitreich.org 70 i return ent; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-uint64_t Err bitreich.org 70 i-storefile_nblks(void) Err bitreich.org 70 i+uint8_t * Err bitreich.org 70 i+alloc_buf(size_t size) Err bitreich.org 70 i { Err bitreich.org 70 i- struct stat sb; Err bitreich.org 70 i+ void *p; Err bitreich.org 70 i Err bitreich.org 70 i- if (fstat(sfd, &sb) < 0) Err bitreich.org 70 i- err(1, "fstat"); Err bitreich.org 70 i- return sb.st_size / sizeof(struct blk); Err bitreich.org 70 i+ p = calloc(1, size); Err bitreich.org 70 i+ if (p == NULL) Err bitreich.org 70 i+ err(1, "calloc"); Err bitreich.org 70 i+ return p; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-uint64_t Err bitreich.org 70 i-cachefile_nblks(void) Err bitreich.org 70 i+void Err bitreich.org 70 i+hash_blk(uint8_t *buf, size_t size, uint8_t *md) Err bitreich.org 70 i { Err bitreich.org 70 i- struct stat sb; Err bitreich.org 70 i+ SHA256_CTX ctx; Err bitreich.org 70 i Err bitreich.org 70 i- if (fstat(cfd, &sb) < 0) Err bitreich.org 70 i- err(1, "fstat"); Err bitreich.org 70 i- return sb.st_size / sizeof(struct cache_data); Err bitreich.org 70 i+ SHA256_Init(&ctx); Err bitreich.org 70 i+ SHA256_Update(&ctx, buf, size); Err bitreich.org 70 i+ SHA256_Final(md, &ctx); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i-hash_blk(struct blk *blk) Err bitreich.org 70 i+read_blk(uint8_t *buf, struct bdescr *bdescr) Err bitreich.org 70 i { Err bitreich.org 70 i- sha256_context ctx; Err bitreich.org 70 i- Err bitreich.org 70 i- sha256_starts(&ctx); Err bitreich.org 70 i- sha256_update(&ctx, blk->data, blk->size); Err bitreich.org 70 i- sha256_finish(&ctx, blk->md); Err bitreich.org 70 i+ lseek(sfd, bdescr->offset, SEEK_SET); Err bitreich.org 70 i+ if (xread(sfd, buf, bdescr->size) == 0) Err bitreich.org 70 i+ errx(1, "read: unexpected EOF"); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i-read_blk(struct blk *blk, off_t blkidx) Err bitreich.org 70 i+append_blk(uint8_t *buf, size_t size) Err bitreich.org 70 i { Err bitreich.org 70 i- lseek(sfd, blkidx * sizeof(*blk), SEEK_SET); Err bitreich.org 70 i- if (xread(sfd, blk, sizeof(*blk)) == 0) Err bitreich.org 70 i- errx(1, "unexpected EOF"); Err bitreich.org 70 i+ lseek(sfd, 0, SEEK_END); Err bitreich.org 70 i+ xwrite(sfd, buf, size); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-void Err bitreich.org 70 i-append_blk(struct blk *blk) Err bitreich.org 70 i+off_t Err bitreich.org 70 i+store_size(void) Err bitreich.org 70 i { Err bitreich.org 70 i- lseek(sfd, 0, SEEK_END); Err bitreich.org 70 i- xwrite(sfd, blk, sizeof(*blk)); Err bitreich.org 70 i+ return lseek(sfd, 0, SEEK_END); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i-lookup_blk(struct blk *blk, uint64_t *blkidx) Err bitreich.org 70 i+lookup_blk(uint8_t *md, struct bdescr *bdescr) Err bitreich.org 70 i { Err bitreich.org 70 i- struct cache_ent *ent, key; Err bitreich.org 70 i+ struct cent *ent, key; Err bitreich.org 70 i Err bitreich.org 70 i- memcpy(key.data.md, blk->md, sizeof(key.data.md)); Err bitreich.org 70 i+ memcpy(key.bdescr.md, md, sizeof(key.bdescr.md)); Err bitreich.org 70 i ent = RB_FIND(cache, &cache_head, &key); Err bitreich.org 70 i if (ent != NULL) { Err bitreich.org 70 i- *blkidx = ent->data.blkidx; Err bitreich.org 70 i+ *bdescr = ent->bdescr; Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i return -1; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i-extract(char *id, int fd) Err bitreich.org 70 i-{ Err bitreich.org 70 i- uint8_t md[32]; Err bitreich.org 70 i- uint64_t nblks, i; Err bitreich.org 70 i- Err bitreich.org 70 i- str2bin(id, md); Err bitreich.org 70 i- nblks = storefile_nblks(); Err bitreich.org 70 i- lseek(ifd, sizeof(enthdr), SEEK_SET); Err bitreich.org 70 i- for (i = 0; i < enthdr.nents; i++) { Err bitreich.org 70 i- uint64_t j; Err bitreich.org 70 i- struct ent *ent; Err bitreich.org 70 i- Err bitreich.org 70 i- /* Load index entry */ Err bitreich.org 70 i- ent = alloc_ent(); Err bitreich.org 70 i- if (xread(ifd, ent, sizeof(*ent)) == 0) Err bitreich.org 70 i- errx(1, "unexpected EOF"); Err bitreich.org 70 i- Err bitreich.org 70 i- /* Check if we've located the right file */ Err bitreich.org 70 i- if (memcmp(ent->md, md, sizeof(ent->md)) != 0) { Err bitreich.org 70 i- free(ent); Err bitreich.org 70 i- /* Skip over index entry block table */ Err bitreich.org 70 i- lseek(ifd, ent->nblks * sizeof(ent->blks[0]), SEEK_CUR); Err bitreich.org 70 i- continue; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- /* Load index entry block table */ Err bitreich.org 70 i- ent = grow_ent(ent, ent->nblks); Err bitreich.org 70 i- if (xread(ifd, ent->blks, Err bitreich.org 70 i- ent->nblks * sizeof(ent->blks[0])) == 0) Err bitreich.org 70 i- errx(1, "unexpected EOF"); Err bitreich.org 70 i- Err bitreich.org 70 i- /* Blast file blocks to file descriptor */ Err bitreich.org 70 i- for (j = 0; j < ent->nblks; j++) { Err bitreich.org 70 i- struct blk blk; Err bitreich.org 70 i- Err bitreich.org 70 i- if (ent->blks[j] > nblks) Err bitreich.org 70 i- errx(1, "index is corrupted"); Err bitreich.org 70 i- read_blk(&blk, ent->blks[j]); Err bitreich.org 70 i- xwrite(fd, blk.data, blk.size); Err bitreich.org 70 i- } Err bitreich.org 70 i- free(ent); Err bitreich.org 70 i- break; Err bitreich.org 70 i- } Err bitreich.org 70 i- if (i == enthdr.nents) Err bitreich.org 70 i- errx(1, "%s: unknown hash %s", __func__, id); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-void Err bitreich.org 70 i dedup(int fd) Err bitreich.org 70 i { Err bitreich.org 70 i- sha256_context ctx; Err bitreich.org 70 i- struct blk blk; Err bitreich.org 70 i+ uint8_t md[MDSIZ]; Err bitreich.org 70 i+ uint8_t *buf; Err bitreich.org 70 i+ SHA256_CTX ctx; Err bitreich.org 70 i struct ent *ent; Err bitreich.org 70 i ssize_t n; Err bitreich.org 70 i Err bitreich.org 70 i+ buf = alloc_buf(BLKSIZ); Err bitreich.org 70 i ent = alloc_ent(); Err bitreich.org 70 i- sha256_starts(&ctx); Err bitreich.org 70 i- while ((n = xread(fd, blk.data, BLKSIZ)) > 0) { Err bitreich.org 70 i- uint64_t blkidx; Err bitreich.org 70 i Err bitreich.org 70 i- blk.size = n; Err bitreich.org 70 i- hash_blk(&blk); Err bitreich.org 70 i+ SHA256_Init(&ctx); Err bitreich.org 70 i+ while ((n = xread(fd, buf, BLKSIZ)) > 0) { Err bitreich.org 70 i+ struct bdescr bdescr; Err bitreich.org 70 i+ Err bitreich.org 70 i+ hash_blk(buf, n, md); Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Calculate file hash one block at a time */ Err bitreich.org 70 i+ SHA256_Update(&ctx, buf, n); Err bitreich.org 70 i Err bitreich.org 70 i- /* Rolling hash of input stream */ Err bitreich.org 70 i- sha256_update(&ctx, blk.data, blk.size); Err bitreich.org 70 i- /* Prepare for adding a new block index for this entry */ Err bitreich.org 70 i ent = grow_ent(ent, ent->nblks + 1); Err bitreich.org 70 i+ if (lookup_blk(md, &bdescr) < 0) { Err bitreich.org 70 i+ struct bdescr bdescr; Err bitreich.org 70 i+ struct cent *cent; Err bitreich.org 70 i Err bitreich.org 70 i- if (lookup_blk(&blk, &blkidx) < 0) { Err bitreich.org 70 i- struct cache_ent *cache_ent; Err bitreich.org 70 i+ /* Block not found, create new block descriptor */ Err bitreich.org 70 i+ memcpy(bdescr.md, md, sizeof(bdescr)); Err bitreich.org 70 i+ bdescr.offset = store_size(); Err bitreich.org 70 i+ bdescr.size = n; Err bitreich.org 70 i Err bitreich.org 70 i- blkidx = storefile_nblks(); Err bitreich.org 70 i+ /* Update index entry */ Err bitreich.org 70 i+ ent->bdescr[ent->nblks++] = bdescr; Err bitreich.org 70 i Err bitreich.org 70 i- /* Create a cache entry for this block */ Err bitreich.org 70 i- cache_ent = alloc_cache_ent(blk.md, blkidx); Err bitreich.org 70 i- add_cache_ent(cache_ent); Err bitreich.org 70 i- cache_ent->dirty = 1; Err bitreich.org 70 i+ /* Store block */ Err bitreich.org 70 i+ append_blk(buf, n); Err bitreich.org 70 i Err bitreich.org 70 i- ent->blks[ent->nblks++] = blkidx; Err bitreich.org 70 i- append_blk(&blk); Err bitreich.org 70 i+ /* Create a cache entry for this block */ Err bitreich.org 70 i+ cent = alloc_cent(); Err bitreich.org 70 i+ cent->bdescr = bdescr; Err bitreich.org 70 i+ add_cent(cent); Err bitreich.org 70 i } else { Err bitreich.org 70 i- ent->blks[ent->nblks++] = blkidx; Err bitreich.org 70 i+ /* Found block with the same hash, update index entry */ Err bitreich.org 70 i+ ent->bdescr[ent->nblks++] = bdescr; Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i if (ent->nblks > 0) { Err bitreich.org 70 i /* Calculate hash and add this entry to the index */ Err bitreich.org 70 i- sha256_finish(&ctx, ent->md); Err bitreich.org 70 i+ SHA256_Final(ent->md, &ctx); Err bitreich.org 70 i append_ent(ent); Err bitreich.org 70 i } Err bitreich.org 70 i+ Err bitreich.org 70 i free(ent); Err bitreich.org 70 i+ free(buf); Err bitreich.org 70 i+} Err bitreich.org 70 i Err bitreich.org 70 i- flush_cache(); Err bitreich.org 70 i+int Err bitreich.org 70 i+extract(struct ent *ent, void *arg) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ uint8_t *buf; Err bitreich.org 70 i+ struct extract_args *args = arg; Err bitreich.org 70 i+ uint64_t i; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (memcmp(ent->md, args->md, sizeof(ent->md)) != 0) Err bitreich.org 70 i+ return WALK_CONTINUE; Err bitreich.org 70 i+ Err bitreich.org 70 i+ buf = alloc_buf(BLKSIZ); Err bitreich.org 70 i+ for (i = 0; i < ent->nblks; i++) { Err bitreich.org 70 i+ read_blk(buf, &ent->bdescr[i]); Err bitreich.org 70 i+ xwrite(args->fd, buf, ent->bdescr[i].size); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ free(buf); Err bitreich.org 70 i+ return WALK_STOP; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-void Err bitreich.org 70 i-check(void) Err bitreich.org 70 i+int Err bitreich.org 70 i+check(struct ent *ent, void *arg) Err bitreich.org 70 i { Err bitreich.org 70 i- uint64_t nblks, i, j; Err bitreich.org 70 i+ uint8_t md[MDSIZ]; Err bitreich.org 70 i+ uint8_t *buf; Err bitreich.org 70 i+ SHA256_CTX ctx; Err bitreich.org 70 i+ uint64_t i; Err bitreich.org 70 i Err bitreich.org 70 i- nblks = storefile_nblks(); Err bitreich.org 70 i- lseek(ifd, sizeof(enthdr), SEEK_SET); Err bitreich.org 70 i- for (i = 0; i < enthdr.nents; i++) { Err bitreich.org 70 i- uint8_t md[32]; Err bitreich.org 70 i- sha256_context ctx; Err bitreich.org 70 i- struct ent *ent; Err bitreich.org 70 i+ buf = alloc_buf(BLKSIZ); Err bitreich.org 70 i+ /* Err bitreich.org 70 i+ * Calculate hash for each block and compare Err bitreich.org 70 i+ * with index entry block descriptor Err bitreich.org 70 i+ */ Err bitreich.org 70 i+ for (i = 0; i < ent->nblks; i++) { Err bitreich.org 70 i+ read_blk(buf, &ent->bdescr[i]); Err bitreich.org 70 i Err bitreich.org 70 i- ent = alloc_ent(); Err bitreich.org 70 i- if (xread(ifd, ent, sizeof(*ent)) == 0) Err bitreich.org 70 i- errx(1, "unexpected EOF"); Err bitreich.org 70 i- ent = grow_ent(ent, ent->nblks); Err bitreich.org 70 i- if (xread(ifd, ent->blks, Err bitreich.org 70 i- ent->nblks * sizeof(ent->blks[0])) == 0) Err bitreich.org 70 i- errx(1, "unexpected EOF"); Err bitreich.org 70 i- Err bitreich.org 70 i- sha256_starts(&ctx); Err bitreich.org 70 i- for (j = 0; j < ent->nblks; j++) { Err bitreich.org 70 i- struct blk blk; Err bitreich.org 70 i- Err bitreich.org 70 i- if (ent->blks[j] > nblks) Err bitreich.org 70 i- errx(1, "index is corrupted"); Err bitreich.org 70 i- read_blk(&blk, ent->blks[j]); Err bitreich.org 70 i- sha256_update(&ctx, blk.data, blk.size); Err bitreich.org 70 i- } Err bitreich.org 70 i- sha256_finish(&ctx, md); Err bitreich.org 70 i+ SHA256_Init(&ctx); Err bitreich.org 70 i+ SHA256_Update(&ctx, buf, ent->bdescr[i].size); Err bitreich.org 70 i+ SHA256_Final(md, &ctx); Err bitreich.org 70 i Err bitreich.org 70 i- if (memcmp(ent->md, md, sizeof(ent->md)) != 0) Err bitreich.org 70 i- errx(1, "hash mismatch"); Err bitreich.org 70 i+ if (memcmp(ent->bdescr[i].md, md, Err bitreich.org 70 i+ sizeof(ent->bdescr[i]).md) == 0) Err bitreich.org 70 i+ continue; Err bitreich.org 70 i Err bitreich.org 70 i- free(ent); Err bitreich.org 70 i+ fprintf(stderr, "Block hash mismatch\n"); Err bitreich.org 70 i+ fprintf(stderr, " Expected hash: "); Err bitreich.org 70 i+ print_md(ent->md, sizeof(ent->md)); Err bitreich.org 70 i+ fputc('\n', stderr); Err bitreich.org 70 i+ fprintf(stderr, " Actual hash: "); Err bitreich.org 70 i+ print_md(md, sizeof(md)); Err bitreich.org 70 i+ fputc('\n', stderr); Err bitreich.org 70 i+ fprintf(stderr, " Offset: %llu\n", Err bitreich.org 70 i+ (unsigned long long)ent->bdescr[i].offset); Err bitreich.org 70 i+ fprintf(stderr, " Size: %llu\n", Err bitreich.org 70 i+ (unsigned long long)ent->bdescr[i].size); Err bitreich.org 70 i } Err bitreich.org 70 i+ free(buf); Err bitreich.org 70 i+ return WALK_CONTINUE; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-void Err bitreich.org 70 i-list(void) Err bitreich.org 70 i+int Err bitreich.org 70 i+list(struct ent *ent, void *arg) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ print_md(ent->md, sizeof(ent->md)); Err bitreich.org 70 i+ putchar('\n'); Err bitreich.org 70 i+ return WALK_CONTINUE; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+rebuild_cache(struct ent *ent, void *arg) Err bitreich.org 70 i { Err bitreich.org 70 i+ uint8_t md[MDSIZ]; Err bitreich.org 70 i+ uint8_t *buf; Err bitreich.org 70 i+ SHA256_CTX ctx; Err bitreich.org 70 i uint64_t i; Err bitreich.org 70 i Err bitreich.org 70 i- lseek(ifd, sizeof(enthdr), SEEK_SET); Err bitreich.org 70 i- for (i = 0; i < enthdr.nents; i++) { Err bitreich.org 70 i- struct ent ent; Err bitreich.org 70 i- size_t i; Err bitreich.org 70 i- Err bitreich.org 70 i- if (xread(ifd, &ent, sizeof(ent)) == 0) Err bitreich.org 70 i- errx(1, "unexpected EOF"); Err bitreich.org 70 i- Err bitreich.org 70 i- for (i = 0; i < sizeof(ent.md); i++) Err bitreich.org 70 i- printf("%02x", ent.md[i]); Err bitreich.org 70 i- if (verbose) Err bitreich.org 70 i- printf(" %llu", (unsigned long long)ent.nblks * BLKSIZ); Err bitreich.org 70 i- putchar('\n'); Err bitreich.org 70 i- lseek(ifd, ent.nblks * sizeof(ent.blks[0]), SEEK_CUR); Err bitreich.org 70 i+ buf = alloc_buf(BLKSIZ); Err bitreich.org 70 i+ for (i = 0; i < ent->nblks; i++) { Err bitreich.org 70 i+ struct cent *cent; Err bitreich.org 70 i+ Err bitreich.org 70 i+ read_blk(buf, &ent->bdescr[i]); Err bitreich.org 70 i+ Err bitreich.org 70 i+ SHA256_Init(&ctx); Err bitreich.org 70 i+ SHA256_Update(&ctx, buf, ent->bdescr[i].size); Err bitreich.org 70 i+ SHA256_Final(md, &ctx); Err bitreich.org 70 i+ Err bitreich.org 70 i+ cent = alloc_cent(); Err bitreich.org 70 i+ memcpy(cent->bdescr.md, md, sizeof(cent->bdescr.md)); Err bitreich.org 70 i+ cent->bdescr = ent->bdescr[i]; Err bitreich.org 70 i+ add_cent(cent); Err bitreich.org 70 i } Err bitreich.org 70 i+ free(buf); Err bitreich.org 70 i+ return WALK_CONTINUE; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+/* Walk through all index entries and call fn() on each one */ Err bitreich.org 70 i void Err bitreich.org 70 i-rebuild_cache(void) Err bitreich.org 70 i+walk(int (*fn)(struct ent *, void *), void *arg) Err bitreich.org 70 i { Err bitreich.org 70 i- uint64_t nblks, i; Err bitreich.org 70 i+ struct ent *ent; Err bitreich.org 70 i+ uint64_t i; Err bitreich.org 70 i Err bitreich.org 70 i- if (verbose) Err bitreich.org 70 i- fprintf(stderr, "rebuilding cache..."); Err bitreich.org 70 i- nblks = storefile_nblks(); Err bitreich.org 70 i- lseek(cfd, 0, SEEK_SET); Err bitreich.org 70 i- for (i = 0; i < nblks; i++) { Err bitreich.org 70 i- struct cache_ent *ent; Err bitreich.org 70 i- struct blk blk; Err bitreich.org 70 i- Err bitreich.org 70 i- read_blk(&blk, i); Err bitreich.org 70 i- ent = alloc_cache_ent(blk.md, i); Err bitreich.org 70 i- add_cache_ent(ent); Err bitreich.org 70 i- ent->dirty = 1; Err bitreich.org 70 i+ lseek(ifd, sizeof(enthdr), SEEK_SET); Err bitreich.org 70 i+ for (i = 0; i < enthdr.nents; i++) { Err bitreich.org 70 i+ ent = alloc_ent(); Err bitreich.org 70 i+ if (xread(ifd, ent, sizeof(*ent)) == 0) Err bitreich.org 70 i+ errx(1, "read: unexpected EOF"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ ent = grow_ent(ent, ent->nblks); Err bitreich.org 70 i+ if (xread(ifd, ent->bdescr, Err bitreich.org 70 i+ ent->nblks * sizeof(ent->bdescr[0])) == 0) Err bitreich.org 70 i+ errx(1, "read: unexpected EOF"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if ((*fn)(ent, arg) == WALK_STOP) Err bitreich.org 70 i+ break; Err bitreich.org 70 i } Err bitreich.org 70 i- flush_cache(); Err bitreich.org 70 i- if (verbose) Err bitreich.org 70 i- fprintf(stderr, "done\n"); Err bitreich.org 70 i+ free(ent); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i init_cache(void) Err bitreich.org 70 i { Err bitreich.org 70 i- uint64_t nblks, i; Err bitreich.org 70 i+ uint64_t nents, i; Err bitreich.org 70 i Err bitreich.org 70 i- if (verbose) Err bitreich.org 70 i- fprintf(stderr, "initializing cache..."); Err bitreich.org 70 i- nblks = cachefile_nblks(); Err bitreich.org 70 i+ nents = cache_nents(); Err bitreich.org 70 i lseek(cfd, 0, SEEK_SET); Err bitreich.org 70 i- for (i = 0; i < nblks; i++) { Err bitreich.org 70 i- struct blk blk; Err bitreich.org 70 i- struct cache_ent *ent; Err bitreich.org 70 i- Err bitreich.org 70 i- ent = alloc_cache_ent(blk.md, i); Err bitreich.org 70 i- if (xread(cfd, &ent->data, sizeof(ent->data)) == 0) Err bitreich.org 70 i- errx(1, "unexpected EOF"); Err bitreich.org 70 i- add_cache_ent(ent); Err bitreich.org 70 i+ for (i = 0; i < nents; i++) { Err bitreich.org 70 i+ struct cent *cent; Err bitreich.org 70 i+ Err bitreich.org 70 i+ cent = alloc_cent(); Err bitreich.org 70 i+ if (xread(cfd, ¢->bdescr, sizeof(cent->bdescr)) == 0) Err bitreich.org 70 i+ errx(1, "read: unexpected EOF"); Err bitreich.org 70 i+ add_cent(cent); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (verbose) { Err bitreich.org 70 i+ fprintf(stderr, "bdescr.offset: %llu bdescr.size: %llu\n", Err bitreich.org 70 i+ (unsigned long long)cent->bdescr.offset, Err bitreich.org 70 i+ (unsigned long long)cent->bdescr.size); Err bitreich.org 70 i+ } Err bitreich.org 70 i } Err bitreich.org 70 i- if (verbose) Err bitreich.org 70 i- fprintf(stderr, "done\n"); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i@@ -530,15 +583,16 @@ init(void) Err bitreich.org 70 i if (sb.st_size != 0) Err bitreich.org 70 i xread(ifd, &enthdr, sizeof(enthdr)); Err bitreich.org 70 i Err bitreich.org 70 i- if (cachefile_nblks() != storefile_nblks()) Err bitreich.org 70 i- rebuild_cache(); Err bitreich.org 70 i- else Err bitreich.org 70 i+ if (cache_nents() != 0) Err bitreich.org 70 i init_cache(); Err bitreich.org 70 i+ else Err bitreich.org 70 i+ walk(rebuild_cache, NULL); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i term(void) Err bitreich.org 70 i { Err bitreich.org 70 i+ flush_cache(); Err bitreich.org 70 i free_cache(); Err bitreich.org 70 i Err bitreich.org 70 i fsync(ifd); Err bitreich.org 70 i@@ -560,6 +614,7 @@ usage(void) Err bitreich.org 70 i int Err bitreich.org 70 i main(int argc, char *argv[]) Err bitreich.org 70 i { Err bitreich.org 70 i+ uint8_t md[MDSIZ]; Err bitreich.org 70 i char *id = NULL, *root = NULL; Err bitreich.org 70 i int fd = -1, lflag = 0, cflag = 0; Err bitreich.org 70 i Err bitreich.org 70 i@@ -611,19 +666,20 @@ main(int argc, char *argv[]) Err bitreich.org 70 i init(); Err bitreich.org 70 i Err bitreich.org 70 i if (cflag) { Err bitreich.org 70 i- check(); Err bitreich.org 70 i+ walk(check, NULL); Err bitreich.org 70 i term(); Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i if (lflag) { Err bitreich.org 70 i- list(); Err bitreich.org 70 i+ walk(list, NULL); Err bitreich.org 70 i term(); Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i if (id) { Err bitreich.org 70 i- extract(id, fd); Err bitreich.org 70 i+ str2bin(id, md); Err bitreich.org 70 i+ walk(extract, &(struct extract_args){ .md = md, .fd = fd }); Err bitreich.org 70 i } else { Err bitreich.org 70 i dedup(fd); Err bitreich.org 70 i } Err bitreich.org 70 1diff --git a/sha256.c b/sha256.c /scm/dedup/file/sha256.c.gph bitreich.org 70 i@@ -1,261 +0,0 @@ Err bitreich.org 70 i-/* Err bitreich.org 70 i- * FIPS-180-2 compliant SHA-256 implementation Err bitreich.org 70 i- * Err bitreich.org 70 i- * Copyright (C) 2001-2003 Christophe Devine Err bitreich.org 70 i- * Err bitreich.org 70 i- * This program is free software; you can redistribute it and/or modify Err bitreich.org 70 i- * it under the terms of the GNU General Public License as published by Err bitreich.org 70 i- * the Free Software Foundation; either version 2 of the License, or Err bitreich.org 70 i- * (at your option) any later version. Err bitreich.org 70 i- * Err bitreich.org 70 i- * This program is distributed in the hope that it will be useful, Err bitreich.org 70 i- * but WITHOUT ANY WARRANTY; without even the implied warranty of Err bitreich.org 70 i- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Err bitreich.org 70 i- * GNU General Public License for more details. Err bitreich.org 70 i- * Err bitreich.org 70 i- * You should have received a copy of the GNU General Public License Err bitreich.org 70 i- * along with this program; if not, write to the Free Software Err bitreich.org 70 i- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Err bitreich.org 70 i- */ Err bitreich.org 70 i- Err bitreich.org 70 i-#include Err bitreich.org 70 i- Err bitreich.org 70 i-#include "sha256.h" Err bitreich.org 70 i- Err bitreich.org 70 i-#define GET_UINT32(n,b,i) \ Err bitreich.org 70 i-{ \ Err bitreich.org 70 i- (n) = ( (uint32) (b)[(i) ] << 24 ) \ Err bitreich.org 70 i- | ( (uint32) (b)[(i) + 1] << 16 ) \ Err bitreich.org 70 i- | ( (uint32) (b)[(i) + 2] << 8 ) \ Err bitreich.org 70 i- | ( (uint32) (b)[(i) + 3] ); \ Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-#define PUT_UINT32(n,b,i) \ Err bitreich.org 70 i-{ \ Err bitreich.org 70 i- (b)[(i) ] = (uint8) ( (n) >> 24 ); \ Err bitreich.org 70 i- (b)[(i) + 1] = (uint8) ( (n) >> 16 ); \ Err bitreich.org 70 i- (b)[(i) + 2] = (uint8) ( (n) >> 8 ); \ Err bitreich.org 70 i- (b)[(i) + 3] = (uint8) ( (n) ); \ Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-void sha256_starts( sha256_context *ctx ) Err bitreich.org 70 i-{ Err bitreich.org 70 i- ctx->total[0] = 0; Err bitreich.org 70 i- ctx->total[1] = 0; Err bitreich.org 70 i- Err bitreich.org 70 i- ctx->state[0] = 0x6A09E667; Err bitreich.org 70 i- ctx->state[1] = 0xBB67AE85; Err bitreich.org 70 i- ctx->state[2] = 0x3C6EF372; Err bitreich.org 70 i- ctx->state[3] = 0xA54FF53A; Err bitreich.org 70 i- ctx->state[4] = 0x510E527F; Err bitreich.org 70 i- ctx->state[5] = 0x9B05688C; Err bitreich.org 70 i- ctx->state[6] = 0x1F83D9AB; Err bitreich.org 70 i- ctx->state[7] = 0x5BE0CD19; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-void sha256_process( sha256_context *ctx, uint8 data[64] ) Err bitreich.org 70 i-{ Err bitreich.org 70 i- uint32 temp1, temp2, W[64]; Err bitreich.org 70 i- uint32 A, B, C, D, E, F, G, H; Err bitreich.org 70 i- Err bitreich.org 70 i- GET_UINT32( W[0], data, 0 ); Err bitreich.org 70 i- GET_UINT32( W[1], data, 4 ); Err bitreich.org 70 i- GET_UINT32( W[2], data, 8 ); Err bitreich.org 70 i- GET_UINT32( W[3], data, 12 ); Err bitreich.org 70 i- GET_UINT32( W[4], data, 16 ); Err bitreich.org 70 i- GET_UINT32( W[5], data, 20 ); Err bitreich.org 70 i- GET_UINT32( W[6], data, 24 ); Err bitreich.org 70 i- GET_UINT32( W[7], data, 28 ); Err bitreich.org 70 i- GET_UINT32( W[8], data, 32 ); Err bitreich.org 70 i- GET_UINT32( W[9], data, 36 ); Err bitreich.org 70 i- GET_UINT32( W[10], data, 40 ); Err bitreich.org 70 i- GET_UINT32( W[11], data, 44 ); Err bitreich.org 70 i- GET_UINT32( W[12], data, 48 ); Err bitreich.org 70 i- GET_UINT32( W[13], data, 52 ); Err bitreich.org 70 i- GET_UINT32( W[14], data, 56 ); Err bitreich.org 70 i- GET_UINT32( W[15], data, 60 ); Err bitreich.org 70 i- Err bitreich.org 70 i-#define SHR(x,n) ((x & 0xFFFFFFFF) >> n) Err bitreich.org 70 i-#define ROTR(x,n) (SHR(x,n) | (x << (32 - n))) Err bitreich.org 70 i- Err bitreich.org 70 i-#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3)) Err bitreich.org 70 i-#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10)) Err bitreich.org 70 i- Err bitreich.org 70 i-#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22)) Err bitreich.org 70 i-#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25)) Err bitreich.org 70 i- Err bitreich.org 70 i-#define F0(x,y,z) ((x & y) | (z & (x | y))) Err bitreich.org 70 i-#define F1(x,y,z) (z ^ (x & (y ^ z))) Err bitreich.org 70 i- Err bitreich.org 70 i-#define R(t) \ Err bitreich.org 70 i-( \ Err bitreich.org 70 i- W[t] = S1(W[t - 2]) + W[t - 7] + \ Err bitreich.org 70 i- S0(W[t - 15]) + W[t - 16] \ Err bitreich.org 70 i-) Err bitreich.org 70 i- Err bitreich.org 70 i-#define P(a,b,c,d,e,f,g,h,x,K) \ Err bitreich.org 70 i-{ \ Err bitreich.org 70 i- temp1 = h + S3(e) + F1(e,f,g) + K + x; \ Err bitreich.org 70 i- temp2 = S2(a) + F0(a,b,c); \ Err bitreich.org 70 i- d += temp1; h = temp1 + temp2; \ Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i- A = ctx->state[0]; Err bitreich.org 70 i- B = ctx->state[1]; Err bitreich.org 70 i- C = ctx->state[2]; Err bitreich.org 70 i- D = ctx->state[3]; Err bitreich.org 70 i- E = ctx->state[4]; Err bitreich.org 70 i- F = ctx->state[5]; Err bitreich.org 70 i- G = ctx->state[6]; Err bitreich.org 70 i- H = ctx->state[7]; Err bitreich.org 70 i- Err bitreich.org 70 i- P( A, B, C, D, E, F, G, H, W[ 0], 0x428A2F98 ); Err bitreich.org 70 i- P( H, A, B, C, D, E, F, G, W[ 1], 0x71374491 ); Err bitreich.org 70 i- P( G, H, A, B, C, D, E, F, W[ 2], 0xB5C0FBCF ); Err bitreich.org 70 i- P( F, G, H, A, B, C, D, E, W[ 3], 0xE9B5DBA5 ); Err bitreich.org 70 i- P( E, F, G, H, A, B, C, D, W[ 4], 0x3956C25B ); Err bitreich.org 70 i- P( D, E, F, G, H, A, B, C, W[ 5], 0x59F111F1 ); Err bitreich.org 70 i- P( C, D, E, F, G, H, A, B, W[ 6], 0x923F82A4 ); Err bitreich.org 70 i- P( B, C, D, E, F, G, H, A, W[ 7], 0xAB1C5ED5 ); Err bitreich.org 70 i- P( A, B, C, D, E, F, G, H, W[ 8], 0xD807AA98 ); Err bitreich.org 70 i- P( H, A, B, C, D, E, F, G, W[ 9], 0x12835B01 ); Err bitreich.org 70 i- P( G, H, A, B, C, D, E, F, W[10], 0x243185BE ); Err bitreich.org 70 i- P( F, G, H, A, B, C, D, E, W[11], 0x550C7DC3 ); Err bitreich.org 70 i- P( E, F, G, H, A, B, C, D, W[12], 0x72BE5D74 ); Err bitreich.org 70 i- P( D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE ); Err bitreich.org 70 i- P( C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7 ); Err bitreich.org 70 i- P( B, C, D, E, F, G, H, A, W[15], 0xC19BF174 ); Err bitreich.org 70 i- P( A, B, C, D, E, F, G, H, R(16), 0xE49B69C1 ); Err bitreich.org 70 i- P( H, A, B, C, D, E, F, G, R(17), 0xEFBE4786 ); Err bitreich.org 70 i- P( G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6 ); Err bitreich.org 70 i- P( F, G, H, A, B, C, D, E, R(19), 0x240CA1CC ); Err bitreich.org 70 i- P( E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F ); Err bitreich.org 70 i- P( D, E, F, G, H, A, B, C, R(21), 0x4A7484AA ); Err bitreich.org 70 i- P( C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC ); Err bitreich.org 70 i- P( B, C, D, E, F, G, H, A, R(23), 0x76F988DA ); Err bitreich.org 70 i- P( A, B, C, D, E, F, G, H, R(24), 0x983E5152 ); Err bitreich.org 70 i- P( H, A, B, C, D, E, F, G, R(25), 0xA831C66D ); Err bitreich.org 70 i- P( G, H, A, B, C, D, E, F, R(26), 0xB00327C8 ); Err bitreich.org 70 i- P( F, G, H, A, B, C, D, E, R(27), 0xBF597FC7 ); Err bitreich.org 70 i- P( E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3 ); Err bitreich.org 70 i- P( D, E, F, G, H, A, B, C, R(29), 0xD5A79147 ); Err bitreich.org 70 i- P( C, D, E, F, G, H, A, B, R(30), 0x06CA6351 ); Err bitreich.org 70 i- P( B, C, D, E, F, G, H, A, R(31), 0x14292967 ); Err bitreich.org 70 i- P( A, B, C, D, E, F, G, H, R(32), 0x27B70A85 ); Err bitreich.org 70 i- P( H, A, B, C, D, E, F, G, R(33), 0x2E1B2138 ); Err bitreich.org 70 i- P( G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC ); Err bitreich.org 70 i- P( F, G, H, A, B, C, D, E, R(35), 0x53380D13 ); Err bitreich.org 70 i- P( E, F, G, H, A, B, C, D, R(36), 0x650A7354 ); Err bitreich.org 70 i- P( D, E, F, G, H, A, B, C, R(37), 0x766A0ABB ); Err bitreich.org 70 i- P( C, D, E, F, G, H, A, B, R(38), 0x81C2C92E ); Err bitreich.org 70 i- P( B, C, D, E, F, G, H, A, R(39), 0x92722C85 ); Err bitreich.org 70 i- P( A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1 ); Err bitreich.org 70 i- P( H, A, B, C, D, E, F, G, R(41), 0xA81A664B ); Err bitreich.org 70 i- P( G, H, A, B, C, D, E, F, R(42), 0xC24B8B70 ); Err bitreich.org 70 i- P( F, G, H, A, B, C, D, E, R(43), 0xC76C51A3 ); Err bitreich.org 70 i- P( E, F, G, H, A, B, C, D, R(44), 0xD192E819 ); Err bitreich.org 70 i- P( D, E, F, G, H, A, B, C, R(45), 0xD6990624 ); Err bitreich.org 70 i- P( C, D, E, F, G, H, A, B, R(46), 0xF40E3585 ); Err bitreich.org 70 i- P( B, C, D, E, F, G, H, A, R(47), 0x106AA070 ); Err bitreich.org 70 i- P( A, B, C, D, E, F, G, H, R(48), 0x19A4C116 ); Err bitreich.org 70 i- P( H, A, B, C, D, E, F, G, R(49), 0x1E376C08 ); Err bitreich.org 70 i- P( G, H, A, B, C, D, E, F, R(50), 0x2748774C ); Err bitreich.org 70 i- P( F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5 ); Err bitreich.org 70 i- P( E, F, G, H, A, B, C, D, R(52), 0x391C0CB3 ); Err bitreich.org 70 i- P( D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A ); Err bitreich.org 70 i- P( C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F ); Err bitreich.org 70 i- P( B, C, D, E, F, G, H, A, R(55), 0x682E6FF3 ); Err bitreich.org 70 i- P( A, B, C, D, E, F, G, H, R(56), 0x748F82EE ); Err bitreich.org 70 i- P( H, A, B, C, D, E, F, G, R(57), 0x78A5636F ); Err bitreich.org 70 i- P( G, H, A, B, C, D, E, F, R(58), 0x84C87814 ); Err bitreich.org 70 i- P( F, G, H, A, B, C, D, E, R(59), 0x8CC70208 ); Err bitreich.org 70 i- P( E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA ); Err bitreich.org 70 i- P( D, E, F, G, H, A, B, C, R(61), 0xA4506CEB ); Err bitreich.org 70 i- P( C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7 ); Err bitreich.org 70 i- P( B, C, D, E, F, G, H, A, R(63), 0xC67178F2 ); Err bitreich.org 70 i- Err bitreich.org 70 i- ctx->state[0] += A; Err bitreich.org 70 i- ctx->state[1] += B; Err bitreich.org 70 i- ctx->state[2] += C; Err bitreich.org 70 i- ctx->state[3] += D; Err bitreich.org 70 i- ctx->state[4] += E; Err bitreich.org 70 i- ctx->state[5] += F; Err bitreich.org 70 i- ctx->state[6] += G; Err bitreich.org 70 i- ctx->state[7] += H; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-void sha256_update( sha256_context *ctx, uint8 *input, uint32 length ) Err bitreich.org 70 i-{ Err bitreich.org 70 i- uint32 left, fill; Err bitreich.org 70 i- Err bitreich.org 70 i- if( ! length ) return; Err bitreich.org 70 i- Err bitreich.org 70 i- left = ctx->total[0] & 0x3F; Err bitreich.org 70 i- fill = 64 - left; Err bitreich.org 70 i- Err bitreich.org 70 i- ctx->total[0] += length; Err bitreich.org 70 i- ctx->total[0] &= 0xFFFFFFFF; Err bitreich.org 70 i- Err bitreich.org 70 i- if( ctx->total[0] < length ) Err bitreich.org 70 i- ctx->total[1]++; Err bitreich.org 70 i- Err bitreich.org 70 i- if( left && length >= fill ) Err bitreich.org 70 i- { Err bitreich.org 70 i- memcpy( (void *) (ctx->buffer + left), Err bitreich.org 70 i- (void *) input, fill ); Err bitreich.org 70 i- sha256_process( ctx, ctx->buffer ); Err bitreich.org 70 i- length -= fill; Err bitreich.org 70 i- input += fill; Err bitreich.org 70 i- left = 0; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- while( length >= 64 ) Err bitreich.org 70 i- { Err bitreich.org 70 i- sha256_process( ctx, input ); Err bitreich.org 70 i- length -= 64; Err bitreich.org 70 i- input += 64; Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- if( length ) Err bitreich.org 70 i- { Err bitreich.org 70 i- memcpy( (void *) (ctx->buffer + left), Err bitreich.org 70 i- (void *) input, length ); Err bitreich.org 70 i- } Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static uint8 sha256_padding[64] = Err bitreich.org 70 i-{ Err bitreich.org 70 i- 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Err bitreich.org 70 i- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Err bitreich.org 70 i- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Err bitreich.org 70 i- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 Err bitreich.org 70 i-}; Err bitreich.org 70 i- Err bitreich.org 70 i-void sha256_finish( sha256_context *ctx, uint8 digest[32] ) Err bitreich.org 70 i-{ Err bitreich.org 70 i- uint32 last, padn; Err bitreich.org 70 i- uint32 high, low; Err bitreich.org 70 i- uint8 msglen[8]; Err bitreich.org 70 i- Err bitreich.org 70 i- high = ( ctx->total[0] >> 29 ) Err bitreich.org 70 i- | ( ctx->total[1] << 3 ); Err bitreich.org 70 i- low = ( ctx->total[0] << 3 ); Err bitreich.org 70 i- Err bitreich.org 70 i- PUT_UINT32( high, msglen, 0 ); Err bitreich.org 70 i- PUT_UINT32( low, msglen, 4 ); Err bitreich.org 70 i- Err bitreich.org 70 i- last = ctx->total[0] & 0x3F; Err bitreich.org 70 i- padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last ); Err bitreich.org 70 i- Err bitreich.org 70 i- sha256_update( ctx, sha256_padding, padn ); Err bitreich.org 70 i- sha256_update( ctx, msglen, 8 ); Err bitreich.org 70 i- Err bitreich.org 70 i- PUT_UINT32( ctx->state[0], digest, 0 ); Err bitreich.org 70 i- PUT_UINT32( ctx->state[1], digest, 4 ); Err bitreich.org 70 i- PUT_UINT32( ctx->state[2], digest, 8 ); Err bitreich.org 70 i- PUT_UINT32( ctx->state[3], digest, 12 ); Err bitreich.org 70 i- PUT_UINT32( ctx->state[4], digest, 16 ); Err bitreich.org 70 i- PUT_UINT32( ctx->state[5], digest, 20 ); Err bitreich.org 70 i- PUT_UINT32( ctx->state[6], digest, 24 ); Err bitreich.org 70 i- PUT_UINT32( ctx->state[7], digest, 28 ); Err bitreich.org 70 i-} Err bitreich.org 70 1diff --git a/sha256.h b/sha256.h /scm/dedup/file/sha256.h.gph bitreich.org 70 i@@ -1,24 +0,0 @@ Err bitreich.org 70 i-#ifndef _SHA256_H Err bitreich.org 70 i-#define _SHA256_H Err bitreich.org 70 i- Err bitreich.org 70 i-#ifndef uint8 Err bitreich.org 70 i-#define uint8 unsigned char Err bitreich.org 70 i-#endif Err bitreich.org 70 i- Err bitreich.org 70 i-#ifndef uint32 Err bitreich.org 70 i-#define uint32 unsigned long int Err bitreich.org 70 i-#endif Err bitreich.org 70 i- Err bitreich.org 70 i-typedef struct Err bitreich.org 70 i-{ Err bitreich.org 70 i- uint32 total[2]; Err bitreich.org 70 i- uint32 state[8]; Err bitreich.org 70 i- uint8 buffer[64]; Err bitreich.org 70 i-} Err bitreich.org 70 i-sha256_context; Err bitreich.org 70 i- Err bitreich.org 70 i-void sha256_starts( sha256_context *ctx ); Err bitreich.org 70 i-void sha256_update( sha256_context *ctx, uint8 *input, uint32 length ); Err bitreich.org 70 i-void sha256_finish( sha256_context *ctx, uint8 digest[32] ); Err bitreich.org 70 i- Err bitreich.org 70 i-#endif /* sha256.h */ Err bitreich.org 70 .