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)