summaryrefslogtreecommitdiff
path: root/sshkey.c
diff options
context:
space:
mode:
authordjm@openbsd.org <djm@openbsd.org>2018-09-12 01:32:54 +0000
committerDamien Miller <djm@mindrot.org>2018-09-12 16:49:21 +1000
commitba9e788315b1f6a350f910cb2a9e95b2ce584e89 (patch)
tree2bc5013faf5d1c4daf26d6db1547aa7602e59306 /sshkey.c
parenta70fd4ad7bd9f2ed223ff635a3d41e483057f23b (diff)
upstream: add sshkey_check_cert_sigtype() that checks a
cert->signature_type against a supplied whitelist; ok markus OpenBSD-Commit-ID: caadb8073292ed7a9535e5adc067d11d356d9302
Diffstat (limited to 'sshkey.c')
-rw-r--r--sshkey.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/sshkey.c b/sshkey.c
index b467571f..50ebdc25 100644
--- a/sshkey.c
+++ b/sshkey.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshkey.c,v 1.67 2018/09/12 01:31:30 djm Exp $ */
+/* $OpenBSD: sshkey.c,v 1.68 2018/09/12 01:32:54 djm Exp $ */
/*
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
* Copyright (c) 2008 Alexander von Gernler. All rights reserved.
@@ -2261,6 +2261,27 @@ get_sigtype(const u_char *sig, size_t siglen, char **sigtypep)
}
/*
+ *
+ * Checks whether a certificate's signature type is allowed.
+ * Returns 0 (success) if the certificate signature type appears in the
+ * "allowed" pattern-list, or the key is not a certificate to begin with.
+ * Otherwise returns a ssherr.h code.
+ */
+int
+sshkey_check_cert_sigtype(const struct sshkey *key, const char *allowed)
+{
+ if (key == NULL || allowed == NULL)
+ return SSH_ERR_INVALID_ARGUMENT;
+ if (!sshkey_type_is_cert(key->type))
+ return 0;
+ if (key->cert == NULL || key->cert->signature_type == NULL)
+ return SSH_ERR_INVALID_ARGUMENT;
+ if (match_pattern_list(key->cert->signature_type, allowed, 0) != 1)
+ return SSH_ERR_SIGN_ALG_UNSUPPORTED;
+ return 0;
+}
+
+/*
* Returns the expected signature algorithm for a given public key algorithm.
*/
const char *