Jakub Jelen 57e280
diff --git a/monitor.c b/monitor.c
Jakub Jelen 57e280
index 12b33e7..a1c3c97 100644
Jakub Jelen 57e280
--- a/monitor.c
Jakub Jelen 57e280
+++ b/monitor.c
Jakub Jelen 57e280
@@ -875,6 +875,34 @@ mm_answer_bsdauthrespond(int sock, struct sshbuf *m)
Jakub Jelen 57e280
 }
Jakub Jelen 57e280
 #endif
Jakub Jelen 57e280
 
Jakub Jelen 57e280
+/*
Jakub Jelen 57e280
+ * Check that the key type appears in the supplied pattern list, ignoring
Jakub Jelen 57e280
+ * mismastches in the signature algorithm. (Signature algorithm checks are
Jakub Jelen 57e280
+ * performed in the unprivileged authentication code).
Jakub Jelen 57e280
+ * Returns 1 on success, 0 otherwise.
Jakub Jelen 57e280
+ */
Jakub Jelen 57e280
+static int
Jakub Jelen 57e280
+key_base_type_match(const struct sshkey *key, const char *list)
Jakub Jelen 57e280
+{
Jakub Jelen 57e280
+	char *s, *l, *ol = xstrdup(list);
Jakub Jelen 57e280
+	int found = 0;
Jakub Jelen 57e280
+
Jakub Jelen 57e280
+	l = ol;
Jakub Jelen 57e280
+	for ((s = strsep(&l, ",")); s && *s != '\0'; (s = strsep(&l, ","))) {
Jakub Jelen 57e280
+		if (sshkey_type_from_name(s) == key->type) {
Jakub Jelen 57e280
+			found = 1;
Jakub Jelen 57e280
+			break;
Jakub Jelen 57e280
+		}
Jakub Jelen 57e280
+	}
Jakub Jelen 57e280
+	if (!found) {
Jakub Jelen 57e280
+		debug("key type %s does not appear in list %s",
Jakub Jelen 57e280
+		    sshkey_ssh_name(key), list);
Jakub Jelen 57e280
+	}
Jakub Jelen 57e280
+
Jakub Jelen 57e280
+	free(ol);
Jakub Jelen 57e280
+	return found;
Jakub Jelen 57e280
+}
Jakub Jelen 57e280
+
Jakub Jelen 57e280
 int
Jakub Jelen 57e280
 mm_answer_keyallowed(int sock, struct sshbuf *m)
Jakub Jelen 57e280
 {
Jakub Jelen 57e280
@@ -909,8 +937,8 @@ mm_answer_keyallowed(int sock, struct sshbuf *m)
Jakub Jelen 57e280
 				break;
Jakub Jelen 57e280
 			if (auth2_key_already_used(authctxt, key))
Jakub Jelen 57e280
 				break;
Jakub Jelen 57e280
-			if (match_pattern_list(sshkey_ssh_name(key),
Jakub Jelen 57e280
-			    options.pubkey_key_types, 0) != 1)
Jakub Jelen 57e280
+			if (!key_base_type_match(key,
Jakub Jelen 57e280
+			    options.pubkey_key_types))
Jakub Jelen 57e280
 				break;
Jakub Jelen 57e280
 			allowed = user_key_allowed(ssh, authctxt->pw, key,
Jakub Jelen 57e280
 			    pubkey_auth_attempt, &opts);
Jakub Jelen 57e280
@@ -921,8 +949,8 @@ mm_answer_keyallowed(int sock, struct sshbuf *m)
Jakub Jelen 57e280
 				break;
Jakub Jelen 57e280
 			if (auth2_key_already_used(authctxt, key))
Jakub Jelen 57e280
 				break;
Jakub Jelen 57e280
-			if (match_pattern_list(sshkey_ssh_name(key),
Jakub Jelen 57e280
-			    options.hostbased_key_types, 0) != 1)
Jakub Jelen 57e280
+			if (!key_base_type_match(key,
Jakub Jelen 57e280
+			    options.hostbased_key_types))
Jakub Jelen 57e280
 				break;
Jakub Jelen 57e280
 			allowed = hostbased_key_allowed(authctxt->pw,
Jakub Jelen 57e280
 			    cuser, chost, key);
Jakub Jelen 57e280