goto egress;
}
+ errcode = check_indicators(kdc_context, state->server,
+ state->auth_indicators);
+ if (errcode) {
+ state->status = "HIGHER_AUTHENTICATION_REQUIRED";
+ goto egress;
+ }
+
state->ticket_reply.enc_part2 = &state->enc_tkt_reply;
/*
return 0;
}
+/* Return KRB5KDC_ERR_POLICY if indicators does not contain the required auth
+ * indicators for server, ENOMEM on allocation error, 0 otherwise. */
+krb5_error_code
+check_indicators(krb5_context context, krb5_db_entry *server,
+ krb5_data *const *indicators)
+{
+ krb5_error_code ret;
+ char *str = NULL, *copy = NULL, *save, *ind;
+
+ ret = krb5_dbe_get_string(context, server, KRB5_KDB_SK_REQUIRE_AUTH, &str);
+ if (ret || str == NULL)
+ goto cleanup;
+ copy = strdup(str);
+ if (copy == NULL) {
+ ret = ENOMEM;
+ goto cleanup;
+ }
+
+ /* Look for any of the space-separated strings in indicators. */
+ ind = strtok_r(copy, " ", &save);
+ while (ind != NULL) {
+ if (authind_contains(indicators, ind))
+ goto cleanup;
+ ind = strtok_r(NULL, " ", &save);
+ }
+
+ ret = KRB5KDC_ERR_POLICY;
+ k5_setmsg(context, ret,
+ _("Required auth indicators not present in ticket: %s"), str);
+
+cleanup:
+ krb5_dbe_free_string(context, str);
+ free(copy);
+ return ret;
+}
+
#define ASN1_ID_CLASS (0xc0)
#define ASN1_ID_TYPE (0x20)
#define ASN1_ID_TAG (0x1f)
krb5_ticket *, krb5_timestamp,
const char **, krb5_pa_data ***);
+krb5_error_code
+check_indicators(krb5_context context, krb5_db_entry *server,
+ krb5_data *const *indicators);
+
int
fetch_asn1_field (unsigned char *, unsigned int, unsigned int, krb5_data *);