ezcrypto2 0.0.2

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/rakefile ADDED
@@ -0,0 +1,200 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+ require 'rake/rdoctask'
5
+ require 'rake/packagetask'
6
+ require 'rake/gempackagetask'
7
+ require 'rake/contrib/rubyforgepublisher'
8
+
9
+ PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
10
+ PKG_NAME = 'ezcrypto'
11
+ PKG_VERSION = '0.7.2' + PKG_BUILD
12
+ PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
13
+
14
+ RELEASE_NAME = "REL #{PKG_VERSION}"
15
+
16
+ RUBY_FORGE_PROJECT = "ezcrypto"
17
+ RUBY_FORGE_USER = "pelleb"
18
+
19
+ desc "Default Task"
20
+ task :default => [ :test ]
21
+
22
+ # Run the unit tests
23
+ Rake::TestTask.new { |t|
24
+ t.libs << "test"
25
+ t.pattern = 'test/*_test.rb'
26
+ t.verbose = true
27
+ }
28
+
29
+
30
+ # Genereate the RDoc documentation
31
+ Rake::RDocTask.new { |rdoc|
32
+ rdoc.rdoc_dir = 'doc'
33
+ rdoc.title = "EzCrypto - Simplified Crypto Library"
34
+ # rdoc.options << '--line-numbers --inline-source --main README #--template=jamis'
35
+ rdoc.template = "#{ENV['template']}.rb" if ENV['template']
36
+ rdoc.rdoc_files.include('README.rdoc')
37
+ rdoc.rdoc_files.include('README_ACTIVE_CRYPTO')
38
+ rdoc.rdoc_files.include('README_DIGITAL_SIGNATURES')
39
+ rdoc.rdoc_files.include('CHANGELOG')
40
+ rdoc.rdoc_files.include('lib/*.rb')
41
+ }
42
+
43
+
44
+ # Create compressed packages
45
+ spec = Gem::Specification.new do |s|
46
+ s.platform = Gem::Platform::RUBY
47
+ s.name = PKG_NAME
48
+ s.summary = "Simplified encryption library."
49
+ s.description = %q{Makes it easier and safer to write crypto code.}
50
+ s.version = PKG_VERSION
51
+
52
+ s.author = "Pelle Braendgaard"
53
+ s.email = "pelle@stakeventures.com"
54
+ s.rubyforge_project = "ezcrypto"
55
+ s.homepage = "http://ezcrypto.rubyforge.org"
56
+
57
+
58
+ s.has_rdoc = true
59
+ s.requirements << 'none'
60
+ s.require_path = 'lib'
61
+
62
+ s.files = [ "rakefile", "README.rdoc", "README_ACTIVE_CRYPTO", "README_DIGITAL_SIGNATURES", "MIT-LICENSE","CHANGELOG","init.rb" ]
63
+ ["lib","test"].each do |dir|
64
+ s.files = s.files + Dir.glob( "#{dir}/*" )
65
+ end
66
+ s.extra_rdoc_files = ["CHANGELOG", "README.rdoc","README_ACTIVE_CRYPTO","README_DIGITAL_SIGNATURES"]
67
+ s.test_files = Dir.glob("test/*")
68
+ end
69
+
70
+ Rake::GemPackageTask.new(spec) do |p|
71
+ p.gem_spec = spec
72
+ p.need_tar = true
73
+ p.need_zip = true
74
+ end
75
+
76
+
77
+ desc "Publish the GEM"
78
+ task :pgem => [:package] do
79
+ Rake::SshFilePublisher.new("pelleb@rubyforge.org", "/var/www/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload
80
+ end
81
+
82
+ desc "Publish the API documentation"
83
+ task :pdoc => [:rdoc] do
84
+ Rake::SshDirPublisher.new("pelleb@rubyforge.org", "/var/www/gforge-projects/ezcrypto", "doc").upload
85
+ end
86
+
87
+ desc "Publish the release files to RubyForge."
88
+ task :rubyforge_upload => :package do
89
+ files = %w(gem tgz zip).map { |ext| "pkg/#{PKG_FILE_NAME}.#{ext}" }
90
+
91
+ if RUBY_FORGE_PROJECT then
92
+ require 'net/http'
93
+ require 'open-uri'
94
+
95
+ project_uri = "http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/"
96
+ project_data = open(project_uri) { |data| data.read }
97
+ group_id = project_data[/[?&]group_id=(\d+)/, 1]
98
+ raise "Couldn't get group id" unless group_id
99
+
100
+ # This echos password to shell which is a bit sucky
101
+ if ENV["RUBY_FORGE_PASSWORD"]
102
+ password = ENV["RUBY_FORGE_PASSWORD"]
103
+ else
104
+ print "#{RUBY_FORGE_USER}@rubyforge.org's password: "
105
+ password = STDIN.gets.chomp
106
+ end
107
+
108
+ login_response = Net::HTTP.start("rubyforge.org", 80) do |http|
109
+ data = [
110
+ "login=1",
111
+ "form_loginname=#{RUBY_FORGE_USER}",
112
+ "form_pw=#{password}"
113
+ ].join("&")
114
+ http.post("/account/login.php", data)
115
+ end
116
+
117
+ cookie = login_response["set-cookie"]
118
+ raise "Login failed" unless cookie
119
+ headers = { "Cookie" => cookie }
120
+
121
+ release_uri = "http://rubyforge.org/frs/admin/?group_id=#{group_id}"
122
+ release_data = open(release_uri, headers) { |data| data.read }
123
+ package_id = release_data[/[?&]package_id=(\d+)/, 1]
124
+ raise "Couldn't get package id" unless package_id
125
+
126
+ first_file = true
127
+ release_id = ""
128
+
129
+ files.each do |filename|
130
+ basename = File.basename(filename)
131
+ file_ext = File.extname(filename)
132
+ file_data = File.open(filename, "rb") { |file| file.read }
133
+
134
+ puts "Releasing #{basename}..."
135
+
136
+ release_response = Net::HTTP.start("rubyforge.org", 80) do |http|
137
+ release_date = Time.now.strftime("%Y-%m-%d %H:%M")
138
+ type_map = {
139
+ ".zip" => "3000",
140
+ ".tgz" => "3110",
141
+ ".gz" => "3110",
142
+ ".gem" => "1400"
143
+ }; type_map.default = "9999"
144
+ type = type_map[file_ext]
145
+ boundary = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor"
146
+
147
+ query_hash = if first_file then
148
+ {
149
+ "group_id" => group_id,
150
+ "package_id" => package_id,
151
+ "release_name" => PKG_FILE_NAME,
152
+ "release_date" => release_date,
153
+ "type_id" => type,
154
+ "processor_id" => "8000", # Any
155
+ "release_notes" => "",
156
+ "release_changes" => "",
157
+ "preformatted" => "1",
158
+ "submit" => "1"
159
+ }
160
+ else
161
+ {
162
+ "group_id" => group_id,
163
+ "release_id" => release_id,
164
+ "package_id" => package_id,
165
+ "step2" => "1",
166
+ "type_id" => type,
167
+ "processor_id" => "8000", # Any
168
+ "submit" => "Add This File"
169
+ }
170
+ end
171
+
172
+ query = "?" + query_hash.map do |(name, value)|
173
+ [name, URI.encode(value)].join("=")
174
+ end.join("&")
175
+
176
+ data = [
177
+ "--" + boundary,
178
+ "Content-Disposition: form-data; name=\"userfile\"; filename=\"#{basename}\"",
179
+ "Content-Type: application/octet-stream",
180
+ "Content-Transfer-Encoding: binary",
181
+ "", file_data, ""
182
+ ].join("\x0D\x0A")
183
+
184
+ release_headers = headers.merge(
185
+ "Content-Type" => "multipart/form-data; boundary=#{boundary}"
186
+ )
187
+
188
+ target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php"
189
+ http.post(target + query, data, release_headers)
190
+ end
191
+
192
+ if first_file then
193
+ release_id = release_response.body[/release_id=(\d+)/, 1]
194
+ raise("Couldn't get release id") unless release_id
195
+ end
196
+
197
+ first_file = false
198
+ end
199
+ end
200
+ end
@@ -0,0 +1,211 @@
1
+ $:.unshift(File.dirname(__FILE__) + "/../lib/")
2
+ require File.join(File.dirname(__FILE__), 'test_helper')
3
+ require 'test/unit'
4
+ require 'active_crypto'
5
+
6
+
7
+ class User < ActiveRecord::Base
8
+ has_many :secrets
9
+ has_many :groups
10
+ keyholder
11
+ end
12
+
13
+ class Secret < ActiveRecord::Base
14
+ encrypt :name,:email, :key=>:user, :base64=>true
15
+ belongs_to :user
16
+ has_many :children
17
+ end
18
+
19
+ class Child < ActiveRecord::Base
20
+ encrypt :email, :key=>:secret, :base64=>true
21
+ belongs_to :secret
22
+ end
23
+
24
+ class Asset<ActiveRecord::Base
25
+ encrypt :title, :base64=>true
26
+ has_many :caps,:dependent=>:destroy
27
+
28
+ def self.create(title,email)
29
+ asset=Asset.new
30
+ asset.set_session_key(EzCrypto::Key.generate)
31
+ asset.title=title
32
+ if asset.save
33
+ asset.share(email)
34
+ else
35
+ nil
36
+ end
37
+ end
38
+
39
+ def share(email=nil)
40
+ Cap.create_for_asset(self,email)
41
+ end
42
+
43
+ end
44
+
45
+ class AssetRaw<ActiveRecord::Base
46
+ set_table_name "assets"
47
+ end
48
+
49
+ class Cap < ActiveRecord::Base
50
+ belongs_to :asset
51
+ encrypt :shared_key, :base64=>true
52
+
53
+ def self.find_by_key(cap_key)
54
+ cap_key.chop
55
+ hash=Digest::SHA1.hexdigest(cap_key)
56
+ if (cap_key.length>=20) # Sanity check
57
+ cap=self.find_by_key_hash(hash)
58
+ if cap
59
+ cap.set_encoded_key(cap_key)
60
+ cap.asset.set_encoded_key(cap.shared_key)
61
+ cap
62
+ end
63
+ else
64
+ nil
65
+ end
66
+ end
67
+
68
+ def self.create_for_asset(asset,email=nil)
69
+ cap=Cap.new
70
+ cap.email=email if email
71
+ cap.asset=asset
72
+ if cap.save
73
+ cap.set_session_key(EzCrypto::Key.generate)
74
+ cap_key=cap.session_key.encode
75
+ cap.key_hash=Digest::SHA1.hexdigest(cap_key)
76
+ cap.shared_key=asset.session_key.encode
77
+ cap.save
78
+ cap_key
79
+ else
80
+ nil
81
+ end
82
+ end
83
+
84
+ end
85
+
86
+ class Group < ActiveRecord::Base
87
+ belongs_to :user
88
+ has_many :group_secrets
89
+
90
+ encrypt :name,:group_key, :key=>:user , :base64=>true
91
+ end
92
+
93
+ class GroupSecret < ActiveRecord::Base
94
+ belongs_to :group
95
+
96
+ encrypt :title,:body, :key=>:group, :base64=>true
97
+
98
+ end
99
+
100
+ class ActiveCryptoTest < Test::Unit::TestCase
101
+
102
+ def setup
103
+ end
104
+
105
+ def test_key_holder_in_record
106
+ user=User.new
107
+ user.name="bob"
108
+ user.save
109
+ assert user.kind_of?(ActiveCrypto::KeyHolder)
110
+ assert user.kind_of?(ActiveRecord::Base)
111
+ assert user.kind_of?(User)
112
+ assert_nil user.session_key
113
+ user.enter_password "shhcccc"
114
+ assert_not_nil user.session_key
115
+ assert_not_nil user.session_key.encrypt("test")
116
+ end
117
+
118
+ def test_encrypted_child
119
+ user=User.new
120
+ user.save
121
+ assert_nil user.session_key
122
+ user.enter_password "shhcccc"
123
+ assert_not_nil user.session_key
124
+ assert user.kind_of?(ActiveCrypto::KeyHolder)
125
+ assert user.kind_of?(ActiveRecord::Base)
126
+ assert user.kind_of?(User)
127
+
128
+ jill=user.secrets.create
129
+
130
+ assert_not_nil jill
131
+ assert jill.kind_of?(ActiveCrypto::AssociationKeyHolder)
132
+ assert jill.kind_of?(ActiveCrypto::KeyHolder)
133
+ assert jill.kind_of?(ActiveCrypto::Encrypted)
134
+ assert jill.kind_of?(ActiveRecord::Base)
135
+ assert jill.kind_of?(Secret)
136
+
137
+ assert jill.respond_to?(:session_key)
138
+
139
+ assert_not_nil jill.user
140
+ assert_not_nil jill.user.session_key
141
+
142
+
143
+ assert_not_nil jill.session_key
144
+ assert_equal user.session_key,jill.session_key
145
+
146
+ jill.name="jill"
147
+ jill.save
148
+
149
+
150
+ assert_equal "jill",jill.name
151
+
152
+ jill=user.secrets.first
153
+ assert_not_nil jill.session_key
154
+ assert_equal user.session_key,jill.session_key
155
+ assert_equal "jill",jill.name
156
+
157
+ child=jill.children.create
158
+ child.email="pelle@neubia.com"
159
+ child.save
160
+
161
+ assert_not_nil child.secret
162
+ assert_not_nil child.secret.session_key
163
+
164
+
165
+ assert_not_nil child.session_key
166
+ assert_equal user.session_key,child.session_key
167
+
168
+ assert_equal "pelle@neubia.com",child.email
169
+
170
+ child=jill.children.first
171
+
172
+ assert_not_nil child.secret
173
+ assert_not_nil child.secret.session_key
174
+
175
+
176
+ assert_not_nil child.session_key
177
+ assert_equal user.session_key,child.session_key
178
+
179
+ assert_equal "pelle@neubia.com",child.email
180
+
181
+ end
182
+
183
+ def test_caps
184
+ key=Asset.create("title","pelle@neubia.com")
185
+ assert_not_nil key
186
+ cap=Cap.find_by_key key
187
+ assert_not_nil cap
188
+ assert_not_nil cap.asset
189
+
190
+ assert_equal "title",cap.asset.title
191
+ assert_equal "title",cap.asset["title"]
192
+ assert_equal "pelle@neubia.com",cap.email
193
+ assert_equal "pelle@neubia.com",cap["email"]
194
+
195
+ # Non decrypting version
196
+ raw=AssetRaw.find cap.asset.id
197
+ assert_not_equal "title",raw.title
198
+ assert_not_equal "title",raw["title"]
199
+
200
+ bob_key=cap.asset.share("bob@bob.com")
201
+ bob_cap=Cap.find_by_key bob_key
202
+
203
+ assert_not_equal key,bob_key
204
+ assert_not_nil bob_cap
205
+ assert_not_nil bob_cap.asset
206
+ assert_equal "title",bob_cap.asset.title
207
+ assert_equal "bob@bob.com",bob_cap.email
208
+ end
209
+ end
210
+
211
+
@@ -0,0 +1,31 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFIzCCBAugAwIBAgIEdjTPCDANBgkqhkiG9w0BAQUFADCB3DELMAkGA1UEBhMC
3
+ VVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNV
4
+ BAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOTA3BgNVBAsTMGh0dHA6
5
+ Ly9jZXJ0aWZpY2F0ZXMuc3RhcmZpZWxkdGVjaC5jb20vcmVwb3NpdG9yeTExMC8G
6
+ A1UEAxMoU3RhcmZpZWxkIFNlY3VyZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTER
7
+ MA8GA1UEBRMIMTA2ODg0MzUwHhcNMDkwMzEwMTUyMzQ1WhcNMTAwMzExMjAzNzE0
8
+ WjB6MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
9
+ U2FuIEZyYW5jaXNjbzEYMBYGA1UEChMPRXh0cmEgRWFnbGUgTExDMQ8wDQYDVQQL
10
+ EwZBZ3JlZTIxEzARBgNVBAMTCmFncmVlMi5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
11
+ gY0AMIGJAoGBAPNfoI6m+NIm69qkuOgOwlRI64W6SmJ+xlxz/fduK/0XtqRlANL9
12
+ aENxkAEvJz6tpsinNOAry96ucajZP9WUMWfy+wmXkTWLQN1jVPZUJs2mBBw6ajgm
13
+ 8xLgPWn3czRve0Q34poWGLFb+CZdcZScbnHcn6Dkt8SwMsFFBhLB0FM/AgMBAAGj
14
+ ggHQMIIBzDAPBgNVHRMBAf8EBTADAQEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr
15
+ BgEFBQcDAjAOBgNVHQ8BAf8EBAMCBaAwOAYDVR0fBDEwLzAtoCugKYYnaHR0cDov
16
+ L2NybC5zdGFyZmllbGR0ZWNoLmNvbS9zZnMyLTAuY3JsMFkGA1UdIARSMFAwTgYL
17
+ YIZIAYb9bgEHFwIwPzA9BggrBgEFBQcCARYxaHR0cDovL2NlcnRpZmljYXRlcy5z
18
+ dGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5LzCBjQYIKwYBBQUHAQEEgYAwfjAq
19
+ BggrBgEFBQcwAYYeaHR0cDovL29jc3Auc3RhcmZpZWxkdGVjaC5jb20vMFAGCCsG
20
+ AQUFBzAChkRodHRwOi8vY2VydGlmaWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3Jl
21
+ cG9zaXRvcnkvc2ZfaW50ZXJtZWRpYXRlLmNydDAfBgNVHSMEGDAWgBRJS1In0Ru8
22
+ 8qEhamJ7UUJ6itfVVjAlBgNVHREEHjAcggphZ3JlZTIuY29tgg53d3cuYWdyZWUy
23
+ LmNvbTAdBgNVHQ4EFgQU8U68CbJHeGRhPSl2LRtx9IaocA4wDQYJKoZIhvcNAQEF
24
+ BQADggEBACFngInbvv6YmtiwHFWZswcY7eoqMpUggXC2jmX9ZT+w9CcdgVlygow6
25
+ jeR2HY7FPSKkm0YaDEAYYIoYeFHwaG6E4B6ykGvw5OQ4FESsQT/lxVlbeF0J1ERh
26
+ YEpvwrVrVK/ppRd5En2hvl6kKvRyqjTcHKT/MKZ2xQXUZ6JEVKIME3HLS+IHR/Sc
27
+ uo1aH3dXS73lFmWLH4P12KIfqnzQ938FDynW875bvKgl4HAzJj66wnMOoL5INOuK
28
+ d+r9xUBD/uWXJPaXLzC8vuORHInLWNE4M2cpNeVNsU8siX4c9mC/Hj+Ss1nYBW0D
29
+ 4b8GcJ+tY+2Y+ODBKJn/s0qhB6TXoKM=
30
+ -----END CERTIFICATE-----
31
+
@@ -0,0 +1,38 @@
1
+ require 'key_holder_test'
2
+
3
+ class User < ActiveRecord::Base
4
+ keyholder
5
+ end
6
+
7
+ class AssociationKeyHolderTest < KeyHolderTest
8
+ def setup
9
+ @key_holder=User.create
10
+ end
11
+
12
+ def test_should_retain_session_key_on_reload
13
+ key=EzCrypto::Key.generate
14
+ key_holder.set_session_key key
15
+ assert_not_nil key_holder.session_key
16
+ assert_equal key.raw,key_holder.session_key.raw
17
+
18
+ reloaded=User.find key_holder.id
19
+ assert_not_nil reloaded.session_key
20
+ assert_equal key.raw,reloaded.session_key.raw
21
+ end
22
+
23
+ def test_should_retain_session_key_on_reload_for_record_with_key_set_before_create
24
+ key=EzCrypto::Key.generate
25
+ key_holder=User.new
26
+ assert_nil key_holder.session_key
27
+
28
+ key_holder.set_session_key key
29
+ assert_not_nil key_holder.session_key
30
+
31
+ assert_equal key.raw,key_holder.session_key.raw
32
+ key_holder.save
33
+
34
+ reloaded=User.find key_holder.id
35
+ assert_not_nil reloaded.session_key
36
+ assert_equal key.raw,reloaded.session_key.raw
37
+ end
38
+ end