unsigned char *p;
size_t len, remain;
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;
if (flags & EXPORT_NAME_FLAG_OID) {
gss_OID_desc mech;
+ enum gss_eap_token_type tokType;
+ uint16_t wireTokType;
/* TOK_ID || MECH_OID_LEN || MECH_OID */
if (remain < 6) {
tokType = TOK_TYPE_EXPORT_NAME;
/* TOK_ID */
- if (load_uint16_be(p) != tokType) {
+ wireTokType = load_uint16_be(p);
+
+ if ((flags & EXPORT_NAME_FLAG_ALLOW_COMPOSITE) &&
+ wireTokType == TOK_TYPE_EXPORT_NAME_COMPOSITE) {
+ tokType = TOK_TYPE_EXPORT_NAME_COMPOSITE;
+ flags |= EXPORT_NAME_FLAG_COMPOSITE;
+ }
+
+ if (wireTokType != tokType) {
*minor = GSSEAP_WRONG_TOK_ID;
return GSS_S_BAD_NAME;
}
gss_name_t *name)
{
return gssEapImportNameInternal(minor, nameBuffer, name,
- EXPORT_NAME_FLAG_OID);
+ EXPORT_NAME_FLAG_OID |
+ EXPORT_NAME_FLAG_ALLOW_COMPOSITE);
}
#ifdef HAVE_GSS_C_NT_COMPOSITE_EXPORT
krb5_free_unparsed_name(krbContext, krbName);
- if (KRB_PRINC_LENGTH(name->krbPrincipal) == 0) {
+ if (output_name_buffer->length == 0) {
name_type = GSS_C_NT_ANONYMOUS;
+ } else if (name->flags & NAME_FLAG_NAI) {
+ name_type = GSS_C_NT_USER_NAME;
} else {
name_type = GSS_EAP_NT_EAP_NAME;
}