From 9373e785b8df5627474b0f8e6bbb16df0f21867e Mon Sep 17 00:00:00 2001 From: Jesse Shawl Date: Mon, 19 Feb 2024 08:44:06 -0600 Subject: [PATCH] make libsodium optional --- bin/minisign | 7 +++++++ lib/minisign.rb | 8 +++++++- lib/minisign/error.rb | 3 +++ lib/minisign/nacl.rb | 27 +++++++++++++++++++++++++++ lib/minisign/utils.rb | 6 +++--- 5 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 lib/minisign/nacl.rb diff --git a/bin/minisign b/bin/minisign index bd121ed..0452b35 100755 --- a/bin/minisign +++ b/bin/minisign @@ -31,6 +31,13 @@ rescue OptionParser::InvalidOption exit 1 end +if options[:G] || options[:R] || options[:G] || options[:S] + unless defined? RbNaCl::Hash + STDERR.puts "Error: libsodium is not installed!" + exit 1 + end +end + Minisign::CLI.generate(options) if options[:G] Minisign::CLI.recreate(options) if options[:R] Minisign::CLI.change_password(options) if options[:C] diff --git a/lib/minisign.rb b/lib/minisign.rb index b1e9a7d..d93999a 100644 --- a/lib/minisign.rb +++ b/lib/minisign.rb @@ -2,7 +2,12 @@ require 'ed25519' require 'base64' -require 'rbnacl' +require 'openssl' +begin + require 'rbnacl' +rescue LoadError => e + # errors handled when invoked (see Minisign::NaCl) +end require 'minisign/cli' require 'minisign/utils' @@ -10,4 +15,5 @@ require 'minisign/signature' require 'minisign/private_key' require 'minisign/key_pair' +require 'minisign/nacl' require 'minisign/error' diff --git a/lib/minisign/error.rb b/lib/minisign/error.rb index a3741e5..6444ec3 100644 --- a/lib/minisign/error.rb +++ b/lib/minisign/error.rb @@ -9,4 +9,7 @@ class PasswordMissingError < StandardError class PasswordIncorrectError < StandardError end + + class LibSodiumDependencyError < StandardError + end end diff --git a/lib/minisign/nacl.rb b/lib/minisign/nacl.rb new file mode 100644 index 0000000..bd49659 --- /dev/null +++ b/lib/minisign/nacl.rb @@ -0,0 +1,27 @@ +module Minisign + module NaCl + def self.safely + begin + yield + rescue NameError + raise Minisign::LibSodiumDependencyError, 'libsodium is not installed!' + end + end + module Hash + module Blake2b + def self.digest(*args) + NaCl::safely do + RbNaCl::Hash::Blake2b.digest(*args) + end + end + end + end + module PasswordHash + def self.scrypt(*args) + NaCl::safely do + RbNaCl::PasswordHash.scrypt(*args) + end + end + end + end +end \ No newline at end of file diff --git a/lib/minisign/utils.rb b/lib/minisign/utils.rb index 74258d8..ff40e60 100644 --- a/lib/minisign/utils.rb +++ b/lib/minisign/utils.rb @@ -4,11 +4,11 @@ module Minisign # Helpers used in multiple classes module Utils def blake2b256(message) - RbNaCl::Hash::Blake2b.digest(message, { digest_size: 32 }) + Minisign::NaCl::Hash::Blake2b.digest(message, { digest_size: 32 }) end def blake2b512(message) - RbNaCl::Hash::Blake2b.digest(message, { digest_size: 64 }) + OpenSSL::Digest.new('blake2b512').digest(message) end # @return [Array<32 bit unsigned ints>] @@ -25,7 +25,7 @@ def hex(bytes) # @return [String] the used to xor the ed25519 keys def derive_key(password, kdf_salt, kdf_opslimit, kdf_memlimit) - RbNaCl::PasswordHash.scrypt( + Minisign::NaCl::PasswordHash.scrypt( password, kdf_salt, kdf_opslimit,