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
module Option = Core.Option type priv = string list type pub = string list let derive = Keys.derive let import = Keys.import let export = Keys.export let show = Keys.show let load = Keys.load let address = Keys.address let sign = Keys.sign let verify = Keys.verify (*** wrappers *****************************************************************) let __check priv = let pub = derive priv in let id = address pub in if Blacklist.exists id then None else Some pub let sign ~priv ~msg = let success pub = let signature = sign ~priv ~msg in Blacklist.add (address pub) ; Some signature in let open Option in __check priv >>= success let import ~cipher ~pass = let open Option in import ~cipher ~pass >>= function priv -> __check priv >>= (function _ -> Some priv) let rec generate () = let priv = Keys.generate () in let const _ _ = priv in let option = __check priv in let step = Option.value_map option ~default:generate ~f:const in step () let pair () = let priv = generate () in let pub = derive priv in (priv, pub)