1 var widgets = require("sdk/widget");
2 var tabs = require("sdk/tabs");
4 const {Cu} = require("chrome");
6 function myDump(message) {
8 dump("**********************************************************************\n");
9 dump("**********************************************************************\n");
10 dump("** " + message + " **\n");
11 dump("**********************************************************************\n");
12 dump("**********************************************************************\n");
15 myDump("About to load ctypes");
16 Cu.import("resource://gre/modules/ctypes.jsm");
18 /************************
20 ************************/
21 const gss_buffer_t_struct = ctypes.StructType(
24 {"length": ctypes.size_t},
25 {"value": ctypes.void_t.ptr}
28 const gss_buffer_t = ctypes.PointerType(gss_buffer_t_struct);
29 const gss_OID_struct = ctypes.StructType(
32 {"length" : ctypes.uint32_t},
33 {"elements" : ctypes.voidptr_t}
36 const gss_OID = ctypes.PointerType(gss_OID_struct);
37 const gss_name_t = ctypes.StructType("gss_name_t");
39 const gss_cred_id_struct = ctypes.StructType("gss_cred_id_struct");
40 const gss_cred_id_t = ctypes.PointerType(gss_cred_id_struct);
42 const gss_ctx_id_struct = ctypes.StructType("gss_ctx_id_struct");
43 const gss_ctx_id_t = ctypes.PointerType(gss_ctx_id_struct);
45 const gss_channel_bindings_struct = ctypes.StructType(
46 "gss_channel_bindings_struct",
48 {"initiator_addrtype": ctypes.uint32_t},
49 {"initiator_address": gss_buffer_t_struct},
50 {"acceptor_addrtype": ctypes.uint32_t},
51 {"acceptor_address": gss_buffer_t_struct},
52 {"application_data": gss_buffer_t_struct}
55 const gss_channel_bindings_t = ctypes.PointerType(gss_channel_bindings_struct);
57 const gss_status_struct = ctypes.StructType(
60 {"major": ctypes.uint32_t},
61 {"minor": ctypes.uint32_t}
64 const gss_status_t = ctypes.PointerType(gss_status_struct);
67 /**********************
69 **********************/
70 function generate_gss_buffer(buff) {
71 myDump("Generate a gss_buffer_t for (" + buff + ")");
73 var buffString = ctypes.char.array()(buff);
75 var gss_buffer = new gss_buffer_t_struct();
76 gss_buffer.length = new ctypes.size_t(buff.length);
77 gss_buffer.value = buffString.address();
79 myDump("Returning the buffer_t");
83 //"1.3.6.1.5.5.2" - spnego
84 //"1.2.840.113554.1.2.1.4" - nt hostservice
86 function str_to_oid(oid_str)
88 var buffer = generate_gss_buffer(oid_str);
89 var oid = new gss_OID_struct();
90 var oid_ptr = oid.address();
91 minStatus = new ctypes.uint32_t(0);
94 myDump("Abotut to str_to_oid: " + oid_str);
95 majStatus = gss_str_to_oid(
99 myDump("Finished the str_to_oid: " + majStatus + "/" + minStatus);
101 myDump(" returned oid: [ length: " + oid_ptr.contents.length + " ]");
103 return(oid_ptr.contents);
106 function import_name(name)
108 myDump("Entering import_name(" + name + ")");
109 var name_buffer = generate_gss_buffer(name);
110 var input_name_type = new gss_OID();
111 var oid = str_to_oid("1.2.840.113554.1.2.1.4");
112 /* GSS_C_NT_HOSTBASED_SERVICE */
113 var output_name_ptr = gss_name_t.ptr(ctypes.UInt64("0x0"));
114 var minor = new ctypes.uint32_t(0);
117 var printable = new gss_buffer_t_struct();
118 var printtype = new gss_OID();
120 major = gss_import_name(
122 name_buffer.address(),
124 output_name_ptr.address()
126 myDump("Finished the gss_import_name: " + major + "/" + minor);
128 major = gss_display_name(
134 myDump("Display name: [ length: " + printable.length +
135 " value: " + printable.value + " ]");
136 myDump("Display name type: [ length: " + printtype.length + " ]");
138 return(output_name_ptr);
146 libkrb5 = ctypes.open("libgssapi_krb5.so");
147 libgss_utils = ctypes.open("libgssapi_utils.so");
150 myDump("Could not open utils: " + e);
151 libkrb5 = ctypes.open("libgss.dll");
152 libgss_utils = ctypes.open("libgssapi_utils.dll");
155 myDump("libkrb5 return value: " + libkrb5);
156 myDump("libgss_utils return value: " + libgss_utils);
158 myDump("ctypes.open");
160 /**************************************************************
161 ** Function definitions
162 **************************************************************/
163 const gss_str_to_oid = libkrb5.declare("gss_str_to_oid",
165 ctypes.uint32_t, /* Return value */
166 ctypes.uint32_t.ptr, /* arg: minor_status */
167 gss_buffer_t, /* arg: oid_str */
168 gss_OID.ptr); /* arg: oid */
169 myDump("gss_str_to_oid function is " + gss_str_to_oid);
171 const gss_display_name = libkrb5.declare("gss_display_name",
173 ctypes.uint32_t, /* Return value */
174 ctypes.uint32_t.ptr, /* arg: minor_status */
175 gss_name_t.ptr, /* arg: input_name */
176 gss_buffer_t, /* arg: output_name_buffer */
177 gss_OID.ptr); /* arg: ouptut_name_type */
178 myDump("gss_str_to_oid function is " + gss_str_to_oid);
180 const gss_import_name = libkrb5.declare("gss_import_name",
182 ctypes.uint32_t, /* Return value */
183 ctypes.uint32_t.ptr, /* arg: minor status */
184 gss_buffer_t, /* arg: input_name_buffer */
185 gss_OID, /* arg: input_name_type */
186 ctypes.PointerType(gss_name_t).ptr ); /* arg: output_name */
187 myDump("gss_import_name is function is " + gss_import_name);
189 const gss_init_sec_context = libkrb5.declare("gss_init_sec_context",
191 ctypes.uint32_t, /* Return value */
192 ctypes.uint32_t.ptr, /* arg: minor status */
193 gss_cred_id_t, /* arg: claimant_cred_handle */
194 gss_ctx_id_t.ptr, /* arg: context_handle */
195 gss_name_t.ptr, /* arg: target_name */
196 gss_OID, /* arg: mech_type */
197 ctypes.uint32_t, /* arg: req_flags */
198 ctypes.uint32_t, /* arg: time_req */
199 gss_channel_bindings_t, /* arg: channel_bindings, reserved for future use */
200 gss_buffer_t, /* arg: input_token */
201 gss_OID.ptr, /* arg: actual_mech_type */
202 gss_buffer_t, /* arg: output_token */
203 ctypes.uint32_t.ptr, /* arg: ret_flags */
204 ctypes.uint32_t.ptr /* arg: time_rec */
206 myDump("gss_init_sec_context function is " + gss_init_sec_context);
208 const gss_construct_sec_context = libgss_utils.declare(
209 "gss_construct_sec_context",
211 ctypes.uint32_t, /* Return value - boolean */
212 gss_status_t, /* arg: Status struct pointer */
213 gss_cred_id_t, /* arg: claimant_cred_handle - reserved for future */
214 gss_ctx_id_t.ptr, /* arg: context_handle, the output of the function */
215 gss_name_t.ptr, /* arg: target_name - the other endpoint */
216 gss_OID, /* arg: mech_type - the desired mechanism type */
217 ctypes.uint32_t, /* arg: req_flags */
218 ctypes.uint32_t, /* arg: time_req */
219 gss_channel_bindings_t /* arg: input_chan_bindings - reserved for future use */
224 var majStatus, minStatus, output_name_ptr;
225 minStatus = new ctypes.uint32_t(0);
227 output_name_ptr = import_name('http@www.project-moonshot.org/PROJECT-MOONSHOT.ORG');
229 var cred_handle = gss_cred_id_struct.ptr(ctypes.UInt64("0x0"));
230 var context_handle = gss_ctx_id_struct.ptr(ctypes.UInt64("0x0"));
231 var GSS_C_NO_OID = gss_OID_struct().address();
232 var null_mechanism = gss_OID_struct.ptr(ctypes.UInt64("0x0"));
233 var channel_bindings = new gss_channel_bindings_struct();
234 var input_token = new gss_buffer_t_struct();
235 var actual_mech_type = gss_OID();
236 var output_token = new gss_buffer_t_struct();
237 var ret_flags = new ctypes.uint32_t(0);
238 var time_rec = new ctypes.uint32_t(0);
239 var status = new gss_status_struct();
241 var success = gss_construct_sec_context(
244 context_handle.address(),
247 ctypes.uint32_t(0), /* req_flags */
248 ctypes.uint32_t(0), /* time_req */
249 channel_bindings.address()
252 myDump("gss_construct_sec_context call: " + success +
253 " [0x" + status.major.toString(16) + "/" + status.minor + "]");
258 majStatus = gss_init_sec_context(
261 context_handle.address(),
263 GSS_C_NO_OID, /* Default OID * /
264 ctypes.uint32_t(0), /* req_flags * /
265 ctypes.uint32_t(0), /* time_req * /
266 channel_bindings.address(),
267 input_token.address(),
268 actual_mech_type.address(),
269 output_token.address(),
273 myDump("Finished the init_sec_context: " + majStatus + "/" + minStatus);
274 myDump(": " + output_name_ptr);
277 } while ((majStatus & 1) == 1)
280 myDump("All calls succeeded");
288 myDump("Caught exception: " + e);