This is an automated email from the ASF dual-hosted git repository.

gabor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/parquet-mr.git


The following commit(s) were added to refs/heads/master by this push:
     new c6187e8  PARQUET-1940: KEK length configuration (#838)
c6187e8 is described below

commit c6187e8d50a241ff83bb364526658d5ddce34b34
Author: ggershinsky <[email protected]>
AuthorDate: Thu Nov 12 18:01:33 2020 +0200

    PARQUET-1940: KEK length configuration (#838)
---
 parquet-hadoop/README.md                                  |  6 ++++++
 .../apache/parquet/crypto/keytools/FileKeyWrapper.java    | 15 ++++++++++++---
 .../org/apache/parquet/crypto/keytools/KeyToolkit.java    |  6 ++++++
 3 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/parquet-hadoop/README.md b/parquet-hadoop/README.md
index ca7aa48..87beeb9 100644
--- a/parquet-hadoop/README.md
+++ b/parquet-hadoop/README.md
@@ -436,3 +436,9 @@ If `false`, key material is stored in separate new files, 
created in the same fo
 **Description:** Length of data encryption keys (DEKs), randomly generated by 
parquet key management tools. Can be 128, 192 or 256 bits.  
 **Default value:** `128`
 
+---
+
+**Property:** `parquet.encryption.kek.length.bits`
+**Description:** Length of key encryption keys (KEKs), randomly generated by 
parquet key management tools. Can be 128, 192 or 256 bits.
+**Default value:** `128`
+
diff --git 
a/parquet-hadoop/src/main/java/org/apache/parquet/crypto/keytools/FileKeyWrapper.java
 
b/parquet-hadoop/src/main/java/org/apache/parquet/crypto/keytools/FileKeyWrapper.java
index 4886019..d6d6d77 100644
--- 
a/parquet-hadoop/src/main/java/org/apache/parquet/crypto/keytools/FileKeyWrapper.java
+++ 
b/parquet-hadoop/src/main/java/org/apache/parquet/crypto/keytools/FileKeyWrapper.java
@@ -21,6 +21,7 @@ package org.apache.parquet.crypto.keytools;
 
 import java.nio.charset.StandardCharsets;
 import java.security.SecureRandom;
+import java.util.Arrays;
 import java.util.concurrent.ConcurrentMap;
 
 import org.apache.hadoop.conf.Configuration;
@@ -35,7 +36,7 @@ import static 
org.apache.parquet.crypto.keytools.KeyToolkit.KEK_WRITE_CACHE_PER_
 public class FileKeyWrapper {
   private static final Logger LOG = 
LoggerFactory.getLogger(FileKeyWrapper.class);
 
-  public static final int KEK_LENGTH = 16;
+  private static final int[] ACCEPTABLE_KEK_LENGTHS = {128, 192, 256};
   public static final int KEK_ID_LENGTH = 16;
 
   // A map of MEK_ID -> KeyEncryptionKey, for the current token
@@ -49,6 +50,7 @@ public class FileKeyWrapper {
   private final Configuration hadoopConfiguration;
   private final SecureRandom random;
   private final boolean doubleWrapping;
+  private final int kekLength;
 
   private short keyCounter;
   private String accessToken;
@@ -79,8 +81,15 @@ public class FileKeyWrapper {
     if (doubleWrapping) {
       KEK_WRITE_CACHE_PER_TOKEN.checkCacheForExpiredTokens(cacheEntryLifetime);
       KEKPerMasterKeyID = 
KEK_WRITE_CACHE_PER_TOKEN.getOrCreateInternalCache(accessToken, 
cacheEntryLifetime);
+      int kekLengthBits = 
configuration.getInt(KeyToolkit.KEK_LENGTH_PROPERTY_NAME,
+          KeyToolkit.KEK_LENGTH_DEFAULT);
+      if (Arrays.binarySearch(ACCEPTABLE_KEK_LENGTHS, kekLengthBits) < 0) {
+        throw new ParquetCryptoRuntimeException("Wrong key encryption key 
(KEK) length : " + kekLengthBits);
+      }
+      kekLength = kekLengthBits / 8;
     } else {
       KEKPerMasterKeyID = null;
+      kekLength = 0;
     }
 
     if (LOG.isDebugEnabled()) {
@@ -143,7 +152,7 @@ public class FileKeyWrapper {
   }
 
   private KeyEncryptionKey createKeyEncryptionKey(String masterKeyID) {
-    byte[] kekBytes = new byte[KEK_LENGTH]; 
+    byte[] kekBytes = new byte[kekLength]; 
     random.nextBytes(kekBytes);
 
     byte[] kekID = new byte[KEK_ID_LENGTH];
@@ -155,4 +164,4 @@ public class FileKeyWrapper {
 
     return new KeyEncryptionKey(kekBytes, kekID, encodedWrappedKEK);
   }
-}
\ No newline at end of file
+}
diff --git 
a/parquet-hadoop/src/main/java/org/apache/parquet/crypto/keytools/KeyToolkit.java
 
b/parquet-hadoop/src/main/java/org/apache/parquet/crypto/keytools/KeyToolkit.java
index 6116bab..668d9db 100644
--- 
a/parquet-hadoop/src/main/java/org/apache/parquet/crypto/keytools/KeyToolkit.java
+++ 
b/parquet-hadoop/src/main/java/org/apache/parquet/crypto/keytools/KeyToolkit.java
@@ -84,12 +84,18 @@ public class KeyToolkit {
    * Can be 128, 192 or 256 bits.
    */
   public static final String DATA_KEY_LENGTH_PROPERTY_NAME = 
"parquet.encryption.data.key.length.bits";
+  /**
+   * Length of key encryption keys (KEKs), randomly generated by parquet key 
management tools.
+   * Can be 128, 192 or 256 bits.
+   */
+  public static final String KEK_LENGTH_PROPERTY_NAME = 
"parquet.encryption.kek.length.bits";
 
   public static final boolean DOUBLE_WRAPPING_DEFAULT = true;
   public static final long CACHE_LIFETIME_DEFAULT_SECONDS = 10 * 60; // 10 
minutes
   public static final boolean WRAP_LOCALLY_DEFAULT = false;
   public static final boolean KEY_MATERIAL_INTERNAL_DEFAULT = true;
   public static final int DATA_KEY_LENGTH_DEFAULT = 128;
+  public static final int KEK_LENGTH_DEFAULT = 128;
 
   private static long lastCacheCleanForKeyRotationTime = 0;
   private static Object lastCacheCleanForKeyRotationTimeLock = new Object();

Reply via email to