minisign 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 59267c0797e4539c136803dd3ac5333f14384019bb211abb50c078b14d9cb1c8
4
- data.tar.gz: 7771c5a5b4227d1030d78b60fa584ed5158270a568617cc4ac7f4760230ef1d1
3
+ metadata.gz: 007c98083c5c2f0343244efee9295ca3b9464c8b8edb59ca809e779ae7d0f76e
4
+ data.tar.gz: bdf21e444448429ee135d59ae7403646afd84b4df0724391563858763bec9a43
5
5
  SHA512:
6
- metadata.gz: 6a713e970fb762efaaabcd4572ea664d69cf5d558aa1219b3a27daf4c1fe4c111e98d0a4d90f4cc9892f0ec776b102bd0ab081d498a05a29639b0668a3decaa1
7
- data.tar.gz: 603bb8180811b3923c1b5782e76d049fefe125ed5338f164dd0ed787d26ffae251932f6b67eea7ef6a15aaddd1076725a44fa397902eb8ea56c80f134dc77923
6
+ metadata.gz: b7db6eab732643303cb76aab37b8c31bd8efd349992c5dfedcd8a7c772936a6554f8382b05efc6c170bbfb970222024790096b5fa611884204cc94882a45338d
7
+ data.tar.gz: e635054fe989e5c76edadc0a16128b2c14b23e201949bda438b593c8671b2cc688df3729eff4733ef65e71a68caf137842ef9f060e6b0199746e92502f39026e
data/lib/minisign/cli.rb CHANGED
@@ -41,6 +41,7 @@ module Minisign
41
41
  puts '-f force. Combined with -G, overwrite a previous key pair'
42
42
  puts '-v display version number'
43
43
  puts ''
44
+ exit 1
44
45
  end
45
46
 
46
47
  def self.prompt
@@ -90,44 +91,25 @@ module Minisign
90
91
  end
91
92
 
92
93
  def self.recreate(options)
93
- secret_key = options[:s] || "#{Dir.home}/.minisign/minisign.key"
94
+ options[:s] ||= "#{Dir.home}/.minisign/minisign.key"
94
95
  public_key = options[:p] || './minisign.pub'
95
- private_key_contents = File.read(secret_key)
96
- begin
97
- # try without a password first
98
- private_key = Minisign::PrivateKey.new(private_key_contents)
99
- rescue Minisign::PasswordMissingError
100
- print 'Password: '
101
- private_key = Minisign::PrivateKey.new(private_key_contents, prompt)
102
- end
103
- File.write(public_key, private_key.public_key)
96
+ File.write(public_key, private_key(options[:s]).public_key)
104
97
  end
105
98
 
106
99
  def self.change_password(options)
107
100
  options[:s] ||= "#{Dir.home}/.minisign/minisign.key"
108
- private_key = begin
109
- Minisign::PrivateKey.new(File.read(options[:s]))
110
- rescue Minisign::PasswordMissingError
111
- print 'Password: '
112
- Minisign::PrivateKey.new(File.read(options[:s]), prompt)
113
- end
101
+ new_private_key = private_key(options[:s])
114
102
  print 'New Password: '
115
103
  new_password = options[:W] ? nil : prompt
116
- private_key.change_password! new_password
117
- File.write(options[:s], private_key)
104
+ new_private_key.change_password! new_password
105
+ File.write(options[:s], new_private_key)
118
106
  end
119
107
 
120
108
  def self.sign(options)
121
109
  # TODO: multiple files
122
110
  options[:x] ||= "#{options[:m]}.minisig"
123
111
  options[:s] ||= "#{Dir.home}/.minisign/minisign.key"
124
- private_key = begin
125
- Minisign::PrivateKey.new(File.read(options[:s]))
126
- rescue Minisign::PasswordMissingError
127
- print 'Password: '
128
- Minisign::PrivateKey.new(File.read(options[:s]), prompt)
129
- end
130
- signature = private_key.sign(options[:m], File.read(options[:m]), options[:t], options[:c])
112
+ signature = private_key(options[:s]).sign(options[:m], File.read(options[:m]), options[:t], options[:c])
131
113
  File.write(options[:x], signature)
132
114
  end
133
115
 
@@ -140,8 +122,8 @@ module Minisign
140
122
  signature = Minisign::Signature.new(File.read(options[:x]))
141
123
  begin
142
124
  verification = public_key.verify(signature, message)
143
- rescue StandardError
144
- puts 'Signature verification failed'
125
+ rescue Minisign::SignatureVerificationError => e
126
+ puts e.message
145
127
  exit 1
146
128
  end
147
129
  return if options[:q]
@@ -150,6 +132,16 @@ module Minisign
150
132
  puts options[:Q] ? signature.trusted_comment : verification
151
133
  end
152
134
 
135
+ def self.private_key(seckey_file)
136
+ seckey_file_contents = File.read(seckey_file)
137
+ begin
138
+ Minisign::PrivateKey.new(seckey_file_contents)
139
+ rescue Minisign::PasswordMissingError
140
+ print 'Password: '
141
+ Minisign::PrivateKey.new(seckey_file_contents, prompt)
142
+ end
143
+ end
144
+
153
145
  # rubocop:enable Metrics/CyclomaticComplexity
