diff --git a/appl/test/gssapi_client.c b/appl/test/gssapi_client.c index 75a49e00e..34c7d3b3c 100644 --- a/appl/test/gssapi_client.c +++ b/appl/test/gssapi_client.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997 - 1999 Kungliga Tekniska Högskolan + * Copyright (c) 1997 - 2000 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -37,79 +37,12 @@ RCSID("$Id$"); static int -proto (int sock, const char *hostname, const char *service) +do_trans (int sock, gss_ctx_id_t context_hdl) { - struct sockaddr_in remote, local; - int addrlen; - - int context_established = 0; - gss_ctx_id_t context_hdl = GSS_C_NO_CONTEXT; - gss_buffer_t input_token, output_token; - gss_buffer_desc real_input_token, real_output_token; OM_uint32 maj_stat, min_stat; - gss_name_t server; - gss_buffer_desc name_token; - - name_token.length = asprintf ((char **)&name_token.value, - "%s@%s", service, hostname); - - maj_stat = gss_import_name (&min_stat, - &name_token, - GSS_C_NT_HOSTBASED_SERVICE, - &server); - if (GSS_ERROR(maj_stat)) - gss_err (1, min_stat, - "Error importing name `%s@%s':\n", service, hostname); - - addrlen = sizeof(local); - if (getsockname (sock, (struct sockaddr *)&local, &addrlen) < 0 - || addrlen != sizeof(local)) - err (1, "getsockname(%s)", hostname); - - addrlen = sizeof(remote); - if (getpeername (sock, (struct sockaddr *)&remote, &addrlen) < 0 - || addrlen != sizeof(remote)) - err (1, "getpeername(%s)", hostname); - - input_token = &real_input_token; - output_token = &real_output_token; - - input_token->length = 0; - output_token->length = 0; - - while(!context_established) { - maj_stat = - gss_init_sec_context(&min_stat, - GSS_C_NO_CREDENTIAL, - &context_hdl, - server, - GSS_C_NO_OID, - GSS_C_MUTUAL_FLAG | GSS_C_SEQUENCE_FLAG, - 0, - GSS_C_NO_CHANNEL_BINDINGS, - input_token, - NULL, - output_token, - NULL, - NULL); - if (GSS_ERROR(maj_stat)) - gss_err (1, min_stat, "gss_init_sec_context"); - if (output_token->length != 0) - write_token (sock, output_token); - if (GSS_ERROR(maj_stat)) { - if (context_hdl != GSS_C_NO_CONTEXT) - gss_delete_sec_context (&min_stat, - &context_hdl, - GSS_C_NO_BUFFER); - break; - } - if (maj_stat & GSS_S_CONTINUE_NEEDED) { - read_token (sock, input_token); - } else { - context_established = 1; - } - - } + gss_buffer_desc real_input_token, real_output_token; + gss_buffer_t input_token = &real_input_token, + output_token = &real_output_token; /* get_mic */ @@ -148,6 +81,81 @@ proto (int sock, const char *hostname, const char *service) return 0; } +static int +proto (int sock, const char *hostname, const char *service) +{ + struct sockaddr_in remote, local; + int addrlen; + + int context_established = 0; + gss_ctx_id_t context_hdl = GSS_C_NO_CONTEXT; + gss_buffer_desc real_input_token, real_output_token; + gss_buffer_t input_token = &real_input_token, + output_token = &real_output_token; + OM_uint32 maj_stat, min_stat; + gss_name_t server; + gss_buffer_desc name_token; + + name_token.length = asprintf ((char **)&name_token.value, + "%s@%s", service, hostname); + + maj_stat = gss_import_name (&min_stat, + &name_token, + GSS_C_NT_HOSTBASED_SERVICE, + &server); + if (GSS_ERROR(maj_stat)) + gss_err (1, min_stat, + "Error importing name `%s@%s':\n", service, hostname); + + addrlen = sizeof(local); + if (getsockname (sock, (struct sockaddr *)&local, &addrlen) < 0 + || addrlen != sizeof(local)) + err (1, "getsockname(%s)", hostname); + + addrlen = sizeof(remote); + if (getpeername (sock, (struct sockaddr *)&remote, &addrlen) < 0 + || addrlen != sizeof(remote)) + err (1, "getpeername(%s)", hostname); + + input_token->length = 0; + output_token->length = 0; + + while(!context_established) { + maj_stat = + gss_init_sec_context(&min_stat, + GSS_C_NO_CREDENTIAL, + &context_hdl, + server, + GSS_C_NO_OID, + GSS_C_MUTUAL_FLAG | GSS_C_SEQUENCE_FLAG, + 0, + GSS_C_NO_CHANNEL_BINDINGS, + input_token, + NULL, + output_token, + NULL, + NULL); + if (GSS_ERROR(maj_stat)) + gss_err (1, min_stat, "gss_init_sec_context"); + if (output_token->length != 0) + write_token (sock, output_token); + if (GSS_ERROR(maj_stat)) { + if (context_hdl != GSS_C_NO_CONTEXT) + gss_delete_sec_context (&min_stat, + &context_hdl, + GSS_C_NO_BUFFER); + break; + } + if (maj_stat & GSS_S_CONTINUE_NEEDED) { + read_token (sock, input_token); + } else { + context_established = 1; + } + + } + return do_trans (sock, context_hdl); +} + int main(int argc, char **argv) { diff --git a/appl/test/gssapi_server.c b/appl/test/gssapi_server.c index 2a056762c..bfc2e8506 100644 --- a/appl/test/gssapi_server.c +++ b/appl/test/gssapi_server.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997 - 1999 Kungliga Tekniska Högskolan + * Copyright (c) 1997 - 2000 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -36,17 +36,82 @@ #include "gss_common.h" RCSID("$Id$"); +static int +process_it(int sock, + gss_ctx_id_t context_hdl, + gss_name_t client_name + ) +{ + OM_uint32 maj_stat, min_stat; + gss_buffer_desc name_token; + gss_buffer_desc real_input_token, real_output_token; + gss_buffer_t input_token = &real_input_token, + output_token = &real_output_token; + + maj_stat = gss_display_name (&min_stat, + client_name, + &name_token, + NULL); + if (GSS_ERROR(maj_stat)) + gss_err (1, min_stat, "gss_display_name"); + + fprintf (stderr, "User is `%.*s'\n", (int)name_token.length, + (char *)name_token.value); + + gss_release_buffer (&min_stat, &name_token); + + /* gss_verify_mic */ + + read_token (sock, input_token); + read_token (sock, output_token); + + maj_stat = gss_verify_mic (&min_stat, + context_hdl, + input_token, + output_token, + NULL); + if (GSS_ERROR(maj_stat)) + gss_err (1, min_stat, "gss_verify_mic"); + + fprintf (stderr, "gss_verify_mic: %.*s\n", (int)input_token->length, + (char *)input_token->value); + + gss_release_buffer (&min_stat, input_token); + gss_release_buffer (&min_stat, output_token); + + /* gss_unwrap */ + + read_token (sock, input_token); + + maj_stat = gss_unwrap (&min_stat, + context_hdl, + input_token, + output_token, + NULL, + NULL); + if(GSS_ERROR(maj_stat)) + gss_err (1, min_stat, "gss_unwrap"); + + fprintf (stderr, "gss_unwrap: %.*s\n", (int)output_token->length, + (char *)output_token->value); + + gss_release_buffer (&min_stat, input_token); + gss_release_buffer (&min_stat, output_token); + + return 0; +} + static int proto (int sock, const char *service) { struct sockaddr_in remote, local; int addrlen; gss_ctx_id_t context_hdl = GSS_C_NO_CONTEXT; - gss_buffer_t input_token, output_token; gss_buffer_desc real_input_token, real_output_token; + gss_buffer_t input_token = &real_input_token, + output_token = &real_output_token; OM_uint32 maj_stat, min_stat; gss_name_t client_name; - gss_buffer_desc name_token; addrlen = sizeof(local); if (getsockname (sock, (struct sockaddr *)&local, &addrlen) < 0 @@ -58,9 +123,6 @@ proto (int sock, const char *service) || addrlen != sizeof(remote)) err (1, "getpeername"); - input_token = &real_input_token; - output_token = &real_output_token; - do { read_token (sock, input_token); maj_stat = @@ -88,49 +150,7 @@ proto (int sock, const char *service) } } while(maj_stat & GSS_S_CONTINUE_NEEDED); - maj_stat = gss_display_name (&min_stat, - client_name, - &name_token, - NULL); - if (GSS_ERROR(maj_stat)) - gss_err (1, min_stat, "gss_display_name"); - - fprintf (stderr, "User is `%.*s'\n", (int)name_token.length, - (char *)name_token.value); - - /* gss_verify_mic */ - - read_token (sock, input_token); - read_token (sock, output_token); - - maj_stat = gss_verify_mic (&min_stat, - context_hdl, - input_token, - output_token, - NULL); - if (GSS_ERROR(maj_stat)) - gss_err (1, min_stat, "gss_verify_mic"); - - fprintf (stderr, "gss_verify_mic: %.*s\n", (int)input_token->length, - (char *)input_token->value); - - /* gss_unwrap */ - - read_token (sock, input_token); - - maj_stat = gss_unwrap (&min_stat, - context_hdl, - input_token, - output_token, - NULL, - NULL); - if(GSS_ERROR(maj_stat)) - gss_err (1, min_stat, "gss_unwrap"); - - fprintf (stderr, "gss_unwrap: %.*s\n", (int)output_token->length, - (char *)output_token->value); - - return 0; + return process_it (sock, context_hdl, client_name); } static int