gibberish 0.0.2 → 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.
- data/.gitmodules +3 -0
- data/.yardoc/checksums +6 -0
- data/.yardoc/objects/root.dat +0 -0
- data/.yardoc/proxy_types +2 -0
- data/.yardopts +2 -0
- data/Gemfile +2 -1
- data/Gemfile.lock +6 -11
- data/README.markdown +54 -17
- data/Rakefile +8 -0
- data/lib/gibberish/aes.rb +29 -0
- data/lib/gibberish/digest.rb +8 -0
- data/lib/gibberish/hmac.rb +8 -0
- data/lib/gibberish/rsa.rb +68 -8
- data/lib/gibberish/version.rb +1 -1
- data/spec/aes_spec.rb +2 -2
- data/spec/digest_spec.rb +3 -3
- data/spec/hmac_spec.rb +1 -1
- data/spec/openssl/plaintext.crypted +3 -0
- data/spec/openssl/plaintext.txt +1 -0
- data/spec/openssl/private.pem +30 -0
- data/spec/openssl/public.pem +9 -0
- data/spec/rsa_spec.rb +46 -11
- data/spec/spec_helper.rb +2 -3
- metadata +14 -19
data/.gitmodules
ADDED
data/.yardoc/checksums
ADDED
@@ -0,0 +1,6 @@
|
|
1
|
+
lib/gibberish.rb 802b1397065b8f34b094cd5e797446a42c2c9b7e
|
2
|
+
lib/gibberish/rsa.rb 011d6178967c8f41bcafe8be060d5aad41c7ebc4
|
3
|
+
lib/gibberish/aes.rb c0f393617c375e47516948a7540eb2bd9f9a261c
|
4
|
+
lib/gibberish/hmac.rb ef42bd281f69be2e4073cd844d02ff26b7247c05
|
5
|
+
lib/gibberish/digest.rb 37e1d1c4daa2ce783e26c7920aa927dc4c869f4e
|
6
|
+
lib/gibberish/version.rb 698d6220529ab0bfd8853ae631aa0eb5b75ef934
|
Binary file
|
data/.yardoc/proxy_types
ADDED
data/.yardopts
ADDED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,24 +1,19 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
gibberish (0.0.
|
4
|
+
gibberish (0.0.2)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: http://rubygems.org/
|
8
8
|
specs:
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
rspec-expectations (~> 2.5.0)
|
13
|
-
rspec-mocks (~> 2.5.0)
|
14
|
-
rspec-core (2.5.1)
|
15
|
-
rspec-expectations (2.5.0)
|
16
|
-
diff-lcs (~> 1.1.2)
|
17
|
-
rspec-mocks (2.5.0)
|
9
|
+
mini_shoulda (0.2.0)
|
10
|
+
minitest (~> 2.0.2)
|
11
|
+
minitest (2.0.2)
|
18
12
|
|
19
13
|
PLATFORMS
|
20
14
|
ruby
|
21
15
|
|
22
16
|
DEPENDENCIES
|
23
17
|
gibberish!
|
24
|
-
|
18
|
+
mini_shoulda
|
19
|
+
minitest
|
data/README.markdown
CHANGED
@@ -1,18 +1,31 @@
|
|
1
|
-
# Gibberish -
|
1
|
+
# Gibberish - Encryption in Ruby made simple
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
### What
|
4
|
+
Gibberish is an opinionated cryptography library for Ruby. Its objective is easy but secure
|
5
|
+
encryption in Ruby.
|
5
6
|
|
6
|
-
|
7
|
+
### Why
|
8
|
+
While OpenSSL is an extremely capable encryption library, it lacks a terse and clean
|
9
|
+
interface in Ruby.
|
7
10
|
|
8
|
-
|
9
|
-
|
11
|
+
### Goals
|
12
|
+
- This library should remain easily iteroperable with the OpenSSL command
|
13
|
+
line interface. Each function will include documentation on how to perform
|
14
|
+
the same routine via the command line with OpenSSL
|
10
15
|
|
11
|
-
|
12
|
-
|
16
|
+
- It should default to a reasonably secure setting, e.g. 256-bit AES, or SHA1 for HMAC
|
17
|
+
But it should allow the user to specify a stronger setting, within reason.
|
13
18
|
|
14
|
-
|
15
|
-
|
19
|
+
- Procedures should be well tested and be compatible with Ruby 1.8.7 and 1.9
|
20
|
+
|
21
|
+
|
22
|
+
## Requirements
|
23
|
+
|
24
|
+
Ruby compiled with OpenSSL support
|
25
|
+
|
26
|
+
## Installation
|
27
|
+
|
28
|
+
gem install gibberish
|
16
29
|
|
17
30
|
## AES
|
18
31
|
|
@@ -30,18 +43,42 @@ Gibberish AES is fully compatible with default OpenSSL on the command line
|
|
30
43
|
echo "U2FsdGVkX187oKRbgDkUcMKaFfB5RsXQj/X4mc8X3lsUVgwb4+S55LQo6f6N\nIDMX\n" | \
|
31
44
|
openssl enc -d -aes-256-cbc -a -k p4ssw0rd
|
32
45
|
|
33
|
-
|
34
|
-
|
35
|
-
Defaults to 256 bit digest
|
36
|
-
|
37
|
-
Gibberish::HMAC("key", "some data")
|
38
|
-
#=> 521677c580722c5c52fa15d978e8656341c4f3c5
|
46
|
+
[Find out more](http://rdoc.info/github/mdp/gibberish/master/Gibberish/AES)
|
39
47
|
|
40
48
|
## RSA
|
41
49
|
|
42
50
|
k = Gibberish::RSA.generate_keypair(1024)
|
43
|
-
cipher = Gibberish::RSA.new(k.public_key
|
51
|
+
cipher = Gibberish::RSA.new(k.public_key)
|
44
52
|
enc = cipher.encrypt("Some data")
|
45
53
|
# Defaults to Base64 output
|
46
54
|
#=> "JKm98wKyJljqmpx7kP8ZsdeXiShllEMcRHVnjUjc4ecyYK/doKAkVTLho1Gp\ng697qrljyClF0AcIH+XZmeF/TrqYUuCEUyhOD6OL1bs5dn8vFQefS5KdaC5Y\ndLADvh3mSfE/w/gs4vaf/OtbZNBeSl6ROCZasWTfRewp4n1RDmE=\n"
|
55
|
+
cipher = Gibberish::RSA.new(k.private_key)
|
47
56
|
dec = cipher.decrypt(enc)
|
57
|
+
|
58
|
+
[Find out more](http://rdoc.info/github/mdp/gibberish/master/Gibberish/RSA)
|
59
|
+
|
60
|
+
## HMAC
|
61
|
+
|
62
|
+
Defaults to 256 bit digest
|
63
|
+
|
64
|
+
Gibberish::HMAC("key", "some data")
|
65
|
+
#=> 521677c580722c5c52fa15d978e8656341c4f3c5
|
66
|
+
|
67
|
+
[Find out more](http://rdoc.info/github/mdp/gibberish/master/Gibberish/HMAC)
|
68
|
+
|
69
|
+
## Digests
|
70
|
+
|
71
|
+
Gibberish::MD5("somedata")
|
72
|
+
#=> aefaf7502d52994c3b01957636a3cdd2
|
73
|
+
|
74
|
+
Gibberish::SHA1("somedata")
|
75
|
+
#=> efaa311ae448a7374c122061bfed952d940e9e37
|
76
|
+
|
77
|
+
Gibberish::SHA256("somedata")
|
78
|
+
#=> 87d149cb424c0387656f211d2589fb5b1e16229921309e98588419ccca8a7362
|
79
|
+
|
80
|
+
[Find out more](http://rdoc.info/github/mdp/gibberish/master/Gibberish/Digest)
|
81
|
+
|
82
|
+
## TODO
|
83
|
+
|
84
|
+
- Cover OpenSSL exceptions with more reasonable and easier to understand exceptions.
|
data/Rakefile
ADDED
data/lib/gibberish/aes.rb
CHANGED
@@ -1,7 +1,36 @@
|
|
1
1
|
module Gibberish
|
2
|
+
# Handles AES encryption and decryption in a way that is compatible
|
3
|
+
# with OpenSSL.
|
4
|
+
#
|
5
|
+
# Defaults to 256-bit CBC encryption, ideally you should leave it
|
6
|
+
# this way
|
7
|
+
#
|
8
|
+
# ## Basic Usage
|
9
|
+
#
|
10
|
+
# ### Encrypting
|
11
|
+
#
|
12
|
+
# cipher = Gibberish::AES.new('p4ssw0rd')
|
13
|
+
# cipher.encrypt("some secret text")
|
14
|
+
# #=> "U2FsdGVkX1/D7z2azGmmQELbMNJV/n9T/9j2iBPy2AM=\n"
|
15
|
+
#
|
16
|
+
# ### Decrypting
|
17
|
+
#
|
18
|
+
# cipher = Gibberish::AES.new('p4ssw0rd')
|
19
|
+
# cipher.decrypt(""U2FsdGVkX1/D7z2azGmmQELbMNJV/n9T/9j2iBPy2AM=\n"")
|
20
|
+
# #=> "some secret text"
|
21
|
+
#
|
22
|
+
# ## OpenSSL Interop
|
23
|
+
#
|
24
|
+
# echo "U2FsdGVkX1/D7z2azGmmQELbMNJV/n9T/9j2iBPy2AM=\n" | openssl enc -d -aes-256-cbc -a -k p4ssw0rd
|
25
|
+
#
|
2
26
|
class AES
|
3
27
|
|
4
28
|
attr_reader :password, :size, :cipher
|
29
|
+
|
30
|
+
# Initialize with the password
|
31
|
+
#
|
32
|
+
# @param [String] password
|
33
|
+
# @param [Integer] size
|
5
34
|
def initialize(password, size=256)
|
6
35
|
@password = password
|
7
36
|
@size = size
|
data/lib/gibberish/digest.rb
CHANGED
@@ -1,4 +1,12 @@
|
|
1
1
|
module Gibberish
|
2
|
+
# Allows for the simple digest of data, supports MD5, SHA1, and SHA256
|
3
|
+
#
|
4
|
+
# ## Examples
|
5
|
+
#
|
6
|
+
# Gibberish::MD5("data") #=> 8d777f385d3dfec8815d20f7496026dc
|
7
|
+
# Gibberish::SHA1("data") #=> a17c9aaa61e80a1bf71d0d850af4e5baa9800bbd
|
8
|
+
# Gibberish::SHA256("data") #=> 3a6eb0790f39ac87c94f3856b2dd2c5d110e6811602261a9a923d3bb23adc8b7
|
9
|
+
#
|
2
10
|
class Digest
|
3
11
|
|
4
12
|
def self.sha1(val, opts={})
|
data/lib/gibberish/hmac.rb
CHANGED
@@ -1,4 +1,12 @@
|
|
1
1
|
module Gibberish
|
2
|
+
# Easy to use HMAC, defaults to SHA1
|
3
|
+
#
|
4
|
+
# ## Example
|
5
|
+
#
|
6
|
+
# Gibberish::HMAC('key', 'data') #=> 104152c5bfdca07bc633eebd46199f0255c9f49d
|
7
|
+
# Gibberish::HMAC('key', 'data', :digest => :sha256)
|
8
|
+
# #=> 5031fe3d989c6d1537a013fa6e739da23463fdaec3b70137d828e36ace221bd0
|
9
|
+
#
|
2
10
|
class HMAC
|
3
11
|
DIGEST = {
|
4
12
|
:sha1 => OpenSSL::Digest::Digest.new('sha1'),
|
data/lib/gibberish/rsa.rb
CHANGED
@@ -1,13 +1,48 @@
|
|
1
1
|
module Gibberish
|
2
|
-
class RSA
|
3
2
|
|
3
|
+
# This wraps the OpenSSL RSA functions
|
4
|
+
# Simply instantiate with a public key or private key
|
5
|
+
#
|
6
|
+
# cipher = Gibberish::RSA.new(private_key)
|
7
|
+
# enc = cipher.encrypt(data)
|
8
|
+
# dec = cipher.decrypt(enc)
|
9
|
+
#
|
10
|
+
# cipher = Gibberish::RSA(public_key)
|
11
|
+
# cipher.decrypt(enc)
|
12
|
+
#
|
13
|
+
#
|
14
|
+
# You can also generate a keypair using Gibberish::RSA.generate_keypair
|
15
|
+
#
|
16
|
+
# kp = Gibberish::RSA.generate_keypair(4096)
|
17
|
+
# kp.public_key #=> Outputs a Base64 encoded public key
|
18
|
+
# kp.private_key #=> Outputs the Base64 pem
|
19
|
+
#
|
20
|
+
# KeyPair will hand back the private key when passed
|
21
|
+
# to the RSA class.
|
22
|
+
#
|
23
|
+
# cipher = Gibberish::RSA.new(kp)
|
24
|
+
#
|
25
|
+
# ## OpenSSL CLI Interop
|
26
|
+
#
|
27
|
+
# openssl rsautl -decrypt -inkey [pem_file] -in [BinaryEncodedCryptedFile]
|
28
|
+
#
|
29
|
+
# or if you're using the default base64 output, you'll need to decode that first
|
30
|
+
#
|
31
|
+
# openssl enc -d -base64 -in [gibberish.crypted] | \
|
32
|
+
# openssl rsautl -decrypt -inkey [pem_file]
|
33
|
+
#
|
34
|
+
|
35
|
+
class RSA
|
4
36
|
class KeyPair
|
5
37
|
def self.generate(bits=2048)
|
6
38
|
self.new(OpenSSL::PKey::RSA.generate(bits))
|
7
39
|
end
|
8
40
|
|
41
|
+
attr_accessor :passphrase
|
42
|
+
|
9
43
|
def initialize(key)
|
10
44
|
@key = key
|
45
|
+
@cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
|
11
46
|
end
|
12
47
|
|
13
48
|
def public_key
|
@@ -15,24 +50,43 @@ module Gibberish
|
|
15
50
|
end
|
16
51
|
|
17
52
|
def private_key
|
18
|
-
@
|
53
|
+
if @passphrase
|
54
|
+
@key.to_pem(@cipher, @passphrase)
|
55
|
+
else
|
56
|
+
@key.to_pem
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def to_s
|
61
|
+
private_key
|
19
62
|
end
|
20
63
|
|
21
64
|
end
|
22
65
|
|
66
|
+
# Generate an RSA keypair - defaults to 2048 bits
|
67
|
+
#
|
68
|
+
# @param [Integer] bits
|
23
69
|
def RSA.generate_keypair(bits=2048)
|
24
70
|
KeyPair.generate(bits)
|
25
71
|
end
|
26
72
|
|
27
73
|
# Expects a public key at the minumum
|
28
74
|
#
|
29
|
-
|
30
|
-
|
31
|
-
|
75
|
+
# @param [#to_s] key public or private
|
76
|
+
# @params [String] passphrase to key
|
77
|
+
#
|
78
|
+
def initialize(key, passphrase=nil)
|
79
|
+
@key = OpenSSL::PKey::RSA.new(key.to_s, passphrase)
|
32
80
|
end
|
33
81
|
|
82
|
+
# Encrypt data using the key
|
83
|
+
#
|
84
|
+
# @param [#to_s] data
|
85
|
+
# @param [Hash] opts
|
86
|
+
# @option opts [Boolean] :binary (false) encode the data in binary, not Base64
|
34
87
|
def encrypt(data, opts={})
|
35
|
-
|
88
|
+
data = data.to_s
|
89
|
+
enc = @key.public_encrypt(data)
|
36
90
|
if opts[:binary]
|
37
91
|
enc
|
38
92
|
else
|
@@ -40,12 +94,18 @@ module Gibberish
|
|
40
94
|
end
|
41
95
|
end
|
42
96
|
|
97
|
+
# Decrypt data using the key
|
98
|
+
#
|
99
|
+
# @param [#to_s] data
|
100
|
+
# @param [Hash] opts
|
101
|
+
# @option opts [Boolean] :binary (false) don't decode the data as Base64
|
43
102
|
def decrypt(data, opts={})
|
44
|
-
|
103
|
+
data = data.to_s
|
104
|
+
raise "No private key set!" unless @key.private?
|
45
105
|
unless opts[:binary]
|
46
106
|
data = Base64.decode64(data)
|
47
107
|
end
|
48
|
-
@
|
108
|
+
@key.private_decrypt(data)
|
49
109
|
end
|
50
110
|
end
|
51
111
|
|
data/lib/gibberish/version.rb
CHANGED
data/spec/aes_spec.rb
CHANGED
@@ -10,14 +10,14 @@ describe "the aes cipher" do
|
|
10
10
|
secret_text = "Made with Gibberish"
|
11
11
|
encrypted = @cipher.e(secret_text)
|
12
12
|
from_openssl = `echo "#{encrypted}" | openssl enc -d -aes-256-cbc -a -k password`
|
13
|
-
from_openssl.
|
13
|
+
from_openssl.must_equal(secret_text)
|
14
14
|
end
|
15
15
|
|
16
16
|
it "should decrypt base64 encoded data from the OpenSSL CLI" do
|
17
17
|
secret_text = "Made with Gibberish"
|
18
18
|
from_openssl = `echo #{secret_text} | openssl enc -aes-256-cbc -a -k password`
|
19
19
|
decrypted_text = @cipher.d(from_openssl).chomp
|
20
|
-
decrypted_text.
|
20
|
+
decrypted_text.must_equal(secret_text)
|
21
21
|
end
|
22
22
|
|
23
23
|
end
|
data/spec/digest_spec.rb
CHANGED
@@ -3,15 +3,15 @@ require 'spec_helper'
|
|
3
3
|
describe "A variety of digest methods" do
|
4
4
|
|
5
5
|
it "should work with MD5" do
|
6
|
-
Gibberish::MD5("password").
|
6
|
+
Gibberish::MD5("password").must_equal("5f4dcc3b5aa765d61d8327deb882cf99")
|
7
7
|
end
|
8
8
|
|
9
9
|
it "should work with SHA1" do
|
10
|
-
Gibberish::SHA1("password").
|
10
|
+
Gibberish::SHA1("password").must_equal("5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8")
|
11
11
|
end
|
12
12
|
|
13
13
|
it "should work with SHA256" do
|
14
|
-
Gibberish::SHA256("password").
|
14
|
+
Gibberish::SHA256("password").must_equal("5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8")
|
15
15
|
end
|
16
16
|
|
17
17
|
end
|
data/spec/hmac_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe "HMAC" do
|
4
4
|
|
5
5
|
it "should hopefully work" do
|
6
|
-
Gibberish::HMAC("password", "data").
|
6
|
+
Gibberish::HMAC("password", "data").must_equal("08d13c72bed7ace5efadc09df109a78a5d713097")
|
7
7
|
end
|
8
8
|
|
9
9
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
This is in plaintext!!!
|
@@ -0,0 +1,30 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
Proc-Type: 4,ENCRYPTED
|
3
|
+
DEK-Info: DES-EDE3-CBC,9DFA13921C765D75
|
4
|
+
|
5
|
+
as7z49axWP7a0p44YlnLwiY9di9BOjSJo98z/Ld0V02p1BHPBElbwIrxcPbAix+I
|
6
|
+
0sl43NtkVlHkiLJR9ZKVWqF8Uly9PCicqKRliPHBw1hiVQuejrmv+6Zx3Aktdunm
|
7
|
+
mdXnwa8TVgpSHZcSUynvwp6nfJOtPAmAQLKRFyrOrNRDfLBqZ0Ha5l1+9MhzZxW6
|
8
|
+
j6EFw5gOzvcR35ghBN6nCD/UNArh9mKPJFjv6Pfkcwlqxiy7OqHS7lPwN+7WnrFf
|
9
|
+
7jyLEAAaOGQxWjtfb9/3A0sjlrfn7j0uO9I/A6ogOd7wcIaBwy0qtGQ3bsj8ctZw
|
10
|
+
6cHWvSiExLDLdxARa1wROqLM5da3eD/W7BvA+9hPuAJxz6iDWPNWHj0IrsGWiHtF
|
11
|
+
dGDbbSyg81/tPKbR0DNpl1bn0ft9h7oQWiM9uubNFCFdLrjJ+z2hMW52PHu89C1f
|
12
|
+
swaG+CgB0754eNoBSNm2z4OaBebA8zbRP+8eqOs/ZDCSK4w2e0OFR2T51eEDDsg6
|
13
|
+
Q7WHBg1Hq9tBTb/xwJ1u/CzzbHcIksnpE5fiHr0Xs/HMdTYXylcDwqN5df2He7FH
|
14
|
+
PyAK41lH4K9MZVpIsWu/6gWk2Nt7UAkG9O/d/el0qMdtWNdJjxP/yFgWi1/zUBH+
|
15
|
+
jqavta/jxbEvqVycL+dU0tZSnukarmziMLg3644WW6AVtUeEScO9DibBYdMDIlgg
|
16
|
+
m+2oOW90uzgdM236OurBQ240TzJYKRu60uOfjjbYzGw9MM4rwHXx3vk3plOw/vpe
|
17
|
+
827LBvSiw5WSD5wwR5nOpkDkMiNFvCO1JoSYkPYo/xy3yhps3Ea2PtnsoA5VcJRA
|
18
|
+
VM0L8ad/taubVqVjDKyMggD6ynB9D0X+SYxbW/UAEKgHbEt6eSRF/egbRhDkt6zl
|
19
|
+
im75EuZpres+5rlAi2X+yOwkHGDh3vDRk0Xmr+Eb5VfY+NQQFJy7sDYXKAEy0lsO
|
20
|
+
wEsmtxam5u1FNVsFALKXTP2HPn+2fzH25ovA/ujXdlD9Q7LgtQpe+N1LjrK2SzWE
|
21
|
+
hKmZZznVVSpDYsIEk95N/yPuDb57+N+UcesasekFkZu/14qseeIZRXYNEgQQqNsS
|
22
|
+
wFJua9A4pcfSefSvMMa43ZFXtc+lRi8oCy0X0nN+Gs/f5LzxKexMfJLoXxORLq1Q
|
23
|
+
s2zOQnyToHV52cGmE5stuWU1K2XIr8LLv/5nqDLscGZcJ/SWBwth1Lrpw/eLHxEY
|
24
|
+
ltzsJzyShsuXFjAIgroKeGpv37D+ekqjVsTOPGtPJ04Q8kX34qTDQA6BvJ8kRQba
|
25
|
+
4hGNtlJlLFwpAIEd43VFkgsiACj2DuqeNGwvtSGkopq0Y5pfSKniezxuezekAn80
|
26
|
+
uIGIT1slYrUm8w6qQOka64W2yE/YaV3lv8HH2eQQ9XmRI4UgFQzSAk1sdOmJadzW
|
27
|
+
EF55t1GJN0BLyg8v/gmk+N3Tj83ZcxbY4fbQGaroOS83HhzLPoaT05PBqChSYhBo
|
28
|
+
97YKZPLDvxfbMjM5XyltNNEqZyKvR/9FIGvNWNT7uwEThqUIQ+OWiaRLo7y2duq4
|
29
|
+
CvPwa8FkA0geEX5RTA05CuxuHriRrWtyoYhtNK2ZJ5pEuRoocP4jaw==
|
30
|
+
-----END RSA PRIVATE KEY-----
|
@@ -0,0 +1,9 @@
|
|
1
|
+
-----BEGIN PUBLIC KEY-----
|
2
|
+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApkrxFVDdfsB1OnOg6CjD
|
3
|
+
3FX/uuYf3bmdiVfzBkNJvZruqCALjesAu4uGrbmBGhe/qyKYQHPzY2KwqpfwtXft
|
4
|
+
61QFtDdZVTjPzi5iqZcpUIYD6sMdJPH0E8YBADAMPyvKbWtjsLZADxRhKQN3Dwb0
|
5
|
+
DTaq0UFVzq/40YZMFzXH9SIWH/4qJnCsqC24DQM9f8mKAGSC5KCReJIzuXorT0RI
|
6
|
+
9ghrwqr8EnglFWT51vcDjR80EfZusvLlep378AmTgYpf9Qxq7BRBx2wp8jWnxsV+
|
7
|
+
xYHuruJbZeqIs4FM2dRLLcMlA8Ky6IrViAR+wfy0CyK/ZGdozvXSOV8lh7gspwBh
|
8
|
+
KQIDAQAB
|
9
|
+
-----END PUBLIC KEY-----
|
data/spec/rsa_spec.rb
CHANGED
@@ -3,19 +3,19 @@ require 'spec_helper'
|
|
3
3
|
describe "RSA key generation" do
|
4
4
|
it "should generate a key" do
|
5
5
|
keypair = Gibberish::RSA.generate_keypair
|
6
|
-
keypair.
|
6
|
+
keypair.must_be_instance_of(Gibberish::RSA::KeyPair)
|
7
7
|
end
|
8
8
|
|
9
9
|
it "should generate a key with custom bits" do
|
10
10
|
keypair = Gibberish::RSA.generate_keypair(1024)
|
11
|
-
keypair.
|
11
|
+
keypair.must_be_instance_of(Gibberish::RSA::KeyPair)
|
12
12
|
end
|
13
13
|
|
14
14
|
it "should answer to public and private key methods" do
|
15
15
|
keypair = Gibberish::RSA.generate_keypair(1024)
|
16
|
-
keypair.
|
17
|
-
keypair.public_key.
|
18
|
-
keypair.private_key.
|
16
|
+
keypair.must_be_instance_of(Gibberish::RSA::KeyPair)
|
17
|
+
keypair.public_key.wont_be_nil
|
18
|
+
keypair.private_key.wont_be_nil
|
19
19
|
end
|
20
20
|
|
21
21
|
end
|
@@ -23,21 +23,56 @@ end
|
|
23
23
|
describe "RSA" do
|
24
24
|
before do
|
25
25
|
k = Gibberish::RSA.generate_keypair(1024)
|
26
|
-
@cipher = Gibberish::RSA.new(k.
|
27
|
-
@pub_cipher = Gibberish::RSA.new(k.public_key
|
26
|
+
@cipher = Gibberish::RSA.new(k.private_key)
|
27
|
+
@pub_cipher = Gibberish::RSA.new(k.public_key)
|
28
28
|
end
|
29
29
|
|
30
30
|
it "should encrypt/decrypt with a keypair" do
|
31
31
|
encrypted = @cipher.encrypt("Some data")
|
32
|
-
p encrypted
|
33
32
|
decrypted = @cipher.decrypt(encrypted)
|
34
|
-
encrypted.
|
35
|
-
decrypted.
|
33
|
+
encrypted.must_match(/^[a-zA-Z0-9\+\/\n=]+$/) # Be base64
|
34
|
+
decrypted.must_equal("Some data")
|
36
35
|
end
|
37
36
|
|
38
37
|
it "should work without private key" do
|
39
38
|
enc = @pub_cipher.encrypt("Some data")
|
40
|
-
enc.
|
39
|
+
enc.must_match(/^[a-zA-Z0-9\+\/\n=]+$/) # Be base64
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "OpenSSL interop" do
|
45
|
+
|
46
|
+
before do
|
47
|
+
@ossl_private_key = File.read('spec/openssl/private.pem')
|
48
|
+
@ossl_public_key = File.read('spec/openssl/public.pem')
|
49
|
+
@keypair = Gibberish::RSA.generate_keypair(1024)
|
50
|
+
@keypair.passphrase = "p4ssw0rd"
|
51
|
+
tmp_file = "/tmp/gibberish-spec"
|
52
|
+
@pub_key_file = "#{tmp_file}-pub.pem"
|
53
|
+
@priv_key_file = "#{tmp_file}-priv.pem"
|
54
|
+
File.open(@pub_key_file, 'w') {|f| f.write(@keypair.public_key) }
|
55
|
+
File.open(@priv_key_file, 'w') {|f| f.write(@keypair.private_key) }
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should decode and OpenSSL generated key and crypted message" do
|
59
|
+
# openssl genrsa -des3 -out spec/openssl/private.pem 2048
|
60
|
+
# openssl rsa -in spec/openssl/private.pem -out spec/openssl/public.pem -outform PEM -pubout
|
61
|
+
# openssl rsautl -encrypt -inkey public.pem -pubin -in spec/openssl/plaintext.txt -out spec/openssl/plaintext.crypted
|
62
|
+
cipher = Gibberish::RSA.new(@ossl_private_key, @keypair.passphrase)
|
63
|
+
cipher.decrypt(File.read('spec/openssl/plaintext.crypted'), :binary => true).must_equal(File.read('spec/openssl/plaintext.txt'))
|
64
|
+
end
|
65
|
+
|
66
|
+
if ENV['INTERACTIVE']
|
67
|
+
it "should encode an OpenSSL compatible format" do
|
68
|
+
# openssl rsautl -decrypt -inkey /tmp/gibberish-spec-priv.pem -in /tmp/gibberish-spec-test.crypted
|
69
|
+
cipher = Gibberish::RSA.new(@keypair.public_key)
|
70
|
+
tmp_crypt_file = '/tmp/gibberish-spec-test.crypted'
|
71
|
+
File.open(tmp_crypt_file, 'w') {|f| f.write(cipher.encrypt("secret text", :binary => true))}
|
72
|
+
puts "\n Please type '#{@keypair.passphrase}' when prompted"
|
73
|
+
output = `openssl rsautl -decrypt -inkey /tmp/gibberish-spec-priv.pem -in /tmp/gibberish-spec-test.crypted`
|
74
|
+
output.must_equal("secret text")
|
75
|
+
end
|
41
76
|
end
|
42
77
|
|
43
78
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gibberish
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 27
|
5
4
|
prerelease:
|
6
|
-
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 2
|
10
|
-
version: 0.0.2
|
5
|
+
version: 1.0.0
|
11
6
|
platform: ruby
|
12
7
|
authors:
|
13
8
|
- Mark Percival
|
@@ -15,7 +10,7 @@ autorequire:
|
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
12
|
|
18
|
-
date: 2011-
|
13
|
+
date: 2011-04-02 00:00:00 +00:00
|
19
14
|
default_executable:
|
20
15
|
dependencies: []
|
21
16
|
|
@@ -30,9 +25,15 @@ extra_rdoc_files: []
|
|
30
25
|
|
31
26
|
files:
|
32
27
|
- .gitignore
|
28
|
+
- .gitmodules
|
29
|
+
- .yardoc/checksums
|
30
|
+
- .yardoc/objects/root.dat
|
31
|
+
- .yardoc/proxy_types
|
32
|
+
- .yardopts
|
33
33
|
- Gemfile
|
34
34
|
- Gemfile.lock
|
35
35
|
- README.markdown
|
36
|
+
- Rakefile
|
36
37
|
- gibberish.gemspec
|
37
38
|
- lib/gibberish.rb
|
38
39
|
- lib/gibberish/aes.rb
|
@@ -43,6 +44,10 @@ files:
|
|
43
44
|
- spec/aes_spec.rb
|
44
45
|
- spec/digest_spec.rb
|
45
46
|
- spec/hmac_spec.rb
|
47
|
+
- spec/openssl/plaintext.crypted
|
48
|
+
- spec/openssl/plaintext.txt
|
49
|
+
- spec/openssl/private.pem
|
50
|
+
- spec/openssl/public.pem
|
46
51
|
- spec/rsa_spec.rb
|
47
52
|
- spec/spec_helper.rb
|
48
53
|
has_rdoc: true
|
@@ -59,18 +64,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
59
64
|
requirements:
|
60
65
|
- - ">="
|
61
66
|
- !ruby/object:Gem::Version
|
62
|
-
hash: 3
|
63
|
-
segments:
|
64
|
-
- 0
|
65
67
|
version: "0"
|
66
68
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
69
|
none: false
|
68
70
|
requirements:
|
69
71
|
- - ">="
|
70
72
|
- !ruby/object:Gem::Version
|
71
|
-
hash: 3
|
72
|
-
segments:
|
73
|
-
- 0
|
74
73
|
version: "0"
|
75
74
|
requirements: []
|
76
75
|
|
@@ -79,9 +78,5 @@ rubygems_version: 1.6.2
|
|
79
78
|
signing_key:
|
80
79
|
specification_version: 3
|
81
80
|
summary: An opinionated ruby encryption library
|
82
|
-
test_files:
|
83
|
-
|
84
|
-
- spec/digest_spec.rb
|
85
|
-
- spec/hmac_spec.rb
|
86
|
-
- spec/rsa_spec.rb
|
87
|
-
- spec/spec_helper.rb
|
81
|
+
test_files: []
|
82
|
+
|