cryptosystem 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/LICENSE +21 -0
- data/Rakefile +8 -0
- data/cryptosystem.gemspec +9 -0
- data/lib/cryptosystem.rb +6 -0
- data/lib/cryptosystem/base.rb +25 -0
- data/lib/cryptosystem/exceptions.rb +5 -0
- data/lib/cryptosystem/rsa.rb +47 -0
- data/test/cryptosystem/rsa_test.rb +43 -0
- data/test/keys/rsa.key +54 -0
- data/test/keys/rsa.pub +14 -0
- data/test/test_helper.rb +8 -0
- metadata +55 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8f81553a727d6fa1eaa44385bdf8e2086b7c09f9
|
4
|
+
data.tar.gz: f1077b92847b5136fd53dd548041dc9e33b3f338
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1630aab91d71c11266a1509230b59ce8e19e354e53b0374d09c1712ecf893ebf1b5d739e4300e178c9592671c19155efe0e0ce7dedf22c77321ed69a62f04db4
|
7
|
+
data.tar.gz: f677b47d6486ddd6ee6487101a0a3cd2fb8f39882a25b6ace6c8f25ef3d231d46b75616125765f319675993077b8ccae7c148c91a61c1ce67446b9ccba686f80
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
.ruby-version
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2016 Josh Wetzel
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/Rakefile
ADDED
data/lib/cryptosystem.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
module Cryptosystem
|
2
|
+
class Base
|
3
|
+
class << self
|
4
|
+
def configure
|
5
|
+
yield self
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def expand_path(path)
|
10
|
+
File.expand_path(path)
|
11
|
+
end
|
12
|
+
|
13
|
+
def read_file(path)
|
14
|
+
File.read(path)
|
15
|
+
end
|
16
|
+
|
17
|
+
def base64_encode(value)
|
18
|
+
Base64.strict_encode64(value)
|
19
|
+
end
|
20
|
+
|
21
|
+
def base64_decode(value)
|
22
|
+
Base64.strict_decode64(value)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Cryptosystem
|
2
|
+
class RSA < Base
|
3
|
+
class << self
|
4
|
+
attr_accessor :password
|
5
|
+
attr_accessor :private_key_path
|
6
|
+
attr_accessor :public_key_path
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_reader :password
|
10
|
+
attr_reader :private_key_path
|
11
|
+
attr_reader :public_key_path
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@password = Cryptosystem::RSA.password
|
15
|
+
@private_key_path = expand_path(Cryptosystem::RSA.private_key_path)
|
16
|
+
@public_key_path = expand_path(Cryptosystem::RSA.public_key_path)
|
17
|
+
rescue => error
|
18
|
+
raise ConfigurationError, error.message
|
19
|
+
end
|
20
|
+
|
21
|
+
def encrypt(value)
|
22
|
+
base64_encode(public_key.public_encrypt(value))
|
23
|
+
rescue => error
|
24
|
+
raise EncryptError, error.message
|
25
|
+
end
|
26
|
+
|
27
|
+
def decrypt(value)
|
28
|
+
private_key.private_decrypt(base64_decode(value))
|
29
|
+
rescue => error
|
30
|
+
raise DecryptError, error.message
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def private_key
|
36
|
+
@private_key ||= rsa.new(read_file(private_key_path), password)
|
37
|
+
end
|
38
|
+
|
39
|
+
def public_key
|
40
|
+
@public_key ||= rsa.new(read_file(public_key_path))
|
41
|
+
end
|
42
|
+
|
43
|
+
def rsa
|
44
|
+
OpenSSL::PKey::RSA
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class RSATest < Minitest::Test
|
4
|
+
def setup
|
5
|
+
@rsa = Cryptosystem::RSA.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_initialize
|
9
|
+
assert_equal Cryptosystem::RSA.password, @rsa.password
|
10
|
+
assert_equal File.expand_path(@rsa.private_key_path), @rsa.private_key_path
|
11
|
+
assert_equal File.expand_path(@rsa.public_key_path), @rsa.public_key_path
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_value_is_encrypted
|
15
|
+
encrypted_value = @rsa.encrypt('test')
|
16
|
+
refute_equal 'test', encrypted_value
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_value_is_decrypted
|
20
|
+
encrypted_value = @rsa.encrypt('test')
|
21
|
+
assert_equal 'test', @rsa.decrypt(encrypted_value)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_encrypted_value_is_base64_encoded
|
25
|
+
assert Base64.strict_decode64(@rsa.encrypt('test'))
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_decrypted_value_is_base64_decoded
|
29
|
+
assert Base64.strict_encode64(@rsa.decrypt(@rsa.encrypt('test')))
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_bad_encrypt_raises_exception
|
33
|
+
assert_raises Cryptosystem::EncryptError do
|
34
|
+
@rsa.encrypt(nil)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_bad_decrypt_raises_exception
|
39
|
+
assert_raises Cryptosystem::DecryptError do
|
40
|
+
@rsa.decrypt(nil)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/test/keys/rsa.key
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
Proc-Type: 4,ENCRYPTED
|
3
|
+
DEK-Info: AES-256-CBC,2C31524529382C7E48A2056847C3497F
|
4
|
+
|
5
|
+
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
|
54
|
+
-----END RSA PRIVATE KEY-----
|
data/test/keys/rsa.pub
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
-----BEGIN PUBLIC KEY-----
|
2
|
+
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvIm5LAFUQaVsvf8+LtQ2
|
3
|
+
3eajUhyM+kP0CMwMc/S7epWKD2JqATSaJUrluvrBP32NxVEyB1d/3nbS9Hq245Qv
|
4
|
+
wtMaTqkxUMpT1TMXZpXOacNeSvFobgAbXSSH4lMuaemVxqgAPrNYF3AP/OVFLJ3X
|
5
|
+
zjdLvz63oYdjAwwy7GwBlbxpCL4081p7f1/Ex+RpAHud9ZXAdXbZSam/zk1A2VAC
|
6
|
+
/ndeC53UF5y//sSeheFByCwOZUeUXrGEFur9hm3oWwBRdY3sCV9pXe6uxBSyca54
|
7
|
+
hUWsO3Ma2ooEvqI2TvB+k4KYJyJS5yhd9s31bTkhznWovzgQONIXxQNr62b2V2yL
|
8
|
+
N/XOtQWYYs3zrDsITdnAIExKq9fzUEP8848+PYzDSaAuvUs2bb592gqOnukzCnyz
|
9
|
+
OovgEbb7Im6cem29x65ym+K0iRU9m4CYCUV4wiaeHKcb6QkuBetGAR0O+dXF25ku
|
10
|
+
T00M0Xta32ss5cYkRWVy44YiQVf4uuDqhrwgoE4gRsNQrvxcW9F6umhoG+yLQxLL
|
11
|
+
lKT1ZavWUO6fW9unKXRKwrrQSf26cAkziLzuzkgeaZf7k8GOJC/bv5XQZvh05AoK
|
12
|
+
C+EiisjnJqPhTGJCmh1ej60Ca7zMnlyojV8bmVagBGo3U1cVHQPQE6nPjjK46OMd
|
13
|
+
KANRPBzvPT+ZZQmzQereaksCAwEAAQ==
|
14
|
+
-----END PUBLIC KEY-----
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cryptosystem
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Josh Wetzel
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-05-14 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email:
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- ".gitignore"
|
20
|
+
- LICENSE
|
21
|
+
- Rakefile
|
22
|
+
- cryptosystem.gemspec
|
23
|
+
- lib/cryptosystem.rb
|
24
|
+
- lib/cryptosystem/base.rb
|
25
|
+
- lib/cryptosystem/exceptions.rb
|
26
|
+
- lib/cryptosystem/rsa.rb
|
27
|
+
- test/cryptosystem/rsa_test.rb
|
28
|
+
- test/keys/rsa.key
|
29
|
+
- test/keys/rsa.pub
|
30
|
+
- test/test_helper.rb
|
31
|
+
homepage:
|
32
|
+
licenses:
|
33
|
+
- MIT
|
34
|
+
metadata: {}
|
35
|
+
post_install_message:
|
36
|
+
rdoc_options: []
|
37
|
+
require_paths:
|
38
|
+
- lib
|
39
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - "~>"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '2'
|
44
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
requirements: []
|
50
|
+
rubyforge_project:
|
51
|
+
rubygems_version: 2.5.1
|
52
|
+
signing_key:
|
53
|
+
specification_version: 4
|
54
|
+
summary: Asymmetric encryption
|
55
|
+
test_files: []
|