Source file multihash_digestif.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
module Hasher = struct
  open Digestif

  let digest_cstruct hash f v = f v |> to_raw_string hash |> Cstruct.of_string

  type supported =
    [ `Blake2b_64
    | `Blake2s_64
    | `Sha1
    | `Sha2_256
    | `Sha2_512
    | `Sha3_224
    | `Sha3_256
    | `Sha3_384
    | `Sha3_512
    | `Ripemd_160
    | `Keccak_256 ]

  let is_supported = function #supported -> true | _ -> false

  let wrap (f : Cstruct.t iter) : bigstring iter =
   fun bs -> f (fun x -> bs (Cstruct.to_bigarray x))

  let make_iter (type v) (module H : Digestif.S with type t = v) (h : v hash)
      (lift : v -> v t) bs =
    H.digesti_bigstring (wrap bs) |> fun t ->
    Digestif.to_raw_string h (lift t) |> Cstruct.of_string |> fun v -> Ok v

  let make_iter_string (type v) (module H : Digestif.S with type t = v)
      (h : v hash) (lift : v -> v t) bs =
    H.digesti_string bs |> fun t ->
    Digestif.to_raw_string h (lift t) |> fun v -> Ok v

  let iter ident bs =
    match ident with
    | `Blake2b_64 -> make_iter (module BLAKE2B) blake2b of_blake2b bs
    | `Blake2s_64 -> make_iter (module BLAKE2S) blake2s of_blake2s bs
    | `Sha1 -> make_iter (module SHA1) sha1 of_sha1 bs
    | `Sha2_256 -> make_iter (module SHA256) sha256 of_sha256 bs
    | `Sha2_512 -> make_iter (module SHA512) sha512 of_sha512 bs
    | `Sha3_224 -> make_iter (module SHA3_224) sha3_224 of_sha3_224 bs
    | `Sha3_256 -> make_iter (module SHA3_256) sha3_256 of_sha3_256 bs
    | `Sha3_384 -> make_iter (module SHA3_384) sha3_384 of_sha3_384 bs
    | `Sha3_512 -> make_iter (module SHA3_512) sha3_512 of_sha3_512 bs
    | `Md5 -> make_iter (module MD5) md5 of_md5 bs
    | `Ripemd_160 -> make_iter (module RMD160) rmd160 of_rmd160 bs
    | `Keccak_256 -> make_iter (module KECCAK_256) keccak_256 of_keccak_256 bs
    | _ -> Error `Unsupported

  let iter_string ident bs =
    match ident with
    | `Blake2b_64 -> make_iter_string (module BLAKE2B) blake2b of_blake2b bs
    | `Blake2s_64 -> make_iter_string (module BLAKE2S) blake2s of_blake2s bs
    | `Sha1 -> make_iter_string (module SHA1) sha1 of_sha1 bs
    | `Sha2_256 -> make_iter_string (module SHA256) sha256 of_sha256 bs
    | `Sha2_512 -> make_iter_string (module SHA512) sha512 of_sha512 bs
    | `Sha3_224 -> make_iter_string (module SHA3_224) sha3_224 of_sha3_224 bs
    | `Sha3_256 -> make_iter_string (module SHA3_256) sha3_256 of_sha3_256 bs
    | `Sha3_384 -> make_iter_string (module SHA3_384) sha3_384 of_sha3_384 bs
    | `Sha3_512 -> make_iter_string (module SHA3_512) sha3_512 of_sha3_512 bs
    | `Md5 -> make_iter_string (module MD5) md5 of_md5 bs
    | `Ripemd_160 -> make_iter_string (module RMD160) rmd160 of_rmd160 bs
    | `Keccak_256 ->
        make_iter_string (module KECCAK_256) keccak_256 of_keccak_256 bs
    | _ -> Error `Unsupported

  let digest (ident : Multicodec.multihash) (v : Cstruct.t) =
    let v = Cstruct.to_bigarray v in
    match ident with
    | `Blake2b_64 -> Ok (digest_cstruct blake2b (digest_bigstring blake2b) v)
    | `Blake2s_64 -> Ok (digest_cstruct blake2s (digest_bigstring blake2s) v)
    | `Sha1 -> Ok (digest_cstruct sha1 (digest_bigstring sha1) v)
    | `Sha2_256 -> Ok (digest_cstruct sha256 (digest_bigstring sha256) v)
    | `Sha2_512 -> Ok (digest_cstruct sha512 (digest_bigstring sha512) v)
    | `Sha3_224 -> Ok (digest_cstruct sha3_224 (digest_bigstring sha3_224) v)
    | `Sha3_256 -> Ok (digest_cstruct sha3_256 (digest_bigstring sha3_256) v)
    | `Sha3_384 -> Ok (digest_cstruct sha3_384 (digest_bigstring sha3_384) v)
    | `Sha3_512 -> Ok (digest_cstruct sha3_512 (digest_bigstring sha3_512) v)
    | `Md5 -> Ok (digest_cstruct md5 (digest_bigstring md5) v)
    | `Ripemd_160 -> Ok (digest_cstruct rmd160 (digest_bigstring rmd160) v)
    | `Keccak_256 ->
        Ok (digest_cstruct keccak_256 (digest_bigstring keccak_256) v)
    | _ -> Error `Unsupported

  let digest_string (ident : Multicodec.multihash) (v : string) =
    match ident with
    | `Blake2b_64 -> Ok (to_raw_string blake2b (digest_string blake2b v))
    | `Blake2s_64 -> Ok (to_raw_string blake2s (digest_string blake2s v))
    | `Sha1 -> Ok (to_raw_string sha1 (digest_string sha1 v))
    | `Sha2_256 -> Ok (to_raw_string sha256 (digest_string sha256 v))
    | `Sha2_512 -> Ok (to_raw_string sha512 (digest_string sha512 v))
    | `Sha3_224 -> Ok (to_raw_string sha3_224 (digest_string sha3_224 v))
    | `Sha3_256 -> Ok (to_raw_string sha3_256 (digest_string sha3_256 v))
    | `Sha3_384 -> Ok (to_raw_string sha3_384 (digest_string sha3_384 v))
    | `Sha3_512 -> Ok (to_raw_string sha3_512 (digest_string sha3_512 v))
    | `Md5 -> Ok (to_raw_string md5 (digest_string md5 v))
    | `Ripemd_160 -> Ok (to_raw_string rmd160 (digest_string rmd160 v))
    | `Keccak_256 -> Ok (to_raw_string keccak_256 (digest_string keccak_256 v))
    | _ -> Error `Unsupported
end

include Multihash.Make (Hasher)