gpgc 0.0.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.
- data/.gitignore +20 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +67 -0
- data/Rakefile +25 -0
- data/bin/gpgc +46 -0
- data/gpgc.gemspec +24 -0
- data/lib/gpgcrypt.rb +138 -0
- data/lib/gpgcrypt/version.rb +3 -0
- data/spec/dummy/msg +1 -0
- data/spec/dummy/priv_key +27 -0
- data/spec/dummy/pub_key +8 -0
- data/spec/dummy/ssh_pub_key +1 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/unit/gpgcrypt_spec.rb +63 -0
- metadata +135 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 TheNotary
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
# Gpgcrypt
|
2
|
+
|
3
|
+
This gem is designed to allow you to manually encrypt/ decrypt RSA encoded messages using GnuPG.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Install the gem:
|
8
|
+
|
9
|
+
$ gem install gpgcrypt
|
10
|
+
|
11
|
+
## Usage Template
|
12
|
+
Encrypting:
|
13
|
+
|
14
|
+
$ gpgcrypt message public_key
|
15
|
+
|
16
|
+
Decrypting:
|
17
|
+
|
18
|
+
$ gpgcrypt encrypted_message private_key
|
19
|
+
|
20
|
+
## Usage
|
21
|
+
|
22
|
+
Have your partner generate a public/private key pair (You may have already done this).
|
23
|
+
|
24
|
+
$ ssh-keygen -t rsa
|
25
|
+
|
26
|
+
Obtain a copy of your partner's public key.
|
27
|
+
|
28
|
+
And then use gpgcrypt to encrypt a message using your partner's public key:
|
29
|
+
|
30
|
+
$ gpgcrypt message.txt public_key_of_recipient_rsa.pub > encrypted_message.txt
|
31
|
+
|
32
|
+
Or have your partner decrypt a message of yours using your own private key:
|
33
|
+
|
34
|
+
$ gpgcrypt encrypted_message.txt your_private_key_rsa > message.txt
|
35
|
+
|
36
|
+
|
37
|
+
## Alternate Usage
|
38
|
+
|
39
|
+
You can alternatively specify a URL to public keys or messages
|
40
|
+
|
41
|
+
Encrypting:
|
42
|
+
|
43
|
+
$ gpgcrypt message.txt github.com/TheNotary/pgp/raw
|
44
|
+
Your message has been pastebin'd to http://pastebin.com/lkajds;lkfjsdaf
|
45
|
+
|
46
|
+
Decrypting:
|
47
|
+
|
48
|
+
$ gpgcrypt http://pastebin.com/lkajds;lkfjsdaf ~/.ssh/id_rsa
|
49
|
+
|
50
|
+
|
51
|
+
|
52
|
+
Later, you will be able to add other people's public keys to your ~/.gpgc folder. Then you will be able to set their key as the default key.
|
53
|
+
|
54
|
+
$ gpgc --save-key pastebin.com/raw/;laksjdflkjdf joe
|
55
|
+
$ gpgc --converse-with ~/.gpgc/joe
|
56
|
+
$ gpgc "Hey, let me know when you've made the finishing touches."
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
## Contributing
|
62
|
+
|
63
|
+
1. Fork it
|
64
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
65
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
66
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
67
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
include Rake::DSL
|
3
|
+
Bundler::GemHelper.install_tasks
|
4
|
+
|
5
|
+
require "rspec/core/rake_task" # RSpec 2.0
|
6
|
+
|
7
|
+
RSpec::Core::RakeTask.new(:unit) do |spec|
|
8
|
+
#spec.pattern = 'spec/*/*_spec.rb'
|
9
|
+
spec.pattern = 'spec/unit/*_spec.rb'
|
10
|
+
spec.rspec_opts = ['--backtrace']
|
11
|
+
end
|
12
|
+
|
13
|
+
RSpec::Core::RakeTask.new(:all) do |spec|
|
14
|
+
spec.pattern = 'spec/*/*_spec.rb'
|
15
|
+
#spec.rspec_opts = ['--debug']
|
16
|
+
end
|
17
|
+
|
18
|
+
# this is for running tests that you've marked current... eg: it 'should work', :current => true do
|
19
|
+
RSpec::Core::RakeTask.new(:current) do |spec|
|
20
|
+
spec.pattern = 'spec/*/*_spec.rb'
|
21
|
+
spec.rspec_opts = ['--tag current']
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
task :default => :all
|
data/bin/gpgc
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#require 'thor'
|
4
|
+
require 'pry'
|
5
|
+
require 'gpgcrypt'
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
if ARGV[0].nil? or ARGV[0].downcase.chomp.strip =~ /^(\-|\-\-)help$/ or ARGV[0] == "" # regex captures help, -help, or --help.
|
10
|
+
puts GpgCrypt.help
|
11
|
+
elsif ARGV[0].downcase.chomp.strip == "export"
|
12
|
+
# TODO
|
13
|
+
elseif ARGV[0].downcase.chomp.strip == "--save-key"
|
14
|
+
puts "The feature hasn't yet been implemented."
|
15
|
+
elseif ARGV[0].downcase.chomp.strip == "--converse-with"
|
16
|
+
puts "The feature hasn't yet been implemented."
|
17
|
+
elsif ARGV.count != 2
|
18
|
+
puts "You need to pass in two parameters, a path to a msg and a path to an RSA key."
|
19
|
+
else
|
20
|
+
puts GpgCrypt.encrypt_or_decrypt(ARGV[0], ARGV[1])
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
=begin
|
29
|
+
class GpgCryptRunner < Thor
|
30
|
+
default_task :help
|
31
|
+
|
32
|
+
desc "help", "Explains the gem's usage on the command line."
|
33
|
+
def help
|
34
|
+
binding.pry
|
35
|
+
puts $my_args
|
36
|
+
puts GpgCrypt.help
|
37
|
+
end
|
38
|
+
|
39
|
+
#desc "encrypt/ Decrypt", "either decrypts or encrypts something based on whether u supply a pub/priv key."
|
40
|
+
#def *args
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
GpgCryptRunner.start
|
45
|
+
|
46
|
+
=end
|
data/gpgc.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'gpgcrypt/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "gpgc"
|
8
|
+
gem.version = GpgCrypt::VERSION
|
9
|
+
gem.authors = ["TheNotary"]
|
10
|
+
gem.email = ["no@mail.plz"]
|
11
|
+
gem.description = %q{GpgCrypt is a gem that helps you encrypt messages.}
|
12
|
+
gem.summary = %q{This gem is designed to allow you to manually encrypt/ decrypt RSA encoded messages using GnuPG.}
|
13
|
+
gem.homepage = ""
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.add_dependency "gibberish"
|
21
|
+
gem.add_development_dependency "rake"
|
22
|
+
gem.add_development_dependency "rspec"
|
23
|
+
gem.add_development_dependency "pry"
|
24
|
+
end
|
data/lib/gpgcrypt.rb
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
require 'gibberish'
|
2
|
+
require 'pry'
|
3
|
+
require 'uri'
|
4
|
+
require 'open-uri'
|
5
|
+
|
6
|
+
require "gpgcrypt/version"
|
7
|
+
|
8
|
+
module GpgCrypt
|
9
|
+
|
10
|
+
def self.encrypt_or_decrypt(*args)
|
11
|
+
key_data = File.read(args[1]) #if File.exists
|
12
|
+
key_type = get_key_type?(key_data) # args[1] is either a public key or a private key...
|
13
|
+
|
14
|
+
# convert_key_to_pem_format
|
15
|
+
if key_type == :open_ssh
|
16
|
+
key_data = convert_openssh_public_key_to_openssl(key_data)
|
17
|
+
key_type = get_key_type?(key_data) # if this fails, we should set key_type to :incompatible
|
18
|
+
end
|
19
|
+
|
20
|
+
# get_message_data decide where to read a file as the message, or use the first param
|
21
|
+
if File.exist? args[0]
|
22
|
+
message_data = File.read(args[0])
|
23
|
+
else
|
24
|
+
message_data = args[0]
|
25
|
+
end
|
26
|
+
|
27
|
+
case key_type
|
28
|
+
when :public
|
29
|
+
encrypt(message_data, key_data)
|
30
|
+
when :private
|
31
|
+
decrypt(message_data, key_data)
|
32
|
+
else # :incompatible or even possibly :open_ssh if something odd happens
|
33
|
+
puts "The key entered was niether a public nor private key. Check that you passed in a proper path to a key as the second parameter."
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# @param [string] message
|
38
|
+
#
|
39
|
+
# @param [string] public_key
|
40
|
+
#
|
41
|
+
# @return [string] encrypted message
|
42
|
+
#
|
43
|
+
def self.encrypt(message, public_key)
|
44
|
+
message_string = message
|
45
|
+
public_key_string = public_key
|
46
|
+
|
47
|
+
# encrypt the message
|
48
|
+
cipher = Gibberish::RSA.new(public_key_string)
|
49
|
+
encrypted_message = cipher.encrypt(message_string)
|
50
|
+
end
|
51
|
+
|
52
|
+
# @param [string] encrypted message
|
53
|
+
#
|
54
|
+
# @param [string] public key in PEM format
|
55
|
+
#
|
56
|
+
# @return [string] decrypted message
|
57
|
+
#
|
58
|
+
def self.decrypt(encrypted_message, private_key)
|
59
|
+
message_string = encrypted_message
|
60
|
+
private_key_string = private_key
|
61
|
+
|
62
|
+
# decrypt the message
|
63
|
+
dec_cipher = Gibberish::RSA.new(private_key_string)
|
64
|
+
decrypted_message = dec_cipher.decrypt(message_string)
|
65
|
+
end
|
66
|
+
|
67
|
+
# This command let's you read your private key and generate from that
|
68
|
+
# a suitable public key which will be posted to pastebin.
|
69
|
+
def self.export_public_key(private_key)
|
70
|
+
raise "stub: not yet implemented"
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.help
|
74
|
+
hlp = "gpgcrypt allows you to 'manually' encrypt and decrypt messages over the command line.\n\n"
|
75
|
+
hlp += "To encrypt a message: \n Supply a path to a file containing a message and an openSSL style public key. \n\n"
|
76
|
+
hlp += "To decrypt a message: \n Supply a path to a file containing an encrypted message and a private key.\n\n"
|
77
|
+
hlp += "Soon you'll be able to export a public key from your private key and automatically pastebin it so others can message you.\n\n"
|
78
|
+
hlp += "As an added feature, someday you will be able to specify pastebin links to encrypted messages and public keys"
|
79
|
+
hlp
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
# checks if a string is a path to a file or a URL
|
84
|
+
# Returns a string of the file or URL page contents
|
85
|
+
def self.path_to_content(string)
|
86
|
+
string_is_a_file = File.exists? string
|
87
|
+
string_is_a_uri = string =~ URI::regexp
|
88
|
+
if string_is_a_file
|
89
|
+
File.read(string)
|
90
|
+
elsif string_is_a_uri
|
91
|
+
URI.parse(string).read
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def scan_if_encrypted_message(string)
|
96
|
+
return true if is_string_private_key?
|
97
|
+
false
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.convert_openssh_public_key_to_openssl(public_key_string, check_key_type = true)
|
101
|
+
return public_key_string if get_key_type?(public_key_string) == :public
|
102
|
+
|
103
|
+
# return public_key_string if true
|
104
|
+
temp_file_path = '/tmp/gpgcrypt_pubtest'
|
105
|
+
File.open(temp_file_path, "w+") do |f|
|
106
|
+
f.puts public_key_string
|
107
|
+
end
|
108
|
+
File.chmod(0600, temp_file_path)
|
109
|
+
|
110
|
+
# binding.pry
|
111
|
+
#openssl_key = `openssl rsa -in #{temp_file_path} -out pub.der -outform pem -pubout`
|
112
|
+
openssl_key = `ssh-keygen -f #{temp_file_path} -e -m pem`
|
113
|
+
File.delete(temp_file_path)
|
114
|
+
return openssl_key
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
def self.get_key_type?(string)
|
119
|
+
valid_private_key = :incompatible
|
120
|
+
|
121
|
+
return :open_ssh if string =~ /^ssh-rsa/
|
122
|
+
|
123
|
+
begin
|
124
|
+
k = OpenSSL::PKey::RSA.new(string)
|
125
|
+
if k.private?
|
126
|
+
valid_private_key = :private
|
127
|
+
elsif k.public?
|
128
|
+
valid_private_key = :public
|
129
|
+
else
|
130
|
+
valid_private_key = :incompatible
|
131
|
+
end
|
132
|
+
rescue
|
133
|
+
valid_private_key = :incompatible
|
134
|
+
end
|
135
|
+
valid_private_key
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
data/spec/dummy/msg
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
These words are the contents of spec/dummy/msg
|
data/spec/dummy/priv_key
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIEogIBAAKCAQEAoxi2V0bSKqAqUtoQHxWkOPnErCS541r6/MOSHmKOd6VSNHoB
|
3
|
+
bnasZRQSDUTbffB6C++DbmBCOHmvzYORD0ZWYgyMcgbYJD48Z2fe0nm+WMYN5u8D
|
4
|
+
PnTPvf8b/rJBxGF0dsaoFAWlB81tTnKFCxAbCSgfmQt+Vd4qupGZ5gGu9uoKlaPj
|
5
|
+
mYuAIxIjUMcu3dov7PQ+PZIvdkM0fiz8YIl8zo+iWWyI2s6/XLoZJ4bYs2YJHZDf
|
6
|
+
6biUsZhs8xqh/F6qlcRt3Ta25KMa0TB9zE3HHmqA/EJHFubWFRCrQqpboB0+nwCb
|
7
|
+
mZUlhaxA79FRvYtORvFAoncoFD4tq3rGXcUQQwIDAQABAoIBAEiF9p78mPvnWKqa
|
8
|
+
2MxZvTqwpem+MwKMNEstU847GQrO8qzvC6/pCWOw9w37bnaj9kFUceck2o1uXuRN
|
9
|
+
+rUGG+dhmRojPP1wxz9cCtMg26lx+ECWS6T8IFxmEjbBYUlH5JfkYlz03ZuIl3Bo
|
10
|
+
sAxpTvxVYSeW2sioD+wCTqLeYMTeO6u8kPjNeuBp7ZKJ+xK/d91C9IycmxqXTiKC
|
11
|
+
5Vpeh0i3xn0QvaHzttnvee0T8wQE6C7WAWlZsOZjuifOM77armuwLaL53KWdwV1H
|
12
|
+
M/PSVyzhfFHzBvIixjJ/y6eA1e4XbwJk9M05XT5MGjYR1TL34a5UasRYKZz6jK4W
|
13
|
+
HGyZxWECgYEA0Vf4BcYn65VgQI6Eff27j7ZJAFm6rGBvasWf+dye+Nkp1TjBhuPj
|
14
|
+
eAAOx72q+Ov0i+wN++Jsbh2CehFaWK0d7+mKmQdpbPXWwEicLs6oIO4zIhr+Y/q3
|
15
|
+
2PaPlxwOrtazanfySVO4MklUTPEjvWGu+FKgGR5zd3fU1OArizP3iWkCgYEAx3Ih
|
16
|
+
d9engWLxK4IwlJ4tiWKDqP7M4p2iGJckj/0Obgn2OgOHDhlFwLcTwA8iBuNlgU6N
|
17
|
+
KqCCHvPm/8ycv3hp4etCPEEr3eeb46tO/MsZGtY0KZkCT61cHva1zWfxhdPs4oaP
|
18
|
+
5qALRp8xfWJP8UHmzR+/QCQUJw1YM844EguVCssCgYBnkxeSe8T6iRBzQFALKgOn
|
19
|
+
ie+6baqvaJMXh6mr7Nz2kDNjXE5b19qOX7DwYEX8HHoE1Ijiq9cr8AvDK1zA7P4X
|
20
|
+
2juJlSIzF7rlrccgXXzPtiq0YBinDL/zZ6IJiIc3N+DS9393iiVjM+aynsgpBfCU
|
21
|
+
ygSOCQPmAvLZVAQXPmHlqQKBgHT2583CeQeWIN1lMlxWD1p8nb3j///+det56AVR
|
22
|
+
YL8DtJT9MJ0CETgdpcWCmm/zt7mHeZ5AF09TtmrZciuP0HifYW64waMXiwKPmnkC
|
23
|
+
Gqz0Zg7nHsXfYyD9ikz14lybllaal5Wm0jYOchWYLE3OWi59qclR30evucRX8eYT
|
24
|
+
SMrVAoGAISImqYF376/pz/9TNEl5P8yOlIOG4grwzuykoBpFh98UCCiW/wzH5zCt
|
25
|
+
Miy9hFH6Lgj9HGtsx/TvclgMBQtktBn5MrNarC8zWCAfIEaNQAkb6GrYXxrO2jnI
|
26
|
+
OW7+BgxGQGFwtn+2TrJQOsgwFTZx1AmG53m3jhiO2HC2kd1VqgM=
|
27
|
+
-----END RSA PRIVATE KEY-----
|
data/spec/dummy/pub_key
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
-----BEGIN RSA PUBLIC KEY-----
|
2
|
+
MIIBCgKCAQEAoxi2V0bSKqAqUtoQHxWkOPnErCS541r6/MOSHmKOd6VSNHoBbnas
|
3
|
+
ZRQSDUTbffB6C++DbmBCOHmvzYORD0ZWYgyMcgbYJD48Z2fe0nm+WMYN5u8DPnTP
|
4
|
+
vf8b/rJBxGF0dsaoFAWlB81tTnKFCxAbCSgfmQt+Vd4qupGZ5gGu9uoKlaPjmYuA
|
5
|
+
IxIjUMcu3dov7PQ+PZIvdkM0fiz8YIl8zo+iWWyI2s6/XLoZJ4bYs2YJHZDf6biU
|
6
|
+
sZhs8xqh/F6qlcRt3Ta25KMa0TB9zE3HHmqA/EJHFubWFRCrQqpboB0+nwCbmZUl
|
7
|
+
haxA79FRvYtORvFAoncoFD4tq3rGXcUQQwIDAQAB
|
8
|
+
-----END RSA PUBLIC KEY-----
|
@@ -0,0 +1 @@
|
|
1
|
+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCjGLZXRtIqoCpS2hAfFaQ4+cSsJLnjWvr8w5IeYo53pVI0egFudqxlFBINRNt98HoL74NuYEI4ea/Ng5EPRlZiDIxyBtgkPjxnZ97Seb5Yxg3m7wM+dM+9/xv+skHEYXR2xqgUBaUHzW1OcoULEBsJKB+ZC35V3iq6kZnmAa726gqVo+OZi4AjEiNQxy7d2i/s9D49ki92QzR+LPxgiXzOj6JZbIjazr9cuhknhtizZgkdkN/puJSxmGzzGqH8XqqVxG3dNrbkoxrRMH3MTcceaoD8QkcW5tYVEKtCqlugHT6fAJuZlSWFrEDv0VG9i05G8UCidygUPi2resZdxRBD
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'gpgcrypt'
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
describe GpgCrypt do
|
6
|
+
|
7
|
+
before :each do
|
8
|
+
@ssh_pub_path = 'spec/dummy/ssh_pub_key'
|
9
|
+
@pub_path = "spec/dummy/pub_key"
|
10
|
+
@priv_path = "spec/dummy/priv_key"
|
11
|
+
@msg_path = "spec/dummy/msg"
|
12
|
+
|
13
|
+
@pub_key = "-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAoxi2V0bSKqAqUtoQHxWkOPnErCS541r6/MOSHmKOd6VSNHoBbnas\nZRQSDUTbffB6C++DbmBCOHmvzYORD0ZWYgyMcgbYJD48Z2fe0nm+WMYN5u8DPnTP\nvf8b/rJBxGF0dsaoFAWlB81tTnKFCxAbCSgfmQt+Vd4qupGZ5gGu9uoKlaPjmYuA\nIxIjUMcu3dov7PQ+PZIvdkM0fiz8YIl8zo+iWWyI2s6/XLoZJ4bYs2YJHZDf6biU\nsZhs8xqh/F6qlcRt3Ta25KMa0TB9zE3HHmqA/EJHFubWFRCrQqpboB0+nwCbmZUl\nhaxA79FRvYtORvFAoncoFD4tq3rGXcUQQwIDAQAB\n-----END RSA PUBLIC KEY-----\n"
|
14
|
+
@priv_key = "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAoxi2V0bSKqAqUtoQHxWkOPnErCS541r6/MOSHmKOd6VSNHoB\nbnasZRQSDUTbffB6C++DbmBCOHmvzYORD0ZWYgyMcgbYJD48Z2fe0nm+WMYN5u8D\nPnTPvf8b/rJBxGF0dsaoFAWlB81tTnKFCxAbCSgfmQt+Vd4qupGZ5gGu9uoKlaPj\nmYuAIxIjUMcu3dov7PQ+PZIvdkM0fiz8YIl8zo+iWWyI2s6/XLoZJ4bYs2YJHZDf\n6biUsZhs8xqh/F6qlcRt3Ta25KMa0TB9zE3HHmqA/EJHFubWFRCrQqpboB0+nwCb\nmZUlhaxA79FRvYtORvFAoncoFD4tq3rGXcUQQwIDAQABAoIBAEiF9p78mPvnWKqa\n2MxZvTqwpem+MwKMNEstU847GQrO8qzvC6/pCWOw9w37bnaj9kFUceck2o1uXuRN\n+rUGG+dhmRojPP1wxz9cCtMg26lx+ECWS6T8IFxmEjbBYUlH5JfkYlz03ZuIl3Bo\nsAxpTvxVYSeW2sioD+wCTqLeYMTeO6u8kPjNeuBp7ZKJ+xK/d91C9IycmxqXTiKC\n5Vpeh0i3xn0QvaHzttnvee0T8wQE6C7WAWlZsOZjuifOM77armuwLaL53KWdwV1H\nM/PSVyzhfFHzBvIixjJ/y6eA1e4XbwJk9M05XT5MGjYR1TL34a5UasRYKZz6jK4W\nHGyZxWECgYEA0Vf4BcYn65VgQI6Eff27j7ZJAFm6rGBvasWf+dye+Nkp1TjBhuPj\neAAOx72q+Ov0i+wN++Jsbh2CehFaWK0d7+mKmQdpbPXWwEicLs6oIO4zIhr+Y/q3\n2PaPlxwOrtazanfySVO4MklUTPEjvWGu+FKgGR5zd3fU1OArizP3iWkCgYEAx3Ih\nd9engWLxK4IwlJ4tiWKDqP7M4p2iGJckj/0Obgn2OgOHDhlFwLcTwA8iBuNlgU6N\nKqCCHvPm/8ycv3hp4etCPEEr3eeb46tO/MsZGtY0KZkCT61cHva1zWfxhdPs4oaP\n5qALRp8xfWJP8UHmzR+/QCQUJw1YM844EguVCssCgYBnkxeSe8T6iRBzQFALKgOn\nie+6baqvaJMXh6mr7Nz2kDNjXE5b19qOX7DwYEX8HHoE1Ijiq9cr8AvDK1zA7P4X\n2juJlSIzF7rlrccgXXzPtiq0YBinDL/zZ6IJiIc3N+DS9393iiVjM+aynsgpBfCU\nygSOCQPmAvLZVAQXPmHlqQKBgHT2583CeQeWIN1lMlxWD1p8nb3j///+det56AVR\nYL8DtJT9MJ0CETgdpcWCmm/zt7mHeZ5AF09TtmrZciuP0HifYW64waMXiwKPmnkC\nGqz0Zg7nHsXfYyD9ikz14lybllaal5Wm0jYOchWYLE3OWi59qclR30evucRX8eYT\nSMrVAoGAISImqYF376/pz/9TNEl5P8yOlIOG4grwzuykoBpFh98UCCiW/wzH5zCt\nMiy9hFH6Lgj9HGtsx/TvclgMBQtktBn5MrNarC8zWCAfIEaNQAkb6GrYXxrO2jnI\nOW7+BgxGQGFwtn+2TrJQOsgwFTZx1AmG53m3jhiO2HC2kd1VqgM=\n-----END RSA PRIVATE KEY-----\n"
|
15
|
+
@ssh_pub_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCjGLZXRtIqoCpS2hAfFaQ4+cSsJLnjWvr8w5IeYo53pVI0egFudqxlFBINRNt98HoL74NuYEI4ea/Ng5EPRlZiDIxyBtgkPjxnZ97Seb5Yxg3m7wM+dM+9/xv+skHEYXR2xqgUBaUHzW1OcoULEBsJKB+ZC35V3iq6kZnmAa726gqVo+OZi4AjEiNQxy7d2i/s9D49ki92QzR+LPxgiXzOj6JZbIjazr9cuhknhtizZgkdkN/puJSxmGzzGqH8XqqVxG3dNrbkoxrRMH3MTcceaoD8QkcW5tYVEKtCqlugHT6fAJuZlSWFrEDv0VG9i05G8UCidygUPi2resZdxRBD"
|
16
|
+
|
17
|
+
@unencrypted_message = 'hello world!'
|
18
|
+
end
|
19
|
+
|
20
|
+
it "Should encrypt and decrypt a message based on a private key string" do
|
21
|
+
enc = GpgCrypt.encrypt(@unencrypted_message, @pub_key)
|
22
|
+
enc.should_not eq @unencrypted_message
|
23
|
+
msg = GpgCrypt.decrypt(enc, @priv_key)
|
24
|
+
msg.should eq @unencrypted_message
|
25
|
+
end
|
26
|
+
|
27
|
+
it "Should encrypt the contents of a file name passed in" do
|
28
|
+
enc = GpgCrypt.encrypt_or_decrypt(@msg_path, @pub_path)
|
29
|
+
GpgCrypt.encrypt_or_decrypt(enc, @priv_path).should eq File.read(@msg_path)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "Should encrypt the first parameter passed in if it's not a file" do
|
33
|
+
enc = GpgCrypt.encrypt_or_decrypt(@unencrypted_message, @pub_path)
|
34
|
+
GpgCrypt.encrypt_or_decrypt(enc, @priv_path).should eq @unencrypted_message
|
35
|
+
end
|
36
|
+
|
37
|
+
# http://unix.stackexchange.com/questions/26924/how-do-i-convert-a-ssh-keygen-public-key-into-a-format-that-openssl-pem-read-bio
|
38
|
+
# Usecase:
|
39
|
+
# You just generated a key pair via ssh-keygen.
|
40
|
+
#
|
41
|
+
# You manually pastebin your public key so your partner can communicate with you.
|
42
|
+
#
|
43
|
+
# Your partner then wants to quickly encrypt a message by
|
44
|
+
# $ gpgcrypt "hey, tell me if you can decrypt this" ~/.ssh/id_rsa.pub
|
45
|
+
#
|
46
|
+
# This function will automatically convert the openSSH format into PEM
|
47
|
+
#
|
48
|
+
it "should convert ssh keys into openssl keys", :current => true do
|
49
|
+
key = GpgCrypt.convert_openssh_public_key_to_openssl(@ssh_pub_key)
|
50
|
+
key.should eq @pub_key
|
51
|
+
end
|
52
|
+
|
53
|
+
it "Should encrypt the file even if it's an ssh public key file that's supplied" do
|
54
|
+
enc = GpgCrypt.encrypt_or_decrypt(@msg_path, @ssh_pub_path)
|
55
|
+
GpgCrypt.encrypt_or_decrypt(enc, @priv_path).should eq File.read(@msg_path)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should be able to determine whether it should encrypt or decrypt something" do
|
59
|
+
GpgCrypt.get_key_type?(@pub_key).should be :public
|
60
|
+
GpgCrypt.get_key_type?(@priv_key).should be :private
|
61
|
+
GpgCrypt.get_key_type?("@priv_key").should be :incompatible
|
62
|
+
end
|
63
|
+
end
|
metadata
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gpgc
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- TheNotary
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-03-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: gibberish
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: pry
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
description: GpgCrypt is a gem that helps you encrypt messages.
|
79
|
+
email:
|
80
|
+
- no@mail.plz
|
81
|
+
executables:
|
82
|
+
- gpgc
|
83
|
+
extensions: []
|
84
|
+
extra_rdoc_files: []
|
85
|
+
files:
|
86
|
+
- .gitignore
|
87
|
+
- Gemfile
|
88
|
+
- LICENSE.txt
|
89
|
+
- README.md
|
90
|
+
- Rakefile
|
91
|
+
- bin/gpgc
|
92
|
+
- gpgc.gemspec
|
93
|
+
- lib/gpgcrypt.rb
|
94
|
+
- lib/gpgcrypt/version.rb
|
95
|
+
- spec/dummy/enc
|
96
|
+
- spec/dummy/msg
|
97
|
+
- spec/dummy/priv_key
|
98
|
+
- spec/dummy/pub_key
|
99
|
+
- spec/dummy/ssh_pub_key
|
100
|
+
- spec/spec_helper.rb
|
101
|
+
- spec/unit/gpgcrypt_spec.rb
|
102
|
+
homepage: ''
|
103
|
+
licenses: []
|
104
|
+
post_install_message:
|
105
|
+
rdoc_options: []
|
106
|
+
require_paths:
|
107
|
+
- lib
|
108
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
109
|
+
none: false
|
110
|
+
requirements:
|
111
|
+
- - ! '>='
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
114
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
116
|
+
requirements:
|
117
|
+
- - ! '>='
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
requirements: []
|
121
|
+
rubyforge_project:
|
122
|
+
rubygems_version: 1.8.23
|
123
|
+
signing_key:
|
124
|
+
specification_version: 3
|
125
|
+
summary: This gem is designed to allow you to manually encrypt/ decrypt RSA encoded
|
126
|
+
messages using GnuPG.
|
127
|
+
test_files:
|
128
|
+
- spec/dummy/enc
|
129
|
+
- spec/dummy/msg
|
130
|
+
- spec/dummy/priv_key
|
131
|
+
- spec/dummy/pub_key
|
132
|
+
- spec/dummy/ssh_pub_key
|
133
|
+
- spec/spec_helper.rb
|
134
|
+
- spec/unit/gpgcrypt_spec.rb
|
135
|
+
has_rdoc:
|