Adding a Watermarker

Adding a new watermarking algorithm is similar to adding an obfuscator. Algorithms are loaded dynamically at run-time, so there is no need to explcitly link them into the system. To create a new watermarking algorithm wm you
  1. create a new directory sandmark.watermark.wm,
  2. create a new class sandmark.watermark.wm.WM which extends sandmark.watermark.StaticWatermarker or sandmark.watermark.DynamicWatermarker.
  3. Create a file sandmark/watermark/wm/doc/help.html documenting your work.

Static Watermarking

To build a new static watermarker you just have to implement two methods, one to embed the watermark into a jarfile and the other to extract it.
package sandmark.watermark.mywatermarker;

public class MyWatermarker extends sandmark.watermark.StaticWatermarker {

    public ConstantString() {}

    public String getShortName() {
        return "MyWatermarker";
    }

    public String getLongName() {
        return "Embed a watermark somewhere in the program";
    }

    public String getAuthor(){
        return "Jane Doe";
    }

    public String getAuthorEmail(){
        return "doe@cs.arizona.edu";
    }

    public String getDescription(){
        return "Embed a watermark...";
    }

    /*
     *  Get the HTML codes of the About page for ConstantString
     */
    public java.lang.String getAlgHTML(){
        return "...";
    }

    /*
     *  Get the URL of the Help page for ConstantString
     */
    public java.lang.String getAlgURL(){
        return "sandmark/watermark/mywatermarker/doc/help.html";
    }

/*************************************************************************/
/*                               Embedding                               */
/*************************************************************************/

public void embed(sandmark.watermark.StaticEmbedParameters params)
    throws sandmark.watermark.WatermarkingException {
   // The actual code goes here!
}


/*************************************************************************/
/*                              Recognition                              */
/*************************************************************************/

class Recognizer implements java.util.Iterator {
    public Recognizer(sandmark.watermark.StaticRecognizeParameters params) {
       ...
    }

    public boolean hasNext() {
      ...
    }

    public java.lang.Object next() {
       ...
    }

    public void remove() {}
}

public java.util.Iterator recognize(sandmark.watermark.StaticRecognizeParameters params)
      throws sandmark.watermark.WatermarkingException {
    return new Recognizer(params);
}
} 
  1. Use BCEL to implement your watermarker. Have a look at the trivial static watermarker sandmark.watermark.constantstring.ConstantString for an example.
  2. Type make at the top-level sandmark directory (smark). The new watermarker should be loaded automagically at runtime.

Dynamic Watermarking

Implementing a dynamic watermarker is more complex, since you have to provide methods for running the application during tracing and recognition:
package sandmark.watermark.mywatermarker;

public class MyWatermarker extends sandmark.watermark.DynamicWatermarker{

   private sandmark.watermark.DynamicRecognizeParameters mRecognizeParams;
   private sandmark.watermark.DynamicTraceParameters mTraceParams;

   /**
    * Returns this watermarker's short name.
    */
   public String getShortName(){
      return "...";
   }

   /**
    * Returns this watermarker's long name.
    */
   public String getLongName() {
        return "...";
   }

   public String getAuthor(){
      return "Jane Doe";
   }

   public String getAuthorEmail(){
      return "doe@cs.arizona.edu";
   }

   public String getDescription(){
      return  "....";
   }

   public sandmark.config.ModificationProperty[] getMutations()
    {
        return null;
    }

   public java.lang.String getAlgHTML(){
      return "...";
   }

   /*
    *  Get the URL of the Help page for DynamicAA
    */
   public java.lang.String getAlgURL(){
      return "...";
   }

/***********************************************************************/
/*                              Tracing                                */
/***********************************************************************/
   public void startTracing(sandmark.watermark.DynamicTraceParameters params)
      throws sandmark.util.exec.TracingException {
       ...
   }

   public void endTracing()
      ...
   }

   public void stopTracing() throws sandmark.util.exec.TracingException {
      tracer.STOP();
   }

/***********************************************************************/
/*                              Embedding                              */
/***********************************************************************/
   public void embed(sandmark.watermark.DynamicEmbedParameters params) {
       ...
   }

/***********************************************************************/
/*                            Recognition                              */
/***********************************************************************/
   public void startRecognition (sandmark.watermark.DynamicRecognizeParameters params) 
      ...
   }

   public java.util.Iterator watermarks() {
      ...
   }

   public void stopRecognition() throws sandmark.util.exec.TracingException {
      ...
   }

   public void waitForProgramExit() {
      ...
   }
}