- if (p[1] != GSS_EAP_MECHANISM->length)
- return GSS_S_BAD_MECH;
- if (memcmp(&p[2], GSS_EAP_MECHANISM->elements, GSS_EAP_MECHANISM->length))
- return GSS_S_BAD_MECH;
- UPDATE_REMAIN(2 + GSS_EAP_MECHANISM->length);
+
+ mech.length = p[1];
+ mech.elements = &p[2];
+
+ CHECK_REMAIN(mech.length);
+
+ if (!gssEapIsMechanismOid(&mech)) {
+ major = GSS_S_BAD_NAME;
+ *minor = GSSEAP_WRONG_MECH;
+ 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);