rnp 0.2.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.adoc +5 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.adoc +3 -182
  5. data/lib/rnp.rb +12 -3
  6. data/lib/rnp/error.rb +40 -0
  7. data/lib/rnp/ffi/librnp.rb +306 -0
  8. data/lib/rnp/input.rb +99 -0
  9. data/lib/rnp/key.rb +275 -0
  10. data/lib/rnp/misc.rb +71 -0
  11. data/lib/rnp/op/encrypt.rb +181 -0
  12. data/lib/rnp/op/sign.rb +139 -0
  13. data/lib/rnp/op/verify.rb +147 -0
  14. data/lib/rnp/output.rb +121 -0
  15. data/lib/rnp/rnp.rb +595 -0
  16. data/lib/rnp/utils.rb +44 -0
  17. data/lib/rnp/version.rb +8 -3
  18. metadata +124 -50
  19. data/.gitignore +0 -12
  20. data/.rspec +0 -2
  21. data/.travis.yml +0 -5
  22. data/CODE_OF_CONDUCT.md +0 -74
  23. data/Gemfile +0 -4
  24. data/Rakefile +0 -6
  25. data/Use_Cases.adoc +0 -119
  26. data/bin/console +0 -14
  27. data/bin/setup +0 -8
  28. data/example-usage.rb +0 -766
  29. data/examples/highlevel/decrypt_mem.rb +0 -44
  30. data/examples/highlevel/encrypt_mem.rb +0 -46
  31. data/examples/lowlevel/decrypt_file.rb +0 -76
  32. data/examples/lowlevel/decrypt_mem.rb +0 -80
  33. data/examples/lowlevel/encrypt_file.rb +0 -68
  34. data/examples/lowlevel/encrypt_mem.rb +0 -75
  35. data/examples/lowlevel/load_pubkey.rb +0 -118
  36. data/examples/lowlevel/print_keyring_file.rb +0 -68
  37. data/examples/lowlevel/print_keyring_mem.rb +0 -96
  38. data/examples/lowlevel/sign_file.rb +0 -104
  39. data/examples/lowlevel/sign_mem.rb +0 -96
  40. data/examples/lowlevel/verify_file.rb +0 -55
  41. data/examples/lowlevel/verify_mem.rb +0 -61
  42. data/lib/rnp/highlevel.rb +0 -5
  43. data/lib/rnp/highlevel/constants.rb +0 -96
  44. data/lib/rnp/highlevel/keyring.rb +0 -259
  45. data/lib/rnp/highlevel/publickey.rb +0 -150
  46. data/lib/rnp/highlevel/secretkey.rb +0 -318
  47. data/lib/rnp/highlevel/utils.rb +0 -119
  48. data/lib/rnp/lowlevel.rb +0 -6
  49. data/lib/rnp/lowlevel/constants.rb +0 -11
  50. data/lib/rnp/lowlevel/dynarray.rb +0 -129
  51. data/lib/rnp/lowlevel/enums.rb +0 -243
  52. data/lib/rnp/lowlevel/libc.rb +0 -28
  53. data/lib/rnp/lowlevel/libopenssl.rb +0 -15
  54. data/lib/rnp/lowlevel/librnp.rb +0 -213
  55. data/lib/rnp/lowlevel/structs.rb +0 -541
  56. data/lib/rnp/lowlevel/utils.rb +0 -25
  57. data/rnp.gemspec +0 -35
  58. data/rnp/lib/rnp.rb +0 -5
  59. data/rnp/spec/rnp_spec.rb +0 -11
@@ -1,68 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require_relative '../../lib/rnp'
3
-
4
- def usage
5
- puts "Usage: #{$0} <file>"
6
- exit 1
7
- end
8
-
9
- def print_pubkey(pubkey, indent=0)
10
- puts "#{' ' * indent}Version: #{pubkey[:version]}"
11
- puts "#{' ' * indent}Creation Time: #{Time.at(pubkey[:birthtime])}"
12
- puts "#{' ' * indent}Algorithm: #{pubkey[:alg]}"
13
- case pubkey[:alg]
14
- when :PGP_PKA_RSA
15
- n = LibRNP::bn2hex(pubkey[:key][:rsa][:n])
16
- e = LibRNP::bn2hex(pubkey[:key][:rsa][:e])
17
- puts "#{' ' * indent}n: 0x#{n}"
18
- puts "#{' ' * indent}e: 0x#{e}"
19
- end
20
- end
21
-
22
- def print_seckey(seckey, indent=0)
23
- puts "#{' ' * (indent+2)}[Public Key]"
24
- print_pubkey(seckey[:pubkey], indent + 2)
25
- puts "#{' ' * indent}string-to-key usage: #{seckey[:s2k_usage]}"
26
- puts "#{' ' * indent}string-to-key specifier: #{seckey[:s2k_specifier]}"
27
- puts "#{' ' * indent}Symmetric algorithm: #{seckey[:alg]}"
28
- puts "#{' ' * indent}Hash algorithm: #{seckey[:hash_alg]}"
29
- end
30
-
31
- usage if ARGV.length != 1
32
- armored = ARGV[0].downcase.end_with?('.asc') ? 1 : 0
33
-
34
- keyring_mem = LibC::calloc(1, LibRNP::PGPKeyring.size)
35
- keyring = LibRNP::PGPKeyring.new(keyring_mem)
36
- if 1 != LibRNP::pgp_keyring_fileread(keyring, armored, ARGV[0])
37
- puts 'Failed to load keyring'
38
- exit 1
39
- end
40
- keycount = LibRNP::dynarray_count(keyring, 'key')
41
- puts "Loaded #{keycount} key(s)"
42
-
43
- (0..keycount - 1).each {|keyn|
44
- key = LibRNP::dynarray_get_item(keyring, 'key', LibRNP::PGPKey, keyn)
45
- puts "[Key ##{keyn}]"
46
- uidcount = LibRNP::dynarray_count(key, 'uid')
47
- print "User ids: "
48
- puts LibRNP::dynarray_get_item(key, 'uid', :string, 0)
49
- (1..uidcount - 1).each {|uidn|
50
- print ' '
51
- puts LibRNP::dynarray_get_item(key, 'uid', :string, uidn)
52
- }
53
- puts "Subpackets: #{LibRNP::dynarray_count(key, 'packet')}"
54
- puts "Subsigs: #{LibRNP::dynarray_count(key, 'subsig')}"
55
- puts "Revocations: #{LibRNP::dynarray_count(key, 'revoke')}"
56
- case key[:type]
57
- when :PGP_PTAG_CT_PUBLIC_KEY
58
- puts ' [Public Key]'
59
- pubkey = key[:key][:pubkey]
60
- print_pubkey(pubkey, 2)
61
- when :PGP_PTAG_CT_SECRET_KEY
62
- puts ' [Secret Key]'
63
- seckey = key[:key][:seckey]
64
- print_seckey(seckey, 2)
65
- end
66
- puts ''
67
- }
68
-
@@ -1,96 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'optparse'
3
-
4
- require_relative '../../lib/rnp'
5
-
6
- options = {armored: false}
7
- parser = OptionParser.new do |opts|
8
- opts.banner = "Usage: #{$0} [options]"
9
- opts.on('-a', '--armored', 'Input file is ASCII armored') do
10
- options[:armored] = true
11
- end
12
- opts.on('-h', '--help', 'Print this help') do
13
- puts opts
14
- exit
15
- end
16
- end
17
-
18
- def print_pubkey(pubkey, indent=0)
19
- puts "#{' ' * indent}Version: #{pubkey[:version]}"
20
- puts "#{' ' * indent}Creation Time: #{Time.at(pubkey[:birthtime])}"
21
- puts "#{' ' * indent}Algorithm: #{pubkey[:alg]}"
22
- case pubkey[:alg]
23
- when :PGP_PKA_RSA
24
- n = LibRNP::bn2hex(pubkey[:key][:rsa][:n])
25
- e = LibRNP::bn2hex(pubkey[:key][:rsa][:e])
26
- puts "#{' ' * indent}n: 0x#{n}"
27
- puts "#{' ' * indent}e: 0x#{e}"
28
- end
29
- end
30
-
31
- def print_seckey(seckey, indent=0)
32
- puts "#{' ' * (indent+2)}[Public Key]"
33
- print_pubkey(seckey[:pubkey], indent + 2)
34
- puts "#{' ' * indent}string-to-key usage: #{seckey[:s2k_usage]}"
35
- puts "#{' ' * indent}string-to-key specifier: #{seckey[:s2k_specifier]}"
36
- puts "#{' ' * indent}Symmetric algorithm: #{seckey[:alg]}"
37
- puts "#{' ' * indent}Hash algorithm: #{seckey[:hash_alg]}"
38
- end
39
-
40
- parser.parse!
41
- armored = options[:armored] ? 1 : 0
42
-
43
- pgpio = LibRNP::PGPIO.new
44
- stdout_fp = LibC::fdopen($stdout.to_i, 'w')
45
- stderr_fp = LibC::fdopen($stderr.to_i, 'w')
46
- pgpio[:outs] = stdout_fp
47
- pgpio[:errs] = stderr_fp
48
- pgpio[:res] = stdout_fp
49
-
50
- mem_ptr = LibC::calloc(1, LibRNP::PGPMemory.size)
51
- mem = LibRNP::PGPMemory.new(mem_ptr)
52
-
53
- $stdin.binmode
54
- data = $stdin.read
55
- data_buf = FFI::MemoryPointer.new(:uint8, data.bytesize)
56
- data_buf.put_bytes(0, data)
57
- LibRNP::pgp_memory_add(mem, data_buf, data_buf.size)
58
-
59
- keyring_mem = LibC::calloc(1, LibRNP::PGPKeyring.size)
60
- keyring = LibRNP::PGPKeyring.new(keyring_mem)
61
- if 1 != LibRNP::pgp_keyring_read_from_mem(pgpio, keyring, armored, mem)
62
- puts 'Failed to load keyring'
63
- exit 1
64
- end
65
- keycount = LibRNP::dynarray_count(keyring, 'key')
66
- puts "Loaded #{keycount} key(s)"
67
-
68
- (0..keycount - 1).each {|keyn|
69
- key = LibRNP::dynarray_get_item(keyring, 'key', LibRNP::PGPKey, keyn)
70
- puts "[Key ##{keyn}]"
71
- uidcount = LibRNP::dynarray_count(key, 'uid')
72
- print "User ids: "
73
- puts LibRNP::dynarray_get_item(key, 'uid', :string, 0)
74
- (1..uidcount - 1).each {|uidn|
75
- print ' '
76
- puts LibRNP::dynarray_get_item(key, 'uid', :string, uidn)
77
- }
78
- puts "Subpackets: #{LibRNP::dynarray_count(key, 'packet')}"
79
- puts "Subsigs: #{LibRNP::dynarray_count(key, 'subsig')}"
80
- puts "Revocations: #{LibRNP::dynarray_count(key, 'revoke')}"
81
- printf "Key Flags: 0x%02X\n", key[:key_flags]
82
- case key[:type]
83
- when :PGP_PTAG_CT_PUBLIC_KEY
84
- puts ' [Public Key]'
85
- pubkey = key[:key][:pubkey]
86
- print_pubkey(pubkey, 2)
87
- when :PGP_PTAG_CT_SECRET_KEY
88
- puts ' [Secret Key]'
89
- seckey = key[:key][:seckey]
90
- print_seckey(seckey, 2)
91
- end
92
- puts ''
93
- }
94
-
95
- LibRNP::pgp_memory_free(mem)
96
-
@@ -1,104 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'optparse'
3
- require 'io/console'
4
-
5
- require_relative '../../lib/rnp'
6
-
7
- options = {keys_armored: false, cleartext: false, output_armored: false, detached: false}
8
- parser = OptionParser.new do |opts|
9
- opts.banner = "Usage: #{$0} [options] <seckey> <input-file> <output-file>"
10
- opts.on('-k', '--keys-armored', 'Seckey is ASCII armored') do
11
- options[:keys_armored] = true
12
- end
13
- opts.on('-c', '--clear-sign', 'Cleartext signature') do
14
- options[:cleartext] = true
15
- end
16
- opts.on('-a', '--armored', 'Output file will be ASCII armored') do
17
- options[:output_armored] = true
18
- end
19
- opts.on('-d', '--detached', 'Detached signature') do
20
- options[:detached] = true
21
- end
22
- opts.on('-h', '--help', 'Print this help') do
23
- puts opts
24
- exit
25
- end
26
- end
27
- parser.parse!
28
-
29
- if ARGV.length != 3
30
- parser.display
31
- exit
32
- end
33
-
34
- seckey_filename = ARGV.shift
35
- input_filename = ARGV.shift
36
- output_filename = ARGV.shift
37
-
38
- # Load keys/keyring
39
- keyring_mem = LibC::calloc(1, LibRNP::PGPKeyring.size)
40
- keyring = LibRNP::PGPKeyring.new(keyring_mem)
41
- if 1 != LibRNP::pgp_keyring_fileread(keyring, options[:keys_armored] ? 1 : 0, seckey_filename)
42
- puts 'Errors encountered while loading keyring.'
43
- exit 1
44
- end
45
- # Find first seckey
46
- keycount = LibRNP::dynarray_count(keyring, 'key')
47
- seckey = nil
48
- (0..keycount - 1).each {|keyn|
49
- key = LibRNP::dynarray_get_item(keyring, 'key', LibRNP::PGPKey, keyn)
50
- seckey = key if LibRNP::pgp_is_key_secret(key)
51
- break if seckey != nil
52
- }
53
- if seckey == nil
54
- puts 'No seckey found'
55
- exit 1
56
- end
57
-
58
- '''
59
- This is a bit convoluted because pgp_decrypt_seckey expects a FILE*.
60
- It may be cleaner to reimplement the short pgp_decrypt_seckey function
61
- in ruby as it does not do a lot.
62
- '''
63
- rd, wr = IO.pipe
64
- print 'Enter passphrase: '
65
- passphrase = $stdin.noecho(&:gets)
66
- puts ''
67
- wr.write passphrase
68
- wr.close
69
- passfp = LibC::fdopen(rd.to_i, 'r')
70
- seckey = LibRNP::pgp_decrypt_seckey(seckey, passfp)
71
- rd.close
72
- LibC::fclose(passfp)
73
-
74
- if seckey == nil
75
- puts 'Invalid passphrase.'
76
- exit 1
77
- end
78
- seckey = LibRNP::PGPSecKey.new(seckey)
79
-
80
- pgpio = LibRNP::PGPIO.new
81
- stdout_fp = LibC::fdopen($stdout.to_i, 'w')
82
- stderr_fp = LibC::fdopen($stderr.to_i, 'w')
83
- pgpio[:outs] = stdout_fp
84
- pgpio[:errs] = stderr_fp
85
- pgpio[:res] = stdout_fp
86
-
87
- overwrite = 1
88
- from = Time.now.to_i
89
- duration = 0
90
- armored = options[:output_armored] ? 1 : 0
91
-
92
- # see pgp_str_to_hash_alg
93
- hashname = 'sha1'
94
- if options[:detached]
95
- ret = LibRNP::pgp_sign_detached(pgpio, input_filename, output_filename, seckey, hashname, from, duration, armored, overwrite)
96
- else
97
- cleartext = options[:cleartext] ? 1 : 0
98
- ret = LibRNP::pgp_sign_file(pgpio, input_filename, output_filename, seckey, hashname, from, duration, armored, cleartext, overwrite)
99
- end
100
- if ret == 1
101
- puts 'Success'
102
- else
103
- puts 'Failed!'
104
- end
@@ -1,96 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'optparse'
3
- require 'io/console'
4
-
5
- require_relative '../../lib/rnp'
6
-
7
- options = {armored: false, keys_armored: false, cleartext: false}
8
- parser = OptionParser.new do |opts|
9
- opts.banner = "Usage: #{$0} [options] <seckey> <passphrase>"
10
- opts.on('-k', '--keys-armored', 'Keys are ASCII armored') do
11
- options[:keys_armored] = true
12
- end
13
- opts.on('-a', '--armored', 'Input is ASCII armored') do
14
- options[:armored] = true
15
- end
16
- opts.on('-c', '--clear-sign', 'Cleartext signature') do
17
- options[:cleartext] = true
18
- end
19
- opts.on('-h', '--help', 'Print this help') do
20
- puts opts
21
- exit
22
- end
23
- end
24
- parser.parse!
25
-
26
- if ARGV.length != 2
27
- parser.display
28
- exit
29
- end
30
-
31
- seckey_filename = ARGV.shift
32
- passphrase = ARGV.shift + "\n"
33
-
34
- # Load seckey/keyring
35
- seckeyring_mem = LibC::calloc(1, LibRNP::PGPKeyring.size)
36
- seckeyring = LibRNP::PGPKeyring.new(seckeyring_mem)
37
- if 1 != LibRNP::pgp_keyring_fileread(seckeyring, options[:keys_armored] ? 1 : 0, seckey_filename)
38
- puts 'Errors encountered while loading secret keyring.'
39
- exit 1
40
- end
41
- # Find first seckey
42
- keycount = LibRNP::dynarray_count(seckeyring, 'key')
43
- seckey = nil
44
- (0..keycount - 1).each {|keyn|
45
- key = LibRNP::dynarray_get_item(seckeyring, 'key', LibRNP::PGPKey, keyn)
46
- seckey = key if LibRNP::pgp_is_key_secret(key)
47
- break if seckey != nil
48
- }
49
- if seckey == nil
50
- puts 'No seckey found'
51
- exit 1
52
- end
53
-
54
- pgpio = LibRNP::PGPIO.new
55
- stderr_fp = LibC::fdopen($stderr.to_i, 'w')
56
- # send all to stderr
57
- pgpio[:outs] = stderr_fp
58
- pgpio[:errs] = stderr_fp
59
- pgpio[:res] = stderr_fp
60
-
61
- rd, wr = IO.pipe
62
- wr.write passphrase
63
- wr.close
64
- passfp = LibC::fdopen(rd.to_i, 'r')
65
- seckey = LibRNP::pgp_decrypt_seckey(seckey, passfp)
66
- rd.close
67
- LibC::fclose(passfp)
68
-
69
- if seckey == nil
70
- puts 'Invalid passphrase.'
71
- exit 1
72
- end
73
- seckey = LibRNP::PGPSecKey.new(seckey)
74
-
75
- armored = options[:armored] ? 1 : 0
76
- cleartext = options[:cleartext] ? 1 : 0
77
- from = Time.now.to_i
78
- duration = 0
79
- # see pgp_str_to_hash_alg
80
- hashname = 'sha1'
81
-
82
- $stdin.binmode
83
- data = $stdin.read
84
- data_buf = FFI::MemoryPointer.new(:uint8, data.bytesize)
85
- data_buf.put_bytes(0, data)
86
- memory_ptr = LibRNP::pgp_sign_buf(pgpio, data_buf, data_buf.size, seckey, from, duration, hashname, armored, cleartext)
87
- if not memory_ptr.null?
88
- memory = LibRNP::PGPMemory.new(memory_ptr)
89
- $stdout.binmode
90
- $stdout.puts memory[:buf].read_bytes(memory[:length])
91
- LibRNP::pgp_memory_free(memory)
92
- $stderr.puts 'Success'
93
- else
94
- $stderr.puts 'Failed!'
95
- end
96
-
@@ -1,55 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'optparse'
3
- require 'io/console'
4
-
5
- require_relative '../../lib/rnp'
6
-
7
- options = {keys_armored: false, armored: false}
8
- parser = OptionParser.new do |opts|
9
- opts.banner = "Usage: #{$0} [options] <pubkey> <input-file>"
10
- opts.on('-k', '--keys-armored', 'Pubkey is ASCII armored') do
11
- options[:keys_armored] = true
12
- end
13
- opts.on('-a', '--armored', 'Input file is ASCII armored') do
14
- options[:armored] = true
15
- end
16
- opts.on('-h', '--help', 'Print this help') do
17
- puts opts
18
- exit
19
- end
20
- end
21
- parser.parse!
22
-
23
- if ARGV.length != 2
24
- parser.display
25
- exit
26
- end
27
-
28
- pubkey_filename = ARGV.shift
29
- input_filename = ARGV.shift
30
-
31
- # Load keys/keyring
32
- keyring_mem = LibC::calloc(1, LibRNP::PGPKeyring.size)
33
- keyring = LibRNP::PGPKeyring.new(keyring_mem)
34
- if 1 != LibRNP::pgp_keyring_fileread(keyring, options[:keys_armored] ? 1 : 0, pubkey_filename)
35
- puts 'Errors encountered while loading keyring.'
36
- exit 1
37
- end
38
-
39
- pgpio = LibRNP::PGPIO.new
40
- stdout_fp = LibC::fdopen($stdout.to_i, 'w')
41
- stderr_fp = LibC::fdopen($stderr.to_i, 'w')
42
- pgpio[:outs] = stdout_fp
43
- pgpio[:errs] = stderr_fp
44
- pgpio[:res] = stdout_fp
45
-
46
- armored = options[:armored] ? 1 : 0
47
-
48
- validation = LibRNP::PGPValidation.new
49
- ret = LibRNP::pgp_validate_file(pgpio, validation, input_filename, nil, armored, keyring)
50
- if ret == 1
51
- puts 'Success'
52
- else
53
- puts 'Failed!'
54
- end
55
-
@@ -1,61 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'optparse'
3
- require 'io/console'
4
-
5
- require_relative '../../lib/rnp'
6
-
7
- options = {keys_armored: false, armored: false}
8
- parser = OptionParser.new do |opts|
9
- opts.banner = "Usage: #{$0} [options] <pubkey>"
10
- opts.on('-k', '--keys-armored', 'Pubkey is ASCII armored') do
11
- options[:keys_armored] = true
12
- end
13
- opts.on('-a', '--armored', 'Input file is ASCII armored') do
14
- options[:armored] = true
15
- end
16
- opts.on('-h', '--help', 'Print this help') do
17
- puts opts
18
- exit
19
- end
20
- end
21
- parser.parse!
22
-
23
- if ARGV.length != 1
24
- parser.display
25
- exit
26
- end
27
-
28
- pubkey_filename = ARGV.shift
29
-
30
- # Load keys/keyring
31
- keyring_mem = LibC::calloc(1, LibRNP::PGPKeyring.size)
32
- keyring = LibRNP::PGPKeyring.new(keyring_mem)
33
- if 1 != LibRNP::pgp_keyring_fileread(keyring, options[:keys_armored] ? 1 : 0, pubkey_filename)
34
- puts 'Errors encountered while loading keyring.'
35
- exit 1
36
- end
37
-
38
- pgpio = LibRNP::PGPIO.new
39
- stderr_fp = LibC::fdopen($stderr.to_i, 'w')
40
- pgpio[:outs] = stderr_fp
41
- pgpio[:errs] = stderr_fp
42
- pgpio[:res] = stderr_fp
43
-
44
- armored = options[:armored] ? 1 : 0
45
-
46
- validation = LibRNP::PGPValidation.new
47
- mem_ptr = LibC::calloc(1, LibRNP::PGPMemory.size)
48
- mem = LibRNP::PGPMemory.new(mem_ptr)
49
-
50
- $stdin.binmode
51
- data = $stdin.read
52
- data_buf = FFI::MemoryPointer.new(:uint8, data.bytesize)
53
- data_buf.put_bytes(0, data)
54
- LibRNP::pgp_memory_add(mem, data_buf, data_buf.size)
55
- ret = LibRNP::pgp_validate_mem(pgpio, validation, mem, nil, armored, keyring)
56
- if ret == 1
57
- puts 'Success'
58
- else
59
- puts 'Failed!'
60
- end
61
-