From 73bbd988b9351f9da1a6bf6a25d4e7cc9e4d1c31 Mon Sep 17 00:00:00 2001 From: Jesse Shawl Date: Sun, 11 Feb 2024 14:56:38 -0600 Subject: [PATCH] add recreate functionality (#25) --- CHANGELOG.md | 1 + bin/minisign | 1 + lib/minisign/cli.rb | 16 ++++++++++++++++ spec/minisign/cli_spec.rb | 15 +++++++++++++++ 4 files changed, 33 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fdc30d..cfe93fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Support for changing or removing the password from the private key +- `minisign` executable ## [0.1.0] - 2024-02-09 diff --git a/bin/minisign b/bin/minisign index 66549f7..361c5e2 100755 --- a/bin/minisign +++ b/bin/minisign @@ -34,3 +34,4 @@ rescue OptionParser::InvalidOption end Minisign::CLI.generate(options) if options[:G] +Minisign::CLI.recreate(options) if options[:R] diff --git a/lib/minisign/cli.rb b/lib/minisign/cli.rb index e88b0ae..5b910f8 100644 --- a/lib/minisign/cli.rb +++ b/lib/minisign/cli.rb @@ -8,6 +8,7 @@ module CLI # lol def self.help puts '-G generate a new key pair' + puts '-R recreate a public key file from a secret key file' puts '-f force. Combined with -G, overwrite a previous key pair' puts '-p public key file (default: ./minisign.pub)' puts '-s secret key file (default: ~/.minisign/minisign.key)' @@ -17,6 +18,7 @@ def self.help def self.usage puts 'Usage:' puts 'minisign -G [-f] [-p pubkey_file] [-s seckey_file] [-W]' + puts 'minisign -R [-s seckey_file] [-p pubkey_file]' end def self.prompt @@ -58,5 +60,19 @@ def self.generate(options) end # rubocop:enable Metrics/MethodLength # rubocop:enable Metrics/AbcSize + + def self.recreate(options) + secret_key = options[:s] || "#{Dir.home}/.minisign/minisign.key" + public_key = options[:p] || './minisign.pub' + private_key_contents = File.read(secret_key) + begin + # try without a password first + private_key = Minisign::PrivateKey.new(private_key_contents) + rescue RuntimeError + print 'Password: ' + private_key = Minisign::PrivateKey.new(private_key_contents, prompt) + end + File.write(public_key, private_key.public_key) + end end end diff --git a/spec/minisign/cli_spec.rb b/spec/minisign/cli_spec.rb index 654c03d..dcca789 100644 --- a/spec/minisign/cli_spec.rb +++ b/spec/minisign/cli_spec.rb @@ -37,4 +37,19 @@ expect(File.exist?(options[:p])).to eq(true) end end + + describe '.recreate' do + it 'recreates the public key from a private key' do + keyname = SecureRandom.uuid + options = { + p: "test/generated/#{keyname}.pub", + s: 'test/minisign.key' + } + allow(Minisign::CLI).to receive(:prompt).and_return('password') + Minisign::CLI.recreate(options) + new_public_key = File.read(options[:p]) + existing_public_key = File.read('test/minisign.pub').gsub(' yay', '') + expect(new_public_key).to eq(existing_public_key) + end + end end