feat: get serial for age
This commit is contained in:
@@ -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";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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!");
|
||||||
|
|||||||
Reference in New Issue
Block a user