Vishal Mishra 7bfe72
Index: openssh-9.9p1/regress/slog.sh
Vishal Mishra 7bfe72
===================================================================
Vishal Mishra 7bfe72
--- openssh-9.9p1.orig/regress/slog.sh
Vishal Mishra 7bfe72
+++ openssh-9.9p1/regress/slog.sh
Vishal Mishra 7bfe72
@@ -1,41 +1,60 @@
Vishal Mishra 7bfe72
 tid='structured log'
Vishal Mishra 7bfe72
 
Vishal Mishra 7bfe72
-port="4242"
Vishal Mishra 7bfe72
 log_prefix="sshd_auth_msg:"
Vishal Mishra 7bfe72
-log_keys="server_ip server_port remote_ip remote_port pid session_id method cert_id cert_serial principal user session_state auth_successful _time command end_time duration auth_info client_version"
Vishal Mishra 7bfe72
+log_keys="server_ip server_port remote_ip remote_port pid session_id method cert_id cert_serial principal user session_state auth_successful command end_time duration auth_info client_version"
Vishal Mishra 7bfe72
 do_log_json="yes"
Vishal Mishra 7bfe72
-test_config="$OBJ/sshd2_config"
Vishal Mishra 7bfe72
-old_config="$OBJ/sshd_config"
Vishal Mishra 7bfe72
-PIDFILE=$OBJ/pidfile
Vishal Mishra 7bfe72
-
Vishal Mishra 7bfe72
-cat << EOF > $test_config
Vishal Mishra 7bfe72
-	#*:
Vishal Mishra 7bfe72
-	StrictModes             no
Vishal Mishra 7bfe72
-	Port                    $port
Vishal Mishra 7bfe72
-	AddressFamily           inet
Vishal Mishra 7bfe72
-	ListenAddress           127.0.0.1
Vishal Mishra 7bfe72
-	#ListenAddress          ::1
Vishal Mishra 7bfe72
-	PidFile                 $PIDFILE
Vishal Mishra 7bfe72
-	AuthorizedKeysFile      $OBJ/authorized_keys_%u
Vishal Mishra 7bfe72
-	LogLevel                ERROR
Vishal Mishra 7bfe72
-	AcceptEnv               _XXX_TEST_*
Vishal Mishra 7bfe72
-	AcceptEnv               _XXX_TEST
Vishal Mishra 7bfe72
-	HostKey $OBJ/host.ssh-ed25519
Vishal Mishra 7bfe72
-	LogFormatPrefix $log_prefix
Vishal Mishra 7bfe72
-	LogFormatJson $do_log_json
Vishal Mishra 7bfe72
-	LogFormatKeys $log_keys
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+AUTH_PRINC_FILE="$OBJ/auth_principals"
Vishal Mishra 7bfe72
+CA_FILE="$OBJ/ca-rsa"
Vishal Mishra 7bfe72
+IDENTITY_FILE="$OBJ/$USER-rsa"
Vishal Mishra 7bfe72
+CERT_ID=$USER
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+cat << EOF >>	$OBJ/sshd_config
Vishal Mishra 7bfe72
+TrustedUserCAKeys $CA_FILE.pub
Vishal Mishra 7bfe72
+PubkeyAuthentication yes
Vishal Mishra 7bfe72
+AuthenticationMethods publickey
Vishal Mishra 7bfe72
+AuthorizedPrincipalsFile $AUTH_PRINC_FILE
Vishal Mishra 7bfe72
+LogFormatPrefix $log_prefix
Vishal Mishra 7bfe72
+LogFormatJson $do_log_json
Vishal Mishra 7bfe72
+LogFormatKeys $log_keys
Vishal Mishra 7bfe72
 EOF
Vishal Mishra 7bfe72
 
Vishal Mishra 7bfe72
+sed -i 's/DEBUG3/VERBOSE/g' $OBJ/sshd_config
Vishal Mishra 7bfe72
 
Vishal Mishra 7bfe72
-cp $test_config $old_config
Vishal Mishra 7bfe72
-start_sshd
Vishal Mishra 7bfe72
+cleanup() {
Vishal Mishra 7bfe72
+	rm -f $CA_FILE{.pub,}
Vishal Mishra 7bfe72
+	rm -f $IDENTITY_FILE{-cert.pub,.pub,}
Vishal Mishra 7bfe72
+	rm -f $AUTH_PRINC_FILE
Vishal Mishra 7bfe72
+	rm -f $TEST_SSHD_LOGFILE
Vishal Mishra 7bfe72
+}
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+make_keys() {
Vishal Mishra 7bfe72
+	local keytype=$1
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+	rm -f $IDENTITY_FILE{.pub,}
Vishal Mishra 7bfe72
+	${SSHKEYGEN} -q -t $keytype -C '' -N '' -f $IDENTITY_FILE ||
Vishal Mishra 7bfe72
+	    fatal 'Could not create keypair'
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+	cat $IDENTITY_FILE.pub > authorized_keys_$USER
Vishal Mishra 7bfe72
+	${SSHKEYGEN} -lf $IDENTITY_FILE
Vishal Mishra 7bfe72
+}
Vishal Mishra 7bfe72
 
