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"
14 typedef OM_uint32 (*init_sec_context)(
15 OM_uint32 *, /* minor_status */
16 gss_cred_id_t, /* claimant_cred_handle */
17 gss_ctx_id_t *, /* context_handle */
18 gss_name_t, /* target_name */
19 gss_OID, /* mech_type (used to be const) */
20 OM_uint32, /* req_flags */
21 OM_uint32, /* time_req */
22 gss_channel_bindings_t, /* input_chan_bindings */
23 gss_buffer_t, /* input_token */
24 gss_OID *, /* actual_mech_type */
25 gss_buffer_t, /* output_token */
26 OM_uint32 *, /* ret_flags */
27 OM_uint32 * /* time_req */
30 /* Helper function - import the OID from a string */
31 static gss_OID str_to_oid(const char *mech_type_str = NULL)
34 gss_buffer_desc gssbuffOID;
35 gss_OID gssoidTargetOID;
40 if (mech_type_str == NULL ||
46 gssbuffOID.value = (void *)(mech_type_str);
47 gssbuffOID.length = strlen(mech_type_str);
48 major = gss_str_to_oid(&minor,
51 if (major != GSS_S_COMPLETE)
52 throw GSSException("Error converting string to OID", major, minor);
57 return gssoidTargetOID;
61 GSSCreateSecContextCommand::execute()
64 init_sec_context fn = (init_sec_context)function;
69 if (output_token.length > 0)
70 retVal = gss_release_buffer(&minor_status, &output_token);
82 GSS_C_NO_CHANNEL_BINDINGS,
94 const char* GSSCreateSecContextCommand::getTargetDisplayName()
97 gss_buffer_desc output_name;
99 OM_uint32 major, minor;
107 major = gss_display_name(&minor, target_name, &output_name, &output_type);
108 if (major == GSS_S_COMPLETE)
109 ret = (const char *)output_name.value;
119 const char* GSSCreateSecContextCommand::getActualMechType()
121 return(this->oidToStr(this->actual_mech_type));
124 const char* GSSCreateSecContextCommand::getMechType()
126 return(this->oidToStr(this->mech_type));
129 const char* GSSCreateSecContextCommand::oidToStr(gss_OID oid)
131 gss_buffer_desc output;
132 OM_uint32 major, minor;
142 major = gss_oid_to_str(&minor, oid, &output);
143 if (major == GSS_S_COMPLETE)
144 retVal = (const char *)output.value;
154 bool GSSCreateSecContextCommand::loadParameters(JSONObject *params)
157 OM_uint32 major, minor;
158 gss_buffer_desc gssbuffTargetName;
166 /* Main processing */
167 // Easy stuff(*params)
168 this->time_req = (OM_uint32)( (*params)["arguments"]["time_req"].integer() );
169 this->req_flags = (OM_uint32)( (*params)["arguments"]["req_flags"].integer() );
172 // -- just treat the value passed in as correct.
173 context_handle = (gss_ctx_id_t)( (*params)["arguments"]["context_handle"].integer() );
176 buffer = (*params)["arguments"]["target_name"].string();
177 if (buffer != NULL && *buffer != 0)
179 gssbuffTargetName.value = (void *)buffer;
180 gssbuffTargetName.length = strlen( buffer );
182 major = gss_import_name(&minor,
186 if (major != GSS_S_COMPLETE)
187 throw GSSException("Error importing target_name", major, minor);
191 mech_type = str_to_oid( (*params)["arguments"]["mech_type"].string() );
194 buffer = (*params)["arguments"]["input_token"].string();
195 if (buffer != NULL && *buffer != 0)
197 this->input_token.value = (void *)buffer;
198 this->input_token.length = strlen(buffer);
208 bool GSSCreateSecContextCommand::zeroOut(bool initialized)
213 gss_buffer_desc output;
218 // Free up existing memory if it's been set.
221 if (this->context_handle != NULL)
222 gss_delete_sec_context(&minor, &(this->context_handle), &output);
224 if (this->target_name != NULL)
225 gss_release_name(&minor, &(this->target_name));
227 if (mech_type != NULL)
228 gss_release_oid(&minor, &(this->mech_type));
230 if (this->actual_mech_type != NULL)
231 gss_release_oid(&minor, &(this->actual_mech_type));
233 if (this->output_token.length > 0)
234 gss_release_buffer(&minor, &output_token);
236 if (this->input_token.length > 0)
237 gss_release_buffer(&minor, &input_token);
240 // Now set things to reasonable defaults
242 this->minor_status = 0;
248 this->context_handle = GSS_C_NO_CONTEXT;
249 this->target_name = GSS_C_NO_NAME;
250 mech_type = str_to_oid( "{ 1 2 840 113554 1 2 1 4 }" );
251 this->input_token.length = 0;
252 this->input_token.value = NULL;
253 this->actual_mech_type = GSS_C_NO_OID;
254 this->output_token.length = 0;
255 this->output_token.value = NULL;
262 JSONObject *GSSCreateSecContextCommand::toJSON()
265 JSONObject *ret = new JSONObject();
266 JSONObject *values = new JSONObject();
273 values->set("major_status", this->retVal);
274 values->set("minor_status", this->minor_status);
275 values->set("context_handle", (json_int_t)0);
276 values->set("actual_mech_type", this->getActualMechType());
277 values->set("output_token", (const char *)this->output_token.value);
278 values->set("ret_flags", this->ret_flags);
279 values->set("time_rec", this->time_rec);
280 ret->set("command", "gss_init_sec_context");
281 ret->set("return_values", *values);
289 GSSCreateSecContextCommand::GSSCreateSecContextCommand(
291 void *fn) : GSSCommand(params)
294 loadParameters(params);
298 GSSCreateSecContextCommand::GSSCreateSecContextCommand(void *fn)