OM_uint32 major;
krb5_context krbContext;
krb5_principal krbPrinc;
- char *nameString;
+ char *nameString, *realm = NULL;
+ int flags = 0;
+ krb5_error_code code;
GSSEAP_KRB_INIT(&krbContext);
+ code = krb5_get_default_realm(krbContext, &realm);
+ if (code != 0 || realm == NULL)
+ flags |= KRB5_PRINCIPAL_PARSE_REQUIRE_REALM;
+ else
+ krb5_free_default_realm(krbContext, realm);
+
if (nameBuffer == GSS_C_NO_BUFFER) {
*minor = krb5_copy_principal(krbContext,
krbAnonymousPrincipal(), &krbPrinc);
if (GSS_ERROR(major))
return major;
- *minor = krb5_parse_name(krbContext, nameString, &krbPrinc);
+ *minor = krb5_parse_name_flags(krbContext, nameString, flags, &krbPrinc);
if (*minor != 0) {
GSSEAP_FREE(nameString);
return GSS_S_FAILURE;
gss_buffer_desc buf;
enum gss_eap_token_type tokType;
gss_name_t name = GSS_C_NO_NAME;
+ gss_OID mechanismUsed = GSS_C_NO_OID;
GSSEAP_KRB_INIT(&krbContext);
CHECK_REMAIN(mech.length);
- if (!gssEapIsMechanismOid(&mech)) {
- major = GSS_S_BAD_NAME;
- *minor = GSSEAP_WRONG_MECH;
+ major = gssEapCanonicalizeOid(minor,
+ &mech,
+ OID_FLAG_FAMILY_MECH_VALID |
+ OID_FLAG_MAP_FAMILY_MECH_TO_NULL,
+ &mechanismUsed);
+ if (GSS_ERROR(major))
goto cleanup;
- }
-
- if (oidEqual(&mech, GSS_EAP_MECHANISM)) {
- name->mechanismUsed = GSS_C_NO_OID;
- } else if (!gssEapInternalizeOid(&mech, &name->mechanismUsed)) {
- major = duplicateOid(minor, &mech, &name->mechanismUsed);
- if (GSS_ERROR(major))
- goto cleanup;
- }
UPDATE_REMAIN(2 + mech.length);
}
if (GSS_ERROR(major))
goto cleanup;
+ name->mechanismUsed = mechanismUsed;
+ mechanismUsed = GSS_C_NO_OID;
+
if (flags & EXPORT_NAME_FLAG_COMPOSITE) {
gss_buffer_desc buf;
*minor = 0;
cleanup:
- if (GSS_ERROR(major))
+ if (GSS_ERROR(major)) {
+ gssEapReleaseOid(&tmpMinor, &mechanismUsed);
gssEapReleaseName(&tmpMinor, &name);
- else
+ } else {
*pName = name;
+ }
return major;
}
assert(gssEapIsConcreteMechanismOid(mechType));
assert(name->mechanismUsed == GSS_C_NO_OID);
- if (!gssEapInternalizeOid(mechType, &name->mechanismUsed)) {
- major = duplicateOid(minor, mechType, &name->mechanismUsed);
- }
+ major = gssEapCanonicalizeOid(minor, mechType, 0, &name->mechanismUsed);
}
if (GSS_ERROR(major))
}
OM_uint32
-gssEapDuplicateName(OM_uint32 *minor,
- const gss_name_t input_name,
- gss_name_t *dest_name)
+gssEapCanonicalizeName(OM_uint32 *minor,
+ const gss_name_t input_name,
+ const gss_OID mech_type,
+ gss_name_t *dest_name)
{
OM_uint32 major, tmpMinor;
krb5_context krbContext;
gss_name_t name;
+ gss_OID mech_used;
if (input_name == GSS_C_NO_NAME) {
*minor = EINVAL;
return major;
}
- if (input_name->mechanismUsed == GSS_C_NO_OID) {
- name->mechanismUsed = GSS_C_NO_OID;
- } else if (gssEapIsConcreteMechanismOid(input_name->mechanismUsed)) {
- if (!gssEapInternalizeOid(input_name->mechanismUsed,
- &name->mechanismUsed)) {
- major = duplicateOid(minor, input_name->mechanismUsed,
- &name->mechanismUsed);
- if (GSS_ERROR(major))
- goto cleanup;
- }
- } else {
- major = GSS_S_BAD_MECH;
- *minor = GSSEAP_WRONG_MECH;
+ if (mech_type != GSS_C_NO_OID)
+ mech_used = mech_type;
+ else
+ mech_used = input_name->mechanismUsed;
+
+ major = gssEapCanonicalizeOid(minor,
+ mech_used,
+ OID_FLAG_NULL_VALID,
+ &name->mechanismUsed);
+ if (GSS_ERROR(major))
goto cleanup;
- }
name->flags = input_name->flags;
}
OM_uint32
+gssEapDuplicateName(OM_uint32 *minor,
+ const gss_name_t input_name,
+ gss_name_t *dest_name)
+{
+ return gssEapCanonicalizeName(minor, input_name,
+ GSS_C_NO_OID, dest_name);
+}
+
+OM_uint32
gssEapDisplayName(OM_uint32 *minor,
gss_name_t name,
gss_buffer_t output_name_buffer,