54 #define GSSKRB_APPLE_DEPRECATED(x)
56 #if HAVE_GSSAPI_GSSAPI_H
57 #include <gssapi/gssapi.h>
61 #if HAVE_GSSAPI_GSSAPI_KRB5_H
62 #include <gssapi/gssapi_krb5.h>
64 #if HAVE_GSSAPI_GSSAPI_GENERIC_H
65 #include <gssapi/gssapi_generic.h>
67 #if HAVE_GSSAPI_GSSAPI_EXT_H
68 #include <gssapi/gssapi_ext.h>
71 #ifndef gss_nt_service_name
72 #define gss_nt_service_name GSS_C_NT_HOSTBASED_SERVICE
75 static const char *
LogTime(
void);
77 int check_gss_err(OM_uint32 major_status, OM_uint32 minor_status,
78 const char *
function);
80 const char *squid_kerb_proxy_auth(
char *proxy);
82 #define PROGRAM "negotiate_kerberos_auth_test"
89 static time_t last_t = 0;
92 gettimeofday(&now,
nullptr);
93 if (now.tv_sec != last_t) {
94 tm = localtime((
const time_t *) &now.tv_sec);
95 strftime(buf, 127,
"%Y/%m/%d %H:%M:%S", tm);
101 #ifndef gss_mech_spnego
102 static gss_OID_desc _gss_mech_spnego = {6, (
void *)
"\x2b\x06\x01\x05\x05\x02"};
103 gss_OID gss_mech_spnego = &_gss_mech_spnego;
107 check_gss_err(OM_uint32 major_status, OM_uint32 minor_status,
108 const char *
function)
110 if (GSS_ERROR(major_status)) {
111 OM_uint32 maj_stat, min_stat;
112 OM_uint32 msg_ctx = 0;
113 gss_buffer_desc status_string;
121 maj_stat = gss_display_status(&min_stat, major_status,
122 GSS_C_GSS_CODE, GSS_C_NULL_OID, &msg_ctx, &status_string);
123 if (maj_stat == GSS_S_COMPLETE && status_string.length > 0) {
124 if (
sizeof(buf) > len + status_string.length + 1) {
125 snprintf(buf + len, (
sizeof(buf) - len),
"%s", (
char *) status_string.value);
126 len += status_string.length;
130 gss_release_buffer(&min_stat, &status_string);
132 if (
sizeof(buf) > len + 2) {
133 snprintf(buf + len, (
sizeof(buf) - len),
"%s",
". ");
139 maj_stat = gss_display_status(&min_stat, minor_status,
140 GSS_C_MECH_CODE, GSS_C_NULL_OID, &msg_ctx, &status_string);
141 if (maj_stat == GSS_S_COMPLETE && status_string.length > 0) {
142 if (
sizeof(buf) > len + status_string.length) {
143 snprintf(buf + len, (
sizeof(buf) - len),
"%s", (
char *) status_string.value);
144 len += status_string.length;
148 gss_release_buffer(&min_stat, &status_string);
150 fprintf(stderr,
"%s| %s: %s failed: %s\n",
LogTime(),
PROGRAM,
function,
158 squid_kerb_proxy_auth(
char *proxy)
160 OM_uint32 major_status, minor_status;
161 gss_ctx_id_t gss_context = GSS_C_NO_CONTEXT;
162 gss_name_t server_name = GSS_C_NO_NAME;
163 gss_buffer_desc service = GSS_C_EMPTY_BUFFER;
164 gss_buffer_desc input_token = GSS_C_EMPTY_BUFFER;
165 gss_buffer_desc output_token = GSS_C_EMPTY_BUFFER;
166 char *token =
nullptr;
168 setbuf(stdout,
nullptr);
169 setbuf(stdin,
nullptr);
172 fprintf(stderr,
"%s| %s: Error: No proxy server name\n",
LogTime(),
176 service.value =
xmalloc(strlen(
"HTTP") + strlen(proxy) + 2);
177 snprintf((
char *) service.value, strlen(
"HTTP") + strlen(proxy) + 2,
"%s@%s",
"HTTP", proxy);
178 service.length = strlen((
char *) service.value);
180 major_status = gss_import_name(&minor_status, &service,
183 if (!
check_gss_err(major_status, minor_status,
"gss_import_name()")) {
185 major_status = gss_init_sec_context(&minor_status,
186 GSS_C_NO_CREDENTIAL, &gss_context, server_name,
190 GSS_C_NO_CHANNEL_BINDINGS,
191 &input_token,
nullptr, &output_token,
nullptr,
nullptr);
193 if (!
check_gss_err(major_status, minor_status,
"gss_init_sec_context()") && output_token.length) {
197 size_t blen =
base64_encode_update(&ctx, token, output_token.length,
reinterpret_cast<const uint8_t*
>(output_token.value));
202 gss_delete_sec_context(&minor_status, &gss_context,
nullptr);
203 gss_release_buffer(&minor_status, &service);
204 gss_release_buffer(&minor_status, &input_token);
205 gss_release_buffer(&minor_status, &output_token);
206 gss_release_name(&minor_status, &server_name);
212 main(
int argc,
char *argv[])
218 fprintf(stderr,
"%s| %s: Error: No proxy server name given\n",
223 count = atoi(argv[2]);
225 Token = (
const char *) squid_kerb_proxy_auth(argv[1]);
226 fprintf(stdout,
"YR %s\n", Token ? Token :
"NULL");
229 fprintf(stdout,
"QQ\n");
231 Token = (
const char *) squid_kerb_proxy_auth(argv[1]);
232 fprintf(stdout,
"Token: %s\n", Token ? Token :
"NULL");