diff --git a/src/util.ml b/src/util.ml index c8fb197e..35fad636 100644 --- a/src/util.ml +++ b/src/util.ml @@ -34,32 +34,28 @@ module Bin_rsa = struct let check = function false -> Error (`Msg "invalid data") | true -> Ok () let z_array_to_octets (arr : Z.t array) = - let arr = - Array.map - (fun z -> - let bits = z_to_bits_be z in - (String.length bits, bits)) - arr - in - let len = Array.fold_left (fun acc (n, _) -> acc + n) 0 arr in + let nb = Array.length arr in + (*Fmt.epr "z_array_to_octets, nb=%d@." nb;*) + let bits_arr = Array.map z_to_bits_be arr in + let len_arr = Array.map String.length bits_arr in + let len = (2 * nb) + Array.fold_left ( + ) 0 len_arr in let b = Bytes.make len '\x00' in - let bits_start_pos = - Array.fold_left - (fun pos (len, _bits) -> - Bytes.set_uint16_be b pos len; - pos + 2) - 0 arr - in - let _end : int = - Array.fold_left - (fun pos (len, bits) -> - Bytes.blit_string bits 0 b pos len; - pos + len) - bits_start_pos arr - in + let pos = ref 0 in + Array.iter + (fun len -> + Bytes.set_uint16_be b !pos len; + pos := !pos + 2) + len_arr; + Array.iteri + (fun i bits -> + let len = len_arr.(i) in + Bytes.blit_string bits 0 b !pos len; + pos := !pos + len) + bits_arr; Bytes.unsafe_to_string b let z_array_of_octets ~nb s = + (*Fmt.epr "z_array_of_octets, nb=%d@." nb;*) let s_len = String.length s in let* () = check (s_len <= 2 * nb) in let pos = ref 0 in