Create CryptoUtils getFileDecrypter method (#1951)

* Organize some of the crypto code in anticipation of improvements
* Move some crypto logic into new CryptoUtils getFileDecrypter method
diff --git a/core/src/main/java/org/apache/accumulo/core/crypto/CryptoUtils.java b/core/src/main/java/org/apache/accumulo/core/crypto/CryptoUtils.java
index 585b30d..703a0eb 100644
--- a/core/src/main/java/org/apache/accumulo/core/crypto/CryptoUtils.java
+++ b/core/src/main/java/org/apache/accumulo/core/crypto/CryptoUtils.java
@@ -26,7 +26,11 @@
 import java.security.SecureRandom;
 import java.util.Objects;
 
+import org.apache.accumulo.core.cryptoImpl.CryptoEnvironmentImpl;
+import org.apache.accumulo.core.spi.crypto.CryptoEnvironment;
+import org.apache.accumulo.core.spi.crypto.CryptoService;
 import org.apache.accumulo.core.spi.crypto.CryptoService.CryptoException;
+import org.apache.accumulo.core.spi.crypto.FileDecrypter;
 import org.apache.commons.io.IOUtils;
 
 public class CryptoUtils {
@@ -61,6 +65,17 @@
   }
 
   /**
+   * Read the decryption parameters from the DataInputStream and get the FileDecrypter associated
+   * with the provided CryptoService and CryptoEnvironment.Scope.
+   */
+  public static FileDecrypter getFileDecrypter(CryptoService cs, CryptoEnvironment.Scope scope,
+      DataInputStream in) throws IOException {
+    byte[] decryptionParams = readParams(in);
+    CryptoEnvironment decEnv = new CryptoEnvironmentImpl(scope, decryptionParams);
+    return cs.getFileDecrypter(decEnv);
+  }
+
+  /**
    * Write the decryption parameters to the DataOutputStream
    */
   public static void writeParams(byte[] decryptionParams, DataOutputStream out) throws IOException {
diff --git a/core/src/test/java/org/apache/accumulo/core/crypto/CryptoTest.java b/core/src/test/java/org/apache/accumulo/core/crypto/CryptoTest.java
index b0d75f4..94336db 100644
--- a/core/src/test/java/org/apache/accumulo/core/crypto/CryptoTest.java
+++ b/core/src/test/java/org/apache/accumulo/core/crypto/CryptoTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.accumulo.core.crypto;
 
+import static org.apache.accumulo.core.crypto.CryptoUtils.getFileDecrypter;
 import static org.apache.accumulo.core.file.rfile.RFileTest.getAccumuloConfig;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -108,10 +109,10 @@
   public void simpleGCMTest() throws Exception {
     AccumuloConfiguration conf = getAccumuloConfig(CRYPTO_ON_CONF);
 
-    CryptoService cryptoService = new AESCryptoService();
-    cryptoService.init(conf.getAllPropertiesWithPrefix(Property.INSTANCE_CRYPTO_PREFIX));
+    CryptoService cs = new AESCryptoService();
+    cs.init(conf.getAllPropertiesWithPrefix(Property.INSTANCE_CRYPTO_PREFIX));
     CryptoEnvironment encEnv = new CryptoEnvironmentImpl(Scope.RFILE, null);
-    FileEncrypter encrypter = cryptoService.getFileEncrypter(encEnv);
+    FileEncrypter encrypter = cs.getFileEncrypter(encEnv);
     byte[] params = encrypter.getDecryptionParameters();
     assertNotNull(params);
 
@@ -134,9 +135,7 @@
 
     // decrypt
     ByteArrayInputStream in = new ByteArrayInputStream(cipherText);
-    params = CryptoUtils.readParams(new DataInputStream(in));
-    CryptoEnvironment decEnv = new CryptoEnvironmentImpl(Scope.RFILE, params);
-    FileDecrypter decrypter = cryptoService.getFileDecrypter(decEnv);
+    FileDecrypter decrypter = getFileDecrypter(cs, Scope.RFILE, new DataInputStream(in));
     DataInputStream decrypted = new DataInputStream(decrypter.decryptStream(in));
     String plainText = decrypted.readUTF();
     decrypted.close();
@@ -385,13 +384,9 @@
 
   private void decrypt(byte[] resultingBytes, Scope scope, String configFile) throws Exception {
     try (DataInputStream dataIn = new DataInputStream(new ByteArrayInputStream(resultingBytes))) {
-      byte[] params = CryptoUtils.readParams(dataIn);
-
       AccumuloConfiguration conf = getAccumuloConfig(configFile);
-      CryptoService cryptoService = CryptoServiceFactory.newInstance(conf, ClassloaderType.JAVA);
-      CryptoEnvironment env = new CryptoEnvironmentImpl(scope, params);
-
-      FileDecrypter decrypter = cryptoService.getFileDecrypter(env);
+      CryptoService cs = CryptoServiceFactory.newInstance(conf, ClassloaderType.JAVA);
+      FileDecrypter decrypter = getFileDecrypter(cs, scope, dataIn);
 
       try (DataInputStream decrypted = new DataInputStream(decrypter.decryptStream(dataIn))) {
         String markerString = decrypted.readUTF();
diff --git a/server/tserver/src/main/java/org/apache/accumulo/tserver/log/DfsLogger.java b/server/tserver/src/main/java/org/apache/accumulo/tserver/log/DfsLogger.java
index 9dd0252..7e2b410 100644
--- a/server/tserver/src/main/java/org/apache/accumulo/tserver/log/DfsLogger.java
+++ b/server/tserver/src/main/java/org/apache/accumulo/tserver/log/DfsLogger.java
@@ -358,12 +358,9 @@
     try {
       input.readFully(magicBuffer);
       if (Arrays.equals(magicBuffer, magic4)) {
-        byte[] params = CryptoUtils.readParams(input);
         CryptoService cryptoService =
             CryptoServiceFactory.newInstance(conf, ClassloaderType.ACCUMULO);
-        CryptoEnvironment env = new CryptoEnvironmentImpl(Scope.WAL, params);
-
-        FileDecrypter decrypter = cryptoService.getFileDecrypter(env);
+        FileDecrypter decrypter = CryptoUtils.getFileDecrypter(cryptoService, Scope.WAL, input);
         log.debug("Using {} for decrypting WAL", cryptoService.getClass().getSimpleName());
         decryptingInput = cryptoService instanceof NoCryptoService ? input
             : new DataInputStream(decrypter.decryptStream(input));