From ec26fcce2b3d31b9fd79124181d8b96d78af1838 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sat, 25 Mar 2023 00:28:39 +0800 Subject: [PATCH] feat: get serial for age --- .../config/TinyEncryptConstant.java | 2 +- .../encrypt/EncryptedFileUtil.java | 3 ++- .../tools/tinyencrypt/util/AgeCliUtil.java | 11 ++++++++--- .../tools/tinyencrypt/util/CardCliUtil.java | 19 +++++++++++++++++++ 4 files changed, 30 insertions(+), 5 deletions(-) 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 0b4d52c..2f4de6e 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.6.1"; + public static final String VERSION = "0.6.2"; 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 42e13c4..312540d 100644 --- a/src/main/java/me/hatter/tools/tinyencrypt/encrypt/EncryptedFileUtil.java +++ b/src/main/java/me/hatter/tools/tinyencrypt/encrypt/EncryptedFileUtil.java @@ -80,7 +80,8 @@ public class EncryptedFileUtil { return false; } final String ageCli = StringUtil.def(config.getAgeCli(), "age"); - final Optional dataKeyOpt = AgeCliUtil.decryptBytes(ageCli, meta.getAgeRecipient(), meta.getAgeEnvelop()); + final Optional serialOpt = CardCliUtil.getSerial(config.getCardCli()); + final Optional dataKeyOpt = AgeCliUtil.decryptBytes(ageCli, meta.getAgeRecipient(), meta.getAgeEnvelop(), serialOpt); if (!dataKeyOpt.isPresent()) { return false; } diff --git a/src/main/java/me/hatter/tools/tinyencrypt/util/AgeCliUtil.java b/src/main/java/me/hatter/tools/tinyencrypt/util/AgeCliUtil.java index 85864d0..ac95575 100644 --- a/src/main/java/me/hatter/tools/tinyencrypt/util/AgeCliUtil.java +++ b/src/main/java/me/hatter/tools/tinyencrypt/util/AgeCliUtil.java @@ -13,11 +13,11 @@ public class AgeCliUtil { public static void main(String[] args) throws Exception { System.out.println( - decryptBytes("age", "age1yubikey1qtwna67eqmyu7q9s3mpf7lkkrqzdrnqazdfdjftmv2qercy0cdchc7jcpu5", "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHBpdi1wMjU2IHFNWDVVUSBBNGMwMTl3\neXhQSXQ1dnhxSzFUNk4rNlJ6QkJCcnJqazZzTVAzcS9sSktyRQpBOXNQSVFudDBQ\nd2kyMFpySGxIUS8yemVwdkJxdEpoZHl3NTJuUzFaTjJJCi0tLSBwbW45LzUyem9j\nZWpROUFRT2huVDArS2hjaWFBeVd4S0xaTzh5eFo5QlhRCo2zDaVK/7YuOShVT0iw\n43LFOEP3T9v53YKhuUqjmm+6af93U2H/ppZVZluXrYPpR6+WHL4vdxflExP4yH1e\n8C+hFKSSdvxQe7cE8lHG\n-----END AGE ENCRYPTED FILE-----") + decryptBytes("age", "age1yubikey1qtwna67eqmyu7q9s3mpf7lkkrqzdrnqazdfdjftmv2qercy0cdchc7jcpu5", "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHBpdi1wMjU2IHFNWDVVUSBBNGMwMTl3\neXhQSXQ1dnhxSzFUNk4rNlJ6QkJCcnJqazZzTVAzcS9sSktyRQpBOXNQSVFudDBQ\nd2kyMFpySGxIUS8yemVwdkJxdEpoZHl3NTJuUzFaTjJJCi0tLSBwbW45LzUyem9j\nZWpROUFRT2huVDArS2hjaWFBeVd4S0xaTzh5eFo5QlhRCo2zDaVK/7YuOShVT0iw\n43LFOEP3T9v53YKhuUqjmm+6af93U2H/ppZVZluXrYPpR6+WHL4vdxflExP4yH1e\n8C+hFKSSdvxQe7cE8lHG\n-----END AGE ENCRYPTED FILE-----", Optional.empty()) ); } - public static Optional decryptBytes(String ageCli, String ageRecipient, String ageEnvelop) { + public static Optional decryptBytes(String ageCli, String ageRecipient, String ageEnvelop, Optional serialOpt) { AssertUtil.notEmpty(ageCli, "Age-cli cannot be empty"); AssertUtil.notEmpty(ageRecipient, "Age-recipient cannot be empty"); AssertUtil.isTrue(ageRecipient.matches("^[a-zA-Z0-9]+$"), "Age-recipient illegal"); @@ -25,7 +25,12 @@ public class AgeCliUtil { AssertUtil.isFalse(ageEnvelop.contains("'"), "Age-envelop cannot contains `'`"); AssertUtil.isTrue(ageEnvelop.matches("^[\\-/+=\\n\\r\\sa-zA-Z0-9]+$"), "Age-envelop illegal"); - final RFile recipientAgeFile = RFile.fromUserHome(".tinyencrypt/" + ageRecipient + ".age"); + final RFile recipientAgeFileWithoutSerial = RFile.fromUserHome(".tinyencrypt/" + ageRecipient + ".age"); + final RFile recipientAgeFileWithSerial = serialOpt.map(s -> RFile.fromUserHome(".tinyencrypt/" + ageRecipient + ".age." + s)).orElse(null); + + final RFile recipientAgeFile = (recipientAgeFileWithSerial != null && recipientAgeFileWithSerial.isFile()) + ? recipientAgeFileWithSerial : recipientAgeFileWithoutSerial; + AssertUtil.isTrue(recipientAgeFile.isFile(), "Age key file required"); final ProcessBuilder pb = new ProcessBuilder( diff --git a/src/main/java/me/hatter/tools/tinyencrypt/util/CardCliUtil.java b/src/main/java/me/hatter/tools/tinyencrypt/util/CardCliUtil.java index 040ab5e..4131741 100644 --- a/src/main/java/me/hatter/tools/tinyencrypt/util/CardCliUtil.java +++ b/src/main/java/me/hatter/tools/tinyencrypt/util/CardCliUtil.java @@ -25,6 +25,25 @@ public class CardCliUtil { return Optional.of(new String(pin)); } + public static Optional getSerial(String cardCli) { + if (StringUtil.isEmpty(cardCli)) { + throw new JumpOutException("Card-cli is empty!"); + } + final ProcessBuilder pb = new ProcessBuilder( + cardCli, + "list", + "--json"); + log.info("Start: " + cardCli); + + final Optional outputsOpt = runProcess(pb); + + if ((!outputsOpt.isPresent()) || outputsOpt.get().trim().isEmpty()) { + return Optional.empty(); + } + final JSONObject jo = JSON.parseObject(outputsOpt.get()); + return Optional.of(jo.getString("serial")); + } + public static Optional getChall(String cardCli, String challenge) { if (StringUtil.isEmpty(cardCli)) { throw new JumpOutException("Card-cli is empty!");