Jan F. Chadima cff1d0c
diff -up openssh-5.9p1/Makefile.in.audit3 openssh-5.9p1/Makefile.in
Jan F. Chadima cff1d0c
--- openssh-5.9p1/Makefile.in.audit3	2011-08-05 22:15:18.000000000 +0200
Jan F. Chadima cff1d0c
+++ openssh-5.9p1/Makefile.in	2011-09-14 07:05:58.337520327 +0200
Jan F. Chadima 69dd72f
@@ -71,7 +71,7 @@ LIBSSH_OBJS=acss.o authfd.o authfile.o b
Jan F. Chadima 69dd72f
 	monitor_fdpass.o rijndael.o ssh-dss.o ssh-ecdsa.o ssh-rsa.o dh.o \
Jan F. Chadima 69dd72f
 	kexdh.o kexgex.o kexdhc.o kexgexc.o bufec.o kexecdh.o kexecdhc.o \
Jan F. Chadima 69dd72f
 	msg.o progressmeter.o dns.o entropy.o gss-genr.o umac.o jpake.o \
Jan F. Chadima 69dd72f
-	schnorr.o ssh-pkcs11.o
Jan F. Chadima 69dd72f
+	schnorr.o ssh-pkcs11.o auditstub.o
Jan F. Chadima 69dd72f
 
Jan F. Chadima 69dd72f
 SSHOBJS= ssh.o readconf.o clientloop.o sshtty.o \
Jan F. Chadima 69dd72f
 	sshconnect.o sshconnect1.o sshconnect2.o mux.o \
Jan F. Chadima cff1d0c
diff -up openssh-5.9p1/audit-bsm.c.audit3 openssh-5.9p1/audit-bsm.c
Jan F. Chadima cff1d0c
--- openssh-5.9p1/audit-bsm.c.audit3	2011-09-14 07:05:56.719459048 +0200
Jan F. Chadima cff1d0c
+++ openssh-5.9p1/audit-bsm.c	2011-09-14 07:05:58.430520147 +0200
Jan F. Chadima 69dd72f
@@ -396,4 +396,16 @@ audit_event(ssh_audit_event_t event)
Jan F. Chadima 69dd72f
 		debug("%s: unhandled event %d", __func__, event);
Jan F. Chadima 69dd72f
 	}
Jan F. Chadima 69dd72f
 }
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+void
Jan F. Chadima 69dd72f
+audit_unsupported_body(int what)
Jan F. Chadima 69dd72f
+{
Jan F. Chadima 69dd72f
+	/* not implemented */
Jan F. Chadima 69dd72f
+}
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+void
Jan F. Chadima 69dd72f
+audit_kex_body(int ctos, char *enc, char *mac, char *compress, pid_t pid, uid_t uid)
Jan F. Chadima 69dd72f
+{
Jan F. Chadima 69dd72f
+	/* not implemented */
Jan F. Chadima 69dd72f
+}
Jan F. Chadima 69dd72f
 #endif /* BSM */
Jan F. Chadima cff1d0c
diff -up openssh-5.9p1/audit-linux.c.audit3 openssh-5.9p1/audit-linux.c
Jan F. Chadima cff1d0c
--- openssh-5.9p1/audit-linux.c.audit3	2011-09-14 07:05:56.820460613 +0200
Jan F. Chadima cff1d0c
+++ openssh-5.9p1/audit-linux.c	2011-09-14 07:07:29.651459660 +0200
Jan F. Chadima 69dd72f
@@ -40,6 +40,8 @@
Jan F. Chadima 69dd72f
 #include "auth.h"
Jan F. Chadima 69dd72f
 #include "servconf.h"
Jan F. Chadima 69dd72f
 #include "canohost.h"
Jan F. Chadima 69dd72f
+#include "packet.h"
Jan F. Chadima 69dd72f
+#include "cipher.h"
Jan F. Chadima 69dd72f
 
Jan F. Chadima 69dd72f
 #define AUDIT_LOG_SIZE 128
Jan F. Chadima 69dd72f
 
Jan F. Chadima cff1d0c
@@ -269,4 +271,60 @@ audit_event(ssh_audit_event_t event)
Jan F. Chadima 69dd72f
 	}
Jan F. Chadima 69dd72f
 }
Jan F. Chadima 69dd72f
 
