#include <rpc/auth.h>
#include <rpc/auth_gss.h>
#include <rpc/rpc.h>
+#include <ctype.h>
#include <gssapi/gssapi.h>
+#include "debug.h"
+
/* additional space needed for encoding */
#define RPC_SLACK_SPACE 1024
if (xdr_stat && xdrs->x_op == XDR_DECODE)
buf->length = tmplen;
- log_debug("xdr_rpc_gss_buf: %s %s (%p:%d)",
- (xdrs->x_op == XDR_ENCODE) ? "encode" : "decode",
- (xdr_stat == TRUE) ? "success" : "failure",
- buf->value, buf->length);
+ gss_log_debug("xdr_rpc_gss_buf: %s %s (%p:%d)",
+ (xdrs->x_op == XDR_ENCODE) ? "encode" : "decode",
+ (xdr_stat == TRUE) ? "success" : "failure",
+ buf->value, buf->length);
return xdr_stat;
}
xdr_enum(xdrs, (enum_t *)&p->gc_svc) &&
xdr_rpc_gss_buf(xdrs, &p->gc_ctx, MAX_AUTH_BYTES));
- log_debug("xdr_rpc_gss_cred: %s %s "
- "(v %d, proc %d, seq %d, svc %d, ctx %p:%d)",
- (xdrs->x_op == XDR_ENCODE) ? "encode" : "decode",
- (xdr_stat == TRUE) ? "success" : "failure",
- p->gc_v, p->gc_proc, p->gc_seq, p->gc_svc,
- p->gc_ctx.value, p->gc_ctx.length);
+ gss_log_debug("xdr_rpc_gss_cred: %s %s "
+ "(v %d, proc %d, seq %d, svc %d, ctx %p:%d)",
+ (xdrs->x_op == XDR_ENCODE) ? "encode" : "decode",
+ (xdr_stat == TRUE) ? "success" : "failure",
+ p->gc_v, p->gc_proc, p->gc_seq, p->gc_svc,
+ p->gc_ctx.value, p->gc_ctx.length);
return (xdr_stat);
}
xdr_stat = xdr_rpc_gss_buf(xdrs, p, maxlen);
- log_debug("xdr_rpc_gss_init_args: %s %s (token %p:%d)",
- (xdrs->x_op == XDR_ENCODE) ? "encode" : "decode",
- (xdr_stat == TRUE) ? "success" : "failure",
- p->value, p->length);
+ gss_log_debug("xdr_rpc_gss_init_args: %s %s (token %p:%d)",
+ (xdrs->x_op == XDR_ENCODE) ? "encode" : "decode",
+ (xdr_stat == TRUE) ? "success" : "failure",
+ p->value, p->length);
return (xdr_stat);
}
xdr_u_int(xdrs, &p->gr_win) &&
xdr_rpc_gss_buf(xdrs, &p->gr_token, tok_maxlen));
- log_debug("xdr_rpc_gss_init_res %s %s "
- "(ctx %p:%d, maj %d, min %d, win %d, token %p:%d)",
- (xdrs->x_op == XDR_ENCODE) ? "encode" : "decode",
- (xdr_stat == TRUE) ? "success" : "failure",
- p->gr_ctx.value, p->gr_ctx.length,
- p->gr_major, p->gr_minor, p->gr_win,
- p->gr_token.value, p->gr_token.length);
+ gss_log_debug("xdr_rpc_gss_init_res %s %s "
+ "(ctx %p:%d, maj %d, min %d, win %d, token %p:%d)",
+ (xdrs->x_op == XDR_ENCODE) ? "encode" : "decode",
+ (xdr_stat == TRUE) ? "success" : "failure",
+ p->gr_ctx.value, p->gr_ctx.length,
+ p->gr_major, p->gr_minor, p->gr_win,
+ p->gr_token.value, p->gr_token.length);
return (xdr_stat);
}
databuflen = end - start - 4;
XDR_SETPOS(xdrs, start + 4);
databuf.value = XDR_INLINE(xdrs, databuflen);
+ databuf.length = databuflen;
xdr_stat = FALSE;
XDR_SETPOS(xdrs, start);
if (!xdr_u_int(xdrs, (u_int *)&databuflen))
return (FALSE);
- databuf.length = databuflen;
/* Checksum rpc_gss_data_t. */
maj_stat = gss_get_mic(&min_stat, ctx, qop,
&databuf, &wrapbuf);
if (maj_stat != GSS_S_COMPLETE) {
- log_debug("gss_get_mic failed");
+ gss_log_status("xdr_rpc_gss_wrap_data: gss_get_mic",
+ maj_stat, min_stat);
return (FALSE);
}
/* Marshal checksum. */
maj_stat = gss_wrap(&min_stat, ctx, TRUE, qop, &databuf,
&conf_state, &wrapbuf);
if (maj_stat != GSS_S_COMPLETE) {
- log_status("gss_wrap", maj_stat, min_stat);
+ gss_log_status("xdr_rpc_gss_wrap_data: gss_wrap",
+ maj_stat, min_stat);
return (FALSE);
}
/* Marshal databody_priv. */
if (svc == RPCSEC_GSS_SVC_INTEGRITY) {
/* Decode databody_integ. */
if (!xdr_rpc_gss_buf(xdrs, &databuf, (u_int)-1)) {
- log_debug("xdr decode databody_integ failed");
+ LIBTIRPC_DEBUG(1, ("xdr_rpc_gss_unwrap_data: decode databody_integ failed"));
return (FALSE);
}
/* Decode checksum. */
if (!xdr_rpc_gss_buf(xdrs, &wrapbuf, (u_int)-1)) {
gss_release_buffer(&min_stat, &databuf);
- log_debug("xdr decode checksum failed");
+ LIBTIRPC_DEBUG(1, ("xdr_rpc_gss_unwrap_data: decode checksum failed"));
return (FALSE);
}
/* Verify checksum and QOP. */
if (maj_stat != GSS_S_COMPLETE || qop_state != qop) {
gss_release_buffer(&min_stat, &databuf);
- log_status("gss_verify_mic", maj_stat, min_stat);
+ gss_log_status("xdr_rpc_gss_unwrap_data: gss_verify_mic",
+ maj_stat, min_stat);
return (FALSE);
}
}
else if (svc == RPCSEC_GSS_SVC_PRIVACY) {
/* Decode databody_priv. */
if (!xdr_rpc_gss_buf(xdrs, &wrapbuf, (u_int)-1)) {
- log_debug("xdr decode databody_priv failed");
+ LIBTIRPC_DEBUG(1, ("xdr_rpc_gss_unwrap_data: decode databody_priv failed"));
return (FALSE);
}
/* Decrypt databody. */
if (maj_stat != GSS_S_COMPLETE || qop_state != qop ||
conf_state != TRUE) {
gss_release_buffer(&min_stat, &databuf);
- log_status("gss_unwrap", maj_stat, min_stat);
+ gss_log_status("xdr_rpc_gss_unwrap_data: gss_unwrap",
+ maj_stat, min_stat);
return (FALSE);
}
}
/* Verify sequence number. */
if (xdr_stat == TRUE && seq_num != seq) {
- log_debug("wrong sequence number in databody");
+ LIBTIRPC_DEBUG(1,
+ ("xdr_rpc_gss_unwrap_data: wrong sequence number in databody"));
return (FALSE);
}
return (xdr_stat);
return (FALSE);
}
-#ifdef DEBUG
-#include <ctype.h>
-
void
-log_debug(const char *fmt, ...)
+gss_log_debug(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
- fprintf(stderr, "rpcsec_gss: ");
- vfprintf(stderr, fmt, ap);
- fprintf(stderr, "\n");
+ vlibtirpc_log_dbg(2, fmt, ap);
va_end(ap);
}
void
-log_status(char *m, OM_uint32 maj_stat, OM_uint32 min_stat)
+gss_log_status(char *m, OM_uint32 maj_stat, OM_uint32 min_stat)
{
- OM_uint32 min;
- gss_buffer_desc msg;
- int msg_ctx = 0;
+ OM_uint32 min, maj;
+ gss_buffer_desc maj_msg, min_msg;
+ u_int32_t msg_ctx = 0;
- fprintf(stderr, "rpcsec_gss: %s: ", m);
+ gss_display_status(&maj, maj_stat, GSS_C_GSS_CODE, GSS_C_NULL_OID,
+ &msg_ctx, &maj_msg);
+ gss_display_status(&min, min_stat, GSS_C_MECH_CODE, GSS_C_NULL_OID,
+ &msg_ctx, &min_msg);
- gss_display_status(&min, maj_stat, GSS_C_GSS_CODE, GSS_C_NULL_OID,
- &msg_ctx, &msg);
- fprintf(stderr, "%s - ", (char *)msg.value);
- gss_release_buffer(&min, &msg);
+ LIBTIRPC_DEBUG(1, ("%s: %s - %s", m, (char *)maj_msg.value, (char *)min_msg.value));
- gss_display_status(&min, min_stat, GSS_C_MECH_CODE, GSS_C_NULL_OID,
- &msg_ctx, &msg);
- fprintf(stderr, "%s\n", (char *)msg.value);
- gss_release_buffer(&min, &msg);
+ gss_release_buffer(&maj, &maj_msg);
+ gss_release_buffer(&min, &min_msg);
}
void
-log_hexdump(const u_char *buf, int len, int offset)
+gss_log_hexdump(const u_char *buf, int len, int offset)
{
u_int i, j, jm;
int c;
+ if (libtirpc_debug_level < 4 || log_stderr == 0)
+ return;
+
fprintf(stderr, "\n");
for (i = 0; i < len; i += 0x10) {
fprintf(stderr, " %04x: ", (u_int)(i + offset));
}
}
-#else
-
-void
-log_debug(const char *fmt, ...)
-{
-}
-
-void
-log_status(char *m, OM_uint32 maj_stat, OM_uint32 min_stat)
-{
-}
-
-void
-log_hexdump(const u_char *buf, int len, int offset)
-{
-}
-
-#endif
-
-