(***********************************************************************) (* *) (* Objective Caml *) (* *) (* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 1996 Institut National de Recherche en Informatique et *) (* en Automatique. All rights reserved. This file is distributed *) (* under the terms of the GNU Library General Public License, with *) (* the special exception on linking described in file ../LICENSE. *) (* *) (***********************************************************************) (* $Id$ *) (* Message digest (MD5) *) type t = string external unsafe_string: string -> int -> int -> t = "md5_string" external channel: in_channel -> int -> t = "md5_chan" let string str = unsafe_string str 0 (String.length str) let substring str ofs len = if ofs < 0 || len < 0 || ofs > String.length str - len then invalid_arg "Digest.substring" else unsafe_string str ofs len let file filename = let ic = open_in_bin filename in let d = channel ic (-1) in close_in ic; d let output chan digest = output chan digest 0 16 let input chan = let digest = String.create 16 in really_input chan digest 0 16; digest let to_hex d = let result = String.create 32 in for i = 0 to 15 do String.blit (Printf.sprintf "%02x" (int_of_char d.[i])) 0 result (2*i) 2; done; result ;;