diff --git a/src/main/java/me/hatter/tools/tinyencrypt/TinyEncryptArgs.java b/src/main/java/me/hatter/tools/tinyencrypt/TinyEncryptArgs.java index cd224bb..e1931b8 100644 --- a/src/main/java/me/hatter/tools/tinyencrypt/TinyEncryptArgs.java +++ b/src/main/java/me/hatter/tools/tinyencrypt/TinyEncryptArgs.java @@ -25,6 +25,9 @@ public class TinyEncryptArgs { @CommandLine.Option(names = {"-c", "--comment"}, description = "Encrypt comment") String comment; + @CommandLine.Option(names = {"-E", "--encrypted-comment"}, description = "Encrypt comment") + String encryptedComment; + @CommandLine.Option(names = {"--compress"}, description = "Encrypt compress") boolean compress = false; diff --git a/src/main/java/me/hatter/tools/tinyencrypt/TinyEncryptMain.java b/src/main/java/me/hatter/tools/tinyencrypt/TinyEncryptMain.java index b0e8035..f0bdc37 100644 --- a/src/main/java/me/hatter/tools/tinyencrypt/TinyEncryptMain.java +++ b/src/main/java/me/hatter/tools/tinyencrypt/TinyEncryptMain.java @@ -76,7 +76,7 @@ public class TinyEncryptMain { if (tinyEncryptArgs.encrypt) { decryptSuccess = EncryptedFileUtil.encryptFile(config, tinyEncryptArgs.key, f, tinyEncryptArgs.compress, !tinyEncryptArgs.skipEnvelop, tinyEncryptArgs.requireSign, - tinyEncryptArgs.comment); + tinyEncryptArgs.comment, tinyEncryptArgs.encryptedComment); } else { if (tinyEncryptArgs.showInWindow) { EncryptedFileUtil.decryptInWindow(config, f, tinyEncryptArgs.pgp); diff --git a/src/main/java/me/hatter/tools/tinyencrypt/TinyEncryptMainUtil.java b/src/main/java/me/hatter/tools/tinyencrypt/TinyEncryptMainUtil.java index 87b4221..90a27e6 100644 --- a/src/main/java/me/hatter/tools/tinyencrypt/TinyEncryptMainUtil.java +++ b/src/main/java/me/hatter/tools/tinyencrypt/TinyEncryptMainUtil.java @@ -117,6 +117,7 @@ public class TinyEncryptMainUtil { private static void printOneFileInfo(File f, FileInputStream fis) throws IOException { Tlv tlv = TlvUtil.readTlv(fis); TinyEncryptMeta meta = tlv.getValueAsBytes().asJSONObject(TinyEncryptMeta.class); + log.debug("Tiny encrypt meta: " + JSON.toJSONString(meta, true)); StringBuilder sb = new StringBuilder(256); sb.append("File Info\n").append(header("File")).append(f); if ((meta.getCompress() != null) && meta.getCompress()) { @@ -143,6 +144,7 @@ public class TinyEncryptMainUtil { if (StringUtil.isNotBlank(meta.getComment())) { sb.append(header("Comment")).append(meta.getComment()).append("\n"); } + sb.append(header("Encrypted comment")).append(toYesOrNo(StringUtil.isNotBlank(meta.getEncryptedComment()))).append("\n"); log.info(sb.toString()); } diff --git a/src/main/java/me/hatter/tools/tinyencrypt/config/TinyEncryptConstant.java b/src/main/java/me/hatter/tools/tinyencrypt/config/TinyEncryptConstant.java index f95d281..b1a48ec 100644 --- a/src/main/java/me/hatter/tools/tinyencrypt/config/TinyEncryptConstant.java +++ b/src/main/java/me/hatter/tools/tinyencrypt/config/TinyEncryptConstant.java @@ -1,7 +1,7 @@ package me.hatter.tools.tinyencrypt.config; public class TinyEncryptConstant { - public static final String VERSION = "0.3.12"; + public static final String VERSION = "0.3.13"; public static final String ENC_FILE_EXT = ".tinyenc"; } diff --git a/src/main/java/me/hatter/tools/tinyencrypt/encrypt/EncryptedFileUtil.java b/src/main/java/me/hatter/tools/tinyencrypt/encrypt/EncryptedFileUtil.java index 6d61af3..b3735c1 100644 --- a/src/main/java/me/hatter/tools/tinyencrypt/encrypt/EncryptedFileUtil.java +++ b/src/main/java/me/hatter/tools/tinyencrypt/encrypt/EncryptedFileUtil.java @@ -8,6 +8,7 @@ import me.hatter.tools.commons.io.IOUtil; import me.hatter.tools.commons.io.RFile; import me.hatter.tools.commons.log.LogTool; import me.hatter.tools.commons.log.LogTools; +import me.hatter.tools.commons.security.crypt.AESCryptTool; import me.hatter.tools.commons.security.crypt.CryptInputStream; import me.hatter.tools.commons.security.crypt.CryptOutputStream; import me.hatter.tools.commons.security.digest.Digests; @@ -68,6 +69,14 @@ public class EncryptedFileUtil { dataKey = TinyEncryptMetaUtil.decryptDataKey(config, meta); } meta.setDataKey(dataKey); + + if (StringUtil.isNotEmpty(meta.getEncryptedComment())) { + Bytes decryptedComment = AESCryptTool.gcmDecrypt(meta.getDataKey(), meta.getNonce()) + .from(Bytes.fromBase64(meta.getEncryptedComment())) + .toBytes(); + log.info("Decrypted comment: >>> " + decryptedComment.string() + " <<<"); + } + try (InputStream newIs = getDecryptInputStream(fis, meta)) { boolean isCompressed = (meta.getCompress() != null) && meta.getCompress(); if (isCompressed) { @@ -140,7 +149,7 @@ public class EncryptedFileUtil { public static boolean encryptFile(TinyEncryptConfig config, String keyName, File file, boolean compress, boolean useEnvelop, boolean requireSign, - String comment) { + String comment, String encryptedComment) { File encFile = getEncryptFile(file); if (encFile == null) { log.warn("Cannot encrypt .tinyenc file: " + file); @@ -151,7 +160,7 @@ public class EncryptedFileUtil { return false; } try { - TinyEncryptMeta meta = TinyEncryptMetaUtil.create(config, keyName, comment, useEnvelop, requireSign); + TinyEncryptMeta meta = TinyEncryptMetaUtil.create(config, keyName, comment, encryptedComment, useEnvelop, requireSign); meta.setFileLength(file.length()); meta.setFileLastModified(file.lastModified()); meta.setCompress(compress); diff --git a/src/main/java/me/hatter/tools/tinyencrypt/encrypt/TinyEncryptMeta.java b/src/main/java/me/hatter/tools/tinyencrypt/encrypt/TinyEncryptMeta.java index 76e2ece..6d6f958 100644 --- a/src/main/java/me/hatter/tools/tinyencrypt/encrypt/TinyEncryptMeta.java +++ b/src/main/java/me/hatter/tools/tinyencrypt/encrypt/TinyEncryptMeta.java @@ -7,6 +7,7 @@ public class TinyEncryptMeta { private long created; private String userAgent; private String comment; + private String encryptedComment; private String pgpEnvelop; private String pgpFingerprint; private String envelop; @@ -49,6 +50,14 @@ public class TinyEncryptMeta { this.comment = comment; } + public String getEncryptedComment() { + return encryptedComment; + } + + public void setEncryptedComment(String encryptedComment) { + this.encryptedComment = encryptedComment; + } + public String getPgpEnvelop() { return pgpEnvelop; } @@ -120,6 +129,7 @@ public class TinyEncryptMeta { ", created=" + created + ", userAgent='" + userAgent + '\'' + ", comment='" + comment + '\'' + + ", encryptedComment='" + encryptedComment + '\'' + ", envelop='" + envelop + '\'' + ", compress=" + compress + ", fileLength=" + fileLength + diff --git a/src/main/java/me/hatter/tools/tinyencrypt/encrypt/TinyEncryptMetaUtil.java b/src/main/java/me/hatter/tools/tinyencrypt/encrypt/TinyEncryptMetaUtil.java index 9719fa0..352c42c 100644 --- a/src/main/java/me/hatter/tools/tinyencrypt/encrypt/TinyEncryptMetaUtil.java +++ b/src/main/java/me/hatter/tools/tinyencrypt/encrypt/TinyEncryptMetaUtil.java @@ -89,7 +89,7 @@ public class TinyEncryptMetaUtil { } public static TinyEncryptMeta create( - TinyEncryptConfig config, String keyName, String comment, + TinyEncryptConfig config, String keyName, String comment, String encryptedComment, boolean useEnvelop, boolean requireSignature) { PrivateKey privateKey = null; @@ -134,6 +134,11 @@ public class TinyEncryptMetaUtil { tinyEncryptMeta.setNonce(RandomTool.secureRandom().nextbytes(12)); tinyEncryptMeta.setUserAgent("TinyEncrypt v" + TinyEncryptConstant.VERSION + "@" + OSUtil.getCurrentOS().name()); tinyEncryptMeta.setComment(comment); + if (StringUtil.isNotEmpty(encryptedComment)) { + tinyEncryptMeta.setEncryptedComment( + AESCryptTool.gcmEncrypt(dataKey, tinyEncryptMeta.getNonce()) + .from(Bytes.from(encryptedComment)).toBytes().asBase64()); + } return tinyEncryptMeta; }