This is an automated email from the ASF dual-hosted git repository.
jiangtian pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/tsfile.git
The following commit(s) were added to refs/heads/develop by this push:
new 53f86c27 Use reflection method to generate encrypt instances (#233)
53f86c27 is described below
commit 53f86c2764ff9712e937e762d0464dc286a88d52
Author: jintao zhu <[email protected]>
AuthorDate: Fri Oct 25 14:34:00 2024 +0800
Use reflection method to generate encrypt instances (#233)
* code review
* use reflection
* use reflection
* spotless apply
* add error information
* DEBUGGING
* code review
* delete debugging codes
* default unencrypted
* review modify
* delete debugging codes
---------
Co-authored-by: zhujt <[email protected]>
---
.../apache/tsfile/common/conf/TSFileConfig.java | 18 +-
.../encrypt/{SM4_Context.java => AES128.java} | 22 +-
.../org/apache/tsfile/encrypt/AES128Decryptor.java | 84 ++++++
.../org/apache/tsfile/encrypt/AES128Encryptor.java | 84 ++++++
.../org/apache/tsfile/encrypt/EncryptUtils.java | 113 +++++--
.../java/org/apache/tsfile/encrypt/IDecryptor.java | 138 ++-------
.../encrypt/{SM4_Context.java => IEncrypt.java} | 17 +-
.../java/org/apache/tsfile/encrypt/IEncryptor.java | 141 ++-------
.../encrypt/{SM4_Context.java => NoDecryptor.java} | 27 +-
.../encrypt/{SM4_Context.java => NoEncryptor.java} | 27 +-
.../main/java/org/apache/tsfile/encrypt/SM4.java | 326 ---------------------
.../java/org/apache/tsfile/encrypt/SM4Utils.java | 90 ------
.../encrypt/{SM4_Context.java => UNENCRYPTED.java} | 27 +-
.../tsfile/file/metadata/TsFileMetadata.java | 12 +-
.../tsfile/file/metadata/enums/EncryptionType.java | 2 +-
.../apache/tsfile/read/TsFileSequenceReader.java | 25 +-
.../java/org/apache/tsfile/read/common/Chunk.java | 4 +-
.../tsfile/read/reader/chunk/ChunkReader.java | 6 +-
.../tsfile/read/reader/page/LazyLoadPageData.java | 6 +-
.../java/org/apache/tsfile/write/TsFileWriter.java | 9 +-
.../write/chunk/AlignedChunkGroupWriterImpl.java | 5 +-
.../tsfile/write/chunk/AlignedChunkWriterImpl.java | 6 +-
.../apache/tsfile/write/chunk/ChunkWriterImpl.java | 2 +-
.../chunk/NonAlignedChunkGroupWriterImpl.java | 2 +-
.../apache/tsfile/write/chunk/TimeChunkWriter.java | 2 +-
.../tsfile/write/chunk/ValueChunkWriter.java | 2 +-
.../org/apache/tsfile/write/page/PageWriter.java | 2 +-
.../apache/tsfile/write/page/TimePageWriter.java | 2 +-
.../apache/tsfile/write/page/ValuePageWriter.java | 2 +-
.../apache/tsfile/write/writer/TsFileIOWriter.java | 26 +-
.../java/org/apache/tsfile/encrypt/AES128Test.java | 21 +-
.../tsfile/encrypt/AES128TsFileReadWriteTest.java | 4 +-
.../tsfile/encrypt/AES128TsFileWriteTest.java | 4 +-
.../org/apache/tsfile/encrypt/EncryptTest.java | 61 ++--
.../java/org/apache/tsfile/encrypt/SM4128Test.java | 76 -----
.../tsfile/encrypt/SM4128TsFileReadWriteTest.java | 265 -----------------
.../tsfile/encrypt/SM4128TsFileWriteTest.java | 291 ------------------
37 files changed, 496 insertions(+), 1455 deletions(-)
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java
b/java/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java
index 40fd6c37..a368a042 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java
@@ -22,7 +22,6 @@ package org.apache.tsfile.common.conf;
import org.apache.tsfile.encrypt.EncryptUtils;
import org.apache.tsfile.enums.TSDataType;
import org.apache.tsfile.file.metadata.enums.CompressionType;
-import org.apache.tsfile.file.metadata.enums.EncryptionType;
import org.apache.tsfile.fileSystem.FSType;
import org.apache.tsfile.utils.FSUtils;
@@ -144,8 +143,11 @@ public class TSFileConfig implements Serializable {
/** encryptKey, this should be 16 bytes String. */
private String encryptKey = "abcdefghijklmnop";
- /** default encryptType is "UNENCRYPTED", TsFile supports UNENCRYPTED,
SM4128 or AES128. */
- private EncryptionType encryptType = EncryptionType.UNENCRYPTED;
+ /**
+ * default encryptType is "org.apache.tsfile.encrypt.UNENCRYPTED", TsFile
supports UNENCRYPTED or
+ * AES128.
+ */
+ private String encryptType = "org.apache.tsfile.encrypt.UNENCRYPTED";
/** Line count threshold for checking page memory occupied size. */
private int pageCheckSizeThreshold = 100;
@@ -234,12 +236,12 @@ public class TSFileConfig implements Serializable {
this.encryptFlag = Boolean.parseBoolean(encryptFlag);
}
- public EncryptionType getEncryptType() {
+ public String getEncryptType() {
return this.encryptType;
}
public void setEncryptType(String encryptType) {
- this.encryptType = EncryptionType.valueOf(encryptType);
+ this.encryptType = encryptType;
}
public String getEncryptKey() {
@@ -254,12 +256,6 @@ public class TSFileConfig implements Serializable {
if (!encryptFlag) {
return;
}
- if (encryptKeyPath == null) {
- throw new RuntimeException("encrypt key path is null");
- }
- if (encryptKeyPath.isEmpty()) {
- throw new RuntimeException("encrypt key path is empty");
- }
this.encryptKey = EncryptUtils.getEncryptKeyFromPath(encryptKeyPath);
}
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/AES128.java
similarity index 74%
copy from java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
copy to java/tsfile/src/main/java/org/apache/tsfile/encrypt/AES128.java
index 53749ccb..b69eea8e 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/AES128.java
@@ -16,19 +16,23 @@
* specific language governing permissions and limitations
* under the License.
*/
-
package org.apache.tsfile.encrypt;
-public class SM4_Context {
- public int mode;
+public class AES128 implements IEncrypt {
+
+ private final byte[] key;
- public long[] sk;
+ public AES128(byte[] key) {
+ this.key = key;
+ }
- public boolean isPadding;
+ @Override
+ public IEncryptor getEncryptor() {
+ return new AES128Encryptor(key);
+ }
- public SM4_Context() {
- this.mode = 1;
- this.isPadding = false;
- this.sk = new long[32];
+ @Override
+ public IDecryptor getDecryptor() {
+ return new AES128Decryptor(key);
}
}
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/AES128Decryptor.java
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/AES128Decryptor.java
new file mode 100644
index 00000000..768f9afc
--- /dev/null
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/AES128Decryptor.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tsfile.encrypt;
+
+import org.apache.tsfile.exception.encrypt.EncryptException;
+import org.apache.tsfile.exception.encrypt.EncryptKeyLengthNotMatchException;
+import org.apache.tsfile.file.metadata.enums.EncryptionType;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+public class AES128Decryptor implements IDecryptor {
+ private final Cipher AES;
+
+ private final SecretKeySpec secretKeySpec;
+
+ private final IvParameterSpec ivParameterSpec;
+
+ AES128Decryptor(byte[] key) {
+ if (key.length != 16) {
+ throw new EncryptKeyLengthNotMatchException(16, key.length);
+ }
+ secretKeySpec = new SecretKeySpec(key, "AES");
+ // Create IV parameter
+ ivParameterSpec = new IvParameterSpec(key);
+ try {
+ // Create Cipher instance and initialize it for encryption in CTR mode
without padding
+ this.AES = Cipher.getInstance("AES/CTR/NoPadding");
+ AES.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
+ } catch (InvalidAlgorithmParameterException
+ | NoSuchPaddingException
+ | NoSuchAlgorithmException
+ | InvalidKeyException e) {
+ throw new EncryptException("AES128Decryptor init failed ", e);
+ }
+ }
+
+ @Override
+ public byte[] decrypt(byte[] data) {
+ try {
+ return AES.doFinal(data);
+ } catch (IllegalBlockSizeException | BadPaddingException e) {
+ throw new EncryptException("AES128Decryptor decrypt failed ", e);
+ }
+ }
+
+ @Override
+ public byte[] decrypt(byte[] data, int offset, int size) {
+ try {
+ return AES.doFinal(data, offset, size);
+ } catch (IllegalBlockSizeException | BadPaddingException e) {
+ throw new EncryptException("AES128Decryptor decrypt failed ", e);
+ }
+ }
+
+ @Override
+ public EncryptionType getEncryptionType() {
+ return EncryptionType.AES128;
+ }
+}
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/AES128Encryptor.java
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/AES128Encryptor.java
new file mode 100644
index 00000000..b4d8c2a7
--- /dev/null
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/AES128Encryptor.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tsfile.encrypt;
+
+import org.apache.tsfile.exception.encrypt.EncryptException;
+import org.apache.tsfile.exception.encrypt.EncryptKeyLengthNotMatchException;
+import org.apache.tsfile.file.metadata.enums.EncryptionType;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+
+public class AES128Encryptor implements IEncryptor {
+ private final Cipher AES;
+
+ private final SecretKeySpec secretKeySpec;
+
+ private final IvParameterSpec ivParameterSpec;
+
+ AES128Encryptor(byte[] key) {
+ if (key.length != 16) {
+ throw new EncryptKeyLengthNotMatchException(16, key.length);
+ }
+ secretKeySpec = new SecretKeySpec(key, "AES");
+ // Create IV parameter
+ ivParameterSpec = new IvParameterSpec(key);
+ try {
+ // Create Cipher instance and initialize it for encryption in CTR mode
without padding
+ this.AES = Cipher.getInstance("AES/CTR/NoPadding");
+ AES.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
+ } catch (InvalidAlgorithmParameterException
+ | NoSuchPaddingException
+ | NoSuchAlgorithmException
+ | InvalidKeyException e) {
+ throw new EncryptException("AES128Encryptor init failed ", e);
+ }
+ }
+
+ @Override
+ public byte[] encrypt(byte[] data) {
+ try {
+ return AES.doFinal(data);
+ } catch (IllegalBlockSizeException | BadPaddingException e) {
+ throw new EncryptException("AES128Encryptor encrypt failed ", e);
+ }
+ }
+
+ @Override
+ public byte[] encrypt(byte[] data, int offset, int size) {
+ try {
+ return AES.doFinal(data, offset, size);
+ } catch (IllegalBlockSizeException | BadPaddingException e) {
+ throw new EncryptException("AES128Encryptor encrypt failed ", e);
+ }
+ }
+
+ @Override
+ public EncryptionType getEncryptionType() {
+ return EncryptionType.AES128;
+ }
+}
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/EncryptUtils.java
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/EncryptUtils.java
index 87ed1381..034eb40c 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/EncryptUtils.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/EncryptUtils.java
@@ -18,24 +18,42 @@
*/
package org.apache.tsfile.encrypt;
+import org.apache.tsfile.common.conf.TSFileConfig;
import org.apache.tsfile.common.conf.TSFileDescriptor;
import org.apache.tsfile.exception.encrypt.EncryptException;
-import org.apache.tsfile.file.metadata.enums.EncryptionType;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
import java.security.MessageDigest;
public class EncryptUtils {
+ private static final Logger logger =
LoggerFactory.getLogger(EncryptUtils.class);
+
+ private static final String defaultKey = "abcdefghijklmnop";
+
public static String normalKeyStr = getNormalKeyStr();
- public static IEncryptor encryptor = getDefaultEncryptor();
+ public static IEncrypt encrypt = getEncrypt();
- public static IDecryptor decryptor = getDefaultDecryptor();
+ public static IEncryptor encryptor = encrypt.getEncryptor();
+
+ public static IDecryptor decryptor = encrypt.getDecryptor();
public static String getEncryptKeyFromPath(String path) {
+ if (path == null) {
+ logger.error("encrypt key path is null, use the default key");
+ return defaultKey;
+ }
+ if (path.isEmpty()) {
+ logger.error("encrypt key path is empty, use the default key");
+ return defaultKey;
+ }
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
StringBuilder sb = new StringBuilder();
String line;
@@ -50,7 +68,7 @@ public class EncryptUtils {
}
return sb.toString();
} catch (IOException e) {
- throw new RuntimeException(e);
+ throw new EncryptException("Read main encrypt key error", e);
}
}
@@ -84,6 +102,12 @@ public class EncryptUtils {
md.update("IoTDB is the best".getBytes());
md.update(TSFileDescriptor.getInstance().getConfig().getEncryptKey().getBytes());
byte[] data_key = md.digest();
+ data_key =
+ IEncryptor.getEncryptor(
+ TSFileDescriptor.getInstance().getConfig().getEncryptType(),
+
TSFileDescriptor.getInstance().getConfig().getEncryptKey().getBytes())
+ .encrypt(data_key);
+
StringBuilder valueStr = new StringBuilder();
for (byte b : data_key) {
@@ -99,8 +123,33 @@ public class EncryptUtils {
}
}
- public static IEncryptor getDefaultEncryptor() {
- EncryptionType encryptType;
+ public static String getNormalKeyStr(TSFileConfig conf) {
+ try {
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ md.update("IoTDB is the best".getBytes());
+ md.update(conf.getEncryptKey().getBytes());
+ byte[] data_key = md.digest();
+ data_key =
+ IEncryptor.getEncryptor(conf.getEncryptType(),
conf.getEncryptKey().getBytes())
+ .encrypt(data_key);
+
+ StringBuilder valueStr = new StringBuilder();
+
+ for (byte b : data_key) {
+ valueStr.append(b).append(",");
+ }
+
+ valueStr.deleteCharAt(valueStr.length() - 1);
+ String str = valueStr.toString();
+
+ return str;
+ } catch (Exception e) {
+ throw new EncryptException("md5 function not found while using md5 to
generate data key", e);
+ }
+ }
+
+ public static IEncrypt getEncrypt() {
+ String encryptType;
byte[] dataEncryptKey;
if (TSFileDescriptor.getInstance().getConfig().getEncryptFlag()) {
encryptType =
TSFileDescriptor.getInstance().getConfig().getEncryptType();
@@ -109,37 +158,61 @@ public class EncryptUtils {
md.update("IoTDB is the best".getBytes());
md.update(TSFileDescriptor.getInstance().getConfig().getEncryptKey().getBytes());
dataEncryptKey = md.digest();
- } catch (Exception e1) {
- throw new EncryptException("md5 function not found while using md5 to
generate data key");
+ } catch (Exception e) {
+ throw new EncryptException(
+ "md5 function not found while using md5 to generate data key", e);
}
} else {
- encryptType = EncryptionType.UNENCRYPTED;
+ encryptType = "org.apache.tsfile.encrypt.UNENCRYPTED";
dataEncryptKey = null;
}
- return IEncryptor.getEncryptor(encryptType, dataEncryptKey);
+ try {
+ Class<?> encryptTypeClass = Class.forName(encryptType);
+ java.lang.reflect.Constructor<?> constructor =
+ encryptTypeClass.getDeclaredConstructor(byte[].class);
+ return ((IEncrypt) constructor.newInstance(dataEncryptKey));
+ } catch (ClassNotFoundException e) {
+ throw new EncryptException("Get encryptor class failed: " + encryptType,
e);
+ } catch (NoSuchMethodException e) {
+ throw new EncryptException("Get constructor for encryptor failed: " +
encryptType, e);
+ } catch (InvocationTargetException | InstantiationException |
IllegalAccessException e) {
+ throw new EncryptException("New encryptor instance failed: " +
encryptType, e);
+ }
}
- public static IDecryptor getDefaultDecryptor() {
- EncryptionType encryptType;
+ public static IEncrypt getEncrypt(TSFileConfig conf) {
+ String encryptType;
byte[] dataEncryptKey;
- if (TSFileDescriptor.getInstance().getConfig().getEncryptFlag()) {
- encryptType =
TSFileDescriptor.getInstance().getConfig().getEncryptType();
+ if (conf.getEncryptFlag()) {
+ encryptType = conf.getEncryptType();
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update("IoTDB is the best".getBytes());
-
md.update(TSFileDescriptor.getInstance().getConfig().getEncryptKey().getBytes());
+ md.update(conf.getEncryptKey().getBytes());
dataEncryptKey = md.digest();
- } catch (Exception e1) {
- throw new EncryptException("md5 function not found while using md5 to
generate data key");
+ } catch (Exception e) {
+ throw new EncryptException(
+ "md5 function not found while using md5 to generate data key", e);
}
} else {
- encryptType = EncryptionType.UNENCRYPTED;
+ encryptType = "org.apache.tsfile.encrypt.UNENCRYPTED";
dataEncryptKey = null;
}
- return IDecryptor.getDecryptor(encryptType, dataEncryptKey);
+ try {
+ Class<?> encryptTypeClass = Class.forName(encryptType);
+ java.lang.reflect.Constructor<?> constructor =
+ encryptTypeClass.getDeclaredConstructor(byte[].class);
+ return ((IEncrypt) constructor.newInstance(dataEncryptKey));
+ } catch (ClassNotFoundException e) {
+ throw new EncryptException("Get encryptor class failed: " + encryptType,
e);
+ } catch (NoSuchMethodException e) {
+ throw new EncryptException("Get constructor for encryptor failed: " +
encryptType, e);
+ } catch (InvocationTargetException | InstantiationException |
IllegalAccessException e) {
+ throw new EncryptException("New encryptor instance failed: " +
encryptType, e);
+ }
}
- public static byte[] getKeyFromStr(String str) {
+ public static byte[] getSecondKeyFromStr(String str) {
String[] strArray = str.split(",");
byte[] key = new byte[strArray.length];
for (int i = 0; i < strArray.length; i++) {
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IDecryptor.java
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IDecryptor.java
index 0707ba3b..a7be7b73 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IDecryptor.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IDecryptor.java
@@ -20,47 +20,34 @@
package org.apache.tsfile.encrypt;
import org.apache.tsfile.exception.encrypt.EncryptException;
-import org.apache.tsfile.exception.encrypt.EncryptKeyLengthNotMatchException;
import org.apache.tsfile.file.metadata.enums.EncryptionType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
-
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
-import java.util.Arrays;
+import java.lang.reflect.InvocationTargetException;
/** encrypt data according to tsfileconfig. */
public interface IDecryptor {
static final Logger logger = LoggerFactory.getLogger(IDecryptor.class);
- static IDecryptor getDecryptor(String name, byte[] key) {
- return getDecryptor(EncryptionType.valueOf(name), key);
- }
-
- static IDecryptor getDecryptor(EncryptionType name, byte[] key) {
- if (name == null) {
- return new NoDecryptor();
- }
- switch (name) {
- case UNENCRYPTED:
- return new NoDecryptor();
- case SM4128:
- return new SM4128Decryptor(key);
- case AES128:
- return new AES128Decryptor(key);
- default:
- logger.warn("Unknown encryption type: {}", name);
- return new NoDecryptor();
+ static IDecryptor getDecryptor(String type, byte[] key) {
+ try {
+ if (IEncrypt.encryptMap.containsKey(type)) {
+ return ((IEncrypt)
IEncrypt.encryptMap.get(type).newInstance(key)).getDecryptor();
+ }
+ Class<?> encryptClass = Class.forName(type);
+ java.lang.reflect.Constructor<?> constructor =
+ encryptClass.getDeclaredConstructor(byte[].class);
+ IEncrypt.encryptMap.put(type, constructor);
+ return ((IEncrypt) constructor.newInstance(key)).getDecryptor();
+ } catch (ClassNotFoundException e) {
+ throw new EncryptException("Get decryptor class failed: " + type, e);
+ } catch (NoSuchMethodException e) {
+ throw new EncryptException("Get constructor for decryptor failed: " +
type, e);
+ } catch (InvocationTargetException | InstantiationException |
IllegalAccessException e) {
+ throw new EncryptException("New decryptor instance failed: " + type, e);
}
}
@@ -69,95 +56,4 @@ public interface IDecryptor {
byte[] decrypt(byte[] data, int offset, int size);
EncryptionType getEncryptionType();
-
- class NoDecryptor implements IDecryptor {
-
- @Override
- public byte[] decrypt(byte[] data) {
- return data;
- }
-
- @Override
- public byte[] decrypt(byte[] data, int offset, int size) {
- return Arrays.copyOfRange(data, offset, offset + size);
- }
-
- @Override
- public EncryptionType getEncryptionType() {
- return EncryptionType.UNENCRYPTED;
- }
- }
-
- class SM4128Decryptor implements IDecryptor {
-
- private final SM4Utils sm4;
-
- SM4128Decryptor(byte[] key) {
- if (key.length != 16) {
- throw new EncryptKeyLengthNotMatchException(16, key.length);
- }
- this.sm4 = new SM4Utils(key, key);
- }
-
- @Override
- public byte[] decrypt(byte[] data) {
- return sm4.cryptData_CTR(data);
- }
-
- @Override
- public byte[] decrypt(byte[] data, int offset, int size) {
- return decrypt(Arrays.copyOfRange(data, offset, offset + size));
- }
-
- @Override
- public EncryptionType getEncryptionType() {
- return EncryptionType.SM4128;
- }
- }
-
- class AES128Decryptor implements IDecryptor {
- private final Cipher AES;
-
- AES128Decryptor(byte[] key) {
- if (key.length != 16) {
- throw new EncryptKeyLengthNotMatchException(16, key.length);
- }
- SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
- // Create IV parameter
- IvParameterSpec ivParameterSpec = new IvParameterSpec(key);
- try {
- // Create Cipher instance and initialize it for encryption in CTR mode
without padding
- this.AES = Cipher.getInstance("AES/CTR/NoPadding");
- AES.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
- } catch (InvalidAlgorithmParameterException
- | NoSuchPaddingException
- | NoSuchAlgorithmException
- | InvalidKeyException e) {
- throw new EncryptException("AES128Decryptor init failed ", e);
- }
- }
-
- @Override
- public byte[] decrypt(byte[] data) {
- try {
- return AES.doFinal(data);
- } catch (IllegalBlockSizeException | BadPaddingException e) {
- throw new EncryptException("AES128Decryptor decrypt failed ", e);
- }
- }
-
- @Override
- public byte[] decrypt(byte[] data, int offset, int size) {
- try {
- return AES.doFinal(data, offset, size);
- } catch (IllegalBlockSizeException | BadPaddingException e) {
- throw new EncryptException("AES128Decryptor decrypt failed ", e);
- }
- }
-
- @Override
- public EncryptionType getEncryptionType() {
- return EncryptionType.AES128;
- }
- }
}
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncrypt.java
similarity index 77%
copy from java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
copy to java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncrypt.java
index 53749ccb..24b691d2 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncrypt.java
@@ -16,19 +16,16 @@
* specific language governing permissions and limitations
* under the License.
*/
-
package org.apache.tsfile.encrypt;
-public class SM4_Context {
- public int mode;
+import java.util.concurrent.ConcurrentHashMap;
+
+public interface IEncrypt {
- public long[] sk;
+ static ConcurrentHashMap<String, java.lang.reflect.Constructor<?>>
encryptMap =
+ new ConcurrentHashMap<>();
- public boolean isPadding;
+ IDecryptor getDecryptor();
- public SM4_Context() {
- this.mode = 1;
- this.isPadding = false;
- this.sk = new long[32];
- }
+ IEncryptor getEncryptor();
}
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncryptor.java
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncryptor.java
index 1c21d37d..d26ab9dc 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncryptor.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncryptor.java
@@ -20,48 +20,34 @@
package org.apache.tsfile.encrypt;
import org.apache.tsfile.exception.encrypt.EncryptException;
-import org.apache.tsfile.exception.encrypt.EncryptKeyLengthNotMatchException;
import org.apache.tsfile.file.metadata.enums.EncryptionType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
-
-import java.security.InvalidAlgorithmParameterException;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
-import java.util.Arrays;
+import java.lang.reflect.InvocationTargetException;
/** encrypt data according to tsfileconfig. */
public interface IEncryptor {
- Logger logger = LoggerFactory.getLogger(IEncryptor.class);
-
- static IEncryptor getEncryptor(String name, byte[] key) {
- return getEncryptor(EncryptionType.valueOf(name), key);
- }
+ static final Logger logger = LoggerFactory.getLogger(IEncryptor.class);
- static IEncryptor getEncryptor(EncryptionType name, byte[] key) {
- if (name == null) {
- return new NoEncryptor();
- }
- switch (name) {
- case SM4128:
- return new SM4128Encryptor(key);
- case AES128:
- return new AES128Encryptor(key);
- case UNENCRYPTED:
- return new NoEncryptor();
- default:
- // log a warning
- logger.warn("Unknown encryption type: {}", name);
- return new NoEncryptor();
+ static IEncryptor getEncryptor(String type, byte[] key) {
+ try {
+ if (IEncrypt.encryptMap.containsKey(type)) {
+ return ((IEncrypt)
IEncrypt.encryptMap.get(type).newInstance(key)).getEncryptor();
+ }
+ Class<?> encryptClass = Class.forName(type);
+ java.lang.reflect.Constructor<?> constructor =
+ encryptClass.getDeclaredConstructor(byte[].class);
+ IEncrypt.encryptMap.put(type, constructor);
+ return ((IEncrypt) constructor.newInstance(key)).getEncryptor();
+ } catch (ClassNotFoundException e) {
+ throw new EncryptException("Get encryptor class failed: " + type, e);
+ } catch (NoSuchMethodException e) {
+ throw new EncryptException("Get constructor for encryptor failed: " +
type, e);
+ } catch (InvocationTargetException | InstantiationException |
IllegalAccessException e) {
+ throw new EncryptException("New encryptor instance failed: " + type, e);
}
}
@@ -70,95 +56,4 @@ public interface IEncryptor {
byte[] encrypt(byte[] data, int offset, int size);
EncryptionType getEncryptionType();
-
- class NoEncryptor implements IEncryptor {
-
- @Override
- public byte[] encrypt(byte[] data) {
- return data;
- }
-
- @Override
- public byte[] encrypt(byte[] data, int offset, int size) {
- return Arrays.copyOfRange(data, offset, offset + size);
- }
-
- @Override
- public EncryptionType getEncryptionType() {
- return EncryptionType.UNENCRYPTED;
- }
- }
-
- class SM4128Encryptor implements IEncryptor {
-
- private final SM4Utils sm4;
-
- SM4128Encryptor(byte[] key) {
- if (key.length != 16) {
- throw new EncryptKeyLengthNotMatchException(16, key.length);
- }
- this.sm4 = new SM4Utils(key, key);
- }
-
- @Override
- public byte[] encrypt(byte[] data) {
- return sm4.cryptData_CTR(data);
- }
-
- @Override
- public byte[] encrypt(byte[] data, int offset, int size) {
- return encrypt(Arrays.copyOfRange(data, offset, offset + size));
- }
-
- @Override
- public EncryptionType getEncryptionType() {
- return EncryptionType.SM4128;
- }
- }
-
- class AES128Encryptor implements IEncryptor {
- private final Cipher AES;
-
- AES128Encryptor(byte[] key) {
- if (key.length != 16) {
- throw new EncryptKeyLengthNotMatchException(16, key.length);
- }
- SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
- // Create IV parameter
- IvParameterSpec ivParameterSpec = new IvParameterSpec(key);
- try {
- // Create Cipher instance and initialize it for encryption in CTR mode
without padding
- this.AES = Cipher.getInstance("AES/CTR/NoPadding");
- AES.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
- } catch (InvalidAlgorithmParameterException
- | NoSuchPaddingException
- | NoSuchAlgorithmException
- | InvalidKeyException e) {
- throw new EncryptException("AES128Encryptor init failed ", e);
- }
- }
-
- @Override
- public byte[] encrypt(byte[] data) {
- try {
- return AES.doFinal(data);
- } catch (IllegalBlockSizeException | BadPaddingException e) {
- throw new EncryptException("AES128Encryptor encrypt failed ", e);
- }
- }
-
- @Override
- public byte[] encrypt(byte[] data, int offset, int size) {
- try {
- return AES.doFinal(data, offset, size);
- } catch (IllegalBlockSizeException | BadPaddingException e) {
- throw new EncryptException("AES128Encryptor encrypt failed ", e);
- }
- }
-
- @Override
- public EncryptionType getEncryptionType() {
- return EncryptionType.AES128;
- }
- }
}
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/NoDecryptor.java
similarity index 64%
copy from java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
copy to java/tsfile/src/main/java/org/apache/tsfile/encrypt/NoDecryptor.java
index 53749ccb..ac743f9c 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/NoDecryptor.java
@@ -16,19 +16,28 @@
* specific language governing permissions and limitations
* under the License.
*/
-
package org.apache.tsfile.encrypt;
-public class SM4_Context {
- public int mode;
+import org.apache.tsfile.file.metadata.enums.EncryptionType;
+
+import java.util.Arrays;
+
+public class NoDecryptor implements IDecryptor {
- public long[] sk;
+ NoDecryptor(byte[] key) {}
- public boolean isPadding;
+ @Override
+ public byte[] decrypt(byte[] data) {
+ return data;
+ }
+
+ @Override
+ public byte[] decrypt(byte[] data, int offset, int size) {
+ return Arrays.copyOfRange(data, offset, offset + size);
+ }
- public SM4_Context() {
- this.mode = 1;
- this.isPadding = false;
- this.sk = new long[32];
+ @Override
+ public EncryptionType getEncryptionType() {
+ return EncryptionType.UNENCRYPTED;
}
}
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/NoEncryptor.java
similarity index 64%
copy from java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
copy to java/tsfile/src/main/java/org/apache/tsfile/encrypt/NoEncryptor.java
index 53749ccb..45dea8fe 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/NoEncryptor.java
@@ -16,19 +16,28 @@
* specific language governing permissions and limitations
* under the License.
*/
-
package org.apache.tsfile.encrypt;
-public class SM4_Context {
- public int mode;
+import org.apache.tsfile.file.metadata.enums.EncryptionType;
+
+import java.util.Arrays;
+
+public class NoEncryptor implements IEncryptor {
- public long[] sk;
+ NoEncryptor(byte[] key) {}
- public boolean isPadding;
+ @Override
+ public byte[] encrypt(byte[] data) {
+ return data;
+ }
+
+ @Override
+ public byte[] encrypt(byte[] data, int offset, int size) {
+ return Arrays.copyOfRange(data, offset, offset + size);
+ }
- public SM4_Context() {
- this.mode = 1;
- this.isPadding = false;
- this.sk = new long[32];
+ @Override
+ public EncryptionType getEncryptionType() {
+ return EncryptionType.UNENCRYPTED;
}
}
diff --git a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4.java
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4.java
deleted file mode 100644
index fa453289..00000000
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.tsfile.encrypt;
-
-import org.apache.tsfile.exception.encrypt.EncryptException;
-import org.apache.tsfile.exception.encrypt.EncryptKeyLengthNotMatchException;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-
-public class SM4 {
- public static final int SM4_ENCRYPT = 1;
-
- public static final int SM4_DECRYPT = 0;
-
- private long GET_ULONG_BE(byte[] b, int i) {
- long n =
- (long) (b[i] & 0xff) << 24
- | (long) ((b[i + 1] & 0xff) << 16)
- | (long) ((b[i + 2] & 0xff) << 8)
- | (long) (b[i + 3] & 0xff) & 0xffffffffL;
- return n;
- }
-
- private void PUT_ULONG_BE(long n, byte[] b, int i) {
- b[i] = (byte) (int) (0xFF & n >> 24);
- b[i + 1] = (byte) (int) (0xFF & n >> 16);
- b[i + 2] = (byte) (int) (0xFF & n >> 8);
- b[i + 3] = (byte) (int) (0xFF & n);
- }
-
- private long SHL(long x, int n) {
- return (x & 0xFFFFFFFF) << n;
- }
-
- private long ROTL(long x, int n) {
- return SHL(x, n) | x >> (32 - n);
- }
-
- private void SWAP(long[] sk, int i) {
- long t = sk[i];
- sk[i] = sk[(31 - i)];
- sk[(31 - i)] = t;
- }
-
- public static final byte[] SboxTable =
- EncryptUtils.hexStringToByteArray(
-
"D690E9FECCE13DB716B614C228FB2C052B679A762ABE04C3AA441326498606999C4250F491EF987A33540B43EDCFAC62E4B31CA9C908E89580DF94FA758F3FA64707A7FCF37317BA83593C19E6854FA8686B81B27164DA8BF8EB0F4B70569D351E240E5E6358D1A225227C3B01217887D40046579FD327524C3602E7A0C4C89EEABF8AD240C738B5A3F7F2CEF96115A1E0AE5DA49B341A55AD933230F58CB1E31DF6E22E8266CA60C02923AB0D534E6FD5DB3745DEFD8E2F03FF6A726D6C5B518D1BAF92BBDDBC7F11D95C411F105AD80AC13188A5CD7BBD2D74D012B8E5B4B08969974A0C96777E65B9F109C56EC6841
[...]
-
- public static final int[] FK = {0xa3b1bac6, 0x56aa3350, 0x677d9197,
0xb27022dc};
-
- public static final int[] CK = {
- 0x00070e15,
- 0x1c232a31,
- 0x383f464d,
- 0x545b6269,
- 0x70777e85,
- 0x8c939aa1,
- 0xa8afb6bd,
- 0xc4cbd2d9,
- 0xe0e7eef5,
- 0xfc030a11,
- 0x181f262d,
- 0x343b4249,
- 0x50575e65,
- 0x6c737a81,
- 0x888f969d,
- 0xa4abb2b9,
- 0xc0c7ced5,
- 0xdce3eaf1,
- 0xf8ff060d,
- 0x141b2229,
- 0x30373e45,
- 0x4c535a61,
- 0x686f767d,
- 0x848b9299,
- 0xa0a7aeb5,
- 0xbcc3cad1,
- 0xd8dfe6ed,
- 0xf4fb0209,
- 0x10171e25,
- 0x2c333a41,
- 0x484f565d,
- 0x646b7279
- };
-
- private byte sm4Sbox(byte inch) {
- int i = inch & 0xFF;
- byte retVal = SboxTable[i];
- return retVal;
- }
-
- private long sm4Lt(long ka) {
- long bb = 0L;
- long c = 0L;
- byte[] a = new byte[4];
- byte[] b = new byte[4];
- PUT_ULONG_BE(ka, a, 0);
- b[0] = sm4Sbox(a[0]);
- b[1] = sm4Sbox(a[1]);
- b[2] = sm4Sbox(a[2]);
- b[3] = sm4Sbox(a[3]);
- bb = GET_ULONG_BE(b, 0);
- c = bb ^ ROTL(bb, 2) ^ ROTL(bb, 10) ^ ROTL(bb, 18) ^ ROTL(bb, 24);
- return c;
- }
-
- private long sm4F(long x0, long x1, long x2, long x3, long rk) {
- return x0 ^ sm4Lt(x1 ^ x2 ^ x3 ^ rk);
- }
-
- private long sm4CalciRK(long ka) {
- long bb = 0L;
- long rk = 0L;
- byte[] a = new byte[4];
- byte[] b = new byte[4];
- PUT_ULONG_BE(ka, a, 0);
- b[0] = sm4Sbox(a[0]);
- b[1] = sm4Sbox(a[1]);
- b[2] = sm4Sbox(a[2]);
- b[3] = sm4Sbox(a[3]);
- bb = GET_ULONG_BE(b, 0);
- rk = bb ^ ROTL(bb, 13) ^ ROTL(bb, 23);
- return rk;
- }
-
- private void sm4_setkey(long[] SK, byte[] key) {
- long[] MK = new long[4];
- long[] k = new long[36];
- int i = 0;
- MK[0] = GET_ULONG_BE(key, 0);
- MK[1] = GET_ULONG_BE(key, 4);
- MK[2] = GET_ULONG_BE(key, 8);
- MK[3] = GET_ULONG_BE(key, 12);
- k[0] = MK[0] ^ (long) FK[0];
- k[1] = MK[1] ^ (long) FK[1];
- k[2] = MK[2] ^ (long) FK[2];
- k[3] = MK[3] ^ (long) FK[3];
- for (; i < 32; i++) {
- k[(i + 4)] = (k[i] ^ sm4CalciRK(k[(i + 1)] ^ k[(i + 2)] ^ k[(i + 3)] ^
(long) CK[i]));
- SK[i] = k[(i + 4)];
- }
- }
-
- private void sm4_one_round(long[] sk, byte[] input, byte[] output) {
- int i = 0;
- long[] ulbuf = new long[36];
- ulbuf[0] = GET_ULONG_BE(input, 0);
- ulbuf[1] = GET_ULONG_BE(input, 4);
- ulbuf[2] = GET_ULONG_BE(input, 8);
- ulbuf[3] = GET_ULONG_BE(input, 12);
- while (i < 32) {
- ulbuf[(i + 4)] = sm4F(ulbuf[i], ulbuf[(i + 1)], ulbuf[(i + 2)], ulbuf[(i
+ 3)], sk[i]);
- i++;
- }
- PUT_ULONG_BE(ulbuf[35], output, 0);
- PUT_ULONG_BE(ulbuf[34], output, 4);
- PUT_ULONG_BE(ulbuf[33], output, 8);
- PUT_ULONG_BE(ulbuf[32], output, 12);
- }
-
- private byte[] padding(byte[] input, int mode) {
- if (input == null) {
- return null;
- }
-
- byte[] ret = (byte[]) null;
- if (mode == SM4_ENCRYPT) {
- int p = 16 - input.length % 16;
- ret = new byte[input.length + p];
- System.arraycopy(input, 0, ret, 0, input.length);
- for (int i = 0; i < p; i++) {
- ret[input.length + i] = (byte) p;
- }
- } else {
- int p = input[input.length - 1];
- ret = new byte[input.length - p];
- System.arraycopy(input, 0, ret, 0, input.length - p);
- }
- return ret;
- }
-
- public void sm4_setkey_enc(SM4_Context ctx, byte[] key) {
- if (ctx == null) {
- throw new EncryptException("sm4 ctx is null!");
- }
-
- if (key == null) {
- throw new EncryptException("sm4 key null error!");
- }
- if (key.length != 16) {
- throw new EncryptKeyLengthNotMatchException(key.length, 16);
- }
-
- ctx.mode = SM4_ENCRYPT;
- sm4_setkey(ctx.sk, key);
- }
-
- public void sm4_setkey_dec(SM4_Context ctx, byte[] key) {
- if (ctx == null) {
- throw new EncryptException("sm4 ctx is null!");
- }
-
- if (key == null) {
- throw new EncryptException("sm4 key null error!");
- }
- if (key.length != 16) {
- throw new EncryptKeyLengthNotMatchException(key.length, 16);
- }
-
- int i = 0;
- ctx.mode = SM4_DECRYPT;
- sm4_setkey(ctx.sk, key);
- for (i = 0; i < 16; i++) {
- SWAP(ctx.sk, i);
- }
- }
-
- public byte[] sm4_crypt_ecb(SM4_Context ctx, byte[] input) {
- try {
- if (input == null) {
- throw new EncryptException("sm4 input is null!");
- }
- if ((ctx.isPadding) && (ctx.mode == SM4_ENCRYPT)) {
- input = padding(input, SM4_ENCRYPT);
- }
-
- int length = input.length;
- ByteArrayInputStream bins = new ByteArrayInputStream(input);
- ByteArrayOutputStream bous = new ByteArrayOutputStream();
- for (; length > 0; length -= 16) {
- byte[] in = new byte[16];
- byte[] out = new byte[16];
- bins.read(in);
- sm4_one_round(ctx.sk, in, out);
- bous.write(out);
- }
-
- byte[] output = bous.toByteArray();
- if (ctx.isPadding && ctx.mode == SM4_DECRYPT) {
- output = padding(output, SM4_DECRYPT);
- }
- bins.close();
- bous.close();
- return output;
- } catch (IOException e) {
- throw new EncryptException("sm4 crypt error");
- }
- }
-
- public byte[] sm4_crypt_cbc(SM4_Context ctx, byte[] iv, byte[] input) throws
Exception {
- if (iv == null || iv.length != 16) {
- throw new EncryptException("iv error!");
- }
-
- if (input == null) {
- throw new EncryptException("input is null!");
- }
-
- if (ctx.isPadding && ctx.mode == SM4_ENCRYPT) {
- input = padding(input, SM4_ENCRYPT);
- }
-
- int i = 0;
- int length = input.length;
- ByteArrayInputStream bins = new ByteArrayInputStream(input);
- ByteArrayOutputStream bous = new ByteArrayOutputStream();
- if (ctx.mode == SM4_ENCRYPT) {
- for (; length > 0; length -= 16) {
- byte[] in = new byte[16];
- byte[] out = new byte[16];
- byte[] out1 = new byte[16];
-
- bins.read(in);
- for (i = 0; i < 16; i++) {
- out[i] = ((byte) (in[i] ^ iv[i]));
- }
- sm4_one_round(ctx.sk, out, out1);
- System.arraycopy(out1, 0, iv, 0, 16);
- bous.write(out1);
- }
- } else {
- byte[] temp = new byte[16];
- for (; length > 0; length -= 16) {
- byte[] in = new byte[16];
- byte[] out = new byte[16];
- byte[] out1 = new byte[16];
-
- bins.read(in);
- System.arraycopy(in, 0, temp, 0, 16);
- sm4_one_round(ctx.sk, in, out);
- for (i = 0; i < 16; i++) {
- out1[i] = ((byte) (out[i] ^ iv[i]));
- }
- System.arraycopy(temp, 0, iv, 0, 16);
- bous.write(out1);
- }
- }
-
- byte[] output = bous.toByteArray();
- if (ctx.isPadding && ctx.mode == SM4_DECRYPT) {
- output = padding(output, SM4_DECRYPT);
- }
- bins.close();
- bous.close();
- return output;
- }
-}
diff --git a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4Utils.java
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4Utils.java
deleted file mode 100644
index 8735275e..00000000
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4Utils.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.tsfile.encrypt;
-
-import java.util.Arrays;
-
-public class SM4Utils {
- public byte[] getSecretKey() {
- return secretKey;
- }
-
- public void setSecretKey(byte[] secretKey) {
- this.secretKey = secretKey;
- }
-
- private byte[] secretKey;
-
- public byte[] getIv() {
- return iv;
- }
-
- public void setIv(String iv) {
- this.iv = iv.getBytes();
- }
-
- private byte[] iv;
-
- private SM4_Context ctx;
-
- private SM4 sm4;
-
- public SM4Utils(byte[] key, byte[] iv) {
- this.secretKey = key;
- this.iv = iv;
- this.ctx = new SM4_Context();
- sm4 = new SM4();
- sm4.sm4_setkey_enc(ctx, secretKey);
- }
-
- public byte[] cryptData_CTR(byte[] data) {
- byte[] keyBytes = secretKey;
- byte[] pivBytes = iv;
- byte[] result = new byte[data.length];
- byte[] ivBytes = Arrays.copyOfRange(pivBytes, 0, 16);
- int begin_iv = 0;
- for (int i = 0; i < 4; i++) {
- begin_iv = (begin_iv << 8) | (ivBytes[i] & 0xFF);
- }
- int group_num = data.length / 16;
- for (int i = 0; i < group_num; i++) {
- ivBytes[0] = (byte) ((begin_iv >>> 24) & 0xFF);
- ivBytes[1] = (byte) ((begin_iv >>> 16) & 0xFF);
- ivBytes[2] = (byte) ((begin_iv >>> 8) & 0xFF);
- ivBytes[3] = (byte) (begin_iv & 0xFF);
- byte[] encrypted = sm4.sm4_crypt_ecb(ctx, ivBytes);
- for (int j = 0; j < 16; j++) {
- result[16 * i + j] = (byte) (data[16 * i + j] ^ encrypted[j]);
- }
- begin_iv++;
- }
- if (data.length % 16 != 0) {
- ivBytes[0] = (byte) ((begin_iv >>> 24) & 0xFF);
- ivBytes[1] = (byte) ((begin_iv >>> 16) & 0xFF);
- ivBytes[2] = (byte) ((begin_iv >>> 8) & 0xFF);
- ivBytes[3] = (byte) (begin_iv & 0xFF);
- byte[] encrypted = sm4.sm4_crypt_ecb(ctx, ivBytes);
- for (int j = 0; j < data.length % 16; j++) {
- result[16 * group_num + j] = (byte) (data[16 * group_num + j] ^
encrypted[j]);
- }
- }
- return result;
- }
-}
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/UNENCRYPTED.java
similarity index 66%
rename from java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
rename to java/tsfile/src/main/java/org/apache/tsfile/encrypt/UNENCRYPTED.java
index 53749ccb..e909b062 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/SM4_Context.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/UNENCRYPTED.java
@@ -16,19 +16,28 @@
* specific language governing permissions and limitations
* under the License.
*/
-
package org.apache.tsfile.encrypt;
-public class SM4_Context {
- public int mode;
+public class UNENCRYPTED implements IEncrypt {
+ private byte[] key;
+
+ private final IEncryptor encryptor;
- public long[] sk;
+ private final IDecryptor decryptor;
- public boolean isPadding;
+ public UNENCRYPTED(byte[] key) {
+ this.key = key;
+ encryptor = new NoEncryptor(key);
+ decryptor = new NoDecryptor(key);
+ }
+
+ @Override
+ public IEncryptor getEncryptor() {
+ return encryptor;
+ }
- public SM4_Context() {
- this.mode = 1;
- this.isPadding = false;
- this.sk = new long[32];
+ @Override
+ public IDecryptor getDecryptor() {
+ return decryptor;
}
}
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
index bcf5d134..e57c9cff 100644
---
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
+++
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
@@ -117,10 +117,10 @@ public class TsFileMetadata {
// if the file is not encrypted, set the default value(for compatible
reason)
if (!propertiesMap.containsKey("encryptLevel") ||
propertiesMap.get("encryptLevel") == null) {
propertiesMap.put("encryptLevel", "0");
- propertiesMap.put("encryptType", "UNENCRYPTED");
+ propertiesMap.put("encryptType",
"org.apache.tsfile.encrypt.UNENCRYPTED");
propertiesMap.put("encryptKey", "");
} else if (propertiesMap.get("encryptLevel").equals("0")) {
- propertiesMap.put("encryptType", "UNENCRYPTED");
+ propertiesMap.put("encryptType",
"org.apache.tsfile.encrypt.UNENCRYPTED");
propertiesMap.put("encryptKey", "");
} else if (propertiesMap.get("encryptLevel").equals("1")) {
if (!propertiesMap.containsKey("encryptType")) {
@@ -133,7 +133,7 @@ public class TsFileMetadata {
throw new EncryptException("TsfileMetadata null encryptKey while
encryptLevel is 1");
}
String str = propertiesMap.get("encryptKey");
- fileMetaData.dataEncryptKey = EncryptUtils.getKeyFromStr(str);
+ fileMetaData.dataEncryptKey = EncryptUtils.getSecondKeyFromStr(str);
fileMetaData.encryptType = propertiesMap.get("encryptType");
} else if (propertiesMap.get("encryptLevel").equals("2")) {
if (!propertiesMap.containsKey("encryptType")) {
@@ -150,7 +150,7 @@ public class TsFileMetadata {
TSFileDescriptor.getInstance().getConfig().getEncryptType(),
TSFileDescriptor.getInstance().getConfig().getEncryptKey().getBytes());
String str = propertiesMap.get("encryptKey");
- fileMetaData.dataEncryptKey =
decryptor.decrypt(EncryptUtils.getKeyFromStr(str));
+ fileMetaData.dataEncryptKey =
decryptor.decrypt(EncryptUtils.getSecondKeyFromStr(str));
fileMetaData.encryptType = propertiesMap.get("encryptType");
} else {
throw new EncryptException(
@@ -164,14 +164,14 @@ public class TsFileMetadata {
public IEncryptor getIEncryptor() {
if (dataEncryptKey == null) {
- return IEncryptor.getEncryptor("UNENCRYPTED", null);
+ return IEncryptor.getEncryptor("org.apache.tsfile.encrypt.UNENCRYPTED",
null);
}
return IEncryptor.getEncryptor(encryptType, dataEncryptKey);
}
public IDecryptor getIDecryptor() {
if (dataEncryptKey == null) {
- return IDecryptor.getDecryptor("UNENCRYPTED", null);
+ return IDecryptor.getDecryptor("org.apache.tsfile.encrypt.UNENCRYPTED",
null);
}
return IDecryptor.getDecryptor(encryptType, dataEncryptKey);
}
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/enums/EncryptionType.java
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/enums/EncryptionType.java
index 0e1625dc..f28d4812 100644
---
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/enums/EncryptionType.java
+++
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/enums/EncryptionType.java
@@ -73,7 +73,7 @@ public enum EncryptionType {
/**
* get extension.
*
- * @return extension (string type), for example: SM4128、AES128
+ * @return extension (string type), for example: UNENCRYPTED、AES128
*/
public String getExtension() {
return extensionName;
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
b/java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
index 5af148f0..e341363b 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
@@ -381,7 +381,7 @@ public class TsFileSequenceReader implements AutoCloseable {
readFileMetadata();
} catch (Exception e) {
logger.error("Something error happened while reading file metadata of
file {}", file, e);
- return EncryptUtils.decryptor;
+ return EncryptUtils.encrypt.getDecryptor();
}
return tsFileMetaData.getIDecryptor();
}
@@ -1732,12 +1732,23 @@ public class TsFileSequenceReader implements
AutoCloseable {
}
IUnCompressor unCompressor =
IUnCompressor.getUnCompressor(compressionType);
ByteBuffer uncompressedBuffer = ByteBuffer.allocate(uncompressedSize);
- unCompressor.uncompress(
- buffer.array(),
- buffer.arrayOffset() + buffer.position(),
- buffer.remaining(),
- uncompressedBuffer.array(),
- 0);
+ try {
+ unCompressor.uncompress(
+ buffer.array(),
+ buffer.arrayOffset() + buffer.position(),
+ buffer.remaining(),
+ uncompressedBuffer.array(),
+ 0);
+ } catch (Exception e) {
+ throw new IOException(
+ "Uncompress error! uncompress size: "
+ + uncompressedSize
+ + "compressed size: "
+ + buffer.remaining()
+ + e.getMessage(),
+ e);
+ }
+
return uncompressedBuffer;
}
diff --git a/java/tsfile/src/main/java/org/apache/tsfile/read/common/Chunk.java
b/java/tsfile/src/main/java/org/apache/tsfile/read/common/Chunk.java
index 18709abc..e338ae06 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/read/common/Chunk.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/read/common/Chunk.java
@@ -60,7 +60,7 @@ public class Chunk {
this.chunkData = buffer;
this.deleteIntervalList = deleteIntervalList;
this.chunkStatistic = chunkStatistic;
- this.decryptor = EncryptUtils.decryptor;
+ this.decryptor = EncryptUtils.encrypt.getDecryptor();
}
public Chunk(
@@ -79,7 +79,7 @@ public class Chunk {
public Chunk(ChunkHeader header, ByteBuffer buffer) {
this.chunkHeader = header;
this.chunkData = buffer;
- this.decryptor = EncryptUtils.decryptor;
+ this.decryptor = EncryptUtils.encrypt.getDecryptor();
}
public Chunk(ChunkHeader header, ByteBuffer buffer, IDecryptor decryptor) {
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/read/reader/chunk/ChunkReader.java
b/java/tsfile/src/main/java/org/apache/tsfile/read/reader/chunk/ChunkReader.java
index 87d3c585..0a76e2d9 100644
---
a/java/tsfile/src/main/java/org/apache/tsfile/read/reader/chunk/ChunkReader.java
+++
b/java/tsfile/src/main/java/org/apache/tsfile/read/reader/chunk/ChunkReader.java
@@ -187,7 +187,8 @@ public class ChunkReader extends AbstractChunkReader {
+ pageHeader.getCompressedSize()
+ "page header: "
+ pageHeader
- + e.getMessage());
+ + e.getMessage(),
+ e);
}
compressedPageData.position(compressedPageData.position() +
compressedPageBodyLength);
return ByteBuffer.wrap(uncompressedPageData);
@@ -217,7 +218,8 @@ public class ChunkReader extends AbstractChunkReader {
+ pageHeader.getCompressedSize()
+ "page header: "
+ pageHeader
- + e.getMessage());
+ + e.getMessage(),
+ e);
}
compressedPageData.position(compressedPageData.position() +
compressedPageBodyLength);
return ByteBuffer.wrap(uncompressedPageData);
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/read/reader/page/LazyLoadPageData.java
b/java/tsfile/src/main/java/org/apache/tsfile/read/reader/page/LazyLoadPageData.java
index 481e8812..301d4f0d 100644
---
a/java/tsfile/src/main/java/org/apache/tsfile/read/reader/page/LazyLoadPageData.java
+++
b/java/tsfile/src/main/java/org/apache/tsfile/read/reader/page/LazyLoadPageData.java
@@ -41,7 +41,7 @@ public class LazyLoadPageData {
this.chunkData = data;
this.pageDataOffset = offset;
this.unCompressor = unCompressor;
- this.decryptor = EncryptUtils.decryptor;
+ this.decryptor = EncryptUtils.encrypt.getDecryptor();
}
public LazyLoadPageData(
@@ -55,9 +55,9 @@ public class LazyLoadPageData {
public ByteBuffer uncompressPageData(PageHeader pageHeader) throws
IOException {
int compressedPageBodyLength = pageHeader.getCompressedSize();
byte[] uncompressedPageData = new byte[pageHeader.getUncompressedSize()];
+ byte[] decryptedPageData =
+ decryptor.decrypt(chunkData, pageDataOffset, compressedPageBodyLength);
try {
- byte[] decryptedPageData =
- decryptor.decrypt(chunkData, pageDataOffset,
compressedPageBodyLength);
unCompressor.uncompress(
decryptedPageData, 0, compressedPageBodyLength,
uncompressedPageData, 0);
} catch (Exception e) {
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
b/java/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
index 1733b005..532b01b9 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
@@ -29,7 +29,6 @@ import org.apache.tsfile.exception.write.NoTableException;
import org.apache.tsfile.exception.write.WriteProcessException;
import org.apache.tsfile.file.metadata.IDeviceID;
import org.apache.tsfile.file.metadata.TableSchema;
-import org.apache.tsfile.file.metadata.enums.EncryptionType;
import org.apache.tsfile.read.common.Path;
import org.apache.tsfile.utils.MeasurementGroup;
import org.apache.tsfile.utils.Pair;
@@ -185,7 +184,7 @@ public class TsFileWriter implements AutoCloseable {
String encryptLevel;
byte[] encryptKey;
byte[] dataEncryptKey;
- EncryptionType encryptType;
+ String encryptType;
if (config.getEncryptFlag()) {
encryptLevel = "2";
encryptType = config.getEncryptType();
@@ -202,7 +201,7 @@ public class TsFileWriter implements AutoCloseable {
}
} else {
encryptLevel = "0";
- encryptType = EncryptionType.UNENCRYPTED;
+ encryptType = "org.apache.tsfile.encrypt.UNENCRYPTED";
encryptKey = null;
dataEncryptKey = null;
}
@@ -217,9 +216,9 @@ public class TsFileWriter implements AutoCloseable {
valueStr.deleteCharAt(valueStr.length() - 1);
String str = valueStr.toString();
- fileWriter.setEncryptParam(encryptLevel, encryptType.getExtension(),
str);
+ fileWriter.setEncryptParam(encryptLevel, encryptType, str);
} else {
- fileWriter.setEncryptParam(encryptLevel, encryptType.getExtension(), "");
+ fileWriter.setEncryptParam(encryptLevel, encryptType, "");
}
}
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkGroupWriterImpl.java
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkGroupWriterImpl.java
index 5ffba51b..0c3bb701 100644
---
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkGroupWriterImpl.java
+++
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkGroupWriterImpl.java
@@ -72,7 +72,7 @@ public class AlignedChunkGroupWriterImpl implements
IChunkGroupWriter {
TSEncoding.valueOf(TSFileDescriptor.getInstance().getConfig().getTimeEncoder());
TSDataType timeType =
TSFileDescriptor.getInstance().getConfig().getTimeSeriesDataType();
Encoder encoder =
TSEncodingBuilder.getEncodingBuilder(tsEncoding).getEncoder(timeType);
- this.encryptor = EncryptUtils.encryptor;
+ this.encryptor = EncryptUtils.encrypt.getEncryptor();
timeChunkWriter = new TimeChunkWriter(timeMeasurementId, compressionType,
tsEncoding, encoder);
}
@@ -86,7 +86,8 @@ public class AlignedChunkGroupWriterImpl implements
IChunkGroupWriter {
Encoder encoder =
TSEncodingBuilder.getEncodingBuilder(tsEncoding).getEncoder(timeType);
this.encryptor = encryptor;
timeChunkWriter =
- new TimeChunkWriter(timeMeasurementId, compressionType, tsEncoding,
encoder, encryptor);
+ new TimeChunkWriter(
+ timeMeasurementId, compressionType, tsEncoding, encoder,
this.encryptor);
}
@Override
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkWriterImpl.java
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkWriterImpl.java
index 87fe088a..96385f33 100644
---
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkWriterImpl.java
+++
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkWriterImpl.java
@@ -57,7 +57,7 @@ public class AlignedChunkWriterImpl implements IChunkWriter {
// TestOnly
public AlignedChunkWriterImpl(VectorMeasurementSchema schema) {
- this.encryptor = EncryptUtils.encryptor;
+ this.encryptor = EncryptUtils.encrypt.getEncryptor();
timeChunkWriter =
new TimeChunkWriter(
schema.getMeasurementId(),
@@ -127,7 +127,7 @@ public class AlignedChunkWriterImpl implements IChunkWriter
{
*/
public AlignedChunkWriterImpl(
IMeasurementSchema timeSchema, List<IMeasurementSchema> valueSchemaList)
{
- this.encryptor = EncryptUtils.encryptor;
+ this.encryptor = EncryptUtils.encrypt.getEncryptor();
timeChunkWriter =
new TimeChunkWriter(
timeSchema.getMeasurementId(),
@@ -189,7 +189,7 @@ public class AlignedChunkWriterImpl implements IChunkWriter
{
* @param schemaList value schema list
*/
public AlignedChunkWriterImpl(List<IMeasurementSchema> schemaList) {
- this.encryptor = EncryptUtils.encryptor;
+ this.encryptor = EncryptUtils.encrypt.getEncryptor();
TSEncoding timeEncoding =
TSEncoding.valueOf(TSFileDescriptor.getInstance().getConfig().getTimeEncoder());
TSDataType timeType =
TSFileDescriptor.getInstance().getConfig().getTimeSeriesDataType();
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ChunkWriterImpl.java
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ChunkWriterImpl.java
index e04c7f54..09fa15f2 100644
---
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ChunkWriterImpl.java
+++
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ChunkWriterImpl.java
@@ -103,7 +103,7 @@ public class ChunkWriterImpl implements IChunkWriter {
public ChunkWriterImpl(IMeasurementSchema schema) {
this.measurementSchema = schema;
this.compressor = ICompressor.getCompressor(schema.getCompressor());
- this.encryptor = EncryptUtils.encryptor;
+ this.encryptor = EncryptUtils.encrypt.getEncryptor();
this.pageBuffer = new PublicBAOS();
this.pageSizeThreshold =
TSFileDescriptor.getInstance().getConfig().getPageSizeInByte();
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/NonAlignedChunkGroupWriterImpl.java
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/NonAlignedChunkGroupWriterImpl.java
index 7bbacfe8..c719dd83 100644
---
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/NonAlignedChunkGroupWriterImpl.java
+++
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/NonAlignedChunkGroupWriterImpl.java
@@ -60,7 +60,7 @@ public class NonAlignedChunkGroupWriterImpl implements
IChunkGroupWriter {
public NonAlignedChunkGroupWriterImpl(IDeviceID deviceId) {
this.deviceId = deviceId;
- this.encryptor = EncryptUtils.encryptor;
+ this.encryptor = EncryptUtils.encrypt.getEncryptor();
}
public NonAlignedChunkGroupWriterImpl(IDeviceID deviceId, IEncryptor
encryptor) {
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/TimeChunkWriter.java
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/TimeChunkWriter.java
index 4f04efb3..32e6fbe1 100644
---
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/TimeChunkWriter.java
+++
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/TimeChunkWriter.java
@@ -94,7 +94,7 @@ public class TimeChunkWriter {
this.measurementId = measurementId;
this.encodingType = encodingType;
this.compressionType = compressionType;
- this.encryptor = EncryptUtils.encryptor;
+ this.encryptor = EncryptUtils.encrypt.getEncryptor();
this.pageBuffer = new PublicBAOS();
this.pageSizeThreshold =
TSFileDescriptor.getInstance().getConfig().getPageSizeInByte();
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ValueChunkWriter.java
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ValueChunkWriter.java
index 9ea908b2..87f5b635 100644
---
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ValueChunkWriter.java
+++
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ValueChunkWriter.java
@@ -97,7 +97,7 @@ public class ValueChunkWriter {
this.encodingType = encodingType;
this.dataType = dataType;
this.compressionType = compressionType;
- this.encryptor = EncryptUtils.encryptor;
+ this.encryptor = EncryptUtils.encrypt.getEncryptor();
this.pageBuffer = new PublicBAOS();
this.pageSizeThreshold =
TSFileDescriptor.getInstance().getConfig().getPageSizeInByte();
this.maxNumberOfPointsInPage =
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/write/page/PageWriter.java
b/java/tsfile/src/main/java/org/apache/tsfile/write/page/PageWriter.java
index c89d019f..75ebbd66 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/write/page/PageWriter.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/write/page/PageWriter.java
@@ -80,7 +80,7 @@ public class PageWriter {
this.valueOut = new PublicBAOS();
this.timeEncoder = timeEncoder;
this.valueEncoder = valueEncoder;
- this.encryptor = EncryptUtils.encryptor;
+ this.encryptor = EncryptUtils.encrypt.getEncryptor();
}
public PageWriter(IEncryptor encryptor) {
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/write/page/TimePageWriter.java
b/java/tsfile/src/main/java/org/apache/tsfile/write/page/TimePageWriter.java
index 5faea9d9..3b45b403 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/write/page/TimePageWriter.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/write/page/TimePageWriter.java
@@ -63,7 +63,7 @@ public class TimePageWriter {
this.timeEncoder = timeEncoder;
this.statistics = new TimeStatistics();
this.compressor = compressor;
- this.encryptor = EncryptUtils.encryptor;
+ this.encryptor = EncryptUtils.encrypt.getEncryptor();
}
public TimePageWriter(Encoder timeEncoder, ICompressor compressor,
IEncryptor encryptor) {
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/write/page/ValuePageWriter.java
b/java/tsfile/src/main/java/org/apache/tsfile/write/page/ValuePageWriter.java
index 1daed419..629ed51b 100644
---
a/java/tsfile/src/main/java/org/apache/tsfile/write/page/ValuePageWriter.java
+++
b/java/tsfile/src/main/java/org/apache/tsfile/write/page/ValuePageWriter.java
@@ -76,7 +76,7 @@ public class ValuePageWriter {
this.valueEncoder = valueEncoder;
this.statistics = Statistics.getStatsByType(dataType);
this.compressor = compressor;
- this.encryptor = EncryptUtils.encryptor;
+ this.encryptor = EncryptUtils.encrypt.getEncryptor();
}
public ValuePageWriter(
diff --git
a/java/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java
b/java/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java
index 0de54052..672fbb8e 100644
---
a/java/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java
+++
b/java/tsfile/src/main/java/org/apache/tsfile/write/writer/TsFileIOWriter.java
@@ -125,14 +125,24 @@ public class TsFileIOWriter implements AutoCloseable {
private boolean generateTableSchema = false;
- protected String encryptLevel = "0";
+ protected String encryptLevel;
- protected String encryptType = "UNENCRYPTED";
+ protected String encryptType;
- protected String encryptKey = null;
+ protected String encryptKey;
/** empty construct function. */
- protected TsFileIOWriter() {}
+ protected TsFileIOWriter() {
+ if (TS_FILE_CONFIG.getEncryptFlag()) {
+ this.encryptLevel = "2";
+ this.encryptType = TS_FILE_CONFIG.getEncryptType();
+ this.encryptKey = EncryptUtils.normalKeyStr;
+ } else {
+ this.encryptLevel = "0";
+ this.encryptType = "org.apache.tsfile.encrypt.UNENCRYPTED";
+ this.encryptKey = null;
+ }
+ }
/**
* for writing a new tsfile.
@@ -153,11 +163,11 @@ public class TsFileIOWriter implements AutoCloseable {
}
if (conf.getEncryptFlag()) {
this.encryptLevel = "2";
- this.encryptType = conf.getEncryptType().getExtension();
+ this.encryptType = conf.getEncryptType();
this.encryptKey = EncryptUtils.normalKeyStr;
} else {
this.encryptLevel = "0";
- this.encryptType = "UNENCRYPTED";
+ this.encryptType = "org.apache.tsfile.encrypt.UNENCRYPTED";
this.encryptKey = null;
}
startFile();
@@ -172,11 +182,11 @@ public class TsFileIOWriter implements AutoCloseable {
this.out = output;
if (TS_FILE_CONFIG.getEncryptFlag()) {
this.encryptLevel = "2";
- this.encryptType = TS_FILE_CONFIG.getEncryptType().getExtension();
+ this.encryptType = TS_FILE_CONFIG.getEncryptType();
this.encryptKey = EncryptUtils.normalKeyStr;
} else {
this.encryptLevel = "0";
- this.encryptType = "UNENCRYPTED";
+ this.encryptType = "org.apache.tsfile.encrypt.UNENCRYPTED";
this.encryptKey = null;
}
startFile();
diff --git
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128Test.java
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128Test.java
index c0d91571..21d8d804 100644
--- a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128Test.java
+++ b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128Test.java
@@ -49,11 +49,11 @@ public class AES128Test {
String input = randomString(2000000);
byte[] unencrypted = input.getBytes(StandardCharsets.UTF_8);
long time = System.currentTimeMillis();
- IEncryptor encryptor = new
IEncryptor.AES128Encryptor(key.getBytes(StandardCharsets.UTF_8));
+ IEncryptor encryptor = new
AES128Encryptor(key.getBytes(StandardCharsets.UTF_8));
byte[] encrypted = encryptor.encrypt(unencrypted);
System.out.println("encryption time cost:" + (System.currentTimeMillis() -
time));
time = System.currentTimeMillis();
- IDecryptor decryptor = new
IDecryptor.AES128Decryptor(key.getBytes(StandardCharsets.UTF_8));
+ IDecryptor decryptor = new
AES128Decryptor(key.getBytes(StandardCharsets.UTF_8));
byte[] decrypted = decryptor.decrypt(encrypted);
System.out.println("decryption time cost:" + (System.currentTimeMillis() -
time));
Assert.assertArrayEquals(unencrypted, decrypted);
@@ -64,13 +64,26 @@ public class AES128Test {
String input = randomString(500000);
byte[] unencrypted = input.getBytes(StandardCharsets.UTF_8);
long time = System.currentTimeMillis();
- IEncryptor encryptor = new
IEncryptor.AES128Encryptor(key.getBytes(StandardCharsets.UTF_8));
+ IEncryptor encryptor = new
AES128Encryptor(key.getBytes(StandardCharsets.UTF_8));
byte[] encrypted = encryptor.encrypt(unencrypted, 0, unencrypted.length);
System.out.println("encryption time cost:" + (System.currentTimeMillis() -
time));
time = System.currentTimeMillis();
- IDecryptor decryptor = new
IDecryptor.AES128Decryptor(key.getBytes(StandardCharsets.UTF_8));
+ IDecryptor decryptor = new
AES128Decryptor(key.getBytes(StandardCharsets.UTF_8));
byte[] decrypted = decryptor.decrypt(encrypted, 0, encrypted.length);
System.out.println("decryption time cost:" + (System.currentTimeMillis() -
time));
Assert.assertArrayEquals(unencrypted, decrypted);
}
+
+ @Test
+ public void testBytes3() throws IOException {
+ byte[] unencrypted = new byte[71];
+ long time = System.currentTimeMillis();
+ IEncryptor encryptor = new
AES128Encryptor(key.getBytes(StandardCharsets.UTF_8));
+ byte[] encrypted = encryptor.encrypt(unencrypted, 0, 35);
+ System.out.println("encryption time cost:" + (System.currentTimeMillis() -
time));
+ time = System.currentTimeMillis();
+ IDecryptor decryptor = new
AES128Decryptor(key.getBytes(StandardCharsets.UTF_8));
+ byte[] decrypted = decryptor.decrypt(encrypted);
+ System.out.println("decryption time cost:" + (System.currentTimeMillis() -
time));
+ }
}
diff --git
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileReadWriteTest.java
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileReadWriteTest.java
index bc1d1220..116cfd4f 100644
---
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileReadWriteTest.java
+++
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileReadWriteTest.java
@@ -66,7 +66,7 @@ public class AES128TsFileReadWriteTest {
@Before
public void setUp() {
conf.setEncryptFlag("true");
- conf.setEncryptType("AES128");
+ conf.setEncryptType("org.apache.tsfile.encrypt.AES128");
conf.setEncryptKey("thisisourtestkey");
f = new File(path);
if (f.exists()) {
@@ -80,7 +80,7 @@ public class AES128TsFileReadWriteTest {
@After
public void tearDown() {
conf.setEncryptKey("abcdefghijklmnop");
- conf.setEncryptType("UNENCRYPTED");
+ conf.setEncryptType("org.apache.tsfile.encrypt.UNENCRYPTED");
conf.setEncryptFlag("false");
f = new File(path);
if (f.exists()) {
diff --git
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileWriteTest.java
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileWriteTest.java
index 640f355b..181f8767 100644
---
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileWriteTest.java
+++
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileWriteTest.java
@@ -86,7 +86,7 @@ public class AES128TsFileWriteTest {
prePageCheckThres = conf.getPageCheckSizeThreshold();
conf.setPageCheckSizeThreshold(0);
conf.setEncryptFlag("true");
- conf.setEncryptType("AES128");
+ conf.setEncryptType("org.apache.tsfile.encrypt.AES128");
conf.setEncryptKey("thisisourtestkey");
try {
@@ -139,7 +139,7 @@ public class AES128TsFileWriteTest {
conf.setPageSizeInByte(prePageSize);
conf.setPageCheckSizeThreshold(prePageCheckThres);
conf.setEncryptKey("abcdefghijklmnop");
- conf.setEncryptType("UNENCRYPTED");
+ conf.setEncryptType("org.apache.tsfile.encrypt.UNENCRYPTED");
conf.setEncryptFlag("false");
File file = new File(inputDataFile);
if (file.exists()) {
diff --git
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/EncryptTest.java
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/EncryptTest.java
index 95448726..dd2a6845 100644
--- a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/EncryptTest.java
+++ b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/EncryptTest.java
@@ -43,8 +43,8 @@ public class EncryptTest {
@Test
public void NoEncryptorTest() throws IOException {
- IEncryptor encryptor = new IEncryptor.NoEncryptor();
- IDecryptor decryptor = new IDecryptor.NoDecryptor();
+ IEncryptor encryptor = new
NoEncryptor(key.getBytes(StandardCharsets.UTF_8));
+ IDecryptor decryptor = new
NoDecryptor(key.getBytes(StandardCharsets.UTF_8));
byte[] encrypted =
encryptor.encrypt(inputString.getBytes(StandardCharsets.UTF_8));
byte[] decrypted = decryptor.decrypt(encrypted);
@@ -53,9 +53,9 @@ public class EncryptTest {
}
@Test
- public void SM4128Test() throws IOException {
- IEncryptor encryptor = new
IEncryptor.SM4128Encryptor(key.getBytes(StandardCharsets.UTF_8));
- IDecryptor decryptor = new
IDecryptor.SM4128Decryptor(key.getBytes(StandardCharsets.UTF_8));
+ public void AES128Test() throws IOException {
+ IEncryptor encryptor = new
AES128Encryptor(key.getBytes(StandardCharsets.UTF_8));
+ IDecryptor decryptor = new
AES128Decryptor(key.getBytes(StandardCharsets.UTF_8));
byte[] encrypted =
encryptor.encrypt(inputString.getBytes(StandardCharsets.UTF_8));
byte[] decrypted = decryptor.decrypt(encrypted);
@@ -64,11 +64,11 @@ public class EncryptTest {
}
@Test
- public void SM4128Test1() throws IOException {
+ public void AES128Test1() throws IOException {
PublicBAOS out = new PublicBAOS();
out.write(inputString.getBytes(StandardCharsets.UTF_8));
- IEncryptor encryptor = new
IEncryptor.SM4128Encryptor(key.getBytes(StandardCharsets.UTF_8));
- IDecryptor decryptor = new
IDecryptor.SM4128Decryptor(key.getBytes(StandardCharsets.UTF_8));
+ IEncryptor encryptor = new
AES128Encryptor(key.getBytes(StandardCharsets.UTF_8));
+ IDecryptor decryptor = new
AES128Decryptor(key.getBytes(StandardCharsets.UTF_8));
byte[] encrypted = encryptor.encrypt(out.getBuf(), 0, out.size());
byte[] decrypted = decryptor.decrypt(encrypted);
@@ -77,9 +77,13 @@ public class EncryptTest {
}
@Test
- public void AES128Test() throws IOException {
- IEncryptor encryptor = new
IEncryptor.AES128Encryptor(key.getBytes(StandardCharsets.UTF_8));
- IDecryptor decryptor = new
IDecryptor.AES128Decryptor(key.getBytes(StandardCharsets.UTF_8));
+ public void AES128Test3() throws IOException {
+ IEncryptor encryptor =
+ IEncryptor.getEncryptor(
+ "org.apache.tsfile.encrypt.AES128",
key.getBytes(StandardCharsets.UTF_8));
+ IDecryptor decryptor =
+ IDecryptor.getDecryptor(
+ "org.apache.tsfile.encrypt.AES128",
key.getBytes(StandardCharsets.UTF_8));
byte[] encrypted =
encryptor.encrypt(inputString.getBytes(StandardCharsets.UTF_8));
byte[] decrypted = decryptor.decrypt(encrypted);
@@ -87,35 +91,28 @@ public class EncryptTest {
assertEquals(inputString, result);
}
- @Test
- public void AES128Test1() throws IOException {
- PublicBAOS out = new PublicBAOS();
- out.write(inputString.getBytes(StandardCharsets.UTF_8));
- IEncryptor encryptor = new
IEncryptor.AES128Encryptor(key.getBytes(StandardCharsets.UTF_8));
- IDecryptor decryptor = new
IDecryptor.AES128Decryptor(key.getBytes(StandardCharsets.UTF_8));
- byte[] encrypted = encryptor.encrypt(out.getBuf(), 0, out.size());
- byte[] decrypted = decryptor.decrypt(encrypted);
-
- String result = new String(decrypted, StandardCharsets.UTF_8);
- assertEquals(inputString, result);
- }
-
@Test
public void GetEncryptorTest() {
- IEncryptor encryptor = IEncryptor.getEncryptor("AES128",
key.getBytes(StandardCharsets.UTF_8));
+ IEncryptor encryptor =
+ IEncryptor.getEncryptor(
+ "org.apache.tsfile.encrypt.AES128",
key.getBytes(StandardCharsets.UTF_8));
assertEquals(encryptor.getEncryptionType(), EncryptionType.AES128);
IEncryptor encryptor2 =
- IEncryptor.getEncryptor(EncryptionType.AES128,
key.getBytes(StandardCharsets.UTF_8));
- assertEquals(encryptor2.getEncryptionType(), EncryptionType.AES128);
+ IEncryptor.getEncryptor(
+ "org.apache.tsfile.encrypt.UNENCRYPTED",
key.getBytes(StandardCharsets.UTF_8));
+ assertEquals(encryptor2.getEncryptionType(), EncryptionType.UNENCRYPTED);
}
@Test
- public void GetEncryptorTest2() {
- IEncryptor encryptor = IEncryptor.getEncryptor("SM4128",
key.getBytes(StandardCharsets.UTF_8));
- assertEquals(encryptor.getEncryptionType(), EncryptionType.SM4128);
+ public void GetDecryptorTest() {
+ IEncryptor encryptor =
+ IEncryptor.getEncryptor(
+ "org.apache.tsfile.encrypt.AES128",
key.getBytes(StandardCharsets.UTF_8));
+ assertEquals(encryptor.getEncryptionType(), EncryptionType.AES128);
IEncryptor encryptor2 =
- IEncryptor.getEncryptor(EncryptionType.SM4128,
key.getBytes(StandardCharsets.UTF_8));
- assertEquals(encryptor2.getEncryptionType(), EncryptionType.SM4128);
+ IEncryptor.getEncryptor(
+ "org.apache.tsfile.encrypt.UNENCRYPTED",
key.getBytes(StandardCharsets.UTF_8));
+ assertEquals(encryptor2.getEncryptionType(), EncryptionType.UNENCRYPTED);
}
@Test
diff --git
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/SM4128Test.java
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/SM4128Test.java
deleted file mode 100644
index af1ddbcb..00000000
--- a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/SM4128Test.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tsfile.encrypt;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.util.concurrent.ThreadLocalRandom;
-
-public class SM4128Test {
- private final String key = "mkmkmkmkmkmkmkmk";
-
- private String randomString(int length) {
- StringBuilder builder = new StringBuilder(length);
- for (int i = 0; i < length; i++) {
- builder.append((char) (ThreadLocalRandom.current().nextInt(33, 128)));
- }
- return builder.toString();
- }
-
- @Before
- public void setUp() {}
-
- @After
- public void tearDown() {}
-
- @Test
- public void testBytes1() throws IOException {
- String input = randomString(2000000);
- byte[] unencrypted = input.getBytes(StandardCharsets.UTF_8);
- long time = System.currentTimeMillis();
- IEncryptor encryptor = new
IEncryptor.SM4128Encryptor(key.getBytes(StandardCharsets.UTF_8));
- byte[] encrypted = encryptor.encrypt(unencrypted);
- System.out.println("encryption time cost:" + (System.currentTimeMillis() -
time));
- time = System.currentTimeMillis();
- IDecryptor decryptor = new
IDecryptor.SM4128Decryptor(key.getBytes(StandardCharsets.UTF_8));
- byte[] decrypted = decryptor.decrypt(encrypted);
- System.out.println("decryption time cost:" + (System.currentTimeMillis() -
time));
- Assert.assertArrayEquals(unencrypted, decrypted);
- }
-
- @Test
- public void testBytes2() throws IOException {
- String input = randomString(500000);
- byte[] unencrypted = input.getBytes(StandardCharsets.UTF_8);
- long time = System.currentTimeMillis();
- IEncryptor encryptor = new
IEncryptor.SM4128Encryptor(key.getBytes(StandardCharsets.UTF_8));
- byte[] encrypted = encryptor.encrypt(unencrypted, 0, unencrypted.length);
- System.out.println("encryption time cost:" + (System.currentTimeMillis() -
time));
- time = System.currentTimeMillis();
- IDecryptor decryptor = new
IDecryptor.SM4128Decryptor(key.getBytes(StandardCharsets.UTF_8));
- byte[] decrypted = decryptor.decrypt(encrypted, 0, encrypted.length);
- System.out.println("decryption time cost:" + (System.currentTimeMillis() -
time));
- Assert.assertArrayEquals(unencrypted, decrypted);
- }
-}
diff --git
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/SM4128TsFileReadWriteTest.java
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/SM4128TsFileReadWriteTest.java
deleted file mode 100644
index f2570707..00000000
---
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/SM4128TsFileReadWriteTest.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tsfile.encrypt;
-
-import org.apache.tsfile.common.conf.TSFileConfig;
-import org.apache.tsfile.common.conf.TSFileDescriptor;
-import org.apache.tsfile.enums.TSDataType;
-import org.apache.tsfile.exception.write.WriteProcessException;
-import org.apache.tsfile.file.metadata.IDeviceID;
-import org.apache.tsfile.file.metadata.enums.TSEncoding;
-import org.apache.tsfile.read.TsFileReader;
-import org.apache.tsfile.read.TsFileSequenceReader;
-import org.apache.tsfile.read.common.Field;
-import org.apache.tsfile.read.common.Path;
-import org.apache.tsfile.read.common.RowRecord;
-import org.apache.tsfile.read.expression.QueryExpression;
-import org.apache.tsfile.read.query.dataset.QueryDataSet;
-import org.apache.tsfile.utils.TsFileGeneratorForTest;
-import org.apache.tsfile.write.TsFileWriter;
-import org.apache.tsfile.write.record.TSRecord;
-import org.apache.tsfile.write.record.datapoint.DataPoint;
-import org.apache.tsfile.write.record.datapoint.DoubleDataPoint;
-import org.apache.tsfile.write.record.datapoint.FloatDataPoint;
-import org.apache.tsfile.write.record.datapoint.IntDataPoint;
-import org.apache.tsfile.write.record.datapoint.LongDataPoint;
-import org.apache.tsfile.write.schema.MeasurementSchema;
-import org.apache.tsfile.write.schema.Schema;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-public class SM4128TsFileReadWriteTest {
- private final double delta = 0.0000001;
- private final String path =
TsFileGeneratorForTest.getTestTsFilePath("root.sg1", 0, 0, 1);
- private File f;
- private final IDeviceID deviceID =
IDeviceID.Factory.DEFAULT_FACTORY.create("device_1");
-
- private TSFileConfig conf = TSFileDescriptor.getInstance().getConfig();
-
- @Before
- public void setUp() {
- conf.setEncryptFlag("true");
- conf.setEncryptType("SM4128");
- conf.setEncryptKey("thisisourtestkey");
- f = new File(path);
- if (f.exists()) {
- assertTrue(f.delete());
- }
- if (!f.getParentFile().exists()) {
- assertTrue(f.getParentFile().mkdirs());
- }
- }
-
- @After
- public void tearDown() {
- conf.setEncryptKey("abcdefghijklmnop");
- conf.setEncryptType("UNENCRYPTED");
- conf.setEncryptFlag("false");
- f = new File(path);
- if (f.exists()) {
- assertTrue(f.delete());
- }
- }
-
- @Test
- public void intTest() throws IOException, WriteProcessException {
- List<TSEncoding> encodings =
- Arrays.asList(
- TSEncoding.PLAIN,
- TSEncoding.RLE,
- TSEncoding.TS_2DIFF,
- TSEncoding.REGULAR,
- TSEncoding.GORILLA,
- TSEncoding.ZIGZAG);
- for (TSEncoding encoding : encodings) {
- intTest(encoding);
- }
- }
-
- private void intTest(TSEncoding encoding) throws IOException,
WriteProcessException {
- writeDataByTSRecord(TSDataType.INT32, (i) -> new IntDataPoint("sensor_1",
(int) i), encoding);
- readData((i, field, delta) -> assertEquals(i, field.getIntV()));
- }
-
- @Test
- public void longTest() throws IOException, WriteProcessException {
- List<TSEncoding> encodings =
- Arrays.asList(
- TSEncoding.PLAIN,
- TSEncoding.RLE,
- TSEncoding.TS_2DIFF,
- TSEncoding.REGULAR,
- TSEncoding.GORILLA);
- for (TSEncoding encoding : encodings) {
- longTest(encoding);
- }
- }
-
- public void longTest(TSEncoding encoding) throws IOException,
WriteProcessException {
- writeDataByTSRecord(TSDataType.INT64, (i) -> new LongDataPoint("sensor_1",
i), encoding);
- readData((i, field, delta) -> assertEquals(i, field.getLongV()));
- }
-
- @Test
- public void floatTest() throws IOException, WriteProcessException {
- List<TSEncoding> encodings =
- Arrays.asList(
- TSEncoding.PLAIN,
- TSEncoding.RLE,
- TSEncoding.TS_2DIFF,
- TSEncoding.GORILLA_V1,
- TSEncoding.GORILLA);
- for (TSEncoding encoding : encodings) {
- floatTest(encoding);
- }
- }
-
- public void floatTest(TSEncoding encoding) throws IOException,
WriteProcessException {
- writeDataByTSRecord(
- TSDataType.FLOAT, (i) -> new FloatDataPoint("sensor_1", (float) i),
encoding);
- readData((i, field, delta) -> assertEquals(i, field.getFloatV(), delta));
- }
-
- @Test
- public void doubleTest() throws IOException, WriteProcessException {
- List<TSEncoding> encodings =
- Arrays.asList(
- TSEncoding.PLAIN,
- TSEncoding.RLE,
- TSEncoding.TS_2DIFF,
- TSEncoding.GORILLA_V1,
- TSEncoding.GORILLA);
- for (TSEncoding encoding : encodings) {
- doubleTest(encoding);
- }
- }
-
- public void doubleTest(TSEncoding encoding) throws IOException,
WriteProcessException {
- writeDataByTSRecord(
- TSDataType.DOUBLE, (i) -> new DoubleDataPoint("sensor_1", (double) i),
encoding);
- readData((i, field, delta) -> assertEquals(i, field.getDoubleV(), delta));
- }
-
- // If no dataPoint in "device_1.sensor_2", it will throws a nomeasurement
- // exception,
- // cause no schema in tsfilemetadata anymore.
- @Test
- public void readEmptyMeasurementTest() throws IOException,
WriteProcessException {
- try (TsFileWriter tsFileWriter = new TsFileWriter(f, new Schema(), conf)) {
- // add measurements into file schema
- tsFileWriter.registerTimeseries(
- new Path(deviceID), new MeasurementSchema("sensor_1",
TSDataType.FLOAT, TSEncoding.RLE));
- tsFileWriter.registerTimeseries(
- new Path(deviceID),
- new MeasurementSchema("sensor_2", TSDataType.INT32,
TSEncoding.TS_2DIFF));
- // construct TSRecord
- TSRecord tsRecord = new TSRecord(1, deviceID);
- DataPoint dPoint1 = new FloatDataPoint("sensor_1", 1.2f);
- tsRecord.addTuple(dPoint1);
- // write a TSRecord to TsFile
- tsFileWriter.write(tsRecord);
- }
-
- // read example : no filter
- TsFileSequenceReader reader = new TsFileSequenceReader(path);
- TsFileReader readTsFile = new TsFileReader(reader);
- ArrayList<Path> paths = new ArrayList<>();
- paths.add(new Path(deviceID, "sensor_2", true));
- QueryExpression queryExpression = QueryExpression.create(paths, null);
- try {
- QueryDataSet queryDataSet = readTsFile.query(queryExpression);
- } catch (IOException e) {
- // Assert.fail();
- } finally {
- reader.close();
- }
-
- assertTrue(f.delete());
- }
-
- @Test
- public void readMeasurementWithRegularEncodingTest() throws IOException,
WriteProcessException {
- TSFileDescriptor.getInstance().getConfig().setTimeEncoder("REGULAR");
- writeDataByTSRecord(
- TSDataType.INT64, (i) -> new LongDataPoint("sensor_1", i),
TSEncoding.REGULAR);
- readData((i, field, delta) -> assertEquals(i, field.getLongV()));
- TSFileDescriptor.getInstance().getConfig().setTimeEncoder("TS_2DIFF");
- }
-
- private void writeDataByTSRecord(
- TSDataType dataType, SM4128TsFileReadWriteTest.DataPointProxy proxy,
TSEncoding encodingType)
- throws IOException, WriteProcessException {
- int floatCount = 1024 * 1024 * 13 + 1023;
- // add measurements into file schema
- try (TsFileWriter tsFileWriter = new TsFileWriter(f, new Schema(), conf)) {
- tsFileWriter.registerTimeseries(
- new Path(deviceID), new MeasurementSchema("sensor_1", dataType,
encodingType));
- for (long i = 1; i < floatCount; i++) {
- // construct TSRecord
- TSRecord tsRecord = new TSRecord(i, deviceID);
- DataPoint dPoint1 = proxy.generateOne(i);
- tsRecord.addTuple(dPoint1);
- // write a TSRecord to TsFile
- tsFileWriter.write(tsRecord);
- }
- }
- }
-
- private void readData(SM4128TsFileReadWriteTest.ReadDataPointProxy proxy)
throws IOException {
- TsFileSequenceReader reader = new TsFileSequenceReader(path);
- TsFileReader readTsFile = new TsFileReader(reader);
- ArrayList<Path> paths = new ArrayList<>();
- paths.add(new Path(deviceID, "sensor_1", true));
- QueryExpression queryExpression = QueryExpression.create(paths, null);
-
- QueryDataSet queryDataSet = readTsFile.query(queryExpression);
- for (int j = 0; j < paths.size(); j++) {
- assertEquals(paths.get(j), queryDataSet.getPaths().get(j));
- }
- int i = 1;
- while (queryDataSet.hasNext()) {
- RowRecord r = queryDataSet.next();
- assertEquals(i, r.getTimestamp());
- proxy.assertEqualProxy(i, r.getFields().get(0), delta);
- i++;
- }
- reader.close();
- }
-
- private interface DataPointProxy {
-
- DataPoint generateOne(long value);
- }
-
- private interface ReadDataPointProxy {
-
- void assertEqualProxy(long i, Field field, double delta);
- }
-}
diff --git
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/SM4128TsFileWriteTest.java
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/SM4128TsFileWriteTest.java
deleted file mode 100644
index 795085bf..00000000
---
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/SM4128TsFileWriteTest.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tsfile.encrypt;
-
-import org.apache.tsfile.common.conf.TSFileConfig;
-import org.apache.tsfile.common.conf.TSFileDescriptor;
-import org.apache.tsfile.common.constant.JsonFormatConstant;
-import org.apache.tsfile.constant.TestConstant;
-import org.apache.tsfile.enums.TSDataType;
-import org.apache.tsfile.exception.write.WriteProcessException;
-import org.apache.tsfile.file.metadata.TsFileMetadata;
-import org.apache.tsfile.file.metadata.enums.TSEncoding;
-import org.apache.tsfile.read.TsFileSequenceReader;
-import org.apache.tsfile.read.common.Path;
-import org.apache.tsfile.utils.RecordUtils;
-import org.apache.tsfile.utils.StringContainer;
-import org.apache.tsfile.write.TsFileWriter;
-import org.apache.tsfile.write.WriteTest;
-import org.apache.tsfile.write.record.TSRecord;
-import org.apache.tsfile.write.schema.IMeasurementSchema;
-import org.apache.tsfile.write.schema.MeasurementSchema;
-import org.apache.tsfile.write.schema.Schema;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Random;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-public class SM4128TsFileWriteTest {
- private static final Logger LOG = LoggerFactory.getLogger(WriteTest.class);
- private final int ROW_COUNT = 2000000;
- private TsFileWriter tsFileWriter;
- private String inputDataFile;
- private String outputDataFile;
- private String errorOutputDataFile;
- private Random rm = new Random();
- private ArrayList<IMeasurementSchema> measurementArray;
- private ArrayList<Path> pathArray;
- private Schema schema;
- private int stageSize = 4;
- private int stageState = -1;
- private int prePageSize;
- private int prePageCheckThres;
- private TSFileConfig conf = TSFileDescriptor.getInstance().getConfig();
-
- private String[][] stageDeviceIds = {{"d1", "d2", "d3"}, {"d1"}, {"d2",
"d3"}};
- private String[] measurementIds = {"s0", "s1", "s2", "s3", "s4", "s5"};
- private long longBase = System.currentTimeMillis() * 1000;
- private String[] enums = {"MAN", "WOMAN"};
-
- @Before
- public void prepare() throws IOException {
- inputDataFile = TestConstant.BASE_OUTPUT_PATH.concat("writeTestInputData");
- outputDataFile =
TestConstant.BASE_OUTPUT_PATH.concat("writeTestOutputData.tsfile");
- errorOutputDataFile =
TestConstant.BASE_OUTPUT_PATH.concat("writeTestErrorOutputData.tsfile");
- // for each row, flush page forcely
- prePageSize = conf.getPageSizeInByte();
- conf.setPageSizeInByte(0);
- prePageCheckThres = conf.getPageCheckSizeThreshold();
- conf.setPageCheckSizeThreshold(0);
- conf.setEncryptFlag("true");
- conf.setEncryptType("SM4128");
- conf.setEncryptKey("thisisourtestkey");
-
- try {
- generateSampleInputDataFile();
- } catch (IOException e) {
- fail();
- }
- File file = new File(outputDataFile);
- File errorFile = new File(errorOutputDataFile);
- if (file.exists()) {
- file.delete();
- }
- if (errorFile.exists()) {
- errorFile.delete();
- }
- measurementArray = new ArrayList<>();
- measurementArray.add(new MeasurementSchema("s0", TSDataType.INT32,
TSEncoding.RLE));
- measurementArray.add(new MeasurementSchema("s1", TSDataType.INT64,
TSEncoding.TS_2DIFF));
- HashMap<String, String> props = new HashMap<>();
- props.put("max_point_number", "2");
- measurementArray.add(
- new MeasurementSchema(
- "s2",
- TSDataType.FLOAT,
- TSEncoding.RLE,
- TSFileDescriptor.getInstance().getConfig().getCompressor(),
- props));
- props = new HashMap<>();
- props.put("max_point_number", "3");
- measurementArray.add(
- new MeasurementSchema(
- "s3",
- TSDataType.DOUBLE,
- TSEncoding.TS_2DIFF,
- TSFileDescriptor.getInstance().getConfig().getCompressor(),
- props));
- measurementArray.add(new MeasurementSchema("s4", TSDataType.BOOLEAN,
TSEncoding.PLAIN));
- pathArray = new ArrayList<>();
- for (int i = 0; i < 5; i++) {
- pathArray.add(new Path("d1", "s" + i, true));
- }
- schema = new Schema();
- LOG.info(schema.toString());
- tsFileWriter = new TsFileWriter(file, schema, conf);
- }
-
- @After
- public void after() {
- conf.setPageSizeInByte(prePageSize);
- conf.setPageCheckSizeThreshold(prePageCheckThres);
- conf.setEncryptKey("abcdefghijklmnop");
- conf.setEncryptType("UNENCRYPTED");
- conf.setEncryptFlag("false");
- File file = new File(inputDataFile);
- if (file.exists()) {
- file.delete();
- }
- file = new File(outputDataFile);
- if (file.exists()) {
- file.delete();
- }
- file = new File(errorOutputDataFile);
- if (file.exists()) {
- file.delete();
- }
- }
-
- private void generateSampleInputDataFile() throws IOException {
- File file = new File(inputDataFile);
- if (file.exists()) {
- file.delete();
- }
- FileWriter fw = new FileWriter(file);
-
- long startTime = System.currentTimeMillis();
- startTime = startTime - startTime % 1000;
-
- // first stage:int, long, float, double, boolean, enums
- try {
- for (int i = 0; i < ROW_COUNT; i++) {
- // write d1
- String d1 = "d1," + (startTime + i) + ",s1," + (i * 10 + 1) + ",s2," +
(i * 10 + 2);
- if (rm.nextInt(1000) < 100) {
- d1 = "d1," + (startTime + i) + ",s1,,s2," + (i * 10 + 2) +
",s4,HIGH";
- }
- if (i % 5 == 0) {
- d1 += ",s3," + (i * 10 + 3);
- }
- fw.write(d1 + "\r\n");
-
- // write d2
- String d2 = "d2," + (startTime + i) + ",s2," + (i * 10 + 2) + ",s3," +
(i * 10 + 3);
- if (rm.nextInt(1000) < 100) {
- d2 = "d2," + (startTime + i) + ",s2,,s3," + (i * 10 + 3) + ",s5,MAN";
- }
- if (i % 5 == 0) {
- d2 += ",s1," + (i * 10 + 1);
- }
- fw.write(d2 + "\r\n");
- }
- // write error
- String d =
- "d2,3,"
- + (startTime + ROW_COUNT)
- + ",s2,"
- + (ROW_COUNT * 10 + 2)
- + ",s3,"
- + (ROW_COUNT * 10 + 3);
- fw.write(d + "\r\n");
- d = "d2," + (startTime + ROW_COUNT + 1) + ",2,s-1," + (ROW_COUNT * 10 +
2);
- fw.write(d + "\r\n");
- } finally {
- fw.close();
- }
- }
-
- @Test
- public void writeTest() throws IOException {
- try {
- write();
- } catch (WriteProcessException e) {
- e.printStackTrace();
- }
- LOG.info("write processing has finished");
- TsFileSequenceReader reader = new TsFileSequenceReader(outputDataFile);
- TsFileMetadata metaData = reader.readFileMetadata();
- }
-
- public void write() throws IOException, WriteProcessException {
- long lineCount = 0;
- long startTime = System.currentTimeMillis();
- String[] strings;
- // add all measurement except the last one at before writing
- for (int i = 0; i < measurementArray.size() - 1; i++) {
- tsFileWriter.registerTimeseries(
- new Path(pathArray.get(i).getIDeviceID()), measurementArray.get(i));
- }
- while (true) {
- if (lineCount % stageSize == 0) {
- LOG.info(
- "write line:{},use time:{}s",
- lineCount,
- (System.currentTimeMillis() - startTime) / 1000);
- stageState++;
- LOG.info("stage:" + stageState);
- if (stageState == stageDeviceIds.length) {
- break;
- }
- }
- if (lineCount == ROW_COUNT / 2) {
- tsFileWriter.registerTimeseries(
- new Path(pathArray.get(measurementArray.size() -
1).getIDeviceID()),
- measurementArray.get(measurementArray.size() - 1));
- }
- strings = getNextRecord(lineCount, stageState);
- for (String str : strings) {
- TSRecord record = RecordUtils.parseSimpleTupleRecord(str, schema);
- if (record.dataPointList.isEmpty()) {
- continue;
- }
- tsFileWriter.write(record);
- }
- lineCount++;
- }
- // test duplicate measurement adding
- Path path = pathArray.get(measurementArray.size() - 1);
- IMeasurementSchema dupTimeseries =
measurementArray.get(measurementArray.size() - 1);
- try {
- tsFileWriter.registerTimeseries(new Path(path.getIDeviceID()),
dupTimeseries);
- } catch (WriteProcessException e) {
- assertEquals("given timeseries has exists! " + path, e.getMessage());
- }
- try {
- tsFileWriter.close();
- } catch (IOException e) {
- fail("close writer failed");
- }
- LOG.info("stage size: {}, write {} group data", stageSize, lineCount);
- }
-
- private String[] getNextRecord(long lineCount, int stage) {
-
- String[] ret = new String[stageDeviceIds[stage].length];
- for (int i = 0; i < ret.length; i++) {
- StringContainer sc = new
StringContainer(JsonFormatConstant.TSRECORD_SEPARATOR);
- sc.addTail(stageDeviceIds[stage][i], lineCount);
- sc.addTail(
- measurementIds[0],
- lineCount * 10 + i,
- measurementIds[1],
- longBase + lineCount * 20 + i,
- measurementIds[2],
- (lineCount * 30 + i) / 3.0,
- measurementIds[3],
- (longBase + lineCount * 40 + i) / 7.0);
- sc.addTail(measurementIds[4], ((lineCount + i) & 1) == 0);
- sc.addTail(measurementIds[5], enums[(int) (lineCount + i) %
enums.length]);
- ret[i] = sc.toString();
- }
- return ret;
- }
-}