cul-handles 0.2.0 → 0.3.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.
- checksums.yaml +7 -0
- data/Rakefile +16 -32
- data/VERSION +1 -1
- data/lib/cul-handles.rb +24 -14
- data/lib/cul/handles/add_value_request.rb +10 -0
- data/lib/cul/handles/base_response.rb +0 -1
- data/lib/cul/handles/client.rb +1 -0
- data/lib/cul/handles/create_handle_request.rb +1 -1
- data/lib/cul/handles/delete_value_request.rb +12 -0
- data/lib/cul/handles/dh.rb +59 -0
- data/lib/cul/handles/handle_value.rb +120 -0
- data/lib/cul/handles/handle_value_request.rb +1 -41
- data/lib/cul/handles/hdl.rb +1 -1
- data/lib/cul/handles/modify_value_request.rb +1 -1
- data/lib/cul/handles/resolution_response.rb +0 -119
- data/lib/cul/handles/{session_request.rb → session_setup_request.rb} +1 -57
- data/test/{authn_test.rb → system/authn_test.rb} +0 -0
- data/test/{resolution_test.rb → system/resolution_test.rb} +0 -0
- data/test/test_helper.rb +8 -1
- data/test/{dh_test.rb → unit/dh_test.rb} +2 -0
- data/test/{unsigned_integer_test.rb → unit/unsigned_integer_test.rb} +1 -0
- metadata +91 -52
- data/.document +0 -5
- data/.gitignore +0 -6
- data/cul-handles.gemspec +0 -79
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f614319ec18ecbe1208315855724e83637605767
|
4
|
+
data.tar.gz: beb8025ca1f6608d0f2ff573fadaa470a47b1b0d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2e7dfa5be36afda48fe8bb32d56ec9a36f4d8f00e69ef0c37592922c965286a1cbfac98c9962579f838e59f3613f2a727188cc01df1b626e51a787b2bff3a5b0
|
7
|
+
data.tar.gz: 0cc6bea8e0b464f09d2f577f80896b170a9d15f0cf7f53e490b34ca65be4135b727aee08b52e13fdd0b3b290038e286b2935ba6f308a218d40c4b19e3986cb39
|
data/Rakefile
CHANGED
@@ -1,47 +1,31 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'rake'
|
3
3
|
|
4
|
-
begin
|
5
|
-
require 'jeweler'
|
6
|
-
Jeweler::Tasks.new do |gem|
|
7
|
-
gem.name = "cul-handles"
|
8
|
-
gem.summary = %Q{CUL Handle Client}
|
9
|
-
gem.description = %Q{Columbia client to deal with handle server}
|
10
|
-
gem.email = "tastyhat@jamesstuart.org"
|
11
|
-
gem.homepage = "http://github.com/tastyhat/cul-handles"
|
12
|
-
gem.authors = ["James Stuart"]
|
13
|
-
gem.add_development_dependency "thoughtbot-shoulda"
|
14
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
|
-
end
|
16
|
-
rescue LoadError
|
17
|
-
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
18
|
-
end
|
19
|
-
|
20
4
|
require 'rake/testtask'
|
5
|
+
|
21
6
|
Rake::TestTask.new(:test) do |test|
|
22
7
|
test.libs << 'lib' << 'test'
|
23
|
-
test.pattern = 'test
|
8
|
+
test.pattern = 'test/*_test.rb'
|
24
9
|
test.verbose = true
|
25
10
|
end
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
task :rcov do
|
36
|
-
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
37
|
-
end
|
11
|
+
Rake::TestTask.new(:unit_test) do |test|
|
12
|
+
test.libs << 'lib' << 'test'
|
13
|
+
test.pattern = 'test/unit/**/*_test.rb'
|
14
|
+
test.verbose = true
|
15
|
+
end
|
16
|
+
Rake::TestTask.new(:system_test) do |test|
|
17
|
+
test.libs << 'lib' << 'test'
|
18
|
+
test.pattern = 'test/system/**/*_test.rb'
|
19
|
+
test.verbose = true
|
38
20
|
end
|
39
21
|
|
40
|
-
task :test
|
22
|
+
task :test
|
23
|
+
|
24
|
+
task :ci => [:test, :unit_test]
|
41
25
|
|
42
|
-
task :default => :
|
26
|
+
task :default => :ci
|
43
27
|
|
44
|
-
require '
|
28
|
+
require 'rdoc/task'
|
45
29
|
Rake::RDocTask.new do |rdoc|
|
46
30
|
if File.exist?('VERSION')
|
47
31
|
version = File.read('VERSION')
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/lib/cul-handles.rb
CHANGED
@@ -1,16 +1,26 @@
|
|
1
1
|
require 'socket'
|
2
2
|
require 'digest/sha1'
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
3
|
+
module Cul
|
4
|
+
module Handles
|
5
|
+
autoload :AddValueRequest, 'cul/handles/add_value_request'
|
6
|
+
autoload :BaseMessage, 'cul/handles/base_message'
|
7
|
+
autoload :BaseRequest, 'cul/handles/base_request'
|
8
|
+
autoload :BaseResponse, 'cul/handles/base_response'
|
9
|
+
autoload :ChallengeAnswerRequest, 'cul/handles/challenge_answer_request'
|
10
|
+
autoload :ChallengeResponse, 'cul/handles/challenge_response'
|
11
|
+
autoload :Client, 'cul/handles/client'
|
12
|
+
autoload :CreateHandleRequest, 'cul/handles/create_handle_request'
|
13
|
+
autoload :DH, 'cul/handles/dh'
|
14
|
+
autoload :DeleteHandleRequest, 'cul/handles/delete_handle_request'
|
15
|
+
autoload :DeleteValueRequest, 'cul/handles/delete_value_request'
|
16
|
+
autoload :HandleValue, 'cul/handles/handle_value'
|
17
|
+
autoload :HandleValueRequest, 'cul/handles/handle_value_request'
|
18
|
+
autoload :Hdl, 'cul/handles/hdl'
|
19
|
+
autoload :ModifyValueRequest, 'cul/handles/modify_value_request'
|
20
|
+
autoload :ResolutionRequest, 'cul/handles/resolution_request'
|
21
|
+
autoload :ResolutionResponse, 'cul/handles/resolution_response'
|
22
|
+
autoload :SessionSetupRequest, 'cul/handles/session_setup_request'
|
23
|
+
autoload :SessionSetupResponse, 'cul/handles/session_setup_response'
|
24
|
+
autoload :SetValueRequest, 'cul/handles/set_value_request'
|
25
|
+
end
|
26
|
+
end
|
data/lib/cul/handles/client.rb
CHANGED
@@ -78,6 +78,7 @@ module Cul
|
|
78
78
|
return sendAuthRequest(req, adminSecret)
|
79
79
|
end
|
80
80
|
def addHandleMaintainer(adminSecret,handle,maintainerHandle)
|
81
|
+
Rails.logger.info('================= addHandleMaintainer 1')
|
81
82
|
req = Cul::Handles::AddValueRequest.new(handle)
|
82
83
|
req.addAdminValue(maintainerHandle, 0x0070, INDEX_MAINTAINER_HANDLE)
|
83
84
|
initRequest(req)
|
@@ -1,5 +1,17 @@
|
|
1
1
|
module Cul
|
2
2
|
module Handles
|
3
|
+
class DeleteValueRequest < HandleValueRequest
|
4
|
+
def initialize(handle)
|
5
|
+
super(handle)
|
6
|
+
@opCode = asBytes(Hdl::OC_REMOVE_VALUE)
|
7
|
+
end
|
8
|
+
def addAdminValue(adminHandle, permissions, index)
|
9
|
+
if (index.eql?(100))
|
10
|
+
raise "Deleting the admin value would leave the handle without an administrator; Use modify value instead."
|
11
|
+
end
|
12
|
+
super(adminHandle, permissions, index)
|
13
|
+
end
|
14
|
+
end
|
3
15
|
class RemoveValueRequest < BaseRequest
|
4
16
|
include Hdl
|
5
17
|
def initialize(handle)
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Cul
|
2
|
+
module Handles
|
3
|
+
class DH
|
4
|
+
include Hdl
|
5
|
+
attr_reader :prime, :generator, :maxrand, :publickey
|
6
|
+
# def DH.miller_rabin(a, n)
|
7
|
+
#
|
8
|
+
# end
|
9
|
+
# def DH.prime
|
10
|
+
#
|
11
|
+
# end
|
12
|
+
def DH.mod_exp start, e, m
|
13
|
+
result = 1
|
14
|
+
b = start
|
15
|
+
while e > 0
|
16
|
+
result = (result * b) % m if e[0] == 1
|
17
|
+
e = e >> 1
|
18
|
+
b = (b*b) %m
|
19
|
+
end
|
20
|
+
return result
|
21
|
+
end
|
22
|
+
def initialize(prime, generator, maxrand)
|
23
|
+
@prime = prime
|
24
|
+
@generator = generator
|
25
|
+
@maxrand = maxrand
|
26
|
+
@publickey = 0 #public key
|
27
|
+
@key = 0 #shared secret
|
28
|
+
@private = 0 #private key
|
29
|
+
end
|
30
|
+
def generate tries=16 # shared key
|
31
|
+
tries.times do
|
32
|
+
@private = rand(@maxrand)
|
33
|
+
@publickey = DH.mod_exp(@generator, @private, @prime)
|
34
|
+
return @publickey if self.valid?
|
35
|
+
end
|
36
|
+
end
|
37
|
+
def secret f # private key
|
38
|
+
@key = DH.mod_exp(f,@private,@prime)
|
39
|
+
@key
|
40
|
+
end
|
41
|
+
def valid? _e = self.publickey
|
42
|
+
_e and _e.between?(2,self.prime-2) and _e != 0
|
43
|
+
end
|
44
|
+
def encodeKeyParms
|
45
|
+
result = []
|
46
|
+
publicBytes = asBytes(@publickey)
|
47
|
+
result.concat(asBytes(publicBytes.length))
|
48
|
+
result.concat(publicBytes)
|
49
|
+
primeBytes = asBytes(@prime)
|
50
|
+
result.concat(asBytes(primeBytes.length))
|
51
|
+
result.concat(primeBytes)
|
52
|
+
genBytes = asBytes(@generator)
|
53
|
+
result.concat(asBytes(genBytes.length))
|
54
|
+
result.concat(genBytes)
|
55
|
+
result
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
module Cul
|
2
|
+
module Handles
|
3
|
+
class HandleValue
|
4
|
+
include Hdl
|
5
|
+
PERM_ADMIN_READ = 0x8
|
6
|
+
PERM_ADMIN_WRITE = 0x4
|
7
|
+
PERM_PUBLIC_READ = 0x2
|
8
|
+
PERM_PUBLIC_WRITE = 0x1
|
9
|
+
TTL_TYPE_RELATIVE = 0
|
10
|
+
TTL_TYPE_ABSOLUTE = 1
|
11
|
+
MAX_RECOGNIZED_TTL = 86400*2 # 2 days
|
12
|
+
def initialize(data=[],handle="")
|
13
|
+
super()
|
14
|
+
@handle=handle
|
15
|
+
@refs = []
|
16
|
+
@data = []
|
17
|
+
@type = []
|
18
|
+
@perm = 14 # admin r/w; public r
|
19
|
+
@ttlType = TTL_TYPE_RELATIVE # default
|
20
|
+
@ttl = asBytes(86400) # default is 86400 seconds = 1440 minutes = 24 hours
|
21
|
+
@timestamp = asBytes(Time.new().to_i) # number of seconds since computing era
|
22
|
+
deserialize(data) unless data.length == 0
|
23
|
+
end
|
24
|
+
def deserialize(data)
|
25
|
+
@index = data[0..3]
|
26
|
+
@timestamp = data[4..7]
|
27
|
+
@ttlType = data[8]
|
28
|
+
@ttl = data[9..12]
|
29
|
+
@perm = data[13]
|
30
|
+
typeLen = fromBytes(data[14..17])
|
31
|
+
offset = 18
|
32
|
+
@type = data[18...18+typeLen]
|
33
|
+
offset = offset + typeLen
|
34
|
+
dataLen = fromBytes(data[offset...offset+4])
|
35
|
+
offset = offset + 4
|
36
|
+
@data = data[offset...offset+dataLen]
|
37
|
+
offset = offset + dataLen
|
38
|
+
refsLen = fromBytes(data[offset...offset+4])
|
39
|
+
offset = offset + 4
|
40
|
+
@refs = []
|
41
|
+
(1..refsLen).each{
|
42
|
+
@refs.push(fromBytes(data[offset...offset+4]))
|
43
|
+
offset = offset + 4
|
44
|
+
}
|
45
|
+
end
|
46
|
+
def serialize()
|
47
|
+
result = [].concat(@index)
|
48
|
+
result.concat(@timestamp)
|
49
|
+
result.concat([@ttlType])
|
50
|
+
result.concat(@ttl)
|
51
|
+
result.concat([@perm])
|
52
|
+
result.concat(asBytes(@type.length))
|
53
|
+
result.concat(@type)
|
54
|
+
result.concat(asBytes(@data.length))
|
55
|
+
result.concat(@data)
|
56
|
+
result.concat(asBytes(@refs.length))
|
57
|
+
if(@refs.length > 0)
|
58
|
+
@refs.each{ | ref|
|
59
|
+
result.concat(asBytes(ref))
|
60
|
+
}
|
61
|
+
end
|
62
|
+
return result
|
63
|
+
end
|
64
|
+
def handle
|
65
|
+
@handle
|
66
|
+
end
|
67
|
+
def index=(val)
|
68
|
+
@index= val
|
69
|
+
end
|
70
|
+
def index
|
71
|
+
fromBytes(@index)
|
72
|
+
end
|
73
|
+
def timestamp=(val)
|
74
|
+
@timestamp=val
|
75
|
+
end
|
76
|
+
def ttlType=(val)
|
77
|
+
@ttlType = val
|
78
|
+
end
|
79
|
+
def ttl=(val)
|
80
|
+
@ttl = val
|
81
|
+
end
|
82
|
+
def perm=(val)
|
83
|
+
@perm = val
|
84
|
+
end
|
85
|
+
def adminRead
|
86
|
+
@perm & PERM_ADMIN_READ
|
87
|
+
end
|
88
|
+
def adminWrite
|
89
|
+
@perm & PERM_ADMIN_WRITE
|
90
|
+
end
|
91
|
+
def publicRead
|
92
|
+
@perm & PERM_PUBLIC_READ
|
93
|
+
end
|
94
|
+
def publicWrite
|
95
|
+
@perm & PERM_PUBLIC_WRITE
|
96
|
+
end
|
97
|
+
def type=(val)
|
98
|
+
@type=val
|
99
|
+
end
|
100
|
+
def type
|
101
|
+
return @type.pack('U*')
|
102
|
+
end
|
103
|
+
def data=(val)
|
104
|
+
@data=val
|
105
|
+
end
|
106
|
+
def data
|
107
|
+
@data.pack('U*')
|
108
|
+
end
|
109
|
+
def refs=(val)
|
110
|
+
@refs = val
|
111
|
+
end
|
112
|
+
def to_s
|
113
|
+
if (type == "HS_ADMIN")
|
114
|
+
return "admin handle data: ttl= " + fromBytes(@ttl).to_s + " ; ttlType= " + @ttlType.to_s + "; index = " + index.to_s + "; " + decodeAdminData(@data).to_s + "; permissions = " + @perm.to_s
|
115
|
+
end
|
116
|
+
return "type: " + type + "; index=" + index.to_s + "; data.length: " + @data.length.to_s + " ; data: " + data + "; data(hex): " + @data.collect { |element| "%02x" % element }.join+ "; permissions = " + @perm.to_s
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
@@ -10,6 +10,7 @@ module Cul
|
|
10
10
|
self.returnRequestDigest=(true)
|
11
11
|
@handle = toProtocolString(handle)
|
12
12
|
@values = []
|
13
|
+
@opCode = asBytes(Hdl::OC_MODIFY_VALUE)
|
13
14
|
end
|
14
15
|
def addURLValue(urlValue)
|
15
16
|
# serialize handle value
|
@@ -45,46 +46,5 @@ module Cul
|
|
45
46
|
@body = result
|
46
47
|
end
|
47
48
|
end
|
48
|
-
class CreateHandleRequest < HandleValueRequest
|
49
|
-
def initialize(handle)
|
50
|
-
super(handle)
|
51
|
-
@opCode = asBytes(Hdl::OC_CREATE_HANDLE)
|
52
|
-
end
|
53
|
-
def valid?
|
54
|
-
if not @handle
|
55
|
-
return false
|
56
|
-
end
|
57
|
-
@values.each { |value|
|
58
|
-
if value.type == "HS_ADMIN"
|
59
|
-
return true
|
60
|
-
end
|
61
|
-
}
|
62
|
-
return false
|
63
|
-
end
|
64
|
-
end
|
65
|
-
class AddValueRequest < HandleValueRequest
|
66
|
-
def initialize(handle)
|
67
|
-
super(handle)
|
68
|
-
@opCode = asBytes(Hdl::OC_ADD_VALUE)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
class ModifyValueRequest < HandleValueRequest
|
72
|
-
def initialize(handle)
|
73
|
-
super(handle)
|
74
|
-
@opCode = asBytes(Hdl::OC_MODIFY_VALUE)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
class DeleteValueRequest < HandleValueRequest
|
78
|
-
def initialize(handle)
|
79
|
-
super(handle)
|
80
|
-
@opCode = asBytes(Hdl::OC_REMOVE_VALUE)
|
81
|
-
end
|
82
|
-
def addAdminValue(adminHandle, permissions, index)
|
83
|
-
if (index.eql?(100))
|
84
|
-
raise "Deleting the admin value would leave the handle without an administrator; Use modify value instead."
|
85
|
-
end
|
86
|
-
super(adminHandle, permissions, index)
|
87
|
-
end
|
88
|
-
end
|
89
49
|
end
|
90
50
|
end
|
data/lib/cul/handles/hdl.rb
CHANGED
@@ -181,7 +181,7 @@ module Cul
|
|
181
181
|
length = fromBytes(data[offset...offset+4])
|
182
182
|
pstring = ""
|
183
183
|
if length > 0
|
184
|
-
pstring = data[offset+4...offset+4+length].pack('C*')
|
184
|
+
pstring = data[offset+4...offset+4+length].pack('C*').unpack('U*').pack('U*')
|
185
185
|
octetsRead = octetsRead + length
|
186
186
|
end
|
187
187
|
return [octetsRead,pstring]
|
@@ -44,125 +44,6 @@ module Cul
|
|
44
44
|
}
|
45
45
|
return nil
|
46
46
|
end
|
47
|
-
end
|
48
|
-
class HandleValue
|
49
|
-
include Hdl
|
50
|
-
PERM_ADMIN_READ = 0x8
|
51
|
-
PERM_ADMIN_WRITE = 0x4
|
52
|
-
PERM_PUBLIC_READ = 0x2
|
53
|
-
PERM_PUBLIC_WRITE = 0x1
|
54
|
-
TTL_TYPE_RELATIVE = 0
|
55
|
-
TTL_TYPE_ABSOLUTE = 1
|
56
|
-
MAX_RECOGNIZED_TTL = 86400*2 # 2 days
|
57
|
-
def initialize(data=[],handle="")
|
58
|
-
super()
|
59
|
-
@handle=handle
|
60
|
-
@refs = []
|
61
|
-
@data = []
|
62
|
-
@type = []
|
63
|
-
@perm = 14 # admin r/w; public r
|
64
|
-
@ttlType = TTL_TYPE_RELATIVE # default
|
65
|
-
@ttl = asBytes(86400) # default is 86400 seconds = 1440 minutes = 24 hours
|
66
|
-
@timestamp = asBytes(Time.new().to_i) # number of seconds since computing era
|
67
|
-
deserialize(data) unless data.length == 0
|
68
|
-
end
|
69
|
-
def deserialize(data)
|
70
|
-
@index = data[0..3]
|
71
|
-
@timestamp = data[4..7]
|
72
|
-
@ttlType = data[8]
|
73
|
-
@ttl = data[9..12]
|
74
|
-
@perm = data[13]
|
75
|
-
typeLen = fromBytes(data[14..17])
|
76
|
-
offset = 18
|
77
|
-
@type = data[18...18+typeLen]
|
78
|
-
offset = offset + typeLen
|
79
|
-
dataLen = fromBytes(data[offset...offset+4])
|
80
|
-
offset = offset + 4
|
81
|
-
@data = data[offset...offset+dataLen]
|
82
|
-
offset = offset + dataLen
|
83
|
-
refsLen = fromBytes(data[offset...offset+4])
|
84
|
-
offset = offset + 4
|
85
|
-
@refs = []
|
86
|
-
(1..refsLen).each{
|
87
|
-
@refs.push(fromBytes(data[offset...offset+4]))
|
88
|
-
offset = offset + 4
|
89
|
-
}
|
90
|
-
end
|
91
|
-
def serialize()
|
92
|
-
result = [].concat(@index)
|
93
|
-
result.concat(@timestamp)
|
94
|
-
result.concat([@ttlType])
|
95
|
-
result.concat(@ttl)
|
96
|
-
result.concat([@perm])
|
97
|
-
result.concat(asBytes(@type.length))
|
98
|
-
result.concat(@type)
|
99
|
-
result.concat(asBytes(@data.length))
|
100
|
-
result.concat(@data)
|
101
|
-
result.concat(asBytes(@refs.length))
|
102
|
-
if(@refs.length > 0)
|
103
|
-
@refs.each{ | ref|
|
104
|
-
result.concat(asBytes(ref))
|
105
|
-
}
|
106
|
-
end
|
107
|
-
return result
|
108
|
-
end
|
109
|
-
def handle
|
110
|
-
@handle
|
111
|
-
end
|
112
|
-
def index=(val)
|
113
|
-
@index= val
|
114
|
-
end
|
115
|
-
def index
|
116
|
-
fromBytes(@index)
|
117
|
-
end
|
118
|
-
def timestamp=(val)
|
119
|
-
@timestamp=val
|
120
|
-
end
|
121
|
-
def ttlType=(val)
|
122
|
-
@ttlType = val
|
123
|
-
end
|
124
|
-
def ttl=(val)
|
125
|
-
@ttl = val
|
126
|
-
end
|
127
|
-
def perm=(val)
|
128
|
-
@perm = val
|
129
|
-
end
|
130
|
-
def adminRead
|
131
|
-
@perm & PERM_ADMIN_READ
|
132
|
-
end
|
133
|
-
def adminWrite
|
134
|
-
@perm & PERM_ADMIN_WRITE
|
135
|
-
end
|
136
|
-
def publicRead
|
137
|
-
@perm & PERM_PUBLIC_READ
|
138
|
-
end
|
139
|
-
def publicWrite
|
140
|
-
@perm & PERM_PUBLIC_WRITE
|
141
|
-
end
|
142
|
-
def type=(val)
|
143
|
-
@type=val
|
144
|
-
end
|
145
|
-
def type
|
146
|
-
return @type.pack('U*')
|
147
|
-
end
|
148
|
-
def data=(val)
|
149
|
-
@data=val
|
150
|
-
end
|
151
|
-
def data
|
152
|
-
@data.pack('U*')
|
153
|
-
end
|
154
|
-
def refs=(val)
|
155
|
-
@refs = val
|
156
|
-
end
|
157
|
-
def to_s
|
158
|
-
if (type == "HS_ADMIN")
|
159
|
-
return "admin handle data: ttl= " + fromBytes(@ttl).to_s + " ; ttlType= " + @ttlType.to_s + "; index = " + index.to_s + "; " + decodeAdminData(@data).to_s + "; permissions = " + @perm.to_s
|
160
|
-
end
|
161
|
-
return "type: " + type + "; index=" + index.to_s + "; data.length: " + @data.length.to_s + " ; data: " + data + "; data(hex): " + @data.collect { |element| "%02x" % element }.join+ "; permissions = " + @perm.to_s
|
162
|
-
end
|
163
|
-
|
164
|
-
|
165
|
-
|
166
47
|
end
|
167
48
|
end
|
168
49
|
end
|
@@ -64,63 +64,7 @@ module Cul
|
|
64
64
|
end
|
65
65
|
def credentialDigestAlg()
|
66
66
|
return []
|
67
|
-
end
|
68
|
-
|
69
|
-
end
|
70
|
-
class DH
|
71
|
-
include Hdl
|
72
|
-
attr_reader :prime, :generator, :maxrand, :publickey
|
73
|
-
# def DH.miller_rabin(a, n)
|
74
|
-
#
|
75
|
-
# end
|
76
|
-
# def DH.prime
|
77
|
-
#
|
78
|
-
# end
|
79
|
-
def DH.mod_exp start, e, m
|
80
|
-
result = 1
|
81
|
-
b = start
|
82
|
-
while e > 0
|
83
|
-
result = (result * b) % m if e[0] == 1
|
84
|
-
e = e >> 1
|
85
|
-
b = (b*b) %m
|
86
|
-
end
|
87
|
-
return result
|
88
|
-
end
|
89
|
-
def initialize(prime, generator, maxrand)
|
90
|
-
@prime = prime
|
91
|
-
@generator = generator
|
92
|
-
@maxrand = maxrand
|
93
|
-
@publickey = 0 #public key
|
94
|
-
@key = 0 #shared secret
|
95
|
-
@private = 0 #private key
|
96
|
-
end
|
97
|
-
def generate tries=16 # shared key
|
98
|
-
tries.times do
|
99
|
-
@private = rand(@maxrand)
|
100
|
-
@publickey = DH.mod_exp(@generator, @private, @prime)
|
101
|
-
return @publickey if self.valid?
|
102
|
-
end
|
103
|
-
end
|
104
|
-
def secret f # private key
|
105
|
-
@key = DH.mod_exp(f,@private,@prime)
|
106
|
-
@key
|
107
|
-
end
|
108
|
-
def valid? _e = self.publickey
|
109
|
-
_e and _e.between?(2,self.prime-2) and _e != 0
|
110
|
-
end
|
111
|
-
def encodeKeyParms
|
112
|
-
result = []
|
113
|
-
publicBytes = asBytes(@publickey)
|
114
|
-
result.concat(asBytes(publicBytes.length))
|
115
|
-
result.concat(publicBytes)
|
116
|
-
primeBytes = asBytes(@prime)
|
117
|
-
result.concat(asBytes(primeBytes.length))
|
118
|
-
result.concat(primeBytes)
|
119
|
-
genBytes = asBytes(@generator)
|
120
|
-
result.concat(asBytes(genBytes.length))
|
121
|
-
result.concat(genBytes)
|
122
|
-
result
|
123
|
-
end
|
67
|
+
end
|
124
68
|
end
|
125
69
|
end
|
126
70
|
end
|
File without changes
|
File without changes
|
data/test/test_helper.rb
CHANGED
@@ -3,6 +3,13 @@ require 'test/unit'
|
|
3
3
|
require 'shoulda'
|
4
4
|
require 'yaml'
|
5
5
|
|
6
|
+
require 'simplecov'
|
7
|
+
SimpleCov.start do
|
8
|
+
coverage_dir 'tmp/coverage'
|
9
|
+
add_group "Library", "lib"
|
10
|
+
add_filter "test"
|
11
|
+
end
|
12
|
+
|
6
13
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
7
14
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
8
15
|
|
@@ -10,4 +17,4 @@ require 'cul-handles'
|
|
10
17
|
|
11
18
|
class Test::Unit::TestCase
|
12
19
|
|
13
|
-
end
|
20
|
+
end
|
metadata
CHANGED
@@ -1,45 +1,86 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: cul-handles
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
|
-
authors:
|
6
|
+
authors:
|
7
7
|
- James Stuart
|
8
|
+
- Ben Armintor
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
date: 2009-11-11 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :development
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
16
29
|
name: thoughtbot-shoulda
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: test-unit
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: simplecov-rcov
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
17
63
|
type: :development
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
-
requirements:
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
21
67
|
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version:
|
24
|
-
version:
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
25
70
|
description: Columbia client to deal with handle server
|
26
|
-
email: tastyhat@jamesstuart.org
|
71
|
+
email: tastyhat@jamesstuart.org armintor@gmail.com
|
27
72
|
executables: []
|
28
|
-
|
29
73
|
extensions: []
|
30
|
-
|
31
|
-
extra_rdoc_files:
|
74
|
+
extra_rdoc_files:
|
32
75
|
- LICENSE
|
33
76
|
- README.rdoc
|
34
|
-
files:
|
35
|
-
- .document
|
36
|
-
- .gitignore
|
77
|
+
files:
|
37
78
|
- LICENSE
|
38
79
|
- README.rdoc
|
39
80
|
- Rakefile
|
40
81
|
- VERSION
|
41
|
-
- cul-handles.gemspec
|
42
82
|
- lib/cul-handles.rb
|
83
|
+
- lib/cul/handles/add_value_request.rb
|
43
84
|
- lib/cul/handles/base_message.rb
|
44
85
|
- lib/cul/handles/base_request.rb
|
45
86
|
- lib/cul/handles/base_response.rb
|
@@ -49,52 +90,50 @@ files:
|
|
49
90
|
- lib/cul/handles/create_handle_request.rb
|
50
91
|
- lib/cul/handles/delete_handle_request.rb
|
51
92
|
- lib/cul/handles/delete_value_request.rb
|
93
|
+
- lib/cul/handles/dh.rb
|
94
|
+
- lib/cul/handles/handle_value.rb
|
52
95
|
- lib/cul/handles/handle_value_request.rb
|
53
96
|
- lib/cul/handles/hdl.rb
|
54
97
|
- lib/cul/handles/modify_value_request.rb
|
55
98
|
- lib/cul/handles/resolution_request.rb
|
56
99
|
- lib/cul/handles/resolution_response.rb
|
57
|
-
- lib/cul/handles/
|
100
|
+
- lib/cul/handles/session_setup_request.rb
|
58
101
|
- lib/cul/handles/session_setup_response.rb
|
59
102
|
- lib/cul/handles/set_value_request.rb
|
60
|
-
- test/authn_test.rb
|
61
103
|
- test/cul-handles_test.rb
|
62
|
-
- test/
|
63
|
-
- test/resolution_test.rb
|
104
|
+
- test/system/authn_test.rb
|
105
|
+
- test/system/resolution_test.rb
|
64
106
|
- test/test_helper.rb
|
65
|
-
- test/
|
66
|
-
|
67
|
-
homepage: http://github.com/
|
107
|
+
- test/unit/dh_test.rb
|
108
|
+
- test/unit/unsigned_integer_test.rb
|
109
|
+
homepage: http://github.com/cul/cul-handles
|
68
110
|
licenses: []
|
69
|
-
|
111
|
+
metadata: {}
|
70
112
|
post_install_message:
|
71
|
-
rdoc_options:
|
72
|
-
- --charset=UTF-8
|
73
|
-
require_paths:
|
113
|
+
rdoc_options:
|
114
|
+
- "--charset=UTF-8"
|
115
|
+
require_paths:
|
74
116
|
- lib
|
75
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
-
requirements:
|
117
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
77
119
|
- - ">="
|
78
|
-
- !ruby/object:Gem::Version
|
79
|
-
version:
|
80
|
-
|
81
|
-
|
82
|
-
requirements:
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0'
|
122
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
83
124
|
- - ">="
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
version:
|
86
|
-
version:
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
87
127
|
requirements: []
|
88
|
-
|
89
128
|
rubyforge_project:
|
90
|
-
rubygems_version:
|
129
|
+
rubygems_version: 2.4.6
|
91
130
|
signing_key:
|
92
|
-
specification_version:
|
131
|
+
specification_version: 4
|
93
132
|
summary: CUL Handle Client
|
94
|
-
test_files:
|
95
|
-
- test/authn_test.rb
|
133
|
+
test_files:
|
96
134
|
- test/cul-handles_test.rb
|
97
|
-
- test/
|
98
|
-
- test/resolution_test.rb
|
135
|
+
- test/system/authn_test.rb
|
136
|
+
- test/system/resolution_test.rb
|
99
137
|
- test/test_helper.rb
|
100
|
-
- test/
|
138
|
+
- test/unit/dh_test.rb
|
139
|
+
- test/unit/unsigned_integer_test.rb
|
data/.document
DELETED
data/.gitignore
DELETED
data/cul-handles.gemspec
DELETED
@@ -1,79 +0,0 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
-
# -*- encoding: utf-8 -*-
|
5
|
-
|
6
|
-
Gem::Specification.new do |s|
|
7
|
-
s.name = %q{cul-handles}
|
8
|
-
s.version = "0.2.0"
|
9
|
-
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["James Stuart"]
|
12
|
-
s.date = %q{2009-11-11}
|
13
|
-
s.description = %q{Columbia client to deal with handle server}
|
14
|
-
s.email = %q{tastyhat@jamesstuart.org}
|
15
|
-
s.extra_rdoc_files = [
|
16
|
-
"LICENSE",
|
17
|
-
"README.rdoc"
|
18
|
-
]
|
19
|
-
s.files = [
|
20
|
-
".document",
|
21
|
-
".gitignore",
|
22
|
-
"LICENSE",
|
23
|
-
"README.rdoc",
|
24
|
-
"Rakefile",
|
25
|
-
"VERSION",
|
26
|
-
"cul-handles.gemspec",
|
27
|
-
"lib/cul-handles.rb",
|
28
|
-
"lib/cul/handles/base_message.rb",
|
29
|
-
"lib/cul/handles/base_request.rb",
|
30
|
-
"lib/cul/handles/base_response.rb",
|
31
|
-
"lib/cul/handles/challenge_answer_request.rb",
|
32
|
-
"lib/cul/handles/challenge_response.rb",
|
33
|
-
"lib/cul/handles/client.rb",
|
34
|
-
"lib/cul/handles/create_handle_request.rb",
|
35
|
-
"lib/cul/handles/delete_handle_request.rb",
|
36
|
-
"lib/cul/handles/delete_value_request.rb",
|
37
|
-
"lib/cul/handles/handle_value_request.rb",
|
38
|
-
"lib/cul/handles/hdl.rb",
|
39
|
-
"lib/cul/handles/modify_value_request.rb",
|
40
|
-
"lib/cul/handles/resolution_request.rb",
|
41
|
-
"lib/cul/handles/resolution_response.rb",
|
42
|
-
"lib/cul/handles/session_request.rb",
|
43
|
-
"lib/cul/handles/session_setup_response.rb",
|
44
|
-
"lib/cul/handles/set_value_request.rb",
|
45
|
-
"test/authn_test.rb",
|
46
|
-
"test/cul-handles_test.rb",
|
47
|
-
"test/dh_test.rb",
|
48
|
-
"test/resolution_test.rb",
|
49
|
-
"test/test_helper.rb",
|
50
|
-
"test/unsigned_integer_test.rb"
|
51
|
-
]
|
52
|
-
s.homepage = %q{http://github.com/tastyhat/cul-handles}
|
53
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
54
|
-
s.require_paths = ["lib"]
|
55
|
-
s.rubygems_version = %q{1.3.5}
|
56
|
-
s.summary = %q{CUL Handle Client}
|
57
|
-
s.test_files = [
|
58
|
-
"test/authn_test.rb",
|
59
|
-
"test/cul-handles_test.rb",
|
60
|
-
"test/dh_test.rb",
|
61
|
-
"test/resolution_test.rb",
|
62
|
-
"test/test_helper.rb",
|
63
|
-
"test/unsigned_integer_test.rb"
|
64
|
-
]
|
65
|
-
|
66
|
-
if s.respond_to? :specification_version then
|
67
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
68
|
-
s.specification_version = 3
|
69
|
-
|
70
|
-
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
71
|
-
s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
72
|
-
else
|
73
|
-
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
74
|
-
end
|
75
|
-
else
|
76
|
-
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|