static krb5_error_code
kcm_send_request(krb5_context context,
		 krb5_storage *request,
		 krb5_data *response_data)
{
    static heim_base_once_t init_once = HEIM_BASE_ONCE_INIT;
    krb5_error_code ret = 0;
    krb5_data request_data;

    heim_base_once_f(&init_once, NULL, kcm_init_ipc);

    if (kcm_ipc == NULL) {
	krb5_set_error_message(context, ENOENT, "Failed to open kcm init");
	return ENOENT;
    }

    ret = krb5_storage_to_data(request, &request_data);
    if (ret) {
	krb5_clear_error_message(context);
	return KRB5_CC_NOMEM;
    }

    ret = heim_ipc_call(kcm_ipc, &request_data, response_data, NULL);
    krb5_data_free(&request_data);

    if (ret) {
	krb5_clear_error_message(context);
	ret = KRB5_CC_NOSUPP;
    }

    return ret;
}
Exemple #2
0
static void
test_ipc(const char *service)
{
    heim_isemaphore s;
    heim_idata req, rep;
    heim_ipc ipc;
    int ret;

    ret = heim_ipc_init_context(service, &ipc);
    if (ret)
	errx(1, "heim_ipc_init_context: %d", ret);

    req.length = 0;
    req.data = NULL;

    ret = heim_ipc_call(ipc, &req, &rep, NULL);
    if (ret)
	errx(1, "heim_ipc_call: %d", ret);

    s = heim_ipc_semaphore_create(0);
    if (s == NULL)
	errx(1, "heim_ipc_semaphore_create");

    ret = heim_ipc_async(ipc, &req, s, reply);
    if (ret)
	errx(1, "heim_ipc_async: %d", ret);

    heim_ipc_semaphore_wait(s, HEIM_IPC_WAIT_FOREVER); /* wait for reply to complete the work */

    heim_ipc_free_context(ipc);
}
Exemple #3
0
static krb5_error_code
kcm_send_request(krb5_context context,
		 krb5_storage *request,
		 krb5_data *response_data)
{
    krb5_error_code ret = 0;
    krb5_data request_data;

    HEIMDAL_MUTEX_lock(&kcm_mutex);
    if (kcm_ipc == NULL)
	ret = heim_ipc_init_context(kcm_ipc_name, &kcm_ipc);
    HEIMDAL_MUTEX_unlock(&kcm_mutex);
    if (ret)
	return KRB5_CC_NOSUPP;

    ret = krb5_storage_to_data(request, &request_data);
    if (ret) {
	krb5_clear_error_message(context);
	return KRB5_CC_NOMEM;
    }

    ret = heim_ipc_call(kcm_ipc, &request_data, response_data, NULL);
    krb5_data_free(&request_data);

    if (ret) {
	krb5_clear_error_message(context);
	ret = KRB5_CC_NOSUPP;
    }

    return ret;
}
Exemple #4
0
static OM_uint32
iakerb_acceptor_start(OM_uint32 * minor_status,
		      gsskrb5_ctx ctx,
		      krb5_context context,
		      const gss_cred_id_t acceptor_cred_handle,
		      const gss_buffer_t input_token_buffer,
		      const gss_channel_bindings_t input_chan_bindings,
		      gss_name_t * src_name,
		      gss_OID * mech_type,
		      gss_buffer_t output_token,
		      OM_uint32 * ret_flags,
		      OM_uint32 * time_rec,
		      gss_cred_id_t * delegated_cred_handle)
{
    krb5_data indata, outdata;
    gss_buffer_desc idata;
    krb5_error_code kret;
    heim_ipc ictx;
    OM_uint32 ret;
    
    if (ctx->messages == NULL) {
	ctx->messages = krb5_storage_emem();
	if (ctx->messages == NULL) {
	    *minor_status = ENOMEM;
	    return GSS_S_FAILURE;
	}
    }
    
    ret = _gsskrb5_iakerb_parse_header(minor_status, context, ctx, input_token_buffer, &indata);
    if (ret == GSS_S_DEFECTIVE_TOKEN) {
	ctx->acceptor_state = gsskrb5_acceptor_start;
	return GSS_S_COMPLETE;
    } else if (ret != GSS_S_COMPLETE)
	return ret;
    
    krb5_storage_write(ctx->messages,
		       input_token_buffer->value,
		       input_token_buffer->length);
    
    idata.value = indata.data;
    idata.length = indata.length;
    
    heim_assert(ctx->iakerbrealm != NULL, "realm not set by decoder, non OPT value");
    
    if (krb5_realm_is_lkdc(ctx->iakerbrealm)) {
	
	kret = heim_ipc_init_context("ANY:org.h5l.kdc", &ictx);
	if (kret) {
	    *minor_status = kret;
	    return GSS_S_FAILURE;
	}
	
	kret = heim_ipc_call(ictx, &indata, &outdata, NULL);
	heim_ipc_free_context(ictx);
	if (kret) {
	    _gsskrb5_error_token(minor_status, ctx->mech, context, kret,
				 NULL, NULL, output_token);
	    *minor_status = kret;
	    return GSS_S_FAILURE;
	}

	ret = _gsskrb5_iakerb_make_header(minor_status, context, ctx, ctx->iakerbrealm, &outdata, output_token);
	heim_ipc_free_data(&outdata);
	if (ret)
	    return ret;

    } else {
	/* XXX dont support non local realms right now */
	*minor_status = EINVAL;
	return GSS_S_FAILURE;
    }
    
    krb5_storage_write(ctx->messages,
		       output_token->value,
		       output_token->length);
    
    return GSS_S_CONTINUE_NEEDED;
}