]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Add authentication indicators in AS-REQs
authorGreg Hudson <ghudson@mit.edu>
Sun, 18 Jan 2015 19:46:11 +0000 (14:46 -0500)
committerGreg Hudson <ghudson@mit.edu>
Wed, 22 Jul 2015 16:22:46 +0000 (12:22 -0400)
Add an auth_indicators parameter to handle_authdata().  In
finish_process_as_req(), supply the auth indicators asserted by
preauth modules.  In handle_authdata(), wrap any supplied auth
indicators in CAMMAC and IF-RELEVANT containers and include them in
the ticket.

ticket: 8157

src/kdc/do_as_req.c
src/kdc/do_tgs_req.c
src/kdc/kdc_authdata.c
src/kdc/kdc_util.h

index 121d027b919e49f8dc7b056cfcb3eff2d3d9455a..1a76adabe65587b6fca206f41813edf539a32e18 100644 (file)
@@ -282,6 +282,7 @@ finish_process_as_req(struct as_req_state *state, krb5_error_code errcode)
                               state->request,
                               NULL, /* for_user_princ */
                               NULL, /* enc_tkt_request */
+                              state->auth_indicators,
                               &state->enc_tkt_reply);
     if (errcode) {
         krb5_klog_syslog(LOG_INFO, _("AS_REQ : handle_authdata (%d)"),
index f6d5cd3852963180aeb420f6323aa9b07ea723e0..fbc7fe76adcedffeccabb5f3f74ea8d89ac23d4b 100644 (file)
@@ -660,6 +660,7 @@ process_tgs_req(struct server_handle *handle, krb5_data *pkt,
                               s4u_x509_user ?
                               s4u_x509_user->user_id.user : NULL,
                               subject_tkt,
+                              NULL,
                               &enc_tkt_reply);
     if (errcode) {
         krb5_klog_syslog(LOG_INFO, _("TGS_REQ : handle_authdata (%d)"),
index e06bbe630ffe77323e991bc7754a3173c59c4761..50b463603ba63167a272bdbcc9e7de778ed648fa 100644 (file)
@@ -738,6 +738,46 @@ cleanup:
     return ret;
 }
 
+/* Add authentication indicator authdata to enc_tkt_reply, wrapped in a CAMMAC
+ * and an IF-RELEVANT container. */
+static krb5_error_code
+add_auth_indicators(krb5_context context, krb5_data *const *auth_indicators,
+                    krb5_keyblock *server_key, krb5_db_entry *krbtgt,
+                    krb5_enc_tkt_part *enc_tkt_reply)
+{
+    krb5_error_code ret;
+    krb5_data *der_indicators = NULL;
+    krb5_authdata ad, *list[2], **cammac = NULL;
+
+    /* Format the authentication indicators into an authdata list. */
+    ret = encode_utf8_strings(auth_indicators, &der_indicators);
+    if (ret)
+        goto cleanup;
+    ad.ad_type = KRB5_AUTHDATA_AUTH_INDICATOR;
+    ad.length = der_indicators->length;
+    ad.contents = (uint8_t *)der_indicators->data;
+    list[0] = &ad;
+    list[1] = NULL;
+
+    /* Wrap the list in CAMMAC and IF-RELEVANT containers. */
+    ret = cammac_create(context, enc_tkt_reply, server_key, krbtgt, list,
+                        &cammac);
+    if (ret)
+        goto cleanup;
+
+    /* Add the wrapped authdata to the ticket, without copying or filtering. */
+    ret = merge_authdata(context, cammac, &enc_tkt_reply->authorization_data,
+                         FALSE, FALSE);
+    if (ret)
+        goto cleanup;
+    cammac = NULL;              /* merge_authdata() freed */
+
+cleanup:
+    krb5_free_data(context, der_indicators);
+    krb5_free_authdata(context, cammac);
+    return ret;
+}
+
 krb5_error_code
 handle_authdata(krb5_context context, unsigned int flags,
                 krb5_db_entry *client, krb5_db_entry *server,
@@ -746,6 +786,7 @@ handle_authdata(krb5_context context, unsigned int flags,
                 krb5_keyblock *header_key, krb5_data *req_pkt,
                 krb5_kdc_req *req, krb5_const_principal for_user_princ,
                 krb5_enc_tkt_part *enc_tkt_req,
+                krb5_data *const *auth_indicators,
                 krb5_enc_tkt_part *enc_tkt_reply)
 {
     kdcauthdata_handle *h;
@@ -783,6 +824,15 @@ handle_authdata(krb5_context context, unsigned int flags,
             return ret;
     }
 
+    /* Add auth indicators if any were given. */
+    if (auth_indicators != NULL && *auth_indicators != NULL &&
+        !isflagset(server->attributes, KRB5_KDB_NO_AUTH_DATA_REQUIRED)) {
+        ret = add_auth_indicators(context, auth_indicators, server_key,
+                                  local_tgt, enc_tkt_reply);
+        if (ret)
+            return ret;
+    }
+
     if (!isflagset(enc_tkt_reply->flags, TKT_FLG_ANONYMOUS)) {
         /* Fetch authdata from the KDB if appropriate. */
         ret = fetch_kdb_authdata(context, flags, client, server, header_server,
index bc98fbffb9c912f8e30545e970237e836d5d9826..ea87e965bfc7c752c1025e0c70facbd938a03f11 100644 (file)
@@ -249,6 +249,7 @@ handle_authdata (krb5_context context,
                  krb5_kdc_req *request,
                  krb5_const_principal for_user_princ,
                  krb5_enc_tkt_part *enc_tkt_request,
+                 krb5_data *const *auth_indicators,
                  krb5_enc_tkt_part *enc_tkt_reply);
 
 /* replay.c */