X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=util_name.c;h=b1475f86bd238a4a974f84f7a665d8d5f7d871a1;hb=163856b1a70d7773c46d4ea5495b85c4dce0f089;hp=7e7d25f1c5051c2a5f3a5040c20b3671994e5b25;hpb=f539123f4aa77a2ed7738173c21e938f8ed1adab;p=mech_eap.git diff --git a/util_name.c b/util_name.c index 7e7d25f..b1475f8 100644 --- a/util_name.c +++ b/util_name.c @@ -53,6 +53,10 @@ * or implied warranty. */ +/* + * Name utility routines. + */ + #include "gssapiP_eap.h" static gss_OID_desc gssEapNtPrincipalName = { @@ -132,7 +136,7 @@ krbPrincipalToName(OM_uint32 *minor, name->krbPrincipal = *principal; *principal = NULL; - if (name->krbPrincipal->length > 1) { + if (KRB_PRINC_LENGTH(name->krbPrincipal) > 1) { name->flags |= NAME_FLAG_SERVICE; } else { name->flags |= NAME_FLAG_NAI; @@ -197,7 +201,7 @@ importUserName(OM_uint32 *minor, if (nameBuffer == GSS_C_NO_BUFFER) { *minor = krb5_copy_principal(krbContext, - krb5_anonymous_principal(), &krbPrinc); + krbAnonymousPrincipal(), &krbPrinc); if (*minor != 0) return GSS_S_FAILURE; } else { @@ -221,6 +225,30 @@ importUserName(OM_uint32 *minor, return major; } +static OM_uint32 +importAnonymousName(OM_uint32 *minor, + const gss_buffer_t nameBuffer, + gss_name_t *pName) +{ + OM_uint32 major; + krb5_context krbContext; + krb5_principal krbPrinc; + + GSSEAP_KRB_INIT(&krbContext); + + *minor = krb5_copy_principal(krbContext, krbAnonymousPrincipal(), + &krbPrinc); + if (*minor != 0) + return GSS_S_FAILURE; + + major = krbPrincipalToName(minor, &krbPrinc, pName); + if (GSS_ERROR(major)) { + krb5_free_principal(krbContext, krbPrinc); + } + + return major; +} + #define UPDATE_REMAIN(n) do { \ p += (n); \ remain -= (n); \ @@ -228,8 +256,8 @@ importUserName(OM_uint32 *minor, #define CHECK_REMAIN(n) do { \ if (remain < (n)) { \ - *minor = GSSEAP_TOK_TRUNC; \ major = GSS_S_BAD_NAME; \ + *minor = GSSEAP_TOK_TRUNC; \ goto cleanup; \ } \ } while (0) @@ -309,6 +337,7 @@ gssEapImportNameInternal(OM_uint32 *minor, } major = GSS_S_COMPLETE; + *minor = 0; cleanup: if (GSS_ERROR(major)) @@ -356,6 +385,7 @@ gssEapImportName(OM_uint32 *minor, { GSS_EAP_NT_PRINCIPAL_NAME, importUserName }, { GSS_C_NT_HOSTBASED_SERVICE, importServiceName }, { GSS_C_NT_HOSTBASED_SERVICE_X, importServiceName }, + { GSS_C_NT_ANONYMOUS, importAnonymousName }, { GSS_C_NT_EXPORT_NAME, importExportName }, #ifdef HAVE_GSS_C_NT_COMPOSITE_EXPORT { GSS_C_NT_COMPOSITE_EXPORT, importCompositeExportName }, @@ -464,8 +494,8 @@ gssEapExportNameInternal(OM_uint32 *minor, assert(p == (unsigned char *)exportedName->value + exportedNameLen); - *minor = 0; major = GSS_S_COMPLETE; + *minor = 0; cleanup: gss_release_buffer(&tmpMinor, &attrs); @@ -497,6 +527,8 @@ gssEapDuplicateName(OM_uint32 *minor, return major; } + name->flags = input_name->flags; + *minor = krb5_copy_principal(krbContext, input_name->krbPrincipal, &name->krbPrincipal); if (*minor != 0) { @@ -529,6 +561,7 @@ gssEapDisplayName(OM_uint32 *minor, OM_uint32 major; krb5_context krbContext; char *krbName; + gss_OID name_type; GSSEAP_KRB_INIT(&krbContext); @@ -553,8 +586,16 @@ gssEapDisplayName(OM_uint32 *minor, krb5_free_unparsed_name(krbContext, krbName); + if (KRB_PRINC_TYPE(name->krbPrincipal) == KRB5_NT_WELLKNOWN && + krb5_principal_compare(krbContext, + name->krbPrincipal, krbAnonymousPrincipal())) { + name_type = GSS_C_NT_ANONYMOUS; + } else { + name_type = GSS_EAP_NT_PRINCIPAL_NAME; + } + if (output_name_type != NULL) - *output_name_type = GSS_EAP_NT_PRINCIPAL_NAME; + *output_name_type = name_type; return GSS_S_COMPLETE; }