Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/heimdal/appl/test/gss_common.c
34889 views
1
/*
2
* Copyright (c) 1997 - 2000 Kungliga Tekniska Högskolan
3
* (Royal Institute of Technology, Stockholm, Sweden).
4
* All rights reserved.
5
*
6
* Redistribution and use in source and binary forms, with or without
7
* modification, are permitted provided that the following conditions
8
* are met:
9
*
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
*
13
* 2. Redistributions in binary form must reproduce the above copyright
14
* notice, this list of conditions and the following disclaimer in the
15
* documentation and/or other materials provided with the distribution.
16
*
17
* 3. Neither the name of the Institute nor the names of its contributors
18
* may be used to endorse or promote products derived from this software
19
* without specific prior written permission.
20
*
21
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31
* SUCH DAMAGE.
32
*/
33
34
#include "test_locl.h"
35
#include <gssapi/gssapi.h>
36
#include <gssapi/gssapi_krb5.h>
37
#include <gssapi/gssapi_spnego.h>
38
#include "gss_common.h"
39
RCSID("$Id$");
40
41
void
42
write_token (int sock, gss_buffer_t buf)
43
{
44
uint32_t len, net_len;
45
OM_uint32 min_stat;
46
47
len = buf->length;
48
49
net_len = htonl(len);
50
51
if (net_write (sock, &net_len, 4) != 4)
52
err (1, "write");
53
if (net_write (sock, buf->value, len) != len)
54
err (1, "write");
55
56
gss_release_buffer (&min_stat, buf);
57
}
58
59
static void
60
enet_read(int fd, void *buf, size_t len)
61
{
62
ssize_t ret;
63
64
ret = net_read (fd, buf, len);
65
if (ret == 0)
66
errx (1, "EOF in read");
67
else if (ret < 0)
68
errx (1, "read");
69
}
70
71
void
72
read_token (int sock, gss_buffer_t buf)
73
{
74
uint32_t len, net_len;
75
76
enet_read (sock, &net_len, 4);
77
len = ntohl(net_len);
78
buf->length = len;
79
buf->value = emalloc(len);
80
enet_read (sock, buf->value, len);
81
}
82
83
void
84
gss_print_errors (int min_stat)
85
{
86
OM_uint32 new_stat;
87
OM_uint32 msg_ctx = 0;
88
gss_buffer_desc status_string;
89
OM_uint32 ret;
90
91
do {
92
ret = gss_display_status (&new_stat,
93
min_stat,
94
GSS_C_MECH_CODE,
95
GSS_C_NO_OID,
96
&msg_ctx,
97
&status_string);
98
fprintf (stderr, "%.*s\n", (int)status_string.length,
99
(char *)status_string.value);
100
gss_release_buffer (&new_stat, &status_string);
101
} while (!GSS_ERROR(ret) && msg_ctx != 0);
102
}
103
104
void
105
gss_verr(int exitval, int status, const char *fmt, va_list ap)
106
{
107
vwarnx (fmt, ap);
108
gss_print_errors (status);
109
exit (exitval);
110
}
111
112
void
113
gss_err(int exitval, int status, const char *fmt, ...)
114
{
115
va_list args;
116
117
va_start(args, fmt);
118
gss_verr (exitval, status, fmt, args);
119
va_end(args);
120
}
121
122
gss_OID
123
select_mech(const char *mech)
124
{
125
if (strcasecmp(mech, "krb5") == 0)
126
return GSS_KRB5_MECHANISM;
127
else if (strcasecmp(mech, "spnego") == 0)
128
return GSS_SPNEGO_MECHANISM;
129
else if (strcasecmp(mech, "no-oid") == 0)
130
return GSS_C_NO_OID;
131
else
132
errx (1, "Unknown mechanism '%s' (spnego, krb5, no-oid)", mech);
133
}
134
135
void
136
print_gss_name(const char *prefix, gss_name_t name)
137
{
138
OM_uint32 maj_stat, min_stat;
139
gss_buffer_desc name_token;
140
141
maj_stat = gss_display_name (&min_stat,
142
name,
143
&name_token,
144
NULL);
145
if (GSS_ERROR(maj_stat))
146
gss_err (1, min_stat, "gss_display_name");
147
148
fprintf (stderr, "%s `%.*s'\n", prefix,
149
(int)name_token.length,
150
(char *)name_token.value);
151
152
gss_release_buffer (&min_stat, &name_token);
153
154
}
155
156