154
146
  # rubocop:enable Metrics/AbcSize
155
147
  # rubocop:enable Metrics/MethodLength
@@ -21,7 +21,7 @@ module Minisign
21
21
  # public_key.key_id
22
22
  # #=> "E86FECED695E8E0"
23
23
  def key_id
24
- key_id_binary_string.bytes.map { |c| c.to_s(16) }.reverse.join.upcase
24
+ hex key_id_binary_string.bytes
25
25
  end
26
26
 
27
27
  # Verify a message's signature
@@ -29,9 +29,9 @@ module Minisign
29
29
  # @param signature [Minisign::Signature]
30
30
  # @param message [String] the content that was signed
31
31
  # @return [String] the trusted comment
32
- # @raise Ed25519::VerifyError on invalid signatures
33
- # @raise RuntimeError on tampered trusted comments
34
- # @raise RuntimeError on mismatching key ids
32
+ # @raise Minisign::SignatureVerificationError on invalid signatures
33
+ # @raise Minisign::SignatureVerificationError on tampered trusted comments
34
+ # @raise Minisign::SignatureVerificationError on mismatching key ids
35
35
  def verify(signature, message)
36
36
  assert_matching_key_ids!(signature.key_id, key_id)
37
37
  verify_message_signature(signature.signature, message)
@@ -54,8 +54,8 @@ module Minisign
54
54
 
55
55
  def verify_message_signature(signature, message)
56
56
  ed25519_verify_key.verify(signature, blake2b512(message))
57
- rescue Ed25519::VerifyError => e
58
- raise Minisign::SignatureVerificationError, e
57
+ rescue Ed25519::VerifyError
58
+ raise Minisign::SignatureVerificationError, 'Signature verification failed'
59
59
  end
60
60
 
61
61
  def untrusted_comment
@@ -3,11 +3,13 @@
3
3
  module Minisign
4
4
  # Parse a .minisig file's contents
5
5
  class Signature
6
+ include Utils
6
7
  # @param str [String] The contents of the .minisig file
7
8
  # @example
8
9
  # Minisign::Signature.new(File.read('test/example.txt.minisig'))
9
10
  def initialize(str)
10
11
  @lines = str.split("\n")
12
+ @decoded = Base64.strict_decode64(@lines[1])
11
13
  end
12
14
 
13
15
  # @return [String] the key id
@@ -15,7 +17,7 @@ module Minisign
15
17
  # Minisign::Signature.new(File.read('test/example.txt.minisig')).key_id
16
18
  # #=> "E86FECED695E8E0"
17
19
  def key_id
18
- encoded_signature[2..9].bytes.map { |c| c.to_s(16) }.reverse.join.upcase
20
+ hex @decoded[2..9].bytes
19
21
  end
20
22
 
21
23
  # @return [String] the trusted comment
@@ -33,18 +35,12 @@ module Minisign
33
35
 
34
36
  # @return [String] the global signature
35
37
  def signature
36
- encoded_signature[10..]
38
+ @decoded[10..]
37
39
  end
38
40
 
39
41
  # @return [String] The signature that can be written to a file
40
42
  def to_s
41
43
  "#{@lines.join("\n")}\n"
42
44
  end
43
-
44
- private
45
-
46
- def encoded_signature
47
- Base64.decode64(@lines[1])
48
- end
49
45
  end
50
46
  end
@@ -18,6 +18,11 @@ module Minisign
18
18
  end
19
19
  end
20
20
 
21
+ # @return [String] bytes as little endian hexadecimal
22
+ def hex(bytes)
23
+ bytes.map { |c| c.to_s(16) }.reverse.join.upcase
24
+ end
25
+
21
26
  # @return [String] the <kdf_output> used to xor the ed25519 keys
22
27
  def derive_key(password, kdf_salt, kdf_opslimit, kdf_memlimit)
23
28
  RbNaCl::PasswordHash.scrypt(
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minisign
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jesse Shawl
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-17 00:00:00.000000000 Z
11
+ date: 2024-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ed25519
@@ -38,7 +38,7 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '7.1'
41
- description: Verify minisign signatures
41
+ description: Create and verify minisign signatures
42
42
  email: jesse@jesse.sh
43
43
  executables:
44
44
  - minisign
@@ -58,6 +58,10 @@ homepage: https://github.com/jshawl/minisign
58
58
  licenses:
59
59
  - MIT
60
60
  metadata:
61
+ bug_tracker_uri: https://github.com/jshawl/minisign/issues
62
+ changelog_uri: https://github.com/jshawl/minisign/blob/main/CHANGELOG.md
63
+ documentation_uri: https://www.rubydoc.info/gems/minisign/0.2.1
64
+ source_code_uri: https://github.com/jshawl/minisign/tree/v0.2.1
61
65
  rubygems_mfa_required: 'true'
62
66
  post_install_message:
63
67
  rdoc_options: []