2 * Copyright (c) 2014 <copyright holder> <email>
4 * For license details, see the LICENSE file in the root of this project.
8 #include "GSSCreateSecContextCommand.h"
9 #include "GSSException.h"
10 #include <cache/GSSContextCache.h>
15 typedef OM_uint32 (*init_sec_context)(
16 OM_uint32 *, /* minor_status */
17 gss_cred_id_t, /* claimant_cred_handle */
18 gss_ctx_id_t *, /* context_handle */
19 gss_name_t, /* target_name */
20 gss_OID, /* mech_type (used to be const) */
21 OM_uint32, /* req_flags */
22 OM_uint32, /* time_req */
23 gss_channel_bindings_t, /* input_chan_bindings */
24 gss_buffer_t, /* input_token */
25 gss_OID *, /* actual_mech_type */
26 gss_buffer_t, /* output_token */
27 OM_uint32 *, /* ret_flags */
28 OM_uint32 * /* time_req */
31 /* Helper function - import the OID from a string */
32 static gss_OID str_to_oid(const char *mech_type_str = NULL)
35 gss_buffer_desc gssbuffOID;
36 gss_OID gssoidTargetOID;
41 if (mech_type_str == NULL ||
47 gssbuffOID.value = (void *)(mech_type_str);
48 gssbuffOID.length = strlen(mech_type_str);
49 major = gss_str_to_oid(&minor,
52 if (major != GSS_S_COMPLETE)
53 throw GSSException("Error converting string to OID", major, minor);
58 return gssoidTargetOID;
62 GSSCreateSecContextCommand::execute()
65 init_sec_context fn = (init_sec_context)function;
70 if (output_token.length > 0)
71 retVal = gss_release_buffer(&minor_status, &output_token);
83 GSS_C_NO_CHANNEL_BINDINGS,
90 context.setContext(context_handle, true);
91 contextKey = GSSContextCache::instance()->store(context);
98 const char* GSSCreateSecContextCommand::getTargetDisplayName()
101 gss_buffer_desc output_name;
103 OM_uint32 major, minor;
111 major = gss_display_name(&minor, target_name, &output_name, &output_type);
112 if (major == GSS_S_COMPLETE)
113 ret = (const char *)output_name.value;
123 const char* GSSCreateSecContextCommand::getActualMechType()
125 return(this->oidToStr(this->actual_mech_type));
128 const char* GSSCreateSecContextCommand::getMechType()
130 return(this->oidToStr(this->mech_type));
133 const char* GSSCreateSecContextCommand::oidToStr(gss_OID oid)
135 gss_buffer_desc output;
136 OM_uint32 major, minor;
146 major = gss_oid_to_str(&minor, oid, &output);
147 if (major == GSS_S_COMPLETE)
148 retVal = (const char *)output.value;
158 bool GSSCreateSecContextCommand::loadParameters(JSONObject *params)
161 OM_uint32 major, minor;
162 gss_buffer_desc gssbuffTargetName;
170 /* Main processing */
171 // Easy stuff(*params)
172 this->time_req = (OM_uint32)( (*params)["arguments"]["time_req"].integer() );
173 this->req_flags = (OM_uint32)( (*params)["arguments"]["req_flags"].integer() );
176 // -- just treat the value passed in as correct.
177 context_handle = (gss_ctx_id_t)( (*params)["arguments"]["context_handle"].integer() );
180 buffer = (*params)["arguments"]["target_name"].string();
181 if (buffer != NULL && *buffer != 0)
183 gssbuffTargetName.value = (void *)buffer;
184 gssbuffTargetName.length = strlen( buffer );
186 major = gss_import_name(&minor,
190 if (major != GSS_S_COMPLETE)
191 throw GSSException("Error importing target_name", major, minor);
195 mech_type = str_to_oid( (*params)["arguments"]["mech_type"].string() );
198 buffer = (*params)["arguments"]["input_token"].string();
199 if (buffer != NULL && *buffer != 0)
201 this->input_token.value = (void *)buffer;
202 this->input_token.length = strlen(buffer);
212 bool GSSCreateSecContextCommand::zeroOut(bool initialized)
217 gss_buffer_desc output;
222 // Free up existing memory if it's been set.
225 if (this->context_handle != NULL)
226 gss_delete_sec_context(&minor, &(this->context_handle), &output);
228 if (this->target_name != NULL)
229 gss_release_name(&minor, &(this->target_name));
231 if (mech_type != NULL)
232 gss_release_oid(&minor, &(this->mech_type));
234 if (this->actual_mech_type != NULL)
235 gss_release_oid(&minor, &(this->actual_mech_type));
237 if (this->output_token.length > 0)
238 gss_release_buffer(&minor, &output_token);
240 if (this->input_token.length > 0)
241 gss_release_buffer(&minor, &input_token);
244 // Now set things to reasonable defaults
246 this->minor_status = 0;
252 this->context_handle = GSS_C_NO_CONTEXT;
253 this->target_name = GSS_C_NO_NAME;
254 mech_type = str_to_oid( "{ 1 2 840 113554 1 2 1 4 }" );
255 this->input_token.length = 0;
256 this->input_token.value = NULL;
257 this->actual_mech_type = GSS_C_NO_OID;
258 this->output_token.length = 0;
259 this->output_token.value = NULL;
266 JSONObject *GSSCreateSecContextCommand::toJSON()
269 JSONObject *ret = new JSONObject();
270 JSONObject *values = new JSONObject();
277 values->set("major_status", this->retVal);
278 values->set("minor_status", this->minor_status);
279 values->set("context_handle", this->contextKey.c_str());
280 values->set("actual_mech_type", this->getActualMechType());
281 values->set("output_token", (const char *)this->output_token.value);
282 values->set("ret_flags", this->ret_flags);
283 values->set("time_rec", this->time_rec);
284 ret->set("command", "gss_init_sec_context");
285 ret->set("return_values", *values);
293 GSSCreateSecContextCommand::GSSCreateSecContextCommand(
295 void *fn) : GSSCommand(params)
298 loadParameters(params);
302 GSSCreateSecContextCommand::GSSCreateSecContextCommand(void *fn)