Esempio n. 1
0
OM_uint32 GSSAPI_CALLCONV _gss_spnego_import_name
           (OM_uint32 * minor_status,
            const gss_buffer_t name_buffer,
            const gss_OID name_type,
            gss_name_t * output_name
           )
{
    spnego_name name;
    OM_uint32 maj_stat;

    *minor_status = 0;

    name = calloc(1, sizeof(*name));
    if (name == NULL) {
	*minor_status = ENOMEM;
	return GSS_S_FAILURE;
    }

    maj_stat = _gss_copy_oid(minor_status, name_type, &name->type);
    if (maj_stat) {
	free(name);
	return GSS_S_FAILURE;
    }

    maj_stat = _gss_copy_buffer(minor_status, name_buffer, &name->value);
    if (maj_stat) {
	gss_name_t rname = (gss_name_t)name;
	_gss_spnego_release_name(minor_status, &rname);
	return GSS_S_FAILURE;
    }
    name->mech = GSS_C_NO_NAME;
    *output_name = (gss_name_t)name;

    return GSS_S_COMPLETE;
}
Esempio n. 2
0
OM_uint32
gss_import_name(OM_uint32 *minor_status,
    const gss_buffer_t input_name_buffer,
    const gss_OID input_name_type,
    gss_name_t *output_name)
{
	gss_OID			name_type = input_name_type;
	OM_uint32		major_status;
	struct _gss_name	*name;

	*output_name = GSS_C_NO_NAME;

	if (input_name_buffer->length == 0) {
		*minor_status = 0;
		return (GSS_S_BAD_NAME);
	}

	/*
	 * Use GSS_NT_USER_NAME as default name type.
	 */
	if (name_type == GSS_C_NO_OID)
		name_type = GSS_C_NT_USER_NAME;

	/*
	 * If this is an exported name, we need to parse it to find
	 * the mechanism and then import it as an MN. See RFC 2743
	 * section 3.2 for a description of the format.
	 */
	if (gss_oid_equal(name_type, GSS_C_NT_EXPORT_NAME)) {
		return _gss_import_export_name(minor_status,
		    input_name_buffer, output_name);
	}

	/*
	 * Only allow certain name types. This is pretty bogus - we
	 * should figure out the list of supported name types using
	 * gss_inquire_names_for_mech.
	 */
	if (!gss_oid_equal(name_type, GSS_C_NT_USER_NAME)
	    && !gss_oid_equal(name_type, GSS_C_NT_MACHINE_UID_NAME)
	    && !gss_oid_equal(name_type, GSS_C_NT_STRING_UID_NAME)
	    && !gss_oid_equal(name_type, GSS_C_NT_HOSTBASED_SERVICE_X)
	    && !gss_oid_equal(name_type, GSS_C_NT_HOSTBASED_SERVICE)
	    && !gss_oid_equal(name_type, GSS_C_NT_ANONYMOUS)
	    && !gss_oid_equal(name_type, GSS_KRB5_NT_PRINCIPAL_NAME)) {
		*minor_status = 0;
		return (GSS_S_BAD_NAMETYPE);
	}

	*minor_status = 0;
	name = malloc(sizeof(struct _gss_name));
	if (!name) {
		*minor_status = ENOMEM;
		return (GSS_S_FAILURE);
	}
	memset(name, 0, sizeof(struct _gss_name));

	major_status = _gss_copy_oid(minor_status,
	    name_type, &name->gn_type);
	if (major_status) {
		free(name);
		return (GSS_S_FAILURE);
	}

	major_status = _gss_copy_buffer(minor_status,
	    input_name_buffer, &name->gn_value);
	if (major_status) {
		gss_name_t rname = (gss_name_t)name;
		gss_release_name(minor_status, &rname);
		return (GSS_S_FAILURE);
	}

	SLIST_INIT(&name->gn_mn);

	*output_name = (gss_name_t) name;
	return (GSS_S_COMPLETE);
}