From 3cc8688a11463906f436aaa24bf591e18f02e4ed Mon Sep 17 00:00:00 2001
From: Fabrice Mouhartem <fabrice.mouhartem@ens-lyon.org>
Date: Mon, 10 Aug 2015 22:27:41 +0200
Subject: [PATCH] Basic modules

---
 enigml.ml  | 75 +++++++++++++++++++++++++++++++++++++++++++++++++-----
 enigml.mli | 55 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 124 insertions(+), 6 deletions(-)
 create mode 100644 enigml.mli

diff --git a/enigml.ml b/enigml.ml
index 6c6f285..8dfc62c 100644
--- a/enigml.ml
+++ b/enigml.ml
@@ -1,5 +1,8 @@
-type letter = A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q
-| R | S | T | U | V | W | X | Y | Z | Space
+type letter = A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | Space
+let letters =
+  [A ; B ; C ; D ; E ; F ; G ; H ; I ; J ; K ; L ; M ; N ; O ; P ; Q ; R ; S ; T
+  ; U ; V ; W ; X ; Y ; Z ; Space]
+
 
 let to_letter = function
   | 'a' -> A | 'b' -> B | 'c' -> C | 'd' -> D | 'e' -> E | 'f' -> F | 'g' -> G |
@@ -12,10 +15,33 @@ let to_letter = function
   'X' -> X | 'Y' -> Y | 'Z' -> Z | _ -> Space
 
 let of_letter = function
-  | A -> 'A' | B -> 'B' | C -> 'C' | D -> 'D' | E -> 'E' | F -> 'F' | G -> 'G' |
-  H -> 'H' | I -> 'I' | J -> 'J' | K -> 'K' | L -> 'L' | M -> 'M' | N -> 'N' |
-  O -> 'O' | P -> 'P' | Q -> 'Q' | R -> 'R' | S -> 'S' | T -> 'T' | U -> 'U' |
-  V -> 'V' | W -> 'W' | X -> 'X' | Y -> 'Y' | Z -> 'Z' | Space -> ' '
+  | A -> 'A' | B -> 'B' | C -> 'C' | D -> 'D' | E -> 'E' | F -> 'F' | G -> 'G'
+  | H -> 'H' | I -> 'I' | J -> 'J' | K -> 'K' | L -> 'L' | M -> 'M' | N -> 'N'
+  | O -> 'O' | P -> 'P' | Q -> 'Q' | R -> 'R' | S -> 'S' | T -> 'T' | U -> 'U'
+  | V -> 'V' | W -> 'W' | X -> 'X' | Y -> 'Y' | Z -> 'Z' | Space -> ' '
+
+let next = function
+  | A -> B | B -> C | C -> D | D -> E | E -> F | F -> G | G -> H | H -> I
+  | I -> J | J -> K | K -> L | L -> M | M -> N | N -> O | O -> P | P -> Q
+  | Q -> R | R -> S | S -> T | T -> U | U -> V | V -> W | W -> X | X -> Y
+  | Y -> Z | Z -> A | Space -> Space
+
+let prev = function
+  | A -> Z | B -> A | C -> B | D -> C | E -> D | F -> E | G -> F | H -> G
+  | I -> H | J -> I | K -> J | L -> K | M -> L | N -> M | O -> N | P -> O
+  | Q -> P | R -> Q | S -> R | T -> S | U -> T | V -> U | W -> V | X -> W
+  | Y -> X | Z -> Y | Space -> Space
+
+let iter f =
+  let rec iter_aux res = function
+    | 0 -> res
+    | i -> iter_aux (f res) (pred i)
+  in iter_aux 
+
+let inverse (permut:letter->letter) ltr =
+  let image = List.map permut letters in
+  let assoc = List.combine letters image in
+  List.assoc ltr assoc
 
 let decompose s =
   let size = String.length s in
@@ -28,3 +54,40 @@ let decompose s =
     in decompose_aux [] size |> List.map to_letter
 
 let print_letters s = List.map of_letter s |> List.iter print_char
+
+type rotor_state = int
+
+module type PERMUT = sig
+  val permut : letter -> letter
+end
+
+module type ROTOR = sig
+  val turn : int
+  val action : int -> rotor_state -> letter -> int * rotor_state * letter
+end
+
+module Rotor (M : sig module P: PERMUT val i: int end ) : ROTOR = struct
+  let turn = M.i 
+  let action b s l =
+    let next_state = (b + s) mod 26 in
+    let next_turn () = 
+      if next_state == turn && b == 1 then
+        1
+      else
+        0
+    in
+    next_turn (), next_state, iter prev (M.P.permut (iter next l s)) s
+end
+
+module type STATE = sig
+  module Walze1 : ROTOR
+  module Walze2 : ROTOR
+  module Walze3 : ROTOR
+  module Umkehrwalze : PERMUT
+  module Steckerbrett : PERMUT
+end
+
+module type MACHINE = sig
+  val encrypt : (int * int * int) -> letter list -> letter list
+end
+
diff --git a/enigml.mli b/enigml.mli
new file mode 100644
index 0000000..c5eb1c7
--- /dev/null
+++ b/enigml.mli
@@ -0,0 +1,55 @@
+type letter =
+    A
+  | B
+  | C
+  | D
+  | E
+  | F
+  | G
+  | H
+  | I
+  | J
+  | K
+  | L
+  | M
+  | N
+  | O
+  | P
+  | Q
+  | R
+  | S
+  | T
+  | U
+  | V
+  | W
+  | X
+  | Y
+  | Z
+  | Space
+val letters : letter list
+val to_letter : char -> letter
+val of_letter : letter -> char
+val next : letter -> letter
+val prev : letter -> letter
+val iter : ('a -> 'a) -> 'a -> int -> 'a
+val inverse : (letter -> letter) -> letter -> letter
+val decompose : string -> letter list
+val print_letters : letter list -> unit
+type rotor_state = int
+module type PERMUT = sig val permut : letter -> letter end
+module type ROTOR =
+  sig
+    val turn : int
+    val action : int -> rotor_state -> letter -> int * rotor_state * letter
+  end
+module Rotor : functor (M : sig module P : PERMUT val i : int end) -> ROTOR
+module type STATE =
+  sig
+    module Walze1 : ROTOR
+    module Walze2 : ROTOR
+    module Walze3 : ROTOR
+    module Umkehrwalze : PERMUT
+    module Steckerbrett : PERMUT
+  end
+module type MACHINE =
+  sig val encrypt : int * int * int -> letter list -> letter list end
-- 
GitLab