diff options
author | markm <markm@FreeBSD.org> | 2000-02-24 11:19:29 +0000 |
---|---|---|
committer | markm <markm@FreeBSD.org> | 2000-02-24 11:19:29 +0000 |
commit | 69414e22b995b6d161fc19bcab66823585f1d394 (patch) | |
tree | c822a9ebecac015f7f6b7d1422b50d0c490791e7 /crypto/heimdal/appl/test/gssapi_server.c | |
parent | fa8b1a96d3a4e7cb6123f48b6c27b717a5ed86fe (diff) | |
download | FreeBSD-src-69414e22b995b6d161fc19bcab66823585f1d394.zip FreeBSD-src-69414e22b995b6d161fc19bcab66823585f1d394.tar.gz |
Vendor import of Heimdal 0.2o
Diffstat (limited to 'crypto/heimdal/appl/test/gssapi_server.c')
-rw-r--r-- | crypto/heimdal/appl/test/gssapi_server.c | 153 |
1 files changed, 104 insertions, 49 deletions
diff --git a/crypto/heimdal/appl/test/gssapi_server.c b/crypto/heimdal/appl/test/gssapi_server.c index a17ce3e..01aa769 100644 --- a/crypto/heimdal/appl/test/gssapi_server.c +++ b/crypto/heimdal/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. * @@ -34,59 +34,19 @@ #include "test_locl.h" #include <gssapi.h> #include "gss_common.h" -RCSID("$Id: gssapi_server.c,v 1.10 1999/12/16 10:29:41 assar Exp $"); +RCSID("$Id: gssapi_server.c,v 1.12 2000/02/12 21:34:11 assar Exp $"); static int -proto (int sock, const char *service) +process_it(int sock, + gss_ctx_id_t context_hdl, + gss_name_t client_name + ) { - 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; 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 - || addrlen != sizeof(local)) - err (1, "getsockname)"); - - addrlen = sizeof(remote); - if (getpeername (sock, (struct sockaddr *)&remote, &addrlen) < 0 - || addrlen != sizeof(remote)) - err (1, "getpeername"); - - input_token = &real_input_token; - output_token = &real_output_token; - - do { - read_token (sock, input_token); - maj_stat = - gss_accept_sec_context (&min_stat, - &context_hdl, - GSS_C_NO_CREDENTIAL, - input_token, - GSS_C_NO_CHANNEL_BINDINGS, - &client_name, - NULL, - output_token, - NULL, - NULL, - NULL); - if(GSS_ERROR(maj_stat)) - gss_err (1, min_stat, "gss_accept_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; - } - } while(maj_stat & GSS_S_CONTINUE_NEEDED); + 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, @@ -98,6 +58,8 @@ proto (int sock, const char *service) 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); @@ -114,6 +76,9 @@ proto (int sock, const char *service) 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); @@ -130,10 +95,100 @@ proto (int sock, const char *service) 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_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; + + addrlen = sizeof(local); + if (getsockname (sock, (struct sockaddr *)&local, &addrlen) < 0 + || addrlen != sizeof(local)) + err (1, "getsockname)"); + + addrlen = sizeof(remote); + if (getpeername (sock, (struct sockaddr *)&remote, &addrlen) < 0 + || addrlen != sizeof(remote)) + err (1, "getpeername"); + + do { + read_token (sock, input_token); + maj_stat = + gss_accept_sec_context (&min_stat, + &context_hdl, + GSS_C_NO_CREDENTIAL, + input_token, + GSS_C_NO_CHANNEL_BINDINGS, + &client_name, + NULL, + output_token, + NULL, + NULL, + NULL); + if(GSS_ERROR(maj_stat)) + gss_err (1, min_stat, "gss_accept_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; + } + } while(maj_stat & GSS_S_CONTINUE_NEEDED); + + if (fork_flag) { + pid_t pid; + int pipefd[2]; + + if (pipe (pipefd) < 0) + err (1, "pipe"); + + pid = fork (); + if (pid < 0) + err (1, "fork"); + if (pid != 0) { + gss_buffer_desc buf; + + maj_stat = gss_export_sec_context (&min_stat, + &context_hdl, + &buf); + if (GSS_ERROR(maj_stat)) + gss_err (1, min_stat, "gss_export_sec_context"); + write_token (pipefd[1], &buf); + exit (0); + } else { + gss_ctx_id_t context_hdl; + gss_buffer_desc buf; + + close (pipefd[1]); + read_token (pipefd[0], &buf); + close (pipefd[0]); + maj_stat = gss_import_sec_context (&min_stat, &buf, &context_hdl); + if (GSS_ERROR(maj_stat)) + gss_err (1, min_stat, "gss_import_sec_context"); + gss_release_buffer (&min_stat, &buf); + return process_it (sock, context_hdl, client_name); + } + } else { + return process_it (sock, context_hdl, client_name); + } +} + +static int doit (int port, const char *service) { int sock, sock2; |