+setAcceptorIdentity(OM_uint32 *minor,
+ gss_ctx_id_t ctx,
+ VALUE_PAIR **avps)
+{
+ OM_uint32 major;
+ gss_buffer_desc nameBuf;
+ krb5_context krbContext = NULL;
+ krb5_principal krbPrinc;
+ struct rs_handle *rh = ctx->acceptorCtx.radHandle;
+
+ assert(rh != NULL);
+
+ /* Awaits further specification */
+ if (ctx->acceptorName == GSS_C_NO_NAME)
+ return GSS_S_COMPLETE;
+
+ GSSEAP_KRB_INIT(&krbContext);
+
+ krbPrinc = ctx->acceptorName->krbPrincipal;
+ assert(krbPrinc != NULL);
+
+ if (krb5_princ_size(krbContext, krbPrinc) < 2)
+ return GSS_S_BAD_NAME;
+
+ /* Acceptor-Service-Name */
+ krbDataToGssBuffer(krb5_princ_component(krbContext, krbPrinc, 0), &nameBuf);
+
+ major = gssEapRadiusAddAvp(minor, rh, avps,
+ PW_GSS_ACCEPTOR_SERVICE_NAME,
+ VENDORPEC_UKERNA,
+ &nameBuf);
+ if (GSS_ERROR(major))
+ return major;
+
+ /* Acceptor-Host-Name */
+ krbDataToGssBuffer(krb5_princ_component(krbContext, krbPrinc, 1), &nameBuf);
+
+ major = gssEapRadiusAddAvp(minor, rh, avps,
+ PW_GSS_ACCEPTOR_HOST_NAME,
+ VENDORPEC_UKERNA,
+ &nameBuf);
+ if (GSS_ERROR(major))
+ return major;
+
+ if (krb5_princ_size(krbContext, krbPrinc) > 2) {
+ /* Acceptor-Service-Specific */
+ krb5_principal_data ssiPrinc = *krbPrinc;
+ char *ssi;
+
+ krb5_princ_size(krbContext, &ssiPrinc) -= 2;
+ krb5_princ_name(krbContext, &ssiPrinc) += 2;
+
+ *minor = krb5_unparse_name_flags(krbContext, &ssiPrinc,
+ KRB5_PRINCIPAL_UNPARSE_NO_REALM, &ssi);
+ if (*minor != 0)
+ return GSS_S_FAILURE;
+
+ nameBuf.value = ssi;
+ nameBuf.length = strlen(ssi);
+
+ major = gssEapRadiusAddAvp(minor, rh, avps,
+ PW_GSS_ACCEPTOR_SERVICE_SPECIFIC,
+ VENDORPEC_UKERNA,
+ &nameBuf);
+
+ if (GSS_ERROR(major)) {
+ krb5_free_unparsed_name(krbContext, ssi);
+ return major;
+ }
+ krb5_free_unparsed_name(krbContext, ssi);
+ }
+
+ krbDataToGssBuffer(krb5_princ_realm(krbContext, krbPrinc), &nameBuf);
+ if (nameBuf.length != 0) {
+ /* Acceptor-Realm-Name */
+ major = gssEapRadiusAddAvp(minor, rh, avps,
+ PW_GSS_ACCEPTOR_REALM_NAME,
+ VENDORPEC_UKERNA,
+ &nameBuf);
+ if (GSS_ERROR(major))
+ return major;
+ }
+
+ return GSS_S_COMPLETE;
+}
+
+static OM_uint32