rnp 0.2.0 → 1.0.0

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.
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
-