feat: get serial for age

This commit is contained in:
2023-03-25 00:28:39 +08:00
parent 0b90e4e8a4
commit ec26fcce2b
4 changed files with 30 additions and 5 deletions

View File

@@ -1,7 +1,7 @@
package me.hatter.tools.tinyencrypt.config; package me.hatter.tools.tinyencrypt.config;
public class TinyEncryptConstant { 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"; public static final String ENC_FILE_EXT = ".tinyenc";
} }

View File

@@ -80,7 +80,8 @@ public class EncryptedFileUtil {
return false; return false;
} }
final String ageCli = StringUtil.def(config.getAgeCli(), "age"); final String ageCli = StringUtil.def(config.getAgeCli(), "age");
final Optional<byte[]> dataKeyOpt = AgeCliUtil.decryptBytes(ageCli, meta.getAgeRecipient(), meta.getAgeEnvelop()); final Optional<String> serialOpt = CardCliUtil.getSerial(config.getCardCli());
final Optional<byte[]> dataKeyOpt = AgeCliUtil.decryptBytes(ageCli, meta.getAgeRecipient(), meta.getAgeEnvelop(), serialOpt);
if (!dataKeyOpt.isPresent()) { if (!dataKeyOpt.isPresent()) {
return false; return false;
} }

View File

@@ -13,11 +13,11 @@ public class AgeCliUtil {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
System.out.println( 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<byte[]> decryptBytes(String ageCli, String ageRecipient, String ageEnvelop) { public static Optional<byte[]> decryptBytes(String ageCli, String ageRecipient, String ageEnvelop, Optional<String> serialOpt) {
AssertUtil.notEmpty(ageCli, "Age-cli cannot be empty"); AssertUtil.notEmpty(ageCli, "Age-cli cannot be empty");
AssertUtil.notEmpty(ageRecipient, "Age-recipient cannot be empty"); AssertUtil.notEmpty(ageRecipient, "Age-recipient cannot be empty");
AssertUtil.isTrue(ageRecipient.matches("^[a-zA-Z0-9]+$"), "Age-recipient illegal"); 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.isFalse(ageEnvelop.contains("'"), "Age-envelop cannot contains `'`");
AssertUtil.isTrue(ageEnvelop.matches("^[\\-/+=\\n\\r\\sa-zA-Z0-9]+$"), "Age-envelop illegal"); 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"); AssertUtil.isTrue(recipientAgeFile.isFile(), "Age key file required");
final ProcessBuilder pb = new ProcessBuilder( final ProcessBuilder pb = new ProcessBuilder(

View File

@@ -25,6 +25,25 @@ public class CardCliUtil {
return Optional.of(new String(pin)); return Optional.of(new String(pin));
} }
public static Optional<String> 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<String> 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<byte[]> getChall(String cardCli, String challenge) { public static Optional<byte[]> getChall(String cardCli, String challenge) {
if (StringUtil.isEmpty(cardCli)) { if (StringUtil.isEmpty(cardCli)) {
throw new JumpOutException("Card-cli is empty!"); throw new JumpOutException("Card-cli is empty!");