Imported Upstream version 0.2.5
[platform/upstream/libtirpc.git] / src / authgss_prot.c
index 9d7fa09..669eab7 100644 (file)
 #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
 
@@ -64,10 +67,10 @@ xdr_rpc_gss_buf(XDR *xdrs, gss_buffer_t buf, u_int maxsize)
        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;
 }
@@ -83,12 +86,12 @@ xdr_rpc_gss_cred(XDR *xdrs, struct rpc_gss_cred *p)
                    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);
 }
@@ -101,10 +104,10 @@ xdr_rpc_gss_init_args(XDR *xdrs, gss_buffer_desc *p)
 
        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);
 }
@@ -123,13 +126,13 @@ xdr_rpc_gss_init_res(XDR *xdrs, struct rpc_gss_init_res *p)
                    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);
 }
@@ -161,6 +164,7 @@ xdr_rpc_gss_wrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr,
        databuflen = end - start - 4;
        XDR_SETPOS(xdrs, start + 4);
        databuf.value = XDR_INLINE(xdrs, databuflen);
+       databuf.length = databuflen;
 
        xdr_stat = FALSE;
 
@@ -169,13 +173,13 @@ xdr_rpc_gss_wrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr,
                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. */
@@ -189,7 +193,8 @@ xdr_rpc_gss_wrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr,
                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. */
@@ -222,13 +227,13 @@ xdr_rpc_gss_unwrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr,
        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. */
@@ -238,14 +243,15 @@ xdr_rpc_gss_unwrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr,
 
                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. */
@@ -258,7 +264,8 @@ xdr_rpc_gss_unwrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr,
                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);
                }
        }
@@ -271,7 +278,8 @@ xdr_rpc_gss_unwrap_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr,
 
        /* 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);
@@ -296,47 +304,43 @@ xdr_rpc_gss_data(XDR *xdrs, xdrproc_t xdr_func, caddr_t xdr_ptr,
        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));
@@ -364,23 +368,3 @@ log_hexdump(const u_char *buf, int len, int 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
-
-