From 31695efe26d64b41443262c36fc5af1025972c3c Mon Sep 17 00:00:00 2001 From: Jesse Shawl Date: Wed, 7 Feb 2024 06:30:08 -0600 Subject: [PATCH 1/7] update readme --- README.md | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e50cab0..3d84106 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,33 @@ A rubygem for creating and verifying [Minisign](http://jedisct1.github.io/minisign/) signatures. +- [Installation \& Usage](#installation--usage) + - [Read a public key](#read-a-public-key) + - [Verify a signature](#verify-a-signature) + - [Create a signature](#create-a-signature) +- [Local Development](#local-development) +- [Local Documentation](#local-documentation) + ## Installation & Usage ``` gem install minisign ``` +### Read a public key + +```rb +require 'minisign' +public_key = Minisign::PublicKey.new('RWSmKaOrT6m3TGwjwBovgOmlhSbyBUw3hyhnSOYruHXbJa36xHr8rq2M') +# or from disk +public_key = Minisign::PublicKey.new(File.read("test/minisign.pub")) +``` + ### Verify a signature ```rb require 'minisign' -public_key = Minisign::PublicKey.new('RWTg6JXWzv6GDtDphRQ/x7eg0LaWBcTxPZ7i49xEeiqXVcR+r79OZRWM') +public_key = Minisign::PublicKey.new('RWSmKaOrT6m3TGwjwBovgOmlhSbyBUw3hyhnSOYruHXbJa36xHr8rq2M') message = File.read("test/example.txt") signature = Minisign::Signature.new(File.read("test/example.txt.minisig")) public_key.verify(signature, message) @@ -21,7 +37,7 @@ public_key.verify(signature, message) The above is equivalent to: ``` -minisign -Vm test/example.txt -P RWTg6JXWzv6GDtDphRQ/x7eg0LaWBcTxPZ7i49xEeiqXVcR+r79OZRWM +minisign -Vm test/example.txt -P RWSmKaOrT6m3TGwjwBovgOmlhSbyBUw3hyhnSOYruHXbJa36xHr8rq2M ``` ### Create a signature From 5d2c7c20ae9644dbd6650e73d9c413084b908169 Mon Sep 17 00:00:00 2001 From: Jesse Shawl Date: Wed, 7 Feb 2024 06:33:22 -0600 Subject: [PATCH 2/7] support public key from string or from file --- lib/minisign/public_key.rb | 3 ++- spec/minisign/public_key_spec.rb | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/minisign/public_key.rb b/lib/minisign/public_key.rb index afa51d7..18eb8eb 100644 --- a/lib/minisign/public_key.rb +++ b/lib/minisign/public_key.rb @@ -10,7 +10,8 @@ class PublicKey # @example # Minisign::PublicKey.new('RWTg6JXWzv6GDtDphRQ/x7eg0LaWBcTxPZ7i49xEeiqXVcR+r79OZRWM') def initialize(str) - @decoded = Base64.strict_decode64(str) + parts = str.split("\n") + @decoded = Base64.strict_decode64(parts.last) @public_key = @decoded[10..] @verify_key = Ed25519::VerifyKey.new(@public_key) end diff --git a/spec/minisign/public_key_spec.rb b/spec/minisign/public_key_spec.rb index 1bda9ef..57942d6 100644 --- a/spec/minisign/public_key_spec.rb +++ b/spec/minisign/public_key_spec.rb @@ -2,7 +2,7 @@ describe Minisign::PublicKey do before do - @pk = Minisign::PublicKey.new(File.read('test/minisign.pub').split("\n").pop) + @pk = Minisign::PublicKey.new(File.read('test/minisign.pub')) @message = File.read('test/example.txt') end it 'verifies signatures' do From d8aeea4cd54b3a75133659c4eaaafc211c9298a8 Mon Sep 17 00:00:00 2001 From: Jesse Shawl Date: Wed, 7 Feb 2024 06:34:37 -0600 Subject: [PATCH 3/7] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3d84106..2748f94 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ gem install minisign ```rb require 'minisign' public_key = Minisign::PublicKey.new('RWSmKaOrT6m3TGwjwBovgOmlhSbyBUw3hyhnSOYruHXbJa36xHr8rq2M') -# or from disk +# or from a file public_key = Minisign::PublicKey.new(File.read("test/minisign.pub")) ``` From 6f0f5f0bb7d691cc269e44bec653844bc20414c5 Mon Sep 17 00:00:00 2001 From: Jesse Shawl Date: Wed, 7 Feb 2024 06:41:36 -0600 Subject: [PATCH 4/7] regenerate untrusted comment --- lib/minisign/public_key.rb | 8 +++++++- spec/minisign/public_key_spec.rb | 4 ++++ test/minisign.pub | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/minisign/public_key.rb b/lib/minisign/public_key.rb index 18eb8eb..3572b4c 100644 --- a/lib/minisign/public_key.rb +++ b/lib/minisign/public_key.rb @@ -14,6 +14,12 @@ def initialize(str) @decoded = Base64.strict_decode64(parts.last) @public_key = @decoded[10..] @verify_key = Ed25519::VerifyKey.new(@public_key) + if parts.length == 1 + data = Base64.strict_encode64("Ed#{@decoded[2..9]}#{@public_key}") + @untrusted_comment = "minisign public key #{key_id}\n#{data}\n" + else + @untrusted_comment = parts.first.split("untrusted comment: ").last + end end # @return [String] the key id @@ -44,7 +50,7 @@ def verify(sig, message) def to_s data = Base64.strict_encode64("Ed#{@decoded[2..9]}#{@public_key}") - "untrusted comment: minisign public key #{key_id}\n#{data}\n" + "untrusted comment: #{@untrusted_comment}\n#{data}\n" end private diff --git a/spec/minisign/public_key_spec.rb b/spec/minisign/public_key_spec.rb index 57942d6..4da5b79 100644 --- a/spec/minisign/public_key_spec.rb +++ b/spec/minisign/public_key_spec.rb @@ -30,4 +30,8 @@ it 'can be written to a file' do expect(@pk.to_s).to eq(File.read('test/minisign.pub')) end + it 'regenerates an untrusted comment if not provided' do + @pk = Minisign::PublicKey.new('RWSmKaOrT6m3TGwjwBovgOmlhSbyBUw3hyhnSOYruHXbJa36xHr8rq2M') + expect(@pk.to_s).to match("minisign public key 4CB7A94FABA329A6") + end end diff --git a/test/minisign.pub b/test/minisign.pub index fce7ebe..7fd845f 100644 --- a/test/minisign.pub +++ b/test/minisign.pub @@ -1,2 +1,2 @@ -untrusted comment: minisign public key 4CB7A94FABA329A6 +untrusted comment: minisign public key 4CB7A94FABA329A6 yay RWSmKaOrT6m3TGwjwBovgOmlhSbyBUw3hyhnSOYruHXbJa36xHr8rq2M From 12126c33a62babef718828593e054e4f2b769acb Mon Sep 17 00:00:00 2001 From: Jesse Shawl Date: Wed, 7 Feb 2024 06:43:24 -0600 Subject: [PATCH 5/7] refactor --- lib/minisign/public_key.rb | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/minisign/public_key.rb b/lib/minisign/public_key.rb index 3572b4c..effccbb 100644 --- a/lib/minisign/public_key.rb +++ b/lib/minisign/public_key.rb @@ -14,11 +14,10 @@ def initialize(str) @decoded = Base64.strict_decode64(parts.last) @public_key = @decoded[10..] @verify_key = Ed25519::VerifyKey.new(@public_key) - if parts.length == 1 - data = Base64.strict_encode64("Ed#{@decoded[2..9]}#{@public_key}") - @untrusted_comment = "minisign public key #{key_id}\n#{data}\n" + @untrusted_comment = if parts.length == 1 + "minisign public key #{key_id}\n#{key_data}\n" else - @untrusted_comment = parts.first.split("untrusted comment: ").last + parts.first.split("untrusted comment: ").last end end @@ -48,9 +47,12 @@ def verify(sig, message) "Signature and comment signature verified\nTrusted comment: #{sig.trusted_comment}" end + def key_data + Base64.strict_encode64("Ed#{@decoded[2..9]}#{@public_key}") + end + def to_s - data = Base64.strict_encode64("Ed#{@decoded[2..9]}#{@public_key}") - "untrusted comment: #{@untrusted_comment}\n#{data}\n" + "untrusted comment: #{@untrusted_comment}\n#{key_data}\n" end private From 7400f6fb687e3e040a270b5b931a600505027e16 Mon Sep 17 00:00:00 2001 From: Jesse Shawl Date: Wed, 7 Feb 2024 06:43:41 -0600 Subject: [PATCH 6/7] rubocop --- lib/minisign/public_key.rb | 8 ++++---- spec/minisign/public_key_spec.rb | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/minisign/public_key.rb b/lib/minisign/public_key.rb index effccbb..0a0c852 100644 --- a/lib/minisign/public_key.rb +++ b/lib/minisign/public_key.rb @@ -15,10 +15,10 @@ def initialize(str) @public_key = @decoded[10..] @verify_key = Ed25519::VerifyKey.new(@public_key) @untrusted_comment = if parts.length == 1 - "minisign public key #{key_id}\n#{key_data}\n" - else - parts.first.split("untrusted comment: ").last - end + "minisign public key #{key_id}\n#{key_data}\n" + else + parts.first.split('untrusted comment: ').last + end end # @return [String] the key id diff --git a/spec/minisign/public_key_spec.rb b/spec/minisign/public_key_spec.rb index 4da5b79..d003de0 100644 --- a/spec/minisign/public_key_spec.rb +++ b/spec/minisign/public_key_spec.rb @@ -32,6 +32,6 @@ end it 'regenerates an untrusted comment if not provided' do @pk = Minisign::PublicKey.new('RWSmKaOrT6m3TGwjwBovgOmlhSbyBUw3hyhnSOYruHXbJa36xHr8rq2M') - expect(@pk.to_s).to match("minisign public key 4CB7A94FABA329A6") + expect(@pk.to_s).to match('minisign public key 4CB7A94FABA329A6') end end From 68f5328a300f28d19c01bc5972477755987035bc Mon Sep 17 00:00:00 2001 From: Jesse Shawl Date: Wed, 7 Feb 2024 06:46:31 -0600 Subject: [PATCH 7/7] update readme --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2748f94..484c82f 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ A rubygem for creating and verifying [Minisign](http://jedisct1.github.io/minisi - [Verify a signature](#verify-a-signature) - [Create a signature](#create-a-signature) - [Local Development](#local-development) -- [Local Documentation](#local-documentation) +- [Documentation](#documentation) ## Installation & Usage @@ -58,7 +58,12 @@ File.write("#{file_path}.minisig", signature.to_s) irb -Ilib -rminisign ``` -## Local Documentation +## Documentation + +The documentation for this gem is published here: +https://www.rubydoc.info/gems/minisign/ + +or if working locally: ``` yard server --reload