gssapi 0.1.4 → 0.1.5
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/VERSION +1 -1
- data/lib/gssapi/lib_gssapi.rb +75 -41
- data/lib/gssapi/simple.rb +9 -12
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.5
|
data/lib/gssapi/lib_gssapi.rb
CHANGED
@@ -48,6 +48,7 @@ module GSSAPI
|
|
48
48
|
|
49
49
|
typedef :uint32, :OM_uint32
|
50
50
|
|
51
|
+
|
51
52
|
class GssOID < FFI::Struct
|
52
53
|
layout :length => :OM_uint32,
|
53
54
|
:elements => :pointer # pointer of :void
|
@@ -57,7 +58,6 @@ module GSSAPI
|
|
57
58
|
end
|
58
59
|
end
|
59
60
|
|
60
|
-
|
61
61
|
# This is a generic Managed Struct subclass that hides the [] methods.
|
62
62
|
# Classes that implement this class should provide accessor methods to get to the attributes.
|
63
63
|
class GssMStruct < FFI::ManagedStruct
|
@@ -72,14 +72,53 @@ module GSSAPI
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
+
# This is a generic Unmanaged Struct subclass that hides the [] methods.
|
76
|
+
# Classes that implement this class should provide accessor methods to get to the attributes.
|
77
|
+
class GssUMStruct < FFI::Struct
|
78
|
+
private
|
79
|
+
|
80
|
+
def [](key)
|
81
|
+
super(key)
|
82
|
+
end
|
83
|
+
|
84
|
+
def []=(key,val)
|
85
|
+
super(key,val)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# This module provides a layout for both the managed and unmanaged GssBufferDesc structs.
|
90
|
+
module GssBufferDescLayout
|
91
|
+
def self.included(base)
|
92
|
+
base.class_eval do
|
93
|
+
layout :length => :size_t,
|
94
|
+
:value => :pointer # pointer of :void
|
95
|
+
|
96
|
+
def length
|
97
|
+
self[:length]
|
98
|
+
end
|
99
|
+
|
100
|
+
def value
|
101
|
+
if(self[:length] == 0)
|
102
|
+
nil
|
103
|
+
else
|
104
|
+
self[:value].read_string(self[:length])
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
75
111
|
# This class implements the gss_buffer_desc type. Use #pointer to emulate gss_buffer_t
|
112
|
+
# If you are setting the value of the buffer and it is not being set from the function
|
113
|
+
# this is the type of buffer you should use. If the buffer is being allocated and set
|
114
|
+
# inside the function you should use a ManagedGssBufferDesc instead so gss_release_buffer
|
115
|
+
# is called for it. It states in the manpage for each gss function whether or not
|
116
|
+
# gss_release_buffer needs to be called or not.
|
76
117
|
# @example
|
77
|
-
# buff =
|
118
|
+
# buff = UnManagedGssBufferDesc.new
|
78
119
|
# buff.value = "This is a test"
|
79
|
-
class
|
80
|
-
|
81
|
-
:value => :pointer # pointer of :void
|
82
|
-
|
120
|
+
class UnManagedGssBufferDesc < GssUMStruct
|
121
|
+
include GssBufferDescLayout
|
83
122
|
def initialize(ptr = nil)
|
84
123
|
if(ptr.nil?)
|
85
124
|
super(FFI::Pointer.new(FFI::MemoryPointer.new(self.size)))
|
@@ -95,41 +134,38 @@ module GSSAPI
|
|
95
134
|
self[:length] = 0
|
96
135
|
self[:value] = val
|
97
136
|
elsif(val.is_a?(String))
|
98
|
-
|
99
|
-
buff = LibGSSAPI.malloc(rbuff.size)
|
100
|
-
LibGSSAPI.memcpy(buff,rbuff,rbuff.size)
|
137
|
+
buff = FFI::MemoryPointer.from_string(val)
|
101
138
|
self[:length] = val.length
|
102
139
|
self[:value] = buff
|
103
140
|
elsif(val.is_a?(Fixnum))
|
104
|
-
|
105
|
-
buff
|
106
|
-
LibGSSAPI.memcpy(buff,rbuff,rbuff.size)
|
141
|
+
buff = FFI::MemoryPointer.new :uint32
|
142
|
+
buff.write_int val
|
107
143
|
self[:length] = val.to_s.length
|
108
144
|
self[:value] = buff
|
109
145
|
else
|
110
146
|
raise StandardError, "Can't handle type #{val.class.name}"
|
111
147
|
end
|
112
148
|
end
|
149
|
+
end
|
113
150
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
151
|
+
# This class implements the gss_buffer_desc type. Use #pointer to emulate gss_buffer_t
|
152
|
+
# Only functions that need to call gss_release_buffer should use this type. It states
|
153
|
+
# in the manpage for each function whether or not it should be called. If it does not
|
154
|
+
# you should be using UnManagedGssBufferDesc instead.
|
155
|
+
class ManagedGssBufferDesc < GssMStruct
|
156
|
+
include GssBufferDescLayout
|
157
|
+
def initialize(ptr = nil)
|
158
|
+
if(ptr.nil?)
|
159
|
+
super(FFI::Pointer.new(FFI::MemoryPointer.new(self.size)))
|
121
160
|
else
|
122
|
-
|
161
|
+
super(ptr)
|
123
162
|
end
|
124
163
|
end
|
125
164
|
|
126
165
|
def self.release(ptr)
|
127
|
-
puts "
|
128
|
-
|
129
|
-
|
130
|
-
# this is a horrible fix, but most instances should be fairly short lived so it's all
|
131
|
-
# I got right now.
|
132
|
-
#maj_stat = LibGSSAPI.gss_release_buffer(min_stat, ptr)
|
166
|
+
puts "Releasing ManagedGssBufferDesc at #{ptr.address.to_s(16)}" if $DEBUG
|
167
|
+
min_stat = FFI::MemoryPointer.new :uint32
|
168
|
+
maj_stat = LibGSSAPI.gss_release_buffer(min_stat, ptr)
|
133
169
|
end
|
134
170
|
end
|
135
171
|
|
@@ -141,20 +177,18 @@ module GSSAPI
|
|
141
177
|
# iov_buff[:buffer][:value] = str
|
142
178
|
class GssIOVBufferDesc < FFI::Struct
|
143
179
|
layout :type => :OM_uint32,
|
144
|
-
:buffer =>
|
180
|
+
:buffer => UnManagedGssBufferDesc
|
145
181
|
end
|
146
|
-
|
182
|
+
|
147
183
|
class GssChannelBindingsStruct < FFI::Struct
|
148
184
|
layout :initiator_addrtype => :OM_uint32,
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
185
|
+
:initiator_address => UnManagedGssBufferDesc,
|
186
|
+
:acceptor_addrtype => :OM_uint32,
|
187
|
+
:acceptor_address => UnManagedGssBufferDesc,
|
188
|
+
:application_data => UnManagedGssBufferDesc
|
153
189
|
|
154
190
|
no_chn_bind = FFI::MemoryPointer.new :pointer #
|
155
|
-
|
156
|
-
|
157
|
-
|
191
|
+
no_chn_bind.write_int 0
|
158
192
|
end
|
159
193
|
|
160
194
|
# This s a generic AutoPointer. Gss pointers that implement this class should also implement a
|
@@ -188,7 +222,8 @@ module GSSAPI
|
|
188
222
|
class GssCtxIdT < GssPointer
|
189
223
|
def self.release_ptr(context_ptr)
|
190
224
|
min_stat = FFI::MemoryPointer.new :uint32
|
191
|
-
|
225
|
+
# FIXME: change to GSS_C_NO_BUFFER
|
226
|
+
empty_buff = LibGSSAPI::UnManagedGssBufferDesc.new
|
192
227
|
empty_buff[:length] = 0
|
193
228
|
empty_buff[:value] = nil
|
194
229
|
maj_stat = LibGSSAPI.gss_delete_sec_context(min_stat, context_ptr, empty_buff.pointer)
|
@@ -216,7 +251,7 @@ module GSSAPI
|
|
216
251
|
# OM_uint32 gss_import_name(OM_uint32 * minor_status, const gss_buffer_t input_name_buffer, const gss_OID input_name_type, gss_name_t * output_name);
|
217
252
|
# @example:
|
218
253
|
# host_str = 'host@example.com'
|
219
|
-
# buff_str = GSSAPI::LibGSSAPI::
|
254
|
+
# buff_str = GSSAPI::LibGSSAPI::UnManagedGssBufferDesc.new
|
220
255
|
# buff_str[:length] = host_str.length
|
221
256
|
# buff_str[:value] = FFI::MemoryPointer.from_string(host_str)
|
222
257
|
# name = FFI::MemoryPointer.new :pointer # gss_name_t
|
@@ -235,7 +270,7 @@ module GSSAPI
|
|
235
270
|
# OM_uint32 gss_oid_to_str(OM_uint32 *minor_status, const gss_OID oid, gss_buffer_t oid_str);
|
236
271
|
# @example:
|
237
272
|
# min_stat = FFI::MemoryPointer.new :uint32
|
238
|
-
# oidstr = GSSAPI::LibGSSAPI::
|
273
|
+
# oidstr = GSSAPI::LibGSSAPI::ManagedGssBufferDesc.new
|
239
274
|
# maj_stat = GSSAPI::LibGSSAPI.gss_oid_to_str(min_stat, GSSAPI::LibGSSAPI.GSS_C_NT_HOSTBASED_SERVICE, oidstr.pointer)
|
240
275
|
# oidstr[:value].read_string
|
241
276
|
attach_function :gss_oid_to_str, [:pointer, :pointer, :pointer], :OM_uint32
|
@@ -245,7 +280,7 @@ module GSSAPI
|
|
245
280
|
# @example: Simulate GSS_C_NT_HOSTBASED_SERVICE
|
246
281
|
# min_stat = FFI::MemoryPointer.new :uint32
|
247
282
|
# str = "{ 1 2 840 113554 1 2 1 4 }"
|
248
|
-
# oidstr = GSSAPI::LibGSSAPI::
|
283
|
+
# oidstr = GSSAPI::LibGSSAPI::UnManagedGssBufferDesc.new
|
249
284
|
# oidstr[:length] = str.length
|
250
285
|
# oidstr[:value] = FFI::MemoryPointer.from_string str
|
251
286
|
# oid = FFI::MemoryPointer.new :pointer
|
@@ -419,8 +454,7 @@ module GSSAPI
|
|
419
454
|
GSS_C_NO_CONTEXT = FFI::Pointer.new(:pointer, 0) # ((gss_ctx_id_t) 0)
|
420
455
|
GSS_C_NO_CREDENTIAL = FFI::Pointer.new(:pointer, 0) # ((gss_cred_id_t) 0)
|
421
456
|
GSS_C_NO_CHANNEL_BINDINGS = FFI::Pointer.new(:pointer, 0) # ((gss_channel_bindings_t) 0)
|
422
|
-
GSS_C_EMPTY_BUFFER =
|
423
|
-
|
457
|
+
GSS_C_EMPTY_BUFFER = ManagedGssBufferDesc.new
|
424
458
|
|
425
459
|
end #end LibGSSAPI
|
426
460
|
end #end GSSAPI
|
data/lib/gssapi/simple.rb
CHANGED
@@ -43,7 +43,7 @@ module GSSAPI
|
|
43
43
|
# Convert a String to a GSSAPI usable buffer (gss_buffer_desc)
|
44
44
|
# @param [String] str the string to convert
|
45
45
|
def import_name(str)
|
46
|
-
buff_str = LibGSSAPI::
|
46
|
+
buff_str = LibGSSAPI::UnManagedGssBufferDesc.new
|
47
47
|
buff_str.value = str
|
48
48
|
mech = LibGSSAPI::GssOID.gss_c_no_oid
|
49
49
|
#mech = LibGSSAPI.GSS_C_NT_HOSTBASED_SERVICE
|
@@ -77,10 +77,9 @@ module GSSAPI
|
|
77
77
|
flags |= LibGSSAPI::GSS_C_DELEG_FLAG if opts[:delegate]
|
78
78
|
flags |= LibGSSAPI::GSS_C_DELEG_POLICY_FLAG if opts[:delegate]
|
79
79
|
end
|
80
|
-
in_tok = LibGSSAPI::
|
80
|
+
in_tok = LibGSSAPI::UnManagedGssBufferDesc.new
|
81
81
|
in_tok.value = in_token
|
82
|
-
out_tok = LibGSSAPI::
|
83
|
-
out_tok.value = nil
|
82
|
+
out_tok = LibGSSAPI::ManagedGssBufferDesc.new
|
84
83
|
ret_flags = FFI::MemoryPointer.new :uint32
|
85
84
|
|
86
85
|
|
@@ -117,10 +116,9 @@ module GSSAPI
|
|
117
116
|
no_chn_bind = LibGSSAPI::GSS_C_NO_CHANNEL_BINDINGS
|
118
117
|
client = FFI::MemoryPointer.new :pointer # Will hold the initiating client name after the call
|
119
118
|
mech = FFI::MemoryPointer.new :pointer # Will hold the mech being used after the call
|
120
|
-
in_tok = GSSAPI::LibGSSAPI::
|
119
|
+
in_tok = GSSAPI::LibGSSAPI::UnManagedGssBufferDesc.new
|
121
120
|
in_tok.value = in_token
|
122
|
-
out_tok = GSSAPI::LibGSSAPI::
|
123
|
-
out_tok.value = nil
|
121
|
+
out_tok = GSSAPI::LibGSSAPI::ManagedGssBufferDesc.new
|
124
122
|
ret_flags = FFI::MemoryPointer.new :uint32
|
125
123
|
|
126
124
|
maj_stat = LibGSSAPI.gss_accept_sec_context(min_stat,
|
@@ -177,11 +175,10 @@ module GSSAPI
|
|
177
175
|
min_stat = FFI::MemoryPointer.new :uint32
|
178
176
|
conf_req = (encrypt ? 1 : 0)
|
179
177
|
qop_req = GSSAPI::LibGSSAPI::GSS_C_QOP_DEFAULT
|
180
|
-
in_buff = GSSAPI::LibGSSAPI::
|
178
|
+
in_buff = GSSAPI::LibGSSAPI::UnManagedGssBufferDesc.new
|
181
179
|
in_buff.value = msg
|
182
180
|
conf_state = FFI::MemoryPointer.new :uint32
|
183
|
-
out_buff = GSSAPI::LibGSSAPI::
|
184
|
-
out_buff.value = nil
|
181
|
+
out_buff = GSSAPI::LibGSSAPI::ManagedGssBufferDesc.new
|
185
182
|
maj_stat = GSSAPI::LibGSSAPI.gss_wrap(min_stat, @context, conf_req, qop_req, in_buff.pointer, conf_state, out_buff.pointer)
|
186
183
|
raise GssApiError, "Failed to gss_wrap message. Error code: maj: #{maj_stat}, min: #{min_stat.read_int}" if maj_stat != 0
|
187
184
|
out_buff.value
|
@@ -192,9 +189,9 @@ module GSSAPI
|
|
192
189
|
# @param [Boolean] encrypted Whether or not this message was encrypted (true) or just signed (false)
|
193
190
|
def unwrap_message(msg, encrypted = true)
|
194
191
|
min_stat = FFI::MemoryPointer.new :uint32
|
195
|
-
in_buff = GSSAPI::LibGSSAPI::
|
192
|
+
in_buff = GSSAPI::LibGSSAPI::UnManagedGssBufferDesc.new
|
196
193
|
in_buff.value = msg
|
197
|
-
out_buff = GSSAPI::LibGSSAPI::
|
194
|
+
out_buff = GSSAPI::LibGSSAPI::ManagedGssBufferDesc.new
|
198
195
|
conf_state = FFI::MemoryPointer.new :int
|
199
196
|
conf_state.write_int((encrypted ? 1 : 0))
|
200
197
|
q_op = FFI::MemoryPointer.new :uint32
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: gssapi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1.
|
5
|
+
version: 0.1.5
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Dan Wanek
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-03-
|
13
|
+
date: 2011-03-03 00:00:00 -06:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|