From 18b5e1acc6671230f5e77baeb621e914f1bbd197 Mon Sep 17 00:00:00 2001
From: Ludovic Apvrille <ludovic.apvrille@telecom-paris.fr>
Date: Fri, 29 Apr 2022 18:22:41 +0200
Subject: [PATCH] Bug resolved on guard handling in ProVerif generation

---
 .../avatartranslator/AvatarBinaryGuard.java   |  4 ++++
 .../avatartranslator/AvatarComposedGuard.java |  5 +++-
 .../AvatarSimpleGuardDuo.java                 | 24 +++++++++++++++++++
 .../toproverif/AVATAR2ProVerif.java           | 23 +++++++++++-------
 4 files changed, 46 insertions(+), 10 deletions(-)

diff --git a/src/main/java/avatartranslator/AvatarBinaryGuard.java b/src/main/java/avatartranslator/AvatarBinaryGuard.java
index 070ef547e6..13771149cf 100644
--- a/src/main/java/avatartranslator/AvatarBinaryGuard.java
+++ b/src/main/java/avatartranslator/AvatarBinaryGuard.java
@@ -38,6 +38,8 @@
 
 package avatartranslator;
 
+import myutil.TraceManager;
+
 import java.util.Map;
 
 /**
@@ -74,6 +76,8 @@ public class AvatarBinaryGuard extends AvatarComposedGuard {
         return this.guardA.getAsString (translator) + translator.translateBinaryOp (this.binaryOp) + this.guardB.getAsString (translator);
     }
 
+
+
     @Override
     public AvatarBinaryGuard clone () {
         return new AvatarBinaryGuard (this.guardA.clone (), this.guardB.clone (), this.binaryOp);
diff --git a/src/main/java/avatartranslator/AvatarComposedGuard.java b/src/main/java/avatartranslator/AvatarComposedGuard.java
index af75da1a4e..b4e1a3c08f 100644
--- a/src/main/java/avatartranslator/AvatarComposedGuard.java
+++ b/src/main/java/avatartranslator/AvatarComposedGuard.java
@@ -38,6 +38,8 @@
 
 package avatartranslator;
 
+import myutil.TraceManager;
+
 /**
    * Class AvatarComposedGuard
    * Creation: 16/09/2015
@@ -47,7 +49,8 @@ package avatartranslator;
 public abstract class AvatarComposedGuard extends AvatarGuard {
     
 	public AvatarComposedGuard getOpposite () {
-        //return new AvatarUnaryGuard ("not", "(", ")", this);
+
+        // Otherwise, general case:
         return new AvatarUnaryGuard ("", "(", ") == false", this);
     }
 
diff --git a/src/main/java/avatartranslator/AvatarSimpleGuardDuo.java b/src/main/java/avatartranslator/AvatarSimpleGuardDuo.java
index d6aa10cb0a..e5ff575d7b 100644
--- a/src/main/java/avatartranslator/AvatarSimpleGuardDuo.java
+++ b/src/main/java/avatartranslator/AvatarSimpleGuardDuo.java
@@ -98,4 +98,28 @@ public class AvatarSimpleGuardDuo extends AvatarSimpleGuard {
             this.termB.replaceAttributes (attributesMapping);
         }
     }
+
+    public AvatarComposedGuard getOpposite () {
+        //return new AvatarUnaryGuard ("not", "(", ")", this);
+
+        // If guard is a binary guard, we take its opposite
+
+        String op = "";
+        if (binaryOp == "==") {
+            op = "!=";
+        } else if (binaryOp == "!=") {
+            op = "==";
+        }
+
+        if (op == null) {
+            // Otherwise, general case:
+            return new AvatarUnaryGuard("", "(", ") == false", this);
+        }
+
+        AvatarSimpleGuardDuo g = this.clone();
+        g.binaryOp = op;
+
+        return g;
+
+    }
 }
diff --git a/src/main/java/avatartranslator/toproverif/AVATAR2ProVerif.java b/src/main/java/avatartranslator/toproverif/AVATAR2ProVerif.java
index b5f23c4898..c9fc22f0e4 100755
--- a/src/main/java/avatartranslator/toproverif/AVATAR2ProVerif.java
+++ b/src/main/java/avatartranslator/toproverif/AVATAR2ProVerif.java
@@ -352,16 +352,18 @@ public class AVATAR2ProVerif implements AvatarTranslator {
     // -> transformed into a = b, a <> b, g1 && g2, g1 || g2
     // Returns nulls otherwise
     private static String translateGuard (AvatarGuard _guard, Map<AvatarAttribute, Integer> attributeCmp) {
-        TraceManager.addDev(_guard.toString());
-        if (_guard == null || _guard instanceof AvatarGuardEmpty)
+        TraceManager.addDev("Handling Guard:" + _guard.toString());
+        if (_guard == null || _guard instanceof AvatarGuardEmpty) {
+            TraceManager.addDev("Null or empty guard");
             return null;
+        }
 
         if (_guard instanceof AvatarGuardElse)
             // TODO: warning
             return null;
 
         if (_guard instanceof AvatarSimpleGuardMono) {
-            //TraceManager.addDev("SimpleGuardMono:" + _guard);
+            TraceManager.addDev("SimpleGuardMono:" + _guard);
             String term = AVATAR2ProVerif.translateTerm (((AvatarSimpleGuardMono) _guard).getTerm (), attributeCmp);
             //TraceManager.addDev("guard/ term=" + term);
             if (term != null)
@@ -371,7 +373,7 @@ public class AVATAR2ProVerif implements AvatarTranslator {
         }
 
         if (_guard instanceof AvatarSimpleGuardDuo) {
-            //TraceManager.addDev("SimpleGuardDuo");
+            TraceManager.addDev("SimpleGuardDuo");
             String delim = null;
             String termA = AVATAR2ProVerif.translateTerm (((AvatarSimpleGuardDuo) _guard).getTermA (), attributeCmp);
             String termB = AVATAR2ProVerif.translateTerm (((AvatarSimpleGuardDuo) _guard).getTermB (), attributeCmp);
@@ -392,7 +394,7 @@ public class AVATAR2ProVerif implements AvatarTranslator {
         }
 
         if (_guard instanceof AvatarUnaryGuard) {
-            //TraceManager.addDev("UnaryGuard");
+            TraceManager.addDev("UnaryGuard");
             String unary = ((AvatarUnaryGuard) _guard).getUnaryOp ();
             AvatarGuard guard = ((AvatarUnaryGuard) _guard).getGuard ();
 
@@ -406,6 +408,8 @@ public class AVATAR2ProVerif implements AvatarTranslator {
 
             String guardProV = AVATAR2ProVerif.translateGuard (guard, attributeCmp);
 
+
+
             if (beforeProV != null && guardProV != null)
                 return beforeProV + guardProV + afterProV;
 
@@ -413,7 +417,7 @@ public class AVATAR2ProVerif implements AvatarTranslator {
         }
 
         if (_guard instanceof AvatarBinaryGuard) {
-            //TraceManager.addDev("BinaryGuard");
+            TraceManager.addDev("BinaryGuard");
             String delim = ((AvatarBinaryGuard) _guard).getBinaryOp ();
             AvatarGuard guardA = ((AvatarBinaryGuard) _guard).getGuardA ();
             AvatarGuard guardB = ((AvatarBinaryGuard) _guard).getGuardB ();
@@ -433,7 +437,7 @@ public class AVATAR2ProVerif implements AvatarTranslator {
         }
 
         if (_guard instanceof AvatarConstantGuard) {
-            //TraceManager.addDev("ConstantGuard");
+            TraceManager.addDev("ConstantGuard");
             AvatarConstantGuard constant = (AvatarConstantGuard) _guard;
             if (constant.getConstant () == AvatarConstant.TRUE)
                 return "TRUE";
@@ -441,6 +445,7 @@ public class AVATAR2ProVerif implements AvatarTranslator {
                 return "FALSE";
         }
 
+        TraceManager.addDev("No valid guard found");
         return null;
     }
 
@@ -1367,8 +1372,8 @@ public class AVATAR2ProVerif implements AvatarTranslator {
                 AvatarAttributeState attrB = ((AvatarPragmaAuthenticity) pragma).getAttrB ();
                 if (attrA.getAttribute ().getBlock () ==  arg.block && attrA.getState ().getName ().equals (_asme.getName ())) {
                     TraceManager.addDev ("DEBUG: " + attrA.getAttribute ());
-                    TraceManager.addDev ("DEBUG: " + attrA.getAttribute ().getBlock ());
-                    TraceManager.addDev ("DEBUG: " + arg.attributeCmp.get (attrA.getAttribute()));
+                    //TraceManager.addDev ("DEBUG: " + attrA.getAttribute ().getBlock ());
+                    //TraceManager.addDev ("DEBUG: " + arg.attributeCmp.get (attrA.getAttribute()));
                     String sp = "authenticity" + ATTR_DELIM + AVATAR2ProVerif.makeAttrName (attrA.getAttribute ().getBlock ().getName (), attrA.getAttribute ().getName (), _asme.getName ()) + " (" + AVATAR2ProVerif.makeAttrName (attrA.getAttribute ().getBlock ().getName (), attrA.getAttribute ().getName (), arg.attributeCmp.get (attrA.getAttribute ()).toString ()) + ")";
                     if (!authenticityEvents.contains (sp)) {
                         authenticityEvents.add (sp);
-- 
GitLab