package checkseum

  1. Overview
  2. Docs

Source file gin_crc32c.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
(* Copyright (c) 2011, Jonathan Derque - MIT licensed *)
(* Copyright (c) 2016, Gabriel de Perthuis - MIT licensed *)

type t = Optint.t

let ( &&& ) = Optint.logand
let ( ^^^ ) = Optint.logxor
let ( >>> ) = Optint.shift_right_logical
let ffffffff = Optint.(succ (mul max_int (of_int 2)))
let ( ~~~ ) x = Optint.(logand (lognot x) ffffffff)

let crc_table =
  Array.map Optint.of_int32
    [| 0x00000000l; 0xf26b8303l; 0xe13b70f7l; 0x1350f3f4l; 0xc79a971fl
     ; 0x35f1141cl; 0x26a1e7e8l; 0xd4ca64ebl; 0x8ad958cfl; 0x78b2dbccl
     ; 0x6be22838l; 0x9989ab3bl; 0x4d43cfd0l; 0xbf284cd3l; 0xac78bf27l
     ; 0x5e133c24l; 0x105ec76fl; 0xe235446cl; 0xf165b798l; 0x030e349bl
     ; 0xd7c45070l; 0x25afd373l; 0x36ff2087l; 0xc494a384l; 0x9a879fa0l
     ; 0x68ec1ca3l; 0x7bbcef57l; 0x89d76c54l; 0x5d1d08bfl; 0xaf768bbcl
     ; 0xbc267848l; 0x4e4dfb4bl; 0x20bd8edel; 0xd2d60dddl; 0xc186fe29l
     ; 0x33ed7d2al; 0xe72719c1l; 0x154c9ac2l; 0x061c6936l; 0xf477ea35l
     ; 0xaa64d611l; 0x580f5512l; 0x4b5fa6e6l; 0xb93425e5l; 0x6dfe410el
     ; 0x9f95c20dl; 0x8cc531f9l; 0x7eaeb2fal; 0x30e349b1l; 0xc288cab2l
     ; 0xd1d83946l; 0x23b3ba45l; 0xf779deael; 0x05125dadl; 0x1642ae59l
     ; 0xe4292d5al; 0xba3a117el; 0x4851927dl; 0x5b016189l; 0xa96ae28al
     ; 0x7da08661l; 0x8fcb0562l; 0x9c9bf696l; 0x6ef07595l; 0x417b1dbcl
     ; 0xb3109ebfl; 0xa0406d4bl; 0x522bee48l; 0x86e18aa3l; 0x748a09a0l
     ; 0x67dafa54l; 0x95b17957l; 0xcba24573l; 0x39c9c670l; 0x2a993584l
     ; 0xd8f2b687l; 0x0c38d26cl; 0xfe53516fl; 0xed03a29bl; 0x1f682198l
     ; 0x5125dad3l; 0xa34e59d0l; 0xb01eaa24l; 0x42752927l; 0x96bf4dccl
     ; 0x64d4cecfl; 0x77843d3bl; 0x85efbe38l; 0xdbfc821cl; 0x2997011fl
     ; 0x3ac7f2ebl; 0xc8ac71e8l; 0x1c661503l; 0xee0d9600l; 0xfd5d65f4l
     ; 0x0f36e6f7l; 0x61c69362l; 0x93ad1061l; 0x80fde395l; 0x72966096l
     ; 0xa65c047dl; 0x5437877el; 0x4767748al; 0xb50cf789l; 0xeb1fcbadl
     ; 0x197448ael; 0x0a24bb5al; 0xf84f3859l; 0x2c855cb2l; 0xdeeedfb1l
     ; 0xcdbe2c45l; 0x3fd5af46l; 0x7198540dl; 0x83f3d70el; 0x90a324fal
     ; 0x62c8a7f9l; 0xb602c312l; 0x44694011l; 0x5739b3e5l; 0xa55230e6l
     ; 0xfb410cc2l; 0x092a8fc1l; 0x1a7a7c35l; 0xe811ff36l; 0x3cdb9bddl
     ; 0xceb018del; 0xdde0eb2al; 0x2f8b6829l; 0x82f63b78l; 0x709db87bl
     ; 0x63cd4b8fl; 0x91a6c88cl; 0x456cac67l; 0xb7072f64l; 0xa457dc90l
     ; 0x563c5f93l; 0x082f63b7l; 0xfa44e0b4l; 0xe9141340l; 0x1b7f9043l
     ; 0xcfb5f4a8l; 0x3dde77abl; 0x2e8e845fl; 0xdce5075cl; 0x92a8fc17l
     ; 0x60c37f14l; 0x73938ce0l; 0x81f80fe3l; 0x55326b08l; 0xa759e80bl
     ; 0xb4091bffl; 0x466298fcl; 0x1871a4d8l; 0xea1a27dbl; 0xf94ad42fl
     ; 0x0b21572cl; 0xdfeb33c7l; 0x2d80b0c4l; 0x3ed04330l; 0xccbbc033l
     ; 0xa24bb5a6l; 0x502036a5l; 0x4370c551l; 0xb11b4652l; 0x65d122b9l
     ; 0x97baa1bal; 0x84ea524el; 0x7681d14dl; 0x2892ed69l; 0xdaf96e6al
     ; 0xc9a99d9el; 0x3bc21e9dl; 0xef087a76l; 0x1d63f975l; 0x0e330a81l
     ; 0xfc588982l; 0xb21572c9l; 0x407ef1cal; 0x532e023el; 0xa145813dl
     ; 0x758fe5d6l; 0x87e466d5l; 0x94b49521l; 0x66df1622l; 0x38cc2a06l
     ; 0xcaa7a905l; 0xd9f75af1l; 0x2b9cd9f2l; 0xff56bd19l; 0x0d3d3e1al
     ; 0x1e6dcdeel; 0xec064eedl; 0xc38d26c4l; 0x31e6a5c7l; 0x22b65633l
     ; 0xd0ddd530l; 0x0417b1dbl; 0xf67c32d8l; 0xe52cc12cl; 0x1747422fl
     ; 0x49547e0bl; 0xbb3ffd08l; 0xa86f0efcl; 0x5a048dffl; 0x8ecee914l
     ; 0x7ca56a17l; 0x6ff599e3l; 0x9d9e1ae0l; 0xd3d3e1abl; 0x21b862a8l
     ; 0x32e8915cl; 0xc083125fl; 0x144976b4l; 0xe622f5b7l; 0xf5720643l
     ; 0x07198540l; 0x590ab964l; 0xab613a67l; 0xb831c993l; 0x4a5a4a90l
     ; 0x9e902e7bl; 0x6cfbad78l; 0x7fab5e8cl; 0x8dc0dd8fl; 0xe330a81al
     ; 0x115b2b19l; 0x020bd8edl; 0xf0605beel; 0x24aa3f05l; 0xd6c1bc06l
     ; 0xc5914ff2l; 0x37faccf1l; 0x69e9f0d5l; 0x9b8273d6l; 0x88d28022l
     ; 0x7ab90321l; 0xae7367cal; 0x5c18e4c9l; 0x4f48173dl; 0xbd23943el
     ; 0xf36e6f75l; 0x0105ec76l; 0x12551f82l; 0xe03e9c81l; 0x34f4f86al
     ; 0xc69f7b69l; 0xd5cf889dl; 0x27a40b9el; 0x79b737bal; 0x8bdcb4b9l
     ; 0x988c474dl; 0x6ae7c44el; 0xbe2da0a5l; 0x4c4623a6l; 0x5f16d052l
     ; 0xad7d5351l |]

let buf_fold_left get f acc buf offset length =
  let acc_r = ref acc in
  for i = offset to offset + length - 1 do
    acc_r := f !acc_r (get buf i)
  done ;
  !acc_r

let update_crc acc c =
  let index = Optint.to_int acc lxor int_of_char c land 0xff in
  crc_table.(index) ^^^ (acc >>> 8) &&& ffffffff

let crc32c : type a. get:(a -> int -> char) -> a -> int -> int -> t -> t =
 fun ~get buf off len crc ->
  ~~~(buf_fold_left get update_crc ~~~crc buf off len)

type bigstring =
  (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t

let digest_bigstring =
  let get : bigstring -> int -> char = Bigarray.Array1.get in
  crc32c ~get

let digest_string =
  let get = String.get in
  crc32c ~get

let digest_bytes =
  let get = Bytes.get in
  crc32c ~get
OCaml

Innovation. Community. Security.