This commit is contained in:
parent
aa2ff7b2f0
commit
2f3113f55d
11742 changed files with 1223940 additions and 0 deletions
57
unikernel/duniverse/digestif/src-ocaml/xor.ml
Normal file
57
unikernel/duniverse/digestif/src-ocaml/xor.ml
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
module Nat = struct
|
||||
include Nativeint
|
||||
|
||||
let ( lxor ) = Nativeint.logxor
|
||||
end
|
||||
|
||||
module type BUFFER = sig
|
||||
type t
|
||||
|
||||
val length : t -> int
|
||||
val sub : t -> int -> int -> t
|
||||
val copy : t -> t
|
||||
val benat_to_cpu : t -> int -> nativeint
|
||||
val cpu_to_benat : t -> int -> nativeint -> unit
|
||||
end
|
||||
|
||||
let imin (a : int) (b : int) = if a < b then a else b
|
||||
|
||||
module Make (B : BUFFER) = struct
|
||||
let size_of_long = Sys.word_size / 8
|
||||
|
||||
(* XXX(dinosaure): I'm not sure about this code. May be we don't need the
|
||||
first loop and the _optimization_ is irrelevant. *)
|
||||
let xor_into src src_off dst dst_off n =
|
||||
let n = ref n in
|
||||
let i = ref 0 in
|
||||
while !n >= size_of_long do
|
||||
B.cpu_to_benat dst (dst_off + !i)
|
||||
Nat.(
|
||||
B.benat_to_cpu dst (dst_off + !i)
|
||||
lxor B.benat_to_cpu src (src_off + !i)) ;
|
||||
n := !n - size_of_long ;
|
||||
i := !i + size_of_long
|
||||
done ;
|
||||
while !n > 0 do
|
||||
B.cpu_to_benat dst (dst_off + !i)
|
||||
Nat.(
|
||||
B.benat_to_cpu src (src_off + !i)
|
||||
lxor B.benat_to_cpu dst (dst_off + !i)) ;
|
||||
incr i ;
|
||||
decr n
|
||||
done
|
||||
|
||||
let xor_into a b n =
|
||||
if n > imin (B.length a) (B.length b)
|
||||
then raise (Invalid_argument "Baijiu.Xor.xor_inrot: buffers to small")
|
||||
else xor_into a 0 b 0 n
|
||||
|
||||
let xor a b =
|
||||
let l = imin (B.length a) (B.length b) in
|
||||
let r = B.copy (B.sub b 0 l) in
|
||||
xor_into a r l ;
|
||||
r
|
||||
end
|
||||
|
||||
module Bytes = Make (Digestif_by)
|
||||
module Bigstring = Make (Digestif_bi)
|
||||
Loading…
Add table
Add a link
Reference in a new issue