let transcript_receiver_for_intruder (name : string) (mess : string) : string =
let add mess1 mess2 =
if(not(Hashtbl.mem transcript_table_for_intruder (name,mess2)) && (mess=mess1 || not(Hashtbl.mem transcript_table_for_intruder (name,mess1))))
then(
Hashtbl.add transcript_table_for_intruder (name,mess1) mess2;
if(mess1<>mess2) then Hashtbl.add transcript_table_for_intruder (name,mess2) mess1;
);
(mess1,mess2)
in
let rec aux mess =
if(Hashtbl.mem transcript_table_for_intruder (name,mess))
then (
let res1 = Hashtbl.find transcript_table_for_intruder (name,mess) in
let res2 = Hashtbl.find transcript_table_for_intruder (name,res1) in
(res2,res1)
)
else(
let l_mess = decompose mess in
if(l_mess=[]) then (
if(is_a_test_var mess) then (
let value = get_value_of_var name mess in
add value value
)
else if(is_a_var mess) then add mess ((get_name_of_var mess)^"'")
else add mess mess
)
else if((car l_mess)="pair") then(
let tm = List.map aux (cdr l_mess) in
add ((car l_mess)^"("^(list2string "," (List.map fst tm))^")") (list2string "." (List.map snd tm))
)
else if((car l_mess)="scrypt" || (car l_mess)="crypt") then (
let tmp=decompose (cadr l_mess) in
if(tmp<>[] && (car tmp)="pair")
then (
let (m1, t1) = aux (cadr l_mess) in
let (m2, t2) = aux (caddr l_mess) in
add ((car l_mess)^"("^m1^","^m2^")") ("{"^t2^"}_{"^t1^"}")
)
else (
let (m1, t1) = aux (cadr l_mess) in
let (m2, t2) = aux (caddr l_mess) in
add ((car l_mess)^"("^m1^","^m2^")") ("{"^t2^"}_"^t1)
)
)
else if((car l_mess)="apply") then (
let tm = List.map aux (cdr l_mess) in
add ((fst (car tm))^"("^(list2string "," (List.map fst (cdr tm)))^")") ((snd (car tm))^"("^(list2string "," (List.map snd (cdr tm)))^")")
)
else if((car l_mess)="exp") then (
let tm = List.map aux (cdr l_mess) in
add ((car l_mess)^"("^(list2string "," (List.map fst tm))^")") ((car l_mess)^"("^(list2string "," (List.map snd tm))^")")
)
else if((car l_mess)="xor") then (
let tm = List.map aux (cdr l_mess) in
add ((car l_mess)^"("^(list2string "," (List.map fst tm))^")") ((car l_mess)^"("^(list2string "," (List.map snd tm))^")")
)
else if((car l_mess)="inv") then (
let (m1, t1) = aux (cadr l_mess) in
add ((car l_mess)^"("^m1^")") ((car l_mess)^"("^t1^")")
)
else (
let tm = List.map aux l_mess in
add ((fst (car tm))^"("^(list2string "," (List.map fst (cdr tm)))^")") ((snd (car tm))^"("^(list2string "," (List.map snd (cdr tm)))^")")
)
);
in
(snd (aux mess))