Jan F. Chadima 69dd72f
+void
Jan F. Chadima 69dd72f
+audit_unsupported_body(int what)
Jan F. Chadima 69dd72f
+{
Jan F. Chadima 69dd72f
+#ifdef AUDIT_CRYPTO_SESSION
Jan F. Chadima 69dd72f
+	char buf[AUDIT_LOG_SIZE];
Jan F. Chadima 69dd72f
+	const static char *name[] = { "cipher", "mac", "comp" };
Jan F. Chadima cff1d0c
+	char *s;
Jan F. Chadima 69dd72f
+	int audit_fd;
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+	snprintf(buf, sizeof(buf), "op=unsupported-%s direction=? cipher=? ksize=? rport=%d laddr=%s lport=%d ",
Jan F. Chadima cff1d0c
+		name[what], get_remote_port(), (s = get_local_ipaddr(packet_get_connection_in())),
Jan F. Chadima 69dd72f
+		get_local_port());
Jan F. Chadima cff1d0c
+	xfree(s);
Jan F. Chadima 69dd72f
+	audit_fd = audit_open();
Jan F. Chadima 69dd72f
+	if (audit_fd < 0)
Jan F. Chadima 69dd72f
+		/* no problem, the next instruction will be fatal() */
Jan F. Chadima 69dd72f
+		return;
Jan F. Chadima 69dd72f
+	audit_log_user_message(audit_fd, AUDIT_CRYPTO_SESSION,
Jan F. Chadima 69dd72f
+			buf, NULL, get_remote_ipaddr(), NULL, 0);
Jan F. Chadima 69dd72f
+	audit_close(audit_fd);
Jan F. Chadima 69dd72f
+#endif
Jan F. Chadima 69dd72f
+}
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+void
Jan F. Chadima 69dd72f
+audit_kex_body(int ctos, char *enc, char *mac, char *compress, pid_t pid,
Jan F. Chadima 69dd72f
+	       uid_t uid)
Jan F. Chadima 69dd72f
+{
Jan F. Chadima 69dd72f
+#ifdef AUDIT_CRYPTO_SESSION
Jan F. Chadima 69dd72f
+	char buf[AUDIT_LOG_SIZE];
Jan F. Chadima 69dd72f
+	int audit_fd, audit_ok;
Jan F. Chadima 69dd72f
+	const static char *direction[] = { "from-server", "from-client", "both" };
Jan F. Chadima 69dd72f
+	Cipher *cipher = cipher_by_name(enc);
Jan F. Chadima cff1d0c
+	char *s;
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+	snprintf(buf, sizeof(buf), "op=start direction=%s cipher=%s ksize=%d spid=%jd suid=%jd rport=%d laddr=%s lport=%d ",
Jan F. Chadima 69dd72f
+		direction[ctos], enc, cipher ? 8 * cipher->key_len : 0,
Jan F. Chadima 69dd72f
+		(intmax_t)pid, (intmax_t)uid,
Jan F. Chadima cff1d0c
+		get_remote_port(), (s = get_local_ipaddr(packet_get_connection_in())), get_local_port());
Jan F. Chadima cff1d0c
+	xfree(s);
Jan F. Chadima 69dd72f
+	audit_fd = audit_open();
Jan F. Chadima 69dd72f
+	if (audit_fd < 0) {
Jan F. Chadima 69dd72f
+		if (errno == EINVAL || errno == EPROTONOSUPPORT ||
Jan F. Chadima 69dd72f
+					 errno == EAFNOSUPPORT)
Jan F. Chadima 69dd72f
+			return; /* No audit support in kernel */
Jan F. Chadima 69dd72f
+		else                                                                                                                                       
Jan F. Chadima 69dd72f
+			fatal("cannot open audit"); /* Must prevent login */
Jan F. Chadima 69dd72f
+	}
Jan F. Chadima 69dd72f
+	audit_ok = audit_log_user_message(audit_fd, AUDIT_CRYPTO_SESSION,
Jan F. Chadima 69dd72f
+			buf, NULL, get_remote_ipaddr(), NULL, 1);
Jan F. Chadima 69dd72f
+	audit_close(audit_fd);
Jan F. Chadima 69dd72f
+	/* do not abort if the error is EPERM and sshd is run as non root user */
Jan F. Chadima 69dd72f
+	if ((audit_ok < 0) && ((audit_ok != -1) || (getuid() == 0)))
Jan F. Chadima 69dd72f
+		fatal("cannot write into audit"); /* Must prevent login */
Jan F. Chadima 69dd72f
+#endif
Jan F. Chadima 69dd72f
+}
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
 #endif /* USE_LINUX_AUDIT */
Jan F. Chadima cff1d0c
diff -up openssh-5.9p1/audit.c.audit3 openssh-5.9p1/audit.c
Jan F. Chadima cff1d0c
--- openssh-5.9p1/audit.c.audit3	2011-09-14 07:05:56.937585272 +0200
Jan F. Chadima cff1d0c
+++ openssh-5.9p1/audit.c	2011-09-14 07:05:58.646521393 +0200
Jan F. Chadima 69dd72f
@@ -28,6 +28,7 @@
Jan F. Chadima 69dd72f
 
Jan F. Chadima 69dd72f
 #include <stdarg.h>
Jan F. Chadima 69dd72f
 #include <string.h>
Jan F. Chadima 69dd72f
+#include <unistd.h>
Jan F. Chadima 69dd72f
 
Jan F. Chadima 69dd72f
 #ifdef SSH_AUDIT_EVENTS
Jan F. Chadima 69dd72f
 
Jan F. Chadima 69dd72f
@@ -36,6 +37,8 @@
Jan F. Chadima 69dd72f
 #include "key.h"
Jan F. Chadima 69dd72f
 #include "hostfile.h"
Jan F. Chadima 69dd72f
 #include "auth.h"
Jan F. Chadima 69dd72f
+#include "ssh-gss.h"
Jan F. Chadima 69dd72f
+#include "monitor_wrap.h"
Jan F. Chadima 69dd72f
 #include "xmalloc.h"
Jan F. Chadima 69dd72f
 
