(* $Id: crypt_3des.ml,v 1.2 2001/03/10 16:43:21 gerd Exp $
* ----------------------------------------------------------------------
* This module is part of the cryptgps package by Gerd Stolpmann.
*)
open Crypt_aux
let check_parity key =
match String.length key with
8 -> Crypt_des.check_parity key
| 16 -> Crypt_des.check_parity (String.sub key 0 8);
Crypt_des.check_parity (String.sub key 8 8)
| 24 -> Crypt_des.check_parity (String.sub key 0 8);
Crypt_des.check_parity (String.sub key 8 8);
Crypt_des.check_parity (String.sub key 16 8)
| _ -> failwith "Crypt_3des: invalid key length"
;;
let set_parity key =
match String.length key with
8 -> Crypt_des.set_parity key
| 16 -> Crypt_des.set_parity (String.sub key 0 8) ^
Crypt_des.set_parity (String.sub key 8 8)
| 24 -> Crypt_des.set_parity (String.sub key 0 8) ^
Crypt_des.set_parity (String.sub key 8 8) ^
Crypt_des.set_parity (String.sub key 16 8)
| _ -> failwith "Crypt_3des: invalid key length"
;;
module Cryptsystem : Cryptsystem_64.T =
struct
type key =
{ k1 : Crypt_des.Cryptsystem.key;
k2 : Crypt_des.Cryptsystem.key;
k3 : Crypt_des.Cryptsystem.key;
n_keys : int
}
let encrypt_ecb k x =
match k.n_keys with
1 -> Crypt_des.Cryptsystem.encrypt_ecb k.k1 x
| 2 -> let x' = Crypt_des.Cryptsystem.encrypt_ecb k.k1 x in
let x'' = Crypt_des.Cryptsystem.decrypt_ecb k.k2 x' in
Crypt_des.Cryptsystem.encrypt_ecb k.k1 x''
| 3 -> let x' = Crypt_des.Cryptsystem.encrypt_ecb k.k1 x in
let x'' = Crypt_des.Cryptsystem.decrypt_ecb k.k2 x' in
Crypt_des.Cryptsystem.encrypt_ecb k.k3 x''
| _ -> failwith "Crypt_3des: invalid key length"
let encrypt_ecb_int32 k xl xr ret_xl ret_xr =
let x = quadruple_of_int32 xl xr in
let y = encrypt_ecb k x in
int32_of_quadruple y ret_xl ret_xr
let decrypt_ecb k x =
match k.n_keys with
1 -> Crypt_des.Cryptsystem.decrypt_ecb k.k1 x
| 2 -> let x' = Crypt_des.Cryptsystem.decrypt_ecb k.k1 x in
let x'' = Crypt_des.Cryptsystem.encrypt_ecb k.k2 x' in
Crypt_des.Cryptsystem.decrypt_ecb k.k1 x''
| 3 -> let x' = Crypt_des.Cryptsystem.decrypt_ecb k.k1 x in
let x'' = Crypt_des.Cryptsystem.encrypt_ecb k.k2 x' in
Crypt_des.Cryptsystem.decrypt_ecb k.k3 x''
| _ -> failwith "Crypt_3des: invalid key length"
let decrypt_ecb_int32 k xl xr ret_xl ret_xr =
let x = quadruple_of_int32 xl xr in
let y = decrypt_ecb k x in
int32_of_quadruple y ret_xl ret_xr
let prepare key =
let l_key = String.length key in
match l_key with
8 -> let k = Crypt_des.Cryptsystem.prepare key in
{ k1=k; k2=k; k3=k; n_keys=1 }
| 16 -> let k1 = Crypt_des.Cryptsystem.prepare (String.sub key 0 8) in
let k2 = Crypt_des.Cryptsystem.prepare (String.sub key 8 8) in
{ k1=k1; k2=k2; k3=k1; n_keys=2 }
| 24 -> let k1 = Crypt_des.Cryptsystem.prepare (String.sub key 0 8) in
let k2 = Crypt_des.Cryptsystem.prepare (String.sub key 8 8) in
let k3 = Crypt_des.Cryptsystem.prepare (String.sub key 16 8) in
{ k1=k1; k2=k2; k3=k3; n_keys=3 }
| _ -> failwith "Crypt_3des: invalid key length"
let textkey k =
match k.n_keys with
1 -> Crypt_des.Cryptsystem.textkey k.k1
| 2 -> Crypt_des.Cryptsystem.textkey k.k1 ^
Crypt_des.Cryptsystem.textkey k.k2
| 3 -> Crypt_des.Cryptsystem.textkey k.k1 ^
Crypt_des.Cryptsystem.textkey k.k2 ^
Crypt_des.Cryptsystem.textkey k.k3
| _ -> failwith "Crypt_3des: invalid key length"
let is_weak k =
match k.n_keys with
1 -> Crypt_des.Cryptsystem.is_weak k.k1
| 2 -> Crypt_des.Cryptsystem.is_weak k.k1 or
Crypt_des.Cryptsystem.is_weak k.k2 or
Crypt_des.Cryptsystem.textkey k.k1 =
Crypt_des.Cryptsystem.textkey k.k2
| 3 -> Crypt_des.Cryptsystem.is_weak k.k1 or
Crypt_des.Cryptsystem.is_weak k.k2 or
Crypt_des.Cryptsystem.is_weak k.k3 or
Crypt_des.Cryptsystem.textkey k.k1 =
Crypt_des.Cryptsystem.textkey k.k2 or
Crypt_des.Cryptsystem.textkey k.k1 =
Crypt_des.Cryptsystem.textkey k.k3 or
Crypt_des.Cryptsystem.textkey k.k2 =
Crypt_des.Cryptsystem.textkey k.k3
| _ -> failwith "Crypt_3des: invalid key length"
end
;;
module Cryptmodes = Cryptmodes_64.Make_modes(Cryptsystem)
;;
(* ======================================================================
* History:
*
* $Log: crypt_3des.ml,v $
* Revision 1.2 2001/03/10 16:43:21 gerd
* int32 experiments
*
* Revision 1.1 1999/06/18 00:23:58 gerd
* First release.
*
*
*)