summaryrefslogtreecommitdiffstats
path: root/utils/gssd/gss_util.c
diff options
context:
space:
mode:
authorKevin Coffman <kwc@citi.umich.edu>2011-04-06 11:25:03 -0400
committerSteve Dickson <steved@redhat.com>2011-04-06 11:30:02 -0400
commitd6c1b35c6b40243bfd6fba2591c9f8f2653078c0 (patch)
tree247e6c2bb3a0c99003c7c006ca15cc28b3a3ffe2 /utils/gssd/gss_util.c
parent73840ef610accf4cf667427bc64805377c0d8394 (diff)
downloadnfs-utils-d6c1b35c6b40243bfd6fba2591c9f8f2653078c0.tar.gz
nfs-utils-d6c1b35c6b40243bfd6fba2591c9f8f2653078c0.tar.xz
nfs-utils-d6c1b35c6b40243bfd6fba2591c9f8f2653078c0.zip
nfs-utils: Add support to svcgssd to limit the negotiated enctypes
Recent versions of Kerberos libraries negotiate and use an "acceptor subkey". This negotiation does not consider that a service may have limited the encryption keys in its keytab. A patch (http://src.mit.edu/fisheye/changelog/krb5/?cs=24603) has been added to the MIT Kerberos code to allow an application to indicate that it wants to limit the encryption types negotiated. (This functionality has been available on the client/initiator side for a while. The new patch adds this support to the server/acceptor side.) This patch adds support to read a recently added nfsd proc file to determine the encryption types supported by the kernel and calls the function to limit encryption types negotiated for the acceptor subkey. Signed-off-by: Kevin Coffman <kwc@citi.umich.edu> Signed-off-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'utils/gssd/gss_util.c')
-rw-r--r--utils/gssd/gss_util.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/utils/gssd/gss_util.c b/utils/gssd/gss_util.c
index ee304cc..ca27d61 100644
--- a/utils/gssd/gss_util.c
+++ b/utils/gssd/gss_util.c
@@ -276,20 +276,25 @@ gssd_acquire_cred(char *server_name, const gss_OID oid)
u_int32_t ignore_maj_stat, ignore_min_stat;
gss_buffer_desc pbuf;
- name.value = (void *)server_name;
- name.length = strlen(server_name);
+ /* If server_name is NULL, get cred for GSS_C_NO_NAME */
+ if (server_name == NULL) {
+ target_name = GSS_C_NO_NAME;
+ } else {
+ name.value = (void *)server_name;
+ name.length = strlen(server_name);
- maj_stat = gss_import_name(&min_stat, &name,
- oid,
- &target_name);
+ maj_stat = gss_import_name(&min_stat, &name,
+ oid,
+ &target_name);
- if (maj_stat != GSS_S_COMPLETE) {
- pgsserr("gss_import_name", maj_stat, min_stat, g_mechOid);
- return (FALSE);
+ if (maj_stat != GSS_S_COMPLETE) {
+ pgsserr("gss_import_name", maj_stat, min_stat, g_mechOid);
+ return (FALSE);
+ }
}
- maj_stat = gss_acquire_cred(&min_stat, target_name, 0,
- GSS_C_NULL_OID_SET, GSS_C_ACCEPT,
+ maj_stat = gss_acquire_cred(&min_stat, target_name, GSS_C_INDEFINITE,
+ GSS_C_NO_OID_SET, GSS_C_ACCEPT,
&gssd_creds, NULL, NULL);
if (maj_stat != GSS_S_COMPLETE) {