diff options
Diffstat (limited to 'proxy/tests/t_init.c')
-rw-r--r-- | proxy/tests/t_init.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/proxy/tests/t_init.c b/proxy/tests/t_init.c new file mode 100644 index 0000000..fd8cdf6 --- /dev/null +++ b/proxy/tests/t_init.c @@ -0,0 +1,97 @@ +/* Copyright (C) 2014 the GSS-PROXY contributors, see COPYING for license */ + +#include "t_utils.h" + +int main(int argc, const char *argv[]) +{ + char buffer[MAX_RPC_SIZE]; + uint32_t buflen; + gss_cred_id_t cred_handle = GSS_C_NO_CREDENTIAL; + gss_ctx_id_t context_handle = GSS_C_NO_CONTEXT; + gss_buffer_desc in_token = GSS_C_EMPTY_BUFFER; + gss_buffer_desc out_token = GSS_C_EMPTY_BUFFER; + gss_name_t name; + uint32_t ret_maj; + uint32_t ret_min; + int ret = -1; + + ret = t_string_to_name(argv[1], &name); + if (ret) { + DEBUG(argv[0], "Failed to import server name from argv[1]\n"); + ret = -1; + goto done; + } + + ret_maj = gss_init_sec_context(&ret_min, + cred_handle, + &context_handle, + name, + GSS_C_NO_OID, + GSS_C_MUTUAL_FLAG | GSS_C_REPLAY_FLAG, + 0, + GSS_C_NO_CHANNEL_BINDINGS, + &in_token, + NULL, + &out_token, + NULL, + NULL); + if (ret_maj != GSS_S_CONTINUE_NEEDED) { + DEBUG(argv[0], "gss_init_sec_context() failed\n"); + t_log_failure(GSS_C_NO_OID, ret_maj, ret_min); + ret = -1; + goto done; + } + + /* We get stuff from stdin and spit it out on stderr */ + if (!out_token.length) { + DEBUG(argv[0], "No output token ?"); + ret = -1; + goto done; + } + + ret = t_send_buffer(STDOUT_FD, out_token.value, out_token.length); + if (ret) { + DEBUG(argv[0], "Failed to send data to server!\n"); + ret = -1; + goto done; + } + + ret = t_recv_buffer(STDIN_FD, buffer, &buflen); + if (ret != 0) { + DEBUG(argv[0], "Failed to read token from STDIN\n"); + ret = -1; + goto done; + } + + in_token.value = buffer; + in_token.length = buflen; + + ret_maj = gss_init_sec_context(&ret_min, + cred_handle, + &context_handle, + name, + GSS_C_NO_OID, + GSS_C_MUTUAL_FLAG | GSS_C_REPLAY_FLAG, + 0, + GSS_C_NO_CHANNEL_BINDINGS, + &in_token, + NULL, + &out_token, + NULL, + NULL); + if (ret_maj) { + DEBUG(argv[0], "Error initializing context\n"); + t_log_failure(GSS_C_NO_OID, ret_maj, ret_min); + ret = -1; + goto done; + } + + ret = 0; + +done: + gss_delete_sec_context(&ret_min, &context_handle, NULL); + gss_release_cred(&ret_min, &cred_handle); + gss_release_buffer(&ret_min, &out_token); + gss_release_name(&ret_min, &name); + return ret; +} |