Vishal Mishra 7bfe72
-${SSH} -F $OBJ/ssh_config somehost true
Vishal Mishra 7bfe72
-if [ $? -ne 0 ]; then
Vishal Mishra 7bfe72
-	fail "ssh connect with failed"
Vishal Mishra 7bfe72
-fi
Vishal Mishra 7bfe72
+make_cert() {
Vishal Mishra 7bfe72
+	local princs=$1
Vishal Mishra 7bfe72
+	local certtype=$2
Vishal Mishra 7bfe72
+	local serial=$3
Vishal Mishra 7bfe72
 
Vishal Mishra 7bfe72
-test_log_counts() {
Vishal Mishra 7bfe72
+	rm -f $CA_FILE
Vishal Mishra 7bfe72
+	rm -f "$IDENTITY_FILE-cert.pub"
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+	${SSHKEYGEN} -q -t $certtype -C '' -N '' -f $CA_FILE ||
Vishal Mishra 7bfe72
+	    fatal 'Could not create CA key'
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+	${SSHKEYGEN} -q -s $CA_FILE -I $CERT_ID -n "$princs" -z $serial "$IDENTITY_FILE.pub" ||
Vishal Mishra 7bfe72
+	    fatal "Could not create SSH cert"
Vishal Mishra 7bfe72
+}
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+do_test_log_counts() {
Vishal Mishra 7bfe72
 	cnt=$(grep -c "$log_prefix" "$TEST_SSHD_LOGFILE")
Vishal Mishra 7bfe72
 	if [ $cnt -ne 2 ]; then
Vishal Mishra 7bfe72
 		fail "expected 2 structured logging lines, got $cnt"
Vishal Mishra 7bfe72
@@ -43,7 +62,10 @@ test_log_counts() {
Vishal Mishra 7bfe72
 }
Vishal Mishra 7bfe72
 
Vishal Mishra 7bfe72
 test_json_valid() {
Vishal Mishra 7bfe72
-	which python &>/dev/null || echo 'python not found in path, skipping tests'
Vishal Mishra 7bfe72
+	if ! $(which python &>/dev/null) ; then
Vishal Mishra 7bfe72
+		 echo 'python not found in path, skipping JSON tests'
Vishal Mishra 7bfe72
+		 return 1
Vishal Mishra 7bfe72
+	fi
Vishal Mishra 7bfe72
 
Vishal Mishra 7bfe72
 	loglines=$(cat "$TEST_SSHD_LOGFILE" | grep "$log_prefix")
Vishal Mishra 7bfe72
 	first=$(echo "$loglines" | head -n1)
Vishal Mishra 7bfe72
@@ -55,5 +77,72 @@ test_json_valid() {
Vishal Mishra 7bfe72
 	    || fail "invalid json structure $last"
Vishal Mishra 7bfe72
 }
Vishal Mishra 7bfe72
 
Vishal Mishra 7bfe72
-test_log_counts
Vishal Mishra 7bfe72
-test_json_valid
Vishal Mishra 7bfe72
+# todo: first/last line
Vishal Mishra 7bfe72
+extract_key() {
Vishal Mishra 7bfe72
+	local key=$1
Vishal Mishra 7bfe72
+	loglines=$(cat "$TEST_SSHD_LOGFILE" | grep "$log_prefix")
Vishal Mishra 7bfe72
+	last=$(echo "$loglines" | tail -n1)
Vishal Mishra 7bfe72
+	json=${last:$(expr length $log_prefix)}
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+	val=$(echo $json | python -c "import sys, json; print(json.load(sys.stdin)[\"$key\"])") ||
Vishal Mishra 7bfe72
+	    fail "error extracting $key from $json"
Vishal Mishra 7bfe72
+	echo "$val"
Vishal Mishra 7bfe72
+}
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+test_basic_logging() {
Vishal Mishra 7bfe72
+	${SSH} -F $OBJ/ssh_config -v -i "$IDENTITY_FILE" somehost true ||
Vishal Mishra 7bfe72
+		    fatal "SSH failed"
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+	do_test_log_counts
Vishal Mishra 7bfe72
+	test_json_valid || return 1
Vishal Mishra 7bfe72
+}
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+extract_hash() {
Vishal Mishra 7bfe72
+	local source=$1
Vishal Mishra 7bfe72
+	echo $source | sed "s/.*\(SHA256:[[:print:]]\{43\}\).*$/\1/"
Vishal Mishra 7bfe72
+}
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+test_auth_info() {
Vishal Mishra 7bfe72
+	local keyfp=$1
Vishal Mishra 7bfe72
+	local keytype=$2
Vishal Mishra 7bfe72
+	local princ=$3
Vishal Mishra 7bfe72
+	local serial=$4
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+	${SSH} -F $OBJ/ssh_config -v -i "$IDENTITY_FILE" somehost true ||
Vishal Mishra 7bfe72
+	    fatal "SSH failed"
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+	auth_info=$(extract_key 'auth_info')
Vishal Mishra 7bfe72
+	digest=$(extract_hash "$keyfp")
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+	[ -z "$keyfp" ] || echo "$auth_info" | grep -q "$digest" ||
Vishal Mishra 7bfe72
+		echo "hash digest not found"
Vishal Mishra 7bfe72
+	[ -z "$keytype" ] || echo "$auth_info" | grep -q "$keytype" ||
Vishal Mishra 7bfe72
+		echo "keytype not found"
Vishal Mishra 7bfe72
+	[ -z "$princ" ] || echo "$auth_info" | grep -q "$princ" ||
Vishal Mishra 7bfe72
+		echo "princ not found"
Vishal Mishra 7bfe72
+	[ -z "$serial" ] || echo "$auth_info" | grep -q "$serial" ||
Vishal Mishra 7bfe72
+		echo "serial not found"
Vishal Mishra 7bfe72
+}
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+test_cert_serial() {
Vishal Mishra 7bfe72
+	local serial=$1
Vishal Mishra 7bfe72
+	logged_serial=$(extract_key 'cert_serial')
Vishal Mishra 7bfe72
+	 [ $serial = $logged_serial ] || fail 'cert serial mismatch'
Vishal Mishra 7bfe72
+}
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+start_sshd
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+keytype="RSA"
Vishal Mishra 7bfe72
+keyfp=$(make_keys $keytype)
Vishal Mishra 7bfe72
+test_basic_logging || return
Vishal Mishra 7bfe72
+test_auth_info "$keyfp" "$keytype"
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+rm authorized_keys_$USER # force cert auth
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+princ="$USER"
Vishal Mishra 7bfe72
+echo $princ > $AUTH_PRINC_FILE
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
+serial='42'
Vishal Mishra 7bfe72
+make_cert "$princ" "$keytype" "$serial"
Vishal Mishra 7bfe72
+test_auth_info "$keyfp" "$keytype" "$princ" "$serial"
Vishal Mishra 7bfe72
+test_cert_serial "$serial"
Vishal Mishra 7bfe72
Index: openssh-9.9p1/auth.c
Vishal Mishra 7bfe72
===================================================================
Vishal Mishra 7bfe72
--- openssh-9.9p1.orig/auth.c
Vishal Mishra 7bfe72
+++ openssh-9.9p1/auth.c
Vishal Mishra 7bfe72
@@ -305,6 +305,8 @@ auth_log(struct ssh *ssh, int authentica
Vishal Mishra 7bfe72
 	    extra != NULL ? ": " : "",
Vishal Mishra 7bfe72
 	    extra != NULL ? extra : "");
Vishal Mishra 7bfe72
 
Vishal Mishra 7bfe72
+	if (extra != NULL)
Vishal Mishra 7bfe72
+		slog_set_auth_info(extra);
Vishal Mishra 7bfe72
 	free(extra);
Vishal Mishra 7bfe72
 	slog_set_auth_data(authenticated, method, authctxt->user);
Vishal Mishra 7bfe72
 
Vishal Mishra 7bfe72
Index: openssh-9.9p1/auth2-pubkey.c
Vishal Mishra 7bfe72
===================================================================
Vishal Mishra 7bfe72
--- openssh-9.9p1.orig/auth2-pubkey.c
Vishal Mishra 7bfe72
+++ openssh-9.9p1/auth2-pubkey.c
Vishal Mishra 7bfe72
@@ -612,6 +612,8 @@ user_cert_trusted_ca(struct passwd *pw,
Vishal Mishra 7bfe72
 		final_opts = NULL;
Vishal Mishra 7bfe72
 	}
Vishal Mishra 7bfe72
 	slog_set_cert_id(key->cert->key_id);
Vishal Mishra 7bfe72
+	slog_set_cert_serial((unsigned long long) key->cert->serial);
Vishal Mishra 7bfe72
+
Vishal Mishra 7bfe72
 	ret = 1;
Vishal Mishra 7bfe72
  out:
Vishal Mishra 7bfe72
 	sshauthopt_free(principals_opts);