encrypted_strings 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +4 -0
- data/MIT-LICENSE +2 -2
- data/README +7 -11
- data/Rakefile +5 -5
- data/lib/encrypted_strings/asymmetric_encryptor.rb +35 -35
- data/lib/encrypted_strings/extensions/string.rb +46 -28
- data/lib/encrypted_strings/sha_encryptor.rb +2 -2
- data/lib/encrypted_strings/symmetric_encryptor.rb +15 -15
- data/test/asymmetric_encryptor_test.rb +5 -5
- data/test/encryptor_test.rb +3 -3
- data/test/no_key_error_test.rb +2 -2
- data/test/no_private_key_error_test.rb +2 -2
- data/test/no_public_key_error_test.rb +2 -2
- data/test/sha_encryptor_test.rb +3 -3
- data/test/string_test.rb +1 -1
- data/test/symmetric_encryptor_test.rb +1 -1
- data/test/test_helper.rb +4 -4
- metadata +63 -56
data/CHANGELOG
CHANGED
data/MIT-LICENSE
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Copyright (c) 2005 Rick Olson, 2006-
|
1
|
+
Copyright (c) 2005 Rick Olson, 2006-2008 Aaron Pfeifer
|
2
2
|
|
3
3
|
Permission is hereby granted, free of charge, to any person obtaining
|
4
4
|
a copy of this software and associated documentation files (the
|
@@ -17,4 +17,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
17
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
18
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
19
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
CHANGED
@@ -4,25 +4,21 @@
|
|
4
4
|
|
5
5
|
== Resources
|
6
6
|
|
7
|
-
API
|
8
|
-
|
9
|
-
* http://api.pluginaweek.org/encrypted_strings
|
10
|
-
|
11
7
|
Wiki
|
12
8
|
|
13
9
|
* http://wiki.pluginaweek.org/Encrypted_strings
|
14
10
|
|
15
|
-
|
11
|
+
API
|
16
12
|
|
17
|
-
* http://
|
13
|
+
* http://api.pluginaweek.org/encrypted_strings
|
18
14
|
|
19
|
-
|
15
|
+
Development
|
20
16
|
|
21
|
-
* http://
|
17
|
+
* http://dev.pluginaweek.org/browse/trunk/encrypted_strings
|
22
18
|
|
23
|
-
|
19
|
+
Source
|
24
20
|
|
25
|
-
* http://
|
21
|
+
* http://svn.pluginaweek.org/trunk/encrypted_strings
|
26
22
|
|
27
23
|
== Description
|
28
24
|
|
@@ -85,7 +81,7 @@ the resulting encrypted value is the same.
|
|
85
81
|
|
86
82
|
== Dependencies
|
87
83
|
|
88
|
-
|
84
|
+
None.
|
89
85
|
|
90
86
|
== References
|
91
87
|
|
data/Rakefile
CHANGED
@@ -4,7 +4,7 @@ require 'rake/gempackagetask'
|
|
4
4
|
require 'rake/contrib/sshpublisher'
|
5
5
|
|
6
6
|
PKG_NAME = 'encrypted_strings'
|
7
|
-
PKG_VERSION = '0.0.
|
7
|
+
PKG_VERSION = '0.0.4'
|
8
8
|
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
|
9
9
|
RUBY_FORGE_PROJECT = 'pluginaweek'
|
10
10
|
|
@@ -39,8 +39,8 @@ spec = Gem::Specification.new do |s|
|
|
39
39
|
s.has_rdoc = true
|
40
40
|
s.test_files = Dir['test/**/*_test.rb']
|
41
41
|
|
42
|
-
s.author = 'Aaron Pfeifer
|
43
|
-
s.email = '
|
42
|
+
s.author = 'Aaron Pfeifer'
|
43
|
+
s.email = 'aaron@pluginaweek.org'
|
44
44
|
s.homepage = 'http://www.pluginaweek.org'
|
45
45
|
end
|
46
46
|
|
@@ -52,12 +52,12 @@ end
|
|
52
52
|
|
53
53
|
desc 'Publish the beta gem'
|
54
54
|
task :pgem => [:package] do
|
55
|
-
Rake::SshFilePublisher.new('
|
55
|
+
Rake::SshFilePublisher.new('aaron@pluginaweek.org', '/home/aaron/gems.pluginaweek.org/public/gems', 'pkg', "#{PKG_FILE_NAME}.gem").upload
|
56
56
|
end
|
57
57
|
|
58
58
|
desc 'Publish the API documentation'
|
59
59
|
task :pdoc => [:rdoc] do
|
60
|
-
Rake::SshDirPublisher.new('
|
60
|
+
Rake::SshDirPublisher.new('aaron@pluginaweek.org', "/home/aaron/api.pluginaweek.org/public/#{PKG_NAME}", 'rdoc').upload
|
61
61
|
end
|
62
62
|
|
63
63
|
desc 'Publish the API docs and gem'
|
@@ -23,7 +23,7 @@ module PluginAWeek #:nodoc:
|
|
23
23
|
# default values will be used. You can override the default values like so:
|
24
24
|
#
|
25
25
|
# password = "shhhh"
|
26
|
-
# password.encrypt(:
|
26
|
+
# password.encrypt(:asymmetric, :public_key_file => "./encrypted_public.key") # => "INy95irZ8AlHmvc6ZAF/ARsTpbqPIB/4bEAKKOebjsayB7NYWtIzpswvzxqf\nNJ5yyuvxfMODrcg7RimEMFkFlg==\n"
|
27
27
|
#
|
28
28
|
# An exception will be raised if either the public key file could not be
|
29
29
|
# found or the key could not decrypt the public key file.
|
@@ -44,7 +44,7 @@ module PluginAWeek #:nodoc:
|
|
44
44
|
# default values will be used. You can override the default values like so:
|
45
45
|
#
|
46
46
|
# password = "INy95irZ8AlHmvc6ZAF/ARsTpbqPIB/4bEAKKOebjsayB7NYWtIzpswvzxqf\nNJ5yyuvxfMODrcg7RimEMFkFlg==\n"
|
47
|
-
# password.decrypt(:
|
47
|
+
# password.decrypt(:asymmetric, :public_key_file => "./encrypted_private.key", :key => "secret") # => "shhhh"
|
48
48
|
#
|
49
49
|
# An exception will be raised if either the private key file could not be
|
50
50
|
# found or the key could not decrypt the private key file.
|
@@ -67,10 +67,10 @@ module PluginAWeek #:nodoc:
|
|
67
67
|
attr_accessor :key
|
68
68
|
|
69
69
|
# Configuration options:
|
70
|
-
# *
|
71
|
-
# *
|
72
|
-
# *
|
73
|
-
# *
|
70
|
+
# * +private_key_file+ - Encrypted private key file
|
71
|
+
# * +public_key_file+ - Public key file
|
72
|
+
# * +key+ - The key to use in the symmetric encryptor
|
73
|
+
# * +algorithm+ - Algorithm to use symmetrically encrypted strings
|
74
74
|
def initialize(options = {})
|
75
75
|
options = options.symbolize_keys
|
76
76
|
options.assert_valid_keys(
|
@@ -86,8 +86,8 @@ module PluginAWeek #:nodoc:
|
|
86
86
|
)
|
87
87
|
|
88
88
|
@public_key = @private_key = nil
|
89
|
-
|
90
|
-
|
89
|
+
self.key = options[:key]
|
90
|
+
self.algorithm = options[:algorithm]
|
91
91
|
|
92
92
|
self.private_key_file = options[:private_key_file]
|
93
93
|
self.public_key_file = options[:public_key_file]
|
@@ -97,7 +97,7 @@ module PluginAWeek #:nodoc:
|
|
97
97
|
|
98
98
|
# Encrypts the given data
|
99
99
|
def encrypt(data)
|
100
|
-
raise NoPublicKeyError, "Public key file: #{
|
100
|
+
raise NoPublicKeyError, "Public key file: #{public_key_file}" unless public?
|
101
101
|
|
102
102
|
encrypted_data = public_rsa.public_encrypt(data)
|
103
103
|
Base64.encode64(encrypted_data)
|
@@ -105,7 +105,7 @@ module PluginAWeek #:nodoc:
|
|
105
105
|
|
106
106
|
# Decrypts the given data
|
107
107
|
def decrypt(data)
|
108
|
-
raise NoPrivateKeyError, "Private key file: #{
|
108
|
+
raise NoPrivateKeyError, "Private key file: #{private_key_file}" unless private?
|
109
109
|
|
110
110
|
decrypted_data = Base64.decode64(data)
|
111
111
|
private_rsa.private_decrypt(decrypted_data)
|
@@ -138,36 +138,36 @@ module PluginAWeek #:nodoc:
|
|
138
138
|
end
|
139
139
|
|
140
140
|
private
|
141
|
-
|
142
|
-
|
141
|
+
def load_private_key
|
142
|
+
@private_rsa = nil
|
143
|
+
|
144
|
+
if private_key_file && File.file?(private_key_file)
|
145
|
+
@private_key = File.open(private_key_file) {|f| f.read}
|
146
|
+
end
|
147
|
+
end
|
143
148
|
|
144
|
-
|
145
|
-
@
|
149
|
+
def load_public_key
|
150
|
+
@public_rsa = nil
|
151
|
+
|
152
|
+
if public_key_file && File.file?(public_key_file)
|
153
|
+
@public_key = File.open(public_key_file) {|f| f.read}
|
154
|
+
end
|
146
155
|
end
|
147
|
-
end
|
148
|
-
|
149
|
-
def load_public_key
|
150
|
-
@public_rsa = nil
|
151
156
|
|
152
|
-
|
153
|
-
|
157
|
+
# Retrieves private RSA from the private key
|
158
|
+
def private_rsa
|
159
|
+
if key
|
160
|
+
private_key = @private_key.decrypt(:symmetric, :key => key, :algorithm => algorithm)
|
161
|
+
OpenSSL::PKey::RSA.new(private_key)
|
162
|
+
else
|
163
|
+
@private_rsa ||= OpenSSL::PKey::RSA.new(@private_key)
|
164
|
+
end
|
154
165
|
end
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
if @key
|
160
|
-
private_key = @private_key.decrypt(:symmetric, :key => @key, :algorithm => @algorithm)
|
161
|
-
OpenSSL::PKey::RSA.new(private_key)
|
162
|
-
else
|
163
|
-
@private_rsa ||= OpenSSL::PKey::RSA.new(@private_key)
|
166
|
+
|
167
|
+
# Retrieves the public RSA
|
168
|
+
def public_rsa
|
169
|
+
@public_rsa ||= OpenSSL::PKey::RSA.new(@public_key)
|
164
170
|
end
|
165
|
-
end
|
166
|
-
|
167
|
-
# Retrieves the public RSA
|
168
|
-
def public_rsa
|
169
|
-
@public_rsa ||= OpenSSL::PKey::RSA.new(@public_key)
|
170
|
-
end
|
171
171
|
end
|
172
172
|
end
|
173
173
|
end
|
@@ -25,7 +25,7 @@ module PluginAWeek #:nodoc:
|
|
25
25
|
#
|
26
26
|
# The following uses SHA mode to encrypt the string:
|
27
27
|
#
|
28
|
-
# password =
|
28
|
+
# password = 'shhhh'
|
29
29
|
# password.encrypt # => "66c85d26dadde7e1db27e15a0776c921e27143bd"
|
30
30
|
#
|
31
31
|
# == Custom encryption mode
|
@@ -33,8 +33,8 @@ module PluginAWeek #:nodoc:
|
|
33
33
|
# The following uses Symmetric mode (with a default key) to encrypt the
|
34
34
|
# string:
|
35
35
|
#
|
36
|
-
# PluginAWeek::EncryptedStrings::SymmetricEncryptor.default_key =
|
37
|
-
# password =
|
36
|
+
# PluginAWeek::EncryptedStrings::SymmetricEncryptor.default_key = 'my_key'
|
37
|
+
# password = 'shhhh'
|
38
38
|
# password.encrypt(:symmetric) # => "jDACXI5hMPI=\n"
|
39
39
|
#
|
40
40
|
# == Custom encryption options
|
@@ -43,8 +43,8 @@ module PluginAWeek #:nodoc:
|
|
43
43
|
# that determine how to encrypt the string. For example, SHA supports
|
44
44
|
# a salt which seeds the algorithm:
|
45
45
|
#
|
46
|
-
# password =
|
47
|
-
# password.encrypt(:sha, :salt =>
|
46
|
+
# password = 'shhhh'
|
47
|
+
# password.encrypt(:sha, :salt => 'secret') # => "3b22cbe4acde873c3efc82681096f3ae69aff828"
|
48
48
|
def encrypt(*args)
|
49
49
|
encryptor = encryptor_from_args(*args)
|
50
50
|
encrypted_string = encryptor.encrypt(self)
|
@@ -57,10 +57,10 @@ module PluginAWeek #:nodoc:
|
|
57
57
|
# takes the same parameters as #encrypt, but returns the same string
|
58
58
|
# instead of a different one.
|
59
59
|
#
|
60
|
-
#
|
60
|
+
# == Example
|
61
61
|
#
|
62
|
-
# password =
|
63
|
-
# password.encrypt!(:symmetric, :key =>
|
62
|
+
# password = 'shhhh'
|
63
|
+
# password.encrypt!(:symmetric, :key => 'my_key') # => "jDACXI5hMPI=\n"
|
64
64
|
# password # => "jDACXI5hMPI=\n"
|
65
65
|
def encrypt!(*args)
|
66
66
|
encrypted_string = encrypt(*args)
|
@@ -72,9 +72,9 @@ module PluginAWeek #:nodoc:
|
|
72
72
|
# Is this string encrypted? This will return true if the string is the
|
73
73
|
# result of a call to #encrypt or #encrypt! was previously invoked.
|
74
74
|
#
|
75
|
-
#
|
75
|
+
# == Example
|
76
76
|
#
|
77
|
-
# password =
|
77
|
+
# password = 'shhhh'
|
78
78
|
# password.encrypted? # => false
|
79
79
|
# password.encrypt! # => "66c85d26dadde7e1db27e15a0776c921e27143bd"
|
80
80
|
# password.encrypted? # => true
|
@@ -85,8 +85,13 @@ module PluginAWeek #:nodoc:
|
|
85
85
|
# Decrypts this string. If this is not a string that was previously encrypted,
|
86
86
|
# the encryption algorithm must be specified in the same way the
|
87
87
|
# algorithm is specified when encrypting a string.
|
88
|
+
#
|
89
|
+
# == Example
|
90
|
+
#
|
91
|
+
# password = "jDACXI5hMPI=\n"
|
92
|
+
# password.decrypt(:symmetric, :key => 'my_key') # => "shhhh"
|
88
93
|
def decrypt(*args)
|
89
|
-
raise ArgumentError, "An
|
94
|
+
raise ArgumentError, "An encryption algorithm must be specified since we can't figure it out" if args.empty? && !@encryptor
|
90
95
|
|
91
96
|
encryptor = args.any? ? encryptor_from_args(*args) : (@encryptor || encryptor_from_args(*args))
|
92
97
|
encrypted_string = encryptor.decrypt(self)
|
@@ -102,7 +107,7 @@ module PluginAWeek #:nodoc:
|
|
102
107
|
# For example,
|
103
108
|
#
|
104
109
|
# password = "jDACXI5hMPI=\n"
|
105
|
-
# password.decrypt!(:symmetric, :key =>
|
110
|
+
# password.decrypt!(:symmetric, :key => 'my_key') # => "shhhh"
|
106
111
|
# password # => "shhhh"
|
107
112
|
def decrypt!(*args)
|
108
113
|
replace(decrypt(*args))
|
@@ -122,55 +127,68 @@ module PluginAWeek #:nodoc:
|
|
122
127
|
#
|
123
128
|
# == Equality with strings
|
124
129
|
#
|
125
|
-
# password =
|
130
|
+
# password = 'shhhh'
|
126
131
|
# password.encrypt! # => "66c85d26dadde7e1db27e15a0776c921e27143bd"
|
127
132
|
# password # => "66c85d26dadde7e1db27e15a0776c921e27143bd"
|
128
133
|
# password == "shhhh" # => true
|
129
134
|
#
|
130
135
|
# == Equality with encrypted strings
|
131
136
|
#
|
132
|
-
# password =
|
137
|
+
# password = 'shhhh'
|
133
138
|
# password.encrypt! # => "66c85d26dadde7e1db27e15a0776c921e27143bd"
|
134
139
|
# password # => "66c85d26dadde7e1db27e15a0776c921e27143bd"
|
135
|
-
# password ==
|
140
|
+
# password == 'shhhh' # => true
|
136
141
|
#
|
137
|
-
# another_password =
|
142
|
+
# another_password = 'shhhh'
|
138
143
|
# another_password.encrypt! # => "66c85d26dadde7e1db27e15a0776c921e27143bd"
|
139
144
|
# password == another_password # => true
|
140
145
|
def equals_with_encryption(other)
|
141
146
|
if !(is_equal = equals_without_encryption(other)) && String === other
|
142
147
|
if encrypted?
|
143
148
|
if other.encrypted?
|
149
|
+
# We're both encrypted, so check if:
|
150
|
+
# (1) The other string is the encrypted value of this string
|
151
|
+
# (2) This string is the encrypted value of the other string
|
152
|
+
# (3) The other string is the encrypted value of this string, decrypted
|
153
|
+
# (4) This string is the encrypted value of the other string, decrypted
|
144
154
|
is_string_equal?(self, other) || is_string_equal?(other, self) || self.can_decrypt? && is_string_equal?(self.decrypt, other) || other.can_decrypt? && is_string_equal?(other.decrypt, self)
|
145
155
|
else
|
156
|
+
# Only we're encrypted
|
146
157
|
is_string_equal?(other, self)
|
147
158
|
end
|
148
159
|
else
|
149
160
|
if other.encrypted?
|
161
|
+
# Only the other string is encrypted
|
150
162
|
is_string_equal?(self, other)
|
151
163
|
else
|
164
|
+
# Neither are encrypted and equality test didn't work before, so
|
165
|
+
# they can't be equal
|
152
166
|
false
|
153
167
|
end
|
154
168
|
end
|
155
169
|
else
|
170
|
+
# The other value wasn't a string, so we can't check encryption equality
|
156
171
|
is_equal
|
157
172
|
end
|
158
173
|
end
|
159
174
|
|
160
175
|
private
|
161
|
-
|
162
|
-
|
163
|
-
encrypted_value.
|
164
|
-
|
165
|
-
|
176
|
+
def is_string_equal?(value, encrypted_value) #:nodoc:
|
177
|
+
# If the encrypted value can be decrypted, then test against the decrypted value
|
178
|
+
if encrypted_value.can_decrypt?
|
179
|
+
encrypted_value.decrypt.equals_without_encryption(value)
|
180
|
+
else
|
181
|
+
# Otherwise encrypt this value based on the encryptor used on the encrypted value
|
182
|
+
# and test the equality of those strings
|
183
|
+
encrypted_value.equals_without_encryption(encrypted_value.encryptor.encrypt(value))
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def encryptor_from_args(*args) #:nodoc:
|
188
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
189
|
+
mode = (args.first || :sha).to_sym
|
190
|
+
"PluginAWeek::EncryptedStrings::#{mode.to_s.classify}Encryptor".constantize.new(options)
|
166
191
|
end
|
167
|
-
end
|
168
|
-
|
169
|
-
def encryptor_from_args(*args) #:nodoc:
|
170
|
-
options = args.last.is_a?(::Hash) ? args.pop : {}
|
171
|
-
mode = (args.first || :sha).to_sym
|
172
|
-
"PluginAWeek::EncryptedStrings::#{mode.to_s.classify}Encryptor".constantize.new(options)
|
173
|
-
end
|
174
192
|
end
|
175
193
|
end
|
176
194
|
end
|
@@ -35,7 +35,7 @@ module PluginAWeek #:nodoc:
|
|
35
35
|
attr_accessor :salt
|
36
36
|
|
37
37
|
# Configuration options:
|
38
|
-
# *
|
38
|
+
# * +salt+ - Salt value to use for encryption
|
39
39
|
def initialize(options = {})
|
40
40
|
options = options.symbolize_keys
|
41
41
|
options.assert_valid_keys(:salt)
|
@@ -52,7 +52,7 @@ module PluginAWeek #:nodoc:
|
|
52
52
|
|
53
53
|
# Returns the encrypted value of the data
|
54
54
|
def encrypt(data)
|
55
|
-
Digest::SHA1.hexdigest(data +
|
55
|
+
Digest::SHA1.hexdigest(data + salt)
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
@@ -14,14 +14,14 @@ module PluginAWeek #:nodoc:
|
|
14
14
|
# key must be specified. You can define the defaults for these values like
|
15
15
|
# so:
|
16
16
|
#
|
17
|
-
# PluginAWeek::EncryptedStrings::SymmetricEncryptor.default_algorithm =
|
18
|
-
# PluginAWeek::EncryptedStrings::SymmetricEncryptor.default_key =
|
17
|
+
# PluginAWeek::EncryptedStrings::SymmetricEncryptor.default_algorithm = 'des-ecb'
|
18
|
+
# PluginAWeek::EncryptedStrings::SymmetricEncryptor.default_key = 'secret'
|
19
19
|
#
|
20
20
|
# If these configuration options are not passed in to #encrypt, then the
|
21
21
|
# default values will be used. You can override the default values like so:
|
22
22
|
#
|
23
|
-
# password =
|
24
|
-
# password.encrypt(:
|
23
|
+
# password = 'shhhh'
|
24
|
+
# password.encrypt(:symmetric, :algorithm => 'des-ecb', :key => 'secret') # => "sUG6tYSn0mI=\n"
|
25
25
|
#
|
26
26
|
# An exception will be raised if no key is specified.
|
27
27
|
#
|
@@ -35,7 +35,7 @@ module PluginAWeek #:nodoc:
|
|
35
35
|
# default values will be used. You can override the default values like so:
|
36
36
|
#
|
37
37
|
# password = "sUG6tYSn0mI=\n"
|
38
|
-
# password.decrypt(:
|
38
|
+
# password.decrypt(:symmetric, :algorithm => 'des-ecb', :key => 'secret') # => "shhhh"
|
39
39
|
#
|
40
40
|
# An exception will be raised if no key is specified.
|
41
41
|
class SymmetricEncryptor < Encryptor
|
@@ -51,8 +51,8 @@ module PluginAWeek #:nodoc:
|
|
51
51
|
attr_accessor :key
|
52
52
|
|
53
53
|
# Configuration options:
|
54
|
-
# *
|
55
|
-
# *
|
54
|
+
# * +key+ - Private key
|
55
|
+
# * +algorithm+ - Algorithm to use
|
56
56
|
def initialize(options = {})
|
57
57
|
options = options.symbolize_keys
|
58
58
|
options.assert_valid_keys(
|
@@ -62,24 +62,24 @@ module PluginAWeek #:nodoc:
|
|
62
62
|
options.reverse_merge!(:key => @@default_key)
|
63
63
|
options[:algorithm] ||= @@default_algorithm
|
64
64
|
|
65
|
-
|
66
|
-
raise NoKeyError if
|
65
|
+
self.key = options[:key]
|
66
|
+
raise NoKeyError if key.nil?
|
67
67
|
|
68
|
-
|
68
|
+
self.algorithm = options[:algorithm]
|
69
69
|
|
70
70
|
super()
|
71
71
|
end
|
72
72
|
|
73
73
|
# Decrypts the current string using the current key and algorithm specified
|
74
74
|
def decrypt(data)
|
75
|
-
cipher.decrypt(
|
75
|
+
cipher.decrypt(key)
|
76
76
|
decrypted_data = cipher.update(Base64.decode64(data))
|
77
77
|
decrypted_data << cipher.final
|
78
78
|
end
|
79
79
|
|
80
80
|
# Encrypts the current string using the current key and algorithm specified
|
81
81
|
def encrypt(data)
|
82
|
-
cipher.encrypt(
|
82
|
+
cipher.encrypt(key)
|
83
83
|
encrypted_data = cipher.update(data)
|
84
84
|
encrypted_data << cipher.final
|
85
85
|
|
@@ -87,9 +87,9 @@ module PluginAWeek #:nodoc:
|
|
87
87
|
end
|
88
88
|
|
89
89
|
private
|
90
|
-
|
91
|
-
|
92
|
-
|
90
|
+
def cipher #:nodoc:
|
91
|
+
@cipher ||= OpenSSL::Cipher::Cipher.new(algorithm)
|
92
|
+
end
|
93
93
|
end
|
94
94
|
end
|
95
95
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
2
|
|
3
3
|
class AsymmetricEncryptorTest < Test::Unit::TestCase
|
4
4
|
def setup
|
@@ -90,8 +90,8 @@ class AsymmetricEncryptorTest < Test::Unit::TestCase
|
|
90
90
|
end
|
91
91
|
|
92
92
|
private
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
93
|
+
def set_default_key_files(public_key, private_key)
|
94
|
+
PluginAWeek::EncryptedStrings::AsymmetricEncryptor.default_public_key_file = public_key
|
95
|
+
PluginAWeek::EncryptedStrings::AsymmetricEncryptor.default_private_key_file = private_key
|
96
|
+
end
|
97
97
|
end
|
data/test/encryptor_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
2
|
|
3
3
|
class EncryptorTest < Test::Unit::TestCase
|
4
4
|
def setup
|
@@ -10,6 +10,6 @@ class EncryptorTest < Test::Unit::TestCase
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def test_should_raise_exception_if_decrypt_not_implemented
|
13
|
-
assert_raises(NotImplementedError) {
|
13
|
+
assert_raises(NotImplementedError) {@encryptor.decrypt('test')}
|
14
14
|
end
|
15
|
-
end
|
15
|
+
end
|
data/test/no_key_error_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require File.
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
2
|
|
3
3
|
class NoPrivateKeyErrorTest < Test::Unit::TestCase
|
4
4
|
def test_should_exist
|
5
5
|
assert_not_nil PluginAWeek::EncryptedStrings::NoPrivateKeyError
|
6
6
|
end
|
7
|
-
end
|
7
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require File.
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
2
|
|
3
3
|
class NoPublicKeyErrorTest < Test::Unit::TestCase
|
4
4
|
def test_should_exist
|
5
5
|
assert_not_nil PluginAWeek::EncryptedStrings::NoPublicKeyError
|
6
6
|
end
|
7
|
-
end
|
7
|
+
end
|
data/test/sha_encryptor_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
2
|
|
3
3
|
class ShaEncryptorTest < Test::Unit::TestCase
|
4
4
|
def setup
|
@@ -18,6 +18,6 @@ class ShaEncryptorTest < Test::Unit::TestCase
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def test_should_raise_exception_if_trying_to_decrypt
|
21
|
-
assert_raises(NotImplementedError) {
|
21
|
+
assert_raises(NotImplementedError) {PluginAWeek::EncryptedStrings::ShaEncryptor.new.decrypt('test')}
|
22
22
|
end
|
23
|
-
end
|
23
|
+
end
|
data/test/string_test.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
1
|
require 'test/unit'
|
2
|
+
require 'rubygems'
|
5
3
|
require 'active_support'
|
6
|
-
|
4
|
+
|
5
|
+
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
6
|
+
require File.dirname(__FILE__) + '/../init'
|
metadata
CHANGED
@@ -1,82 +1,89 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.0
|
3
|
-
specification_version: 1
|
4
2
|
name: encrypted_strings
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2007-09-18 00:00:00 -04:00
|
8
|
-
summary: Dead-simple string encryption/decryption syntax.
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email: info@pluginaweek.org
|
12
|
-
homepage: http://www.pluginaweek.org
|
13
|
-
rubyforge_project:
|
14
|
-
description:
|
15
|
-
autorequire: encrypted_strings
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: true
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
4
|
+
version: 0.0.4
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
|
-
post_install_message:
|
29
6
|
authors:
|
30
|
-
- Aaron Pfeifer
|
7
|
+
- Aaron Pfeifer
|
8
|
+
autorequire: encrypted_strings
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-05-05 00:00:00 -04:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description:
|
17
|
+
email: aaron@pluginaweek.org
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
31
24
|
files:
|
32
25
|
- lib/encrypted_strings.rb
|
33
26
|
- lib/encrypted_strings
|
34
|
-
- lib/encrypted_strings/
|
35
|
-
- lib/encrypted_strings/asymmetric_encryptor.rb
|
36
|
-
- lib/encrypted_strings/no_public_key_error.rb
|
27
|
+
- lib/encrypted_strings/no_private_key_error.rb
|
37
28
|
- lib/encrypted_strings/no_key_error.rb
|
29
|
+
- lib/encrypted_strings/no_public_key_error.rb
|
30
|
+
- lib/encrypted_strings/asymmetric_encryptor.rb
|
31
|
+
- lib/encrypted_strings/symmetric_encryptor.rb
|
38
32
|
- lib/encrypted_strings/sha_encryptor.rb
|
39
|
-
- lib/encrypted_strings/no_private_key_error.rb
|
40
33
|
- lib/encrypted_strings/encryptor.rb
|
41
|
-
- lib/encrypted_strings/
|
34
|
+
- lib/encrypted_strings/extensions
|
42
35
|
- lib/encrypted_strings/extensions/string.rb
|
43
|
-
- test/test_helper.rb
|
44
|
-
- test/no_private_key_error_test.rb
|
45
|
-
- test/no_public_key_error_test.rb
|
46
|
-
- test/sha_encryptor_test.rb
|
47
|
-
- test/symmetric_encryptor_test.rb
|
48
|
-
- test/string_test.rb
|
49
|
-
- test/encryptor_test.rb
|
50
|
-
- test/asymmetric_encryptor_test.rb
|
51
36
|
- test/keys
|
52
|
-
- test/no_key_error_test.rb
|
53
37
|
- test/keys/private
|
38
|
+
- test/keys/encrypted_private
|
54
39
|
- test/keys/public
|
55
40
|
- test/keys/encrypted_public
|
56
|
-
- test/
|
41
|
+
- test/no_private_key_error_test.rb
|
42
|
+
- test/encryptor_test.rb
|
43
|
+
- test/asymmetric_encryptor_test.rb
|
44
|
+
- test/no_key_error_test.rb
|
45
|
+
- test/sha_encryptor_test.rb
|
46
|
+
- test/test_helper.rb
|
47
|
+
- test/no_public_key_error_test.rb
|
48
|
+
- test/string_test.rb
|
49
|
+
- test/symmetric_encryptor_test.rb
|
57
50
|
- CHANGELOG
|
58
51
|
- init.rb
|
59
52
|
- MIT-LICENSE
|
60
53
|
- Rakefile
|
61
54
|
- README
|
55
|
+
has_rdoc: true
|
56
|
+
homepage: http://www.pluginaweek.org
|
57
|
+
post_install_message:
|
58
|
+
rdoc_options: []
|
59
|
+
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: "0"
|
67
|
+
version:
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: "0"
|
73
|
+
version:
|
74
|
+
requirements: []
|
75
|
+
|
76
|
+
rubyforge_project:
|
77
|
+
rubygems_version: 1.1.0
|
78
|
+
signing_key:
|
79
|
+
specification_version: 2
|
80
|
+
summary: Dead-simple string encryption/decryption syntax.
|
62
81
|
test_files:
|
63
82
|
- test/no_private_key_error_test.rb
|
64
|
-
- test/no_public_key_error_test.rb
|
65
|
-
- test/sha_encryptor_test.rb
|
66
|
-
- test/symmetric_encryptor_test.rb
|
67
|
-
- test/string_test.rb
|
68
83
|
- test/encryptor_test.rb
|
69
84
|
- test/asymmetric_encryptor_test.rb
|
70
85
|
- test/no_key_error_test.rb
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
executables: []
|
76
|
-
|
77
|
-
extensions: []
|
78
|
-
|
79
|
-
requirements: []
|
80
|
-
|
81
|
-
dependencies: []
|
82
|
-
|
86
|
+
- test/sha_encryptor_test.rb
|
87
|
+
- test/no_public_key_error_test.rb
|
88
|
+
- test/string_test.rb
|
89
|
+
- test/symmetric_encryptor_test.rb
|