From 85d2f08644cabfeb1eb78785d215f265a27848ca Mon Sep 17 00:00:00 2001 From: John Date: Sun, 10 Mar 2013 15:05:33 +0200 Subject: [PATCH] added key decryptor --- gener.rb | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 67 insertions(+), 3 deletions(-) diff --git a/gener.rb b/gener.rb index 8ff1e3a..8db8045 100755 --- a/gener.rb +++ b/gener.rb @@ -116,7 +116,18 @@ def generate_bins (key_sink) bin_name = @bin_dir + '%02X' % number receivers = keys.map { |k| "-r #{k}"}.join(' ') - system "gpg --batch --homedir #{@public_repo} #{receivers} -o #{bin_name} -e" + r,w = IO.pipe + + gpg_call = "gpg --batch --always-trust --homedir #{@public_repo} #{receivers} -o #{bin_name} -e" + + pid = spawn(gpg_call, :in => r) + r.close + + w.write(chunk) + + w.close + + Process.wait pid end def combine_keys (&block) @@ -136,7 +147,7 @@ def generate_bins (key_sink) combine_keys do |c| chunk = generate_key_chunk key_sink.write(chunk) - write_bin(num, generate_key_chunk, c) + write_bin(num, chunk, c) num += 1 end @@ -145,8 +156,61 @@ def generate_bins (key_sink) Process.waitall end +def decrypt_key (rings) + def list_bins + # enumerate all bins in alphabetical order + (Dir.entries(@bin_dir) - ['.', '..']).sort.map do |x| + @bin_dir + x + end + end + + bin_list = list_bins + + chunks = bin_list.clone + + todo_count = bin_list.size + + for ring in rings + break if todo_count <= 0 + + bin_list.each_index do |bi| + next if bin_list[bi] == nil + + r,w = IO.pipe + + pid = spawn("gpg --batch --homedir #{ring} -d #{bin_list[bi]}", :out => w, :err => '/dev/null') + w.close + + ch = r.read + + r.close + Process.wait pid + if $?.exitstatus == 0 + bin_list[bi] = nil + chunks[bi] = ch + todo_count -= 1 + end + end + end + + raise "Cannot decrypt some of the bins: #{bin_list.inspect}" if todo_count > 0 + + yield chunks.join +end #regenerate_keys -generate_bins (spawn_sha_sink) +#generate_bins (spawn_sha_sink) + +decrypt_key %w{ + ./private/aria + ./private/jaime + ./private/cercei + ./private/tywin +} do |key| + sink = spawn_sha_sink + sink.write key + sink.close + Process.waitall +end -- 2.11.4.GIT