Class AesFile

java.lang.Object
com.mku.salmonfs.file.AesFile
All Implemented Interfaces:
IVirtualFile

public class AesFile extends Object implements IVirtualFile
An IVirtualFile implementation of an encryption wrapper backed by a real IFile. You can use this file to browse a VirtualDrive. Encrypt/Decrypt operations are accessible via getInputStream/getOutputStream.
  • Field Details

  • Constructor Details

    • AesFile

      public AesFile(IFile realFile)
      File wrapper to be used to create, read, and write encrypted files.
      Parameters:
      realFile - The real file
    • AesFile

      public AesFile(IFile realFile, EncryptionFormat format)
      File wrapper to be used to create, read, and write encrypted files.
      Parameters:
      realFile - The real file
      format - The format to use, see EncryptionFormat
    • AesFile

      public AesFile(IFile realFile, AesDrive drive)
      File wrapper to create, read, and write encrypted files. Requires a virtual drive that supports the underlying filesystem, see JavaFile implementation.
      Parameters:
      realFile - The real file
      drive - The file virtual system that will be used with file operations
  • Method Details

    • isIntegrityEnabled

      public boolean isIntegrityEnabled()
      Return if integrity is set
      Returns:
      True if integrity is enabled.
    • getRequestedChunkSize

      public int getRequestedChunkSize()
      Return the current chunk size requested that will be used for integrity
      Returns:
      The requested chunk size
    • getFileChunkSize

      public int getFileChunkSize() throws IOException
      Get the file chunk size from the header.
      Returns:
      The chunk size.
      Throws:
      IOException - Throws exceptions if the format is corrupt.
    • getHeader

      public Header getHeader() throws IOException
      Get the custom Header from this file.
      Returns:
      The header
      Throws:
      IOException - Thrown if there is an IO error.
    • getInputStream

      public AesStream getInputStream() throws IOException
      Retrieves a AesStream that will be used for reading/decrypting the file contents.
      Specified by:
      getInputStream in interface IVirtualFile
      Returns:
      The input stream
      Throws:
      IOException - Thrown if there is an IO error.
      SecurityException - Thrown if there is a security exception
      IntegrityException - Thrown if the data are corrupt or tampered with.
    • getOutputStream

      public RandomAccessStream getOutputStream() throws IOException
      Get a AesStream for encrypting/writing contents using the nonce in the header.
      Specified by:
      getOutputStream in interface IVirtualFile
      Returns:
      The output stream
      Throws:
      SecurityException - Thrown if there is a security exception
      IntegrityException - Thrown if the data are corrupt or tampered with.
      SequenceException - Thrown if there is an error with the nonce sequence
      IOException - Thrown if there is a problem with the stream.
    • getOutputStream

      public RandomAccessStream getOutputStream(byte[] nonce) throws IOException
      Get a AesStream for encrypting/writing contents to this file.
      Parameters:
      nonce - Nonce to be used for encryption. Note that each file should have a unique nonce see AesDrive.getNextNonce().
      Returns:
      The output stream.
      Throws:
      SecurityException - If overwriting existing files. See SetAllowOverwrite().
      IOException - If there is a problem creating the stream.
    • getEncryptionKey

      public byte[] getEncryptionKey()
      Returns the current encryption key
      Returns:
      The encryption key
    • setEncryptionKey

      public void setEncryptionKey(byte[] encryptionKey)
      Sets the encryption key
      Parameters:
      encryptionKey - The AES encryption key to be used
    • setVerifyIntegrity

      public void setVerifyIntegrity(boolean integrity) throws IOException
      Enabled verification of file integrity during read() and write()
      Parameters:
      integrity - False to disable integrity verification
      Throws:
      IOException - Thrown if there is an IO error.
    • setVerifyIntegrity

      public void setVerifyIntegrity(boolean integrity, byte[] hashKey) throws IOException
      Enabled verification of file integrity during read() and write()
      Parameters:
      integrity - True to enable integrity verification
      hashKey - The hash key to be used for verification
      Throws:
      IOException - Thrown if there is an IO error.
    • setApplyIntegrity

      public void setApplyIntegrity(boolean integrity) throws IOException
      Enable integrity with this file.
      Parameters:
      integrity - False to disable integrity
      Throws:
      IOException - Thrown if there is an IO error.
    • setApplyIntegrity

      public void setApplyIntegrity(boolean integrity, byte[] hashKey) throws IOException
      Enable integrity with this file.
      Parameters:
      integrity - True to enable integrity
      hashKey - The hash key to use
      Throws:
      IOException - Thrown if there is an IO error.
    • setApplyIntegrity

      public void setApplyIntegrity(boolean integrity, byte[] hashKey, int requestChunkSize) throws IOException
      Enable integrity with this file.
      Parameters:
      integrity - True to enable integrity
      hashKey - The hash key to use
      requestChunkSize - 0 use default file chunk. A positive number to specify integrity chunks.
      Throws:
      IOException - Thrown if there is an IO error.
    • setAllowOverwrite

      public void setAllowOverwrite(boolean value)
      Warning! Allow overwriting on a current stream. Overwriting is not a good idea because it will re-use the same IV. This is not recommended if you use the stream on storing files or generally data if prior version can be inspected by others. You should only use this setting for initial encryption with parallel streams and not for overwriting!
      Parameters:
      value - True to allow overwriting operations
    • getFileNonce

      public byte[] getFileNonce() throws IOException
      Returns the initial vector that is used for encryption / decryption
      Returns:
      The file nonce
      Throws:
      IOException - Thrown if there is an IO error.
    • setRequestedNonce

      public void setRequestedNonce(byte[] nonce)
      Set the nonce for encryption/decryption for this file.
      Parameters:
      nonce - Nonce to be used.
      Throws:
      SecurityException - Thrown if there is a security exception
    • getRequestedNonce

      public byte[] getRequestedNonce()
      Get the nonce that is used for encryption/decryption of this file.
      Returns:
      The requested nonce
    • getBlockSize

      public int getBlockSize()
      Return the AES block size for encryption / decryption
      Returns:
      The block size
    • getChildrenCount

      public int getChildrenCount()
      Get the count of files and subdirectories
      Returns:
      The children count
    • listFiles

      public AesFile[] listFiles()
      Lists files and directories under this directory
      Specified by:
      listFiles in interface IVirtualFile
      Returns:
      An array of files and subdirectories.
    • getChild

      public AesFile getChild(String filename) throws IOException
      Get a child with this filename.
      Specified by:
      getChild in interface IVirtualFile
      Parameters:
      filename - The filename to search for
      Returns:
      The child file
      Throws:
      SecurityException - Thrown if there is a security exception
      IntegrityException - Thrown if the data are corrupt or tampered with.
      IOException - Thrown if there is an IO error.
      AuthException - Thrown if there is an Authorization error
    • createDirectory

      public AesFile createDirectory(String dirName) throws IOException
      Creates a directory under this directory
      Specified by:
      createDirectory in interface IVirtualFile
      Parameters:
      dirName - The name of the directory to be created
      Returns:
      The new directory.
      Throws:
      IOException - if there was a problem with the stream
    • createDirectory

      public AesFile createDirectory(String dirName, byte[] key, byte[] dirNameNonce) throws IOException
      Creates a directory under this directory
      Parameters:
      dirName - The name of the directory to be created
      key - The key that will be used to encrypt the directory name
      dirNameNonce - The nonce to be used for encrypting the directory name
      Returns:
      The directory that was created
      Throws:
      IOException - Thrown when error during IO
    • getRealFile

      public IFile getRealFile()
      Return the real file
      Specified by:
      getRealFile in interface IVirtualFile
      Returns:
      The real file
    • isFile

      public boolean isFile()
      Check if this is a file.
      Specified by:
      isFile in interface IVirtualFile
      Returns:
      True if it is a file.
    • isDirectory

      public boolean isDirectory()
      Check if this is a directory.
      Specified by:
      isDirectory in interface IVirtualFile
      Returns:
      True if it is a directory.
    • getPath

      public String getPath() throws IOException
      Return the virtual path for this file.
      Specified by:
      getPath in interface IVirtualFile
      Returns:
      The virtual path.
      Throws:
      IOException - Thrown if there is an IO error.
    • getRealPath

      public String getRealPath()
      Return the path of the real file.
      Specified by:
      getRealPath in interface IVirtualFile
      Returns:
      The real path.
    • getName

      public String getName() throws IOException
      Returns the virtual name of the file
      Specified by:
      getName in interface IVirtualFile
      Returns:
      The file name
      Throws:
      IOException - if there was a problem with the stream
    • getParent

      public AesFile getParent()
      Returns the virtual parent directory.
      Specified by:
      getParent in interface IVirtualFile
      Returns:
      The parent directory.
    • delete

      public void delete()
      Delete this file.
      Specified by:
      delete in interface IVirtualFile
    • mkdir

      public void mkdir()
      Create this directory. Currently Not Supported
      Specified by:
      mkdir in interface IVirtualFile
    • getLastDateModified

      public long getLastDateModified()
      Returns the last date modified in milliseconds.
      Specified by:
      getLastDateModified in interface IVirtualFile
      Returns:
      The last date modified in milliseconds.
    • getLength

      public long getLength() throws IOException
      Return the virtual size of the file excluding the header and hash signatures.
      Specified by:
      getLength in interface IVirtualFile
      Returns:
      The size in bytes.
      Throws:
      IOException - if there was a problem with the stream
    • createFile

      public AesFile createFile(String filename) throws IOException
      Create a file under this directory
      Specified by:
      createFile in interface IVirtualFile
      Parameters:
      filename - The file name of the file.
      Returns:
      The new file.
      Throws:
      IOException - if there was a problem with the stream
    • createFile

      public AesFile createFile(String filename, byte[] key, byte[] fileNameNonce, byte[] fileNonce) throws IOException
      Create a file under this directory
      Parameters:
      filename - The file name.
      key - The key that will be used for encryption
      fileNameNonce - The nonce for the encrypting the filename
      fileNonce - The nonce for the encrypting the file contents
      Returns:
      The file
      Throws:
      IOException - Thrown if there is an IO error.
    • rename

      public void rename(String newFilename) throws IOException
      Rename the virtual file name
      Specified by:
      rename in interface IVirtualFile
      Parameters:
      newFilename - The new filename this file will be renamed to
      Throws:
      IOException - if there was a problem with the stream
    • rename

      public void rename(String newFilename, byte[] nonce) throws IOException
      Rename the virtual file name
      Parameters:
      newFilename - The new filename this file will be renamed to
      nonce - The nonce to use
      Throws:
      IOException - Thrown when error during IO
    • exists

      public boolean exists()
      Returns true if this file exists
      Specified by:
      exists in interface IVirtualFile
      Returns:
      True if exists.
    • getDecryptedFilename

      protected String getDecryptedFilename(String filename, byte[] key, byte[] nonce) throws IOException
      Return the decrypted filename of a real filename
      Parameters:
      filename - The filename of a real file
      key - The encryption key if the file doesn't belong to a drive
      nonce - The nonce if the file doesn't belong to a drive
      Returns:
      The decrypted filename
      Throws:
      IOException - Thrown if there is an IO error.
    • getEncryptedFilename

      protected String getEncryptedFilename(String filename, byte[] key, byte[] nonce) throws IOException
      Return the encrypted filename of a virtual filename
      Parameters:
      filename - The virtual filename
      key - The encryption key if the file doesn't belong to a drive
      nonce - The nonce if the file doesn't belong to a drive
      Returns:
      The encrypted file name
      Throws:
      IOException - Thrown if there is an IO error.
    • getDrive

      public AesDrive getDrive()
      Get the drive this file belongs to.
      Returns:
      The drive
    • setTag

      public void setTag(Object tag)
      Set the tag for this file.
      Parameters:
      tag - The file tag
    • getTag

      public Object getTag()
      Get the file tag.
      Returns:
      The file tag.
    • move

      public AesFile move(IVirtualFile dir) throws IOException
      Move file to another directory.
      Specified by:
      move in interface IVirtualFile
      Parameters:
      dir - Target directory.
      Returns:
      The file
      Throws:
      IOException - Thrown if there is an IO error.
    • move

      public AesFile move(IVirtualFile dir, IFile.MoveOptions options) throws IOException
      Move file to another directory.
      Specified by:
      move in interface IVirtualFile
      Parameters:
      dir - Target directory.
      options - The Options
      Returns:
      The file
      Throws:
      IOException - Thrown if there is an IO error.
    • copy

      public AesFile copy(IVirtualFile dir) throws IOException
      Copy file to another directory.
      Specified by:
      copy in interface IVirtualFile
      Parameters:
      dir - Target directory.
      Returns:
      The file
      Throws:
      IOException - Thrown if there is an IO error.
    • copy

      public AesFile copy(IVirtualFile dir, IFile.CopyOptions options) throws IOException
      Copy file to another directory.
      Specified by:
      copy in interface IVirtualFile
      Parameters:
      dir - Target directory.
      options - The options
      Returns:
      The file
      Throws:
      IOException - Thrown if there is an IO error.
    • copyRecursively

      public void copyRecursively(IVirtualFile dest) throws IOException
      Copy a directory recursively
      Specified by:
      copyRecursively in interface IVirtualFile
      Parameters:
      dest - The destination directory
      Throws:
      IOException - Thrown if there is an IO error.
    • copyRecursively

      public void copyRecursively(IVirtualFile dest, IVirtualFile.VirtualRecursiveCopyOptions options) throws IOException
      Copy a directory recursively
      Specified by:
      copyRecursively in interface IVirtualFile
      Parameters:
      dest - The destination directory
      options - The options
      Throws:
      IOException - Thrown if there is an IO error.
    • moveRecursively

      public void moveRecursively(IVirtualFile dest) throws IOException
      Move a directory recursively
      Specified by:
      moveRecursively in interface IVirtualFile
      Parameters:
      dest - The destination directory
      Throws:
      IOException - Thrown if there is an IO error.
    • moveRecursively

      public void moveRecursively(IVirtualFile dest, IVirtualFile.VirtualRecursiveMoveOptions options) throws IOException
      Move a directory recursively
      Specified by:
      moveRecursively in interface IVirtualFile
      Parameters:
      dest - The destination directory
      options - The options
      Throws:
      IOException - Thrown if there is an IO error.
    • deleteRecursively

      public void deleteRecursively()
      Delete all subdirectories and files.
      Specified by:
      deleteRecursively in interface IVirtualFile
    • deleteRecursively

      public void deleteRecursively(IVirtualFile.VirtualRecursiveDeleteOptions options)
      Delete all subdirectories and files.
      Specified by:
      deleteRecursively in interface IVirtualFile
      Parameters:
      options - The options
    • getMinimumPartSize

      public long getMinimumPartSize() throws IOException
      Returns the minimum part size that can be encrypted / decrypted in parallel aligning to the integrity chunk size if available.
      Returns:
      The minimum part size
      Throws:
      IOException - Thrown if there is an IO error.
    • autoRename

      public static String autoRename(AesFile file) throws Exception
      Provides an alternative file name for an AesFile. Use this to rename files.
      Parameters:
      file - The file
      Returns:
      The new file name
      Throws:
      Exception - If a problem occurs