Jan F. Chadima 69dd72f
 /*
Jan F. Chadima 69dd72f
@@ -128,6 +131,18 @@ audit_key(int host_user, int *rv, const
Jan F. Chadima 69dd72f
 	xfree(fp);
Jan F. Chadima 69dd72f
 }
Jan F. Chadima 69dd72f
 
Jan F. Chadima 69dd72f
+void
Jan F. Chadima 69dd72f
+audit_unsupported(int what)
Jan F. Chadima 69dd72f
+{
Jan F. Chadima 69dd72f
+	PRIVSEP(audit_unsupported_body(what));
Jan F. Chadima 69dd72f
+}
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+void
Jan F. Chadima 69dd72f
+audit_kex(int ctos, char *enc, char *mac, char *comp)
Jan F. Chadima 69dd72f
+{
Jan F. Chadima 69dd72f
+	PRIVSEP(audit_kex_body(ctos, enc, mac, comp, getpid(), getuid()));
Jan F. Chadima 69dd72f
+}
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
 # ifndef CUSTOM_SSH_AUDIT_EVENTS
Jan F. Chadima 69dd72f
 /*
Jan F. Chadima 69dd72f
  * Null implementations of audit functions.
Jan F. Chadima 69dd72f
@@ -238,5 +253,26 @@ audit_keyusage(int host_user, const char
Jan F. Chadima 69dd72f
 		host_user ? "pubkey" : "hostbased", geteuid(), audit_username(), type, bits,
Jan F. Chadima 69dd72f
 		key_fingerprint_prefix(), fp, rv);
Jan F. Chadima 69dd72f
 }
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+/*
Jan F. Chadima 69dd72f
+ * This will be called when the protocol negotiation fails.
Jan F. Chadima 69dd72f
+ */
Jan F. Chadima 69dd72f
+void
Jan F. Chadima 69dd72f
+audit_unsupported_body(int what)
Jan F. Chadima 69dd72f
+{
Jan F. Chadima 69dd72f
+	debug("audit unsupported protocol euid %d type %d", geteuid(), what);
Jan F. Chadima 69dd72f
+}
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+/*
Jan F. Chadima 69dd72f
+ * This will be called on succesfull protocol negotiation.
Jan F. Chadima 69dd72f
+ */
Jan F. Chadima 69dd72f
+void
Jan F. Chadima 69dd72f
+audit_kex_body(int ctos, char *enc, char *mac, char *compress, pid_t pid,
Jan F. Chadima 69dd72f
+	       uid_t uid)
Jan F. Chadima 69dd72f
+{
Jan F. Chadima 69dd72f
+	debug("audit protocol negotiation euid %d direction %d cipher %s mac %s compresion %s from pid %ld uid %u",
Jan F. Chadima 69dd72f
+		(unsigned)geteuid(), ctos, enc, mac, compress, (long)pid,
Jan F. Chadima 69dd72f
+	        (unsigned)uid);
Jan F. Chadima 69dd72f
+}
Jan F. Chadima 69dd72f
 # endif  /* !defined CUSTOM_SSH_AUDIT_EVENTS */
Jan F. Chadima 69dd72f
 #endif /* SSH_AUDIT_EVENTS */
Jan F. Chadima cff1d0c
diff -up openssh-5.9p1/audit.h.audit3 openssh-5.9p1/audit.h
Jan F. Chadima cff1d0c
--- openssh-5.9p1/audit.h.audit3	2011-09-14 07:05:57.391522394 +0200
Jan F. Chadima cff1d0c
+++ openssh-5.9p1/audit.h	2011-09-14 07:05:58.766586362 +0200
Jan F. Chadima 69dd72f
@@ -58,5 +58,9 @@ void 	audit_end_command(int, const char
Jan F. Chadima 69dd72f
 ssh_audit_event_t audit_classify_auth(const char *);
Jan F. Chadima 69dd72f
 int	audit_keyusage(int, const char *, unsigned, char *, int);
Jan F. Chadima 69dd72f
 void	audit_key(int, int *, const Key *);
Jan F. Chadima 69dd72f
+void	audit_unsupported(int);
Jan F. Chadima 69dd72f
+void	audit_kex(int, char *, char *, char *);
Jan F. Chadima 69dd72f
+void	audit_unsupported_body(int);
Jan F. Chadima 69dd72f
+void	audit_kex_body(int, char *, char *, char *, pid_t, uid_t);
Jan F. Chadima 69dd72f
 
Jan F. Chadima 69dd72f
 #endif /* _SSH_AUDIT_H */
Jan F. Chadima cff1d0c
diff -up openssh-5.9p1/auditstub.c.audit3 openssh-5.9p1/auditstub.c
Jan F. Chadima cff1d0c
--- openssh-5.9p1/auditstub.c.audit3	2011-09-14 07:05:58.866461077 +0200
Jan F. Chadima cff1d0c
+++ openssh-5.9p1/auditstub.c	2011-09-14 07:05:58.870569033 +0200
Jan F. Chadima 69dd72f
@@ -0,0 +1,39 @@
Jan F. Chadima 69dd72f
+/* $Id: auditstub.c,v 1.1 jfch Exp $ */
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+/*
Jan F. Chadima 69dd72f
+ * Copyright 2010 Red Hat, Inc.  All rights reserved.
Jan F. Chadima 69dd72f
+ * Use is subject to license terms.
Jan F. Chadima 69dd72f
+ *
Jan F. Chadima 69dd72f
+ * Redistribution and use in source and binary forms, with or without
Jan F. Chadima 69dd72f
+ * modification, are permitted provided that the following conditions
Jan F. Chadima 69dd72f
+ * are met:
Jan F. Chadima 69dd72f
+ * 1. Redistributions of source code must retain the above copyright
Jan F. Chadima 69dd72f
+ *    notice, this list of conditions and the following disclaimer.
Jan F. Chadima 69dd72f
+ * 2. Redistributions in binary form must reproduce the above copyright
Jan F. Chadima 69dd72f
+ *    notice, this list of conditions and the following disclaimer in the
Jan F. Chadima 69dd72f
+ *    documentation and/or other materials provided with the distribution.
Jan F. Chadima 69dd72f
+ *
Jan F. Chadima 69dd72f
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
Jan F. Chadima 69dd72f
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
Jan F. Chadima 69dd72f
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
Jan F. Chadima 69dd72f
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
Jan F. Chadima 69dd72f
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
Jan F. Chadima 69dd72f
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Jan F. Chadima 69dd72f
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Jan F. Chadima 69dd72f
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Jan F. Chadima 69dd72f
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
Jan F. Chadima 69dd72f
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Jan F. Chadima 69dd72f
+ *
Jan F. Chadima 69dd72f
+ * Red Hat author: Jan F. Chadima <jchadima@redhat.com>
Jan F. Chadima 69dd72f
+ */
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+void
Jan F. Chadima 69dd72f
+audit_unsupported(int n)
Jan F. Chadima 69dd72f
+{
Jan F. Chadima 69dd72f
+}
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+void
Jan F. Chadima 69dd72f
+audit_kex(int ctos, char *enc, char *mac, char *comp)
Jan F. Chadima 69dd72f
+{
Jan F. Chadima 69dd72f
+}
Jan F. Chadima 69dd72f
+
Jan F. Chadima cff1d0c
diff -up openssh-5.9p1/cipher.c.audit3 openssh-5.9p1/cipher.c
Jan F. Chadima cff1d0c
--- openssh-5.9p1/cipher.c.audit3	2011-09-07 15:05:09.000000000 +0200
Jan F. Chadima cff1d0c
+++ openssh-5.9p1/cipher.c	2011-09-14 07:05:58.955582581 +0200
Jan F. Chadima 69dd72f
@@ -60,15 +60,7 @@ extern void ssh1_3des_iv(EVP_CIPHER_CTX
Jan F. Chadima 69dd72f
 extern const EVP_CIPHER *evp_aes_128_ctr(void);
Jan F. Chadima 69dd72f
 extern void ssh_aes_ctr_iv(EVP_CIPHER_CTX *, int, u_char *, u_int);
Jan F. Chadima 69dd72f
 
Jan F. Chadima 69dd72f
-struct Cipher {
Jan F. Chadima 69dd72f
-	char	*name;
Jan F. Chadima 69dd72f
-	int	number;		/* for ssh1 only */
Jan F. Chadima 69dd72f
-	u_int	block_size;
Jan F. Chadima 69dd72f
-	u_int	key_len;
Jan F. Chadima 69dd72f
-	u_int	discard_len;
Jan F. Chadima 69dd72f
-	u_int	cbc_mode;
Jan F. Chadima 69dd72f
-	const EVP_CIPHER	*(*evptype)(void);
Jan F. Chadima 69dd72f
-} ciphers[] = {
Jan F. Chadima 69dd72f
+struct Cipher ciphers[] = {
Jan F. Chadima 69dd72f
 	{ "none",		SSH_CIPHER_NONE, 8, 0, 0, 0, EVP_enc_null },
Jan F. Chadima 69dd72f
 	{ "des",		SSH_CIPHER_DES, 8, 8, 0, 1, EVP_des_cbc },
Jan F. Chadima 69dd72f
 	{ "3des",		SSH_CIPHER_3DES, 8, 16, 0, 1, evp_ssh1_3des },
Jan F. Chadima cff1d0c
diff -up openssh-5.9p1/cipher.h.audit3 openssh-5.9p1/cipher.h
Jan F. Chadima cff1d0c
--- openssh-5.9p1/cipher.h.audit3	2009-01-28 06:38:41.000000000 +0100
Jan F. Chadima cff1d0c
+++ openssh-5.9p1/cipher.h	2011-09-14 07:05:59.063459363 +0200
Jan F. Chadima 69dd72f
@@ -61,7 +61,16 @@
Jan F. Chadima 69dd72f
 typedef struct Cipher Cipher;
Jan F. Chadima 69dd72f
 typedef struct CipherContext CipherContext;
Jan F. Chadima 69dd72f
 
Jan F. Chadima 69dd72f
-struct Cipher;
Jan F. Chadima 69dd72f
+struct Cipher {
Jan F. Chadima 69dd72f
+	char	*name;
Jan F. Chadima 69dd72f
+	int	number;		/* for ssh1 only */
Jan F. Chadima 69dd72f
+	u_int	block_size;
Jan F. Chadima 69dd72f
+	u_int	key_len;
Jan F. Chadima 69dd72f
+	u_int	discard_len;
Jan F. Chadima 69dd72f
+	u_int	cbc_mode;
Jan F. Chadima 69dd72f
+	const EVP_CIPHER	*(*evptype)(void);
Jan F. Chadima 69dd72f
+};
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
 struct CipherContext {
Jan F. Chadima 69dd72f
 	int	plaintext;
Jan F. Chadima 69dd72f
 	EVP_CIPHER_CTX evp;
Jan F. Chadima cff1d0c
diff -up openssh-5.9p1/kex.c.audit3 openssh-5.9p1/kex.c
Jan F. Chadima cff1d0c
--- openssh-5.9p1/kex.c.audit3	2010-09-24 14:11:14.000000000 +0200
Jan F. Chadima cff1d0c
+++ openssh-5.9p1/kex.c	2011-09-14 07:05:59.171457800 +0200
Jan F. Chadima 69dd72f
@@ -49,6 +49,7 @@
Jan F. Chadima 69dd72f
 #include "dispatch.h"
Jan F. Chadima 69dd72f
 #include "monitor.h"
Jan F. Chadima 69dd72f
 #include "roaming.h"
Jan F. Chadima 69dd72f
+#include "audit.h"
Jan F. Chadima 69dd72f
 
Jan F. Chadima 69dd72f
 #if OPENSSL_VERSION_NUMBER >= 0x00907000L
Jan F. Chadima 69dd72f
 # if defined(HAVE_EVP_SHA256)
Jan F. Chadima 69dd72f
@@ -286,9 +287,13 @@ static void
Jan F. Chadima 69dd72f
 choose_enc(Enc *enc, char *client, char *server)
Jan F. Chadima 69dd72f
 {
Jan F. Chadima 69dd72f
 	char *name = match_list(client, server, NULL);
Jan F. Chadima 69dd72f
-	if (name == NULL)
Jan F. Chadima 69dd72f
+	if (name == NULL) {
Jan F. Chadima 69dd72f
+#ifdef SSH_AUDIT_EVENTS
Jan F. Chadima 69dd72f
+		audit_unsupported(0);
Jan F. Chadima 69dd72f
+#endif
Jan F. Chadima 69dd72f
 		fatal("no matching cipher found: client %s server %s",
Jan F. Chadima 69dd72f
 		    client, server);
Jan F. Chadima 69dd72f
+	}
Jan F. Chadima 69dd72f
 	if ((enc->cipher = cipher_by_name(name)) == NULL)
Jan F. Chadima 69dd72f
 		fatal("matching cipher is not supported: %s", name);
Jan F. Chadima 69dd72f
 	enc->name = name;
Jan F. Chadima 69dd72f
@@ -303,9 +308,13 @@ static void
Jan F. Chadima 69dd72f
 choose_mac(Mac *mac, char *client, char *server)
Jan F. Chadima 69dd72f
 {
Jan F. Chadima 69dd72f
 	char *name = match_list(client, server, NULL);
Jan F. Chadima 69dd72f
-	if (name == NULL)
Jan F. Chadima 69dd72f
+	if (name == NULL) {
Jan F. Chadima 69dd72f
+#ifdef SSH_AUDIT_EVENTS
Jan F. Chadima 69dd72f
+		audit_unsupported(1);
Jan F. Chadima 69dd72f
+#endif
Jan F. Chadima 69dd72f
 		fatal("no matching mac found: client %s server %s",
Jan F. Chadima 69dd72f
 		    client, server);
Jan F. Chadima 69dd72f
+	}
Jan F. Chadima 69dd72f
 	if (mac_setup(mac, name) < 0)
Jan F. Chadima 69dd72f
 		fatal("unsupported mac %s", name);
Jan F. Chadima 69dd72f
 	/* truncate the key */
Jan F. Chadima 69dd72f
@@ -320,8 +329,12 @@ static void
Jan F. Chadima 69dd72f
 choose_comp(Comp *comp, char *client, char *server)
Jan F. Chadima 69dd72f
 {
Jan F. Chadima 69dd72f
 	char *name = match_list(client, server, NULL);
Jan F. Chadima 69dd72f
-	if (name == NULL)
Jan F. Chadima 69dd72f
+	if (name == NULL) {
Jan F. Chadima 69dd72f
+#ifdef SSH_AUDIT_EVENTS
Jan F. Chadima 69dd72f
+		audit_unsupported(2);
Jan F. Chadima 69dd72f
+#endif
Jan F. Chadima 69dd72f
 		fatal("no matching comp found: client %s server %s", client, server);
Jan F. Chadima 69dd72f
+	}
Jan F. Chadima 69dd72f
 	if (strcmp(name, "zlib@openssh.com") == 0) {
Jan F. Chadima 69dd72f
 		comp->type = COMP_DELAYED;
Jan F. Chadima 69dd72f
 	} else if (strcmp(name, "zlib") == 0) {
Jan F. Chadima 69dd72f
@@ -446,6 +459,9 @@ kex_choose_conf(Kex *kex)
Jan F. Chadima 69dd72f
 		    newkeys->enc.name,
Jan F. Chadima 69dd72f
 		    newkeys->mac.name,
Jan F. Chadima 69dd72f
 		    newkeys->comp.name);
Jan F. Chadima 69dd72f
+#ifdef SSH_AUDIT_EVENTS
Jan F. Chadima 69dd72f
+		audit_kex(ctos, newkeys->enc.name, newkeys->mac.name, newkeys->comp.name);
Jan F. Chadima 69dd72f
+#endif
Jan F. Chadima 69dd72f
 	}
Jan F. Chadima 69dd72f
 	choose_kex(kex, cprop[PROPOSAL_KEX_ALGS], sprop[PROPOSAL_KEX_ALGS]);
Jan F. Chadima 69dd72f
 	choose_hostkeyalg(kex, cprop[PROPOSAL_SERVER_HOST_KEY_ALGS],
Jan F. Chadima cff1d0c
diff -up openssh-5.9p1/monitor.c.audit3 openssh-5.9p1/monitor.c
Jan F. Chadima cff1d0c
--- openssh-5.9p1/monitor.c.audit3	2011-09-14 07:05:57.952459820 +0200
Jan F. Chadima cff1d0c
+++ openssh-5.9p1/monitor.c	2011-09-14 07:05:59.272520466 +0200
Jan F. Chadima 69dd72f
@@ -97,6 +97,7 @@
Jan F. Chadima 69dd72f
 #include "ssh2.h"
Jan F. Chadima 69dd72f
 #include "jpake.h"
Jan F. Chadima 69dd72f
 #include "roaming.h"
Jan F. Chadima 69dd72f
+#include "audit.h"
Jan F. Chadima 69dd72f
 
Jan F. Chadima 69dd72f
 #ifdef GSSAPI
Jan F. Chadima 69dd72f
 static Gssctxt *gsscontext = NULL;
Jan F. Chadima 69dd72f
@@ -187,6 +188,8 @@ int mm_answer_gss_checkmic(int, Buffer *
Jan F. Chadima 69dd72f
 int mm_answer_audit_event(int, Buffer *);
Jan F. Chadima 69dd72f
 int mm_answer_audit_command(int, Buffer *);
Jan F. Chadima 69dd72f
 int mm_answer_audit_end_command(int, Buffer *);
Jan F. Chadima 69dd72f
+int mm_answer_audit_unsupported_body(int, Buffer *);
Jan F. Chadima 69dd72f
+int mm_answer_audit_kex_body(int, Buffer *);
Jan F. Chadima 69dd72f
 #endif
Jan F. Chadima 69dd72f
 
Jan F. Chadima 69dd72f
 static int monitor_read_log(struct monitor *);
Jan F. Chadima 69dd72f
@@ -237,6 +240,8 @@ struct mon_table mon_dispatch_proto20[]
Jan F. Chadima 69dd72f
 #endif
Jan F. Chadima 69dd72f
 #ifdef SSH_AUDIT_EVENTS
Jan F. Chadima 69dd72f
     {MONITOR_REQ_AUDIT_EVENT, MON_PERMIT, mm_answer_audit_event},
Jan F. Chadima 69dd72f
+    {MONITOR_REQ_AUDIT_UNSUPPORTED, MON_PERMIT, mm_answer_audit_unsupported_body},
Jan F. Chadima 69dd72f
+    {MONITOR_REQ_AUDIT_KEX, MON_PERMIT, mm_answer_audit_kex_body},
Jan F. Chadima 69dd72f
 #endif
Jan F. Chadima 69dd72f
 #ifdef BSD_AUTH
Jan F. Chadima 69dd72f
     {MONITOR_REQ_BSDAUTHQUERY, MON_ISAUTH, mm_answer_bsdauthquery},
Jan F. Chadima 69dd72f
@@ -275,6 +280,8 @@ struct mon_table mon_dispatch_postauth20
Jan F. Chadima 69dd72f
     {MONITOR_REQ_AUDIT_EVENT, MON_PERMIT, mm_answer_audit_event},
Jan F. Chadima 69dd72f
     {MONITOR_REQ_AUDIT_COMMAND, MON_PERMIT, mm_answer_audit_command},
Jan F. Chadima 69dd72f
     {MONITOR_REQ_AUDIT_END_COMMAND, MON_PERMIT, mm_answer_audit_end_command},
Jan F. Chadima 69dd72f
+    {MONITOR_REQ_AUDIT_UNSUPPORTED, MON_PERMIT, mm_answer_audit_unsupported_body},
Jan F. Chadima 69dd72f
+    {MONITOR_REQ_AUDIT_KEX, MON_PERMIT, mm_answer_audit_kex_body},
Jan F. Chadima 69dd72f
 #endif
Jan F. Chadima 69dd72f
     {0, 0, NULL}
Jan F. Chadima 69dd72f
 };
Jan F. Chadima 69dd72f
@@ -306,6 +313,8 @@ struct mon_table mon_dispatch_proto15[]
Jan F. Chadima 69dd72f
 #endif
Jan F. Chadima 69dd72f
 #ifdef SSH_AUDIT_EVENTS
Jan F. Chadima 69dd72f
     {MONITOR_REQ_AUDIT_EVENT, MON_PERMIT, mm_answer_audit_event},
Jan F. Chadima 69dd72f
+    {MONITOR_REQ_AUDIT_UNSUPPORTED, MON_PERMIT, mm_answer_audit_unsupported_body},
Jan F. Chadima 69dd72f
+    {MONITOR_REQ_AUDIT_KEX, MON_PERMIT, mm_answer_audit_kex_body},
Jan F. Chadima 69dd72f
 #endif
Jan F. Chadima 69dd72f
     {0, 0, NULL}
Jan F. Chadima 69dd72f
 };
Jan F. Chadima 69dd72f
@@ -318,6 +327,8 @@ struct mon_table mon_dispatch_postauth15
Jan F. Chadima 69dd72f
     {MONITOR_REQ_AUDIT_EVENT, MON_PERMIT, mm_answer_audit_event},
Jan F. Chadima 69dd72f
     {MONITOR_REQ_AUDIT_COMMAND, MON_PERMIT|MON_ONCE, mm_answer_audit_command},
Jan F. Chadima 69dd72f
     {MONITOR_REQ_AUDIT_END_COMMAND, MON_PERMIT, mm_answer_audit_end_command},
Jan F. Chadima 69dd72f
+    {MONITOR_REQ_AUDIT_UNSUPPORTED, MON_PERMIT, mm_answer_audit_unsupported_body},
Jan F. Chadima 69dd72f
+    {MONITOR_REQ_AUDIT_KEX, MON_PERMIT, mm_answer_audit_kex_body},
Jan F. Chadima 69dd72f
 #endif
Jan F. Chadima 69dd72f
     {0, 0, NULL}
Jan F. Chadima 69dd72f
 };
Jan F. Chadima cff1d0c
@@ -2383,3 +2394,47 @@ mm_answer_jpake_check_confirm(int sock,
Jan F. Chadima 69dd72f
 }
Jan F. Chadima 69dd72f
 
Jan F. Chadima 69dd72f
 #endif /* JPAKE */
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+#ifdef SSH_AUDIT_EVENTS
Jan F. Chadima 69dd72f
+int
Jan F. Chadima 69dd72f
+mm_answer_audit_unsupported_body(int sock, Buffer *m)
Jan F. Chadima 69dd72f
+{
Jan F. Chadima 69dd72f
+	int what;
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+	what = buffer_get_int(m);
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+	audit_unsupported_body(what);
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+	buffer_clear(m);
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+	mm_request_send(sock, MONITOR_ANS_AUDIT_UNSUPPORTED, m);
Jan F. Chadima 69dd72f
+	return 0;
Jan F. Chadima 69dd72f
+}
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+int
Jan F. Chadima 69dd72f
+mm_answer_audit_kex_body(int sock, Buffer *m)
Jan F. Chadima 69dd72f
+{
Jan F. Chadima 69dd72f
+	int ctos, len;
Jan F. Chadima 69dd72f
+	char *cipher, *mac, *compress;
Jan F. Chadima 69dd72f
+	pid_t pid;
Jan F. Chadima 69dd72f
+	uid_t uid;
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+	ctos = buffer_get_int(m);
Jan F. Chadima 69dd72f
+	cipher = buffer_get_string(m, &len;;
Jan F. Chadima 69dd72f
+	mac = buffer_get_string(m, &len;;
Jan F. Chadima 69dd72f
+	compress = buffer_get_string(m, &len;;
Jan F. Chadima 69dd72f
+	pid = buffer_get_int64(m);
Jan F. Chadima 69dd72f
+	uid = buffer_get_int64(m);
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+	audit_kex_body(ctos, cipher, mac, compress, pid, uid);
Jan F. Chadima 69dd72f
+
Jan F. Chadima cff1d0c
+	xfree(cipher);
Jan F. Chadima cff1d0c
+	xfree(mac);
Jan F. Chadima cff1d0c
+	xfree(compress);
Jan F. Chadima 69dd72f
+	buffer_clear(m);
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+	mm_request_send(sock, MONITOR_ANS_AUDIT_KEX, m);
Jan F. Chadima 69dd72f
+	return 0;
Jan F. Chadima 69dd72f
+}
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+#endif /* SSH_AUDIT_EVENTS */
Jan F. Chadima cff1d0c
diff -up openssh-5.9p1/monitor.h.audit3 openssh-5.9p1/monitor.h
Jan F. Chadima cff1d0c
--- openssh-5.9p1/monitor.h.audit3	2011-09-14 07:05:55.510580908 +0200
Jan F. Chadima cff1d0c
+++ openssh-5.9p1/monitor.h	2011-09-14 07:05:59.378647273 +0200
Jan F. Chadima 69dd72f
@@ -61,6 +61,8 @@ enum monitor_reqtype {
Jan F. Chadima 69dd72f
 	MONITOR_REQ_PAM_FREE_CTX, MONITOR_ANS_PAM_FREE_CTX,
Jan F. Chadima 69dd72f
 	MONITOR_REQ_AUDIT_EVENT, MONITOR_REQ_AUDIT_COMMAND,
Jan F. Chadima 69dd72f
 	MONITOR_ANS_AUDIT_COMMAND, MONITOR_REQ_AUDIT_END_COMMAND,
Jan F. Chadima 69dd72f
+	MONITOR_REQ_AUDIT_UNSUPPORTED, MONITOR_ANS_AUDIT_UNSUPPORTED,
Jan F. Chadima 69dd72f
+	MONITOR_REQ_AUDIT_KEX, MONITOR_ANS_AUDIT_KEX,
Jan F. Chadima 69dd72f
 	MONITOR_REQ_TERM,
Jan F. Chadima 69dd72f
 	MONITOR_REQ_JPAKE_STEP1, MONITOR_ANS_JPAKE_STEP1,
Jan F. Chadima 69dd72f
 	MONITOR_REQ_JPAKE_GET_PWDATA, MONITOR_ANS_JPAKE_GET_PWDATA,
Jan F. Chadima cff1d0c
diff -up openssh-5.9p1/monitor_wrap.c.audit3 openssh-5.9p1/monitor_wrap.c
Jan F. Chadima cff1d0c
--- openssh-5.9p1/monitor_wrap.c.audit3	2011-09-14 07:05:58.059501118 +0200
Jan F. Chadima cff1d0c
+++ openssh-5.9p1/monitor_wrap.c	2011-09-14 07:05:59.511503364 +0200
Jan F. Chadima 69dd72f
@@ -1505,3 +1505,41 @@ mm_jpake_check_confirm(const BIGNUM *k,
Jan F. Chadima 69dd72f
 	return success;
Jan F. Chadima 69dd72f
 }
Jan F. Chadima 69dd72f
 #endif /* JPAKE */
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+#ifdef SSH_AUDIT_EVENTS
Jan F. Chadima 69dd72f
+void
Jan F. Chadima 69dd72f
+mm_audit_unsupported_body(int what)
Jan F. Chadima 69dd72f
+{
Jan F. Chadima 69dd72f
+	Buffer m;
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+	buffer_init(&m);
Jan F. Chadima 69dd72f
+	buffer_put_int(&m, what);
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_UNSUPPORTED, &m);
Jan F. Chadima 69dd72f
+	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_AUDIT_UNSUPPORTED,
Jan F. Chadima 69dd72f
+				  &m);
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+	buffer_free(&m);
Jan F. Chadima 69dd72f
+}
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+void
Jan F. Chadima 69dd72f
+mm_audit_kex_body(int ctos, char *cipher, char *mac, char *compress, pid_t pid,
Jan F. Chadima 69dd72f
+		  uid_t uid)
Jan F. Chadima 69dd72f
+{
Jan F. Chadima 69dd72f
+	Buffer m;
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+	buffer_init(&m);
Jan F. Chadima 69dd72f
+	buffer_put_int(&m, ctos);
Jan F. Chadima 69dd72f
+	buffer_put_cstring(&m, cipher);
Jan F. Chadima 69dd72f
+	buffer_put_cstring(&m, mac);
Jan F. Chadima 69dd72f
+	buffer_put_cstring(&m, compress);
Jan F. Chadima 69dd72f
+	buffer_put_int64(&m, pid);
Jan F. Chadima 69dd72f
+	buffer_put_int64(&m, uid);
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+	mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_KEX, &m);
Jan F. Chadima 69dd72f
+	mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_AUDIT_KEX,
Jan F. Chadima 69dd72f
+				  &m);
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
+	buffer_free(&m);
Jan F. Chadima 69dd72f
+}
Jan F. Chadima 69dd72f
+#endif /* SSH_AUDIT_EVENTS */
Jan F. Chadima cff1d0c
diff -up openssh-5.9p1/monitor_wrap.h.audit3 openssh-5.9p1/monitor_wrap.h
Jan F. Chadima cff1d0c
--- openssh-5.9p1/monitor_wrap.h.audit3	2011-09-14 07:05:58.171521245 +0200
Jan F. Chadima cff1d0c
+++ openssh-5.9p1/monitor_wrap.h	2011-09-14 07:05:59.624646515 +0200
Jan F. Chadima 69dd72f
@@ -78,6 +78,8 @@ void mm_sshpam_free_ctx(void *);
Jan F. Chadima 69dd72f
 void mm_audit_event(ssh_audit_event_t);
Jan F. Chadima 69dd72f
 int mm_audit_run_command(const char *);
Jan F. Chadima 69dd72f
 void mm_audit_end_command(int, const char *);
Jan F. Chadima 69dd72f
+void mm_audit_unsupported_body(int);
Jan F. Chadima 69dd72f
+void mm_audit_kex_body(int, char *, char *, char *, pid_t, uid_t);
Jan F. Chadima 69dd72f
 #endif
Jan F. Chadima 69dd72f
 
Jan F. Chadima 69dd72f
 struct Session;
Jan F. Chadima cff1d0c
diff -up openssh-5.9p1/sshd.c.audit3 openssh-5.9p1/sshd.c
Jan F. Chadima cff1d0c
--- openssh-5.9p1/sshd.c.audit3	2011-09-14 07:05:56.554583874 +0200
Jan F. Chadima cff1d0c
+++ openssh-5.9p1/sshd.c	2011-09-14 07:05:59.828466112 +0200
Jan F. Chadima 69dd72f
@@ -118,6 +118,7 @@
Jan F. Chadima 69dd72f
 #endif
Jan F. Chadima 69dd72f
 #include "monitor_wrap.h"
Jan F. Chadima 69dd72f
 #include "roaming.h"
Jan F. Chadima 69dd72f
+#include "audit.h"
Jan F. Chadima 69dd72f
 #include "ssh-sandbox.h"
Jan F. Chadima 69dd72f
 #include "version.h"
Jan F. Chadima 69dd72f
 
Jan F. Chadima cff1d0c
@@ -2209,6 +2210,10 @@ do_ssh1_kex(void)
Jan F. Chadima 69dd72f
 		if (cookie[i] != packet_get_char())
Jan F. Chadima 69dd72f
 			packet_disconnect("IP Spoofing check bytes do not match.");
Jan F. Chadima 69dd72f
 
Jan F. Chadima 69dd72f
+#ifdef SSH_AUDIT_EVENTS
Jan F. Chadima 69dd72f
+	audit_kex(2, cipher_name(cipher_type), "crc", "none");
Jan F. Chadima 69dd72f
+#endif
Jan F. Chadima 69dd72f
+
Jan F. Chadima 69dd72f
 	debug("Encryption type: %.200s", cipher_name(cipher_type));
Jan F. Chadima 69dd72f
 
Jan F. Chadima 69dd72f
 	/* Get the encrypted integer. */