URI: 
       thash.c - dedup - data deduplication program
  HTML git clone git://bitreich.org/dedup/ git://hg6vgqziawt5s4dj.onion/dedup/
   DIR Log
   DIR Files
   DIR Refs
   DIR Tags
   DIR README
   DIR LICENSE
       ---
       thash.c (1587B)
       ---
            1 #include <sys/types.h>
            2 
            3 #include <stdint.h>
            4 #include <stdio.h>
            5 #include <stdlib.h>
            6 #include <string.h>
            7 #include <strings.h>
            8 
            9 #include "blake2.h"
           10 #include "dedup.h"
           11 
           12 static struct hash_ops {
           13         int (*init)(struct hash_ctx *ctx, size_t n);
           14         int (*update)(struct hash_ctx *ctx, const void *buf, size_t n);
           15         int (*final)(struct hash_ctx *ctx, void *buf, size_t n);
           16 } hashes[NR_HASHES] = {
           17         {
           18                 .init = blake2bi,
           19                 .update = blake2bu,
           20                 .final = blake2bf,
           21         },
           22         {
           23                 .init = blake2bpi,
           24                 .update = blake2bpu,
           25                 .final = blake2bpf,
           26         },
           27         {
           28                 .init = blake2si,
           29                 .update = blake2su,
           30                 .final = blake2sf,
           31         },
           32         {
           33                 .init = blake2spi,
           34                 .update = blake2spu,
           35                 .final = blake2spf,
           36         },
           37 };
           38 
           39 static char *algomap[NR_HASHES] = {
           40         [HASH_BLAKE2B] = "blake2b",
           41         [HASH_BLAKE2BP] = "blake2bp",
           42         [HASH_BLAKE2S] = "blake2s",
           43         [HASH_BLAKE2SP] = "blake2sp",
           44 };
           45 
           46 int
           47 hash_init(struct hash_ctx *ctx, int type, size_t n)
           48 {
           49         if (type < 0 || type >= NR_HASHES)
           50                 return -1;
           51 
           52         ctx->ops = &hashes[type];
           53         return (*ctx->ops->init)(ctx, n);
           54 }
           55 
           56 int
           57 hash_update(struct hash_ctx *ctx, const void *buf, size_t n)
           58 {
           59         return (*ctx->ops->update)(ctx, buf, n);
           60 }
           61 
           62 int
           63 hash_final(struct hash_ctx *ctx, void *buf, size_t n)
           64 {
           65         return (*ctx->ops->final)(ctx, buf, n);
           66 }
           67 
           68 int
           69 hash_name2type(char *name)
           70 {
           71         size_t i;
           72 
           73         for (i = 0; i < NR_HASHES; i++)
           74                 if (strcasecmp(algomap[i], name) == 0)
           75                         return i;
           76         return -1;
           77 }
           78 
           79 char *
           80 hash_type2name(int type)
           81 {
           82         if (type < 0 || type >= NR_HASHES)
           83                 return NULL;
           84         return algomap[type];
           85 }
           86 
           87 void
           88 hash_list(int fd)
           89 {
           90         size_t i;
           91 
           92         for (i = 0; i < NR_HASHES; i++)
           93                 dprintf(fd, "%s\n", algomap[i]);
           94 }