View Javadoc
1   package org.jastacry.layer;
2   
3   import java.io.File;
4   import java.io.FileInputStream;
5   import java.io.IOException;
6   import java.io.InputStream;
7   import java.io.OutputStream;
8   import java.nio.channels.FileChannel;
9   import java.util.Objects;
10  
11  import org.jastacry.JastacryException;
12  
13  /**
14   * Mask every byte with data of a given file. If the file is smaller than the data it will be used again and again from the
15   * beginning.
16   *
17   * <p>SPDX-License-Identifier: MIT
18   *
19   * @author Kai Kretschmann
20   */
21  public class FilemergeLayer extends AbstractBasicLayer
22  {
23      /**
24       * static name of the layer.
25       */
26      public static final String LAYERNAME = "Filemerge Layer";
27  
28      /**
29       * File to merge with..
30       */
31      private File fileMerge;
32  
33      /**
34       * Constructor of FilemergeLayer.
35       */
36      public FilemergeLayer()
37      {
38          super(FilemergeLayer.class, LAYERNAME);
39      }
40  
41      /**
42       * init function.
43       *
44       * @param data to initialise the file.
45       */
46      @SuppressWarnings("squid:S4797") // Handling files is security-sensitive
47      @Override
48      public final void init(final String data)
49      {
50          this.fileMerge = new File(data);
51      }
52  
53      /**
54       * merge Stream function.
55       *
56       * @param inputStream input stream
57       * @param outputStream output stream
58       * @throws JastacryException in case of error
59       */
60      public final void encodeAndDecode(final InputStream inputStream, final OutputStream outputStream) throws JastacryException
61      {
62          int iChar;
63          int iMerge;
64          byte bChar;
65          byte bMerge;
66          FileChannel channel;
67  
68          try (FileInputStream fIS = new FileInputStream(fileMerge))
69          {
70              channel = fIS.getChannel(); // NOPMD by kai on 21.11.17 17:24
71  
72              while ((iChar = inputStream.read()) != -1)
73              { // NOPMD by kai on 21.11.17 17:24
74                  iMerge = fIS.read();
75  
76                  if (-1 == iMerge)
77                  {
78                      logger.debug("EOF reached, reset to start");
79                      channel.position(0);
80                      iMerge = fIS.read();
81                  }
82                  bChar = (byte) iChar; // NOPMD by kai on 21.11.17 17:24
83                  bMerge = (byte) iMerge;
84                  bChar = (byte) (bChar ^ bMerge);
85                  outputStream.write(bChar);
86              }
87              logger.info("close pipe");
88              outputStream.close();
89          } // try with resources
90          catch (IOException e)
91          {
92              throw (JastacryExceptionl#JastacryException">JastacryException) new JastacryException("encodeAndDecode failed").initCause(e);
93          }
94      }
95  
96      /**
97       * Override equals method from object class.
98       * @param o object to compare with
99       * @return true or false
100      */
101     @Override
102     public boolean equals(final Object o)
103     {
104         if (o == this)
105         {
106             return true;
107         }
108         if (!(o instanceof FilemergeLayer))
109         {
110             return false;
111         }
112 
113         final FilemergeLayer./org/jastacry/layer/FilemergeLayer.html#FilemergeLayer">FilemergeLayer layer = (FilemergeLayer) o;
114         return layer.fileMerge.equals(this.fileMerge);
115     }
116 
117     /**
118      * Override equals method from object class.
119      * @return hash of properties
120      */
121     @Override
122     public int hashCode()
123     {
124         return Objects.hash(fileMerge);
125     }
126 }