def init_context(in_token = nil, opts = {})
min_stat = FFI::MemoryPointer.new :OM_uint32
ctx = (@context.nil? ? LibGSSAPI::GssCtxIdT.gss_c_no_context.address_of : @context.address_of)
mech = LibGSSAPI::GssOID.gss_c_no_oid
if(opts[:flags])
flags = opts[:flags]
else
flags = (LibGSSAPI::GSS_C_MUTUAL_FLAG | LibGSSAPI::GSS_C_SEQUENCE_FLAG | LibGSSAPI::GSS_C_CONF_FLAG | LibGSSAPI::GSS_C_INTEG_FLAG)
flags |= LibGSSAPI::GSS_C_DELEG_FLAG if opts[:delegate]
flags |= LibGSSAPI::GSS_C_DELEG_POLICY_FLAG if opts[:delegate]
end
in_tok = LibGSSAPI::UnManagedGssBufferDesc.new
in_tok.value = in_token
out_tok = LibGSSAPI::ManagedGssBufferDesc.new
ret_flags = FFI::MemoryPointer.new :OM_uint32
maj_stat = LibGSSAPI.gss_init_sec_context(min_stat,
nil,
ctx,
@int_svc_name,
mech,
flags,
0,
nil,
in_tok.pointer,
nil,
out_tok.pointer,
ret_flags,
nil)
raise GssApiError.new(maj_stat, min_stat), "gss_init_sec_context did not return GSS_S_COMPLETE" if maj_stat > 1
@context = LibGSSAPI::GssCtxIdT.new(ctx.get_pointer(0))
maj_stat == 1 ? out_tok.value : true
end