[PATCH] Function to dump revoked keys from KRL

Douglas Temple doug at commodityvectors.com
Tue Jan 31 22:35:21 AEDT 2017


Hello,

I am currently using the KRL functionality of OpenSSH, and have
written a convenience function for getting the set of revoked keys (in
whatever format they have been stored) in the KRL. The patch, with the
openssh-portable commit ID b109ce92aae0ca0376dce9513d953be60e449ae1 as
the reference, is inline because I'm not sure if the list server
accepts x-patch MIME type (so apologies for the long email). I would
be happy to modify this if there are standards that I have failed to
follow. This is my first time contributing to a OpenBSD project, so
things may not be completely up to scratch on my end. I would also be
happy to answer any questions about this.

Thanks,

Doug

diff --git a/krl.c b/krl.c
index e271a193..9fa03e68 100644
--- a/krl.c
+++ b/krl.c
@@ -28,6 +28,7 @@
 #include <string.h>
 #include <time.h>
 #include <unistd.h>
+#include <inttypes.h>

 #include "sshbuf.h"
 #include "ssherr.h"
@@ -37,6 +38,7 @@
 #include "log.h"
 #include "digest.h"
 #include "bitmap.h"
+#include "uuencode.h"

 #include "krl.h"

@@ -185,6 +187,50 @@ ssh_krl_free(struct ssh_krl *krl)
 }

 void
+ssh_krl_dump(struct ssh_krl *krl)
+{
+       struct revoked_certs *rc, *trc;
+       struct revoked_key_id *rki, *tki;
+       struct revoked_serial *rs, *trs;
+       struct revoked_blob *rb, *trb;
+       struct sshbuf *sect;
+       int retval;
+
+       if (krl == NULL)
+               return;
+
+       TAILQ_FOREACH_SAFE(rc, &krl->revoked_certs, entry, trc) {
+               RB_FOREACH_SAFE(rki, revoked_key_id_tree,
&rc->revoked_key_ids, tki) {
+                       KRL_DBG(("%s: Key ID %s", __func__, rki->key_id));
+                       printf("Key ID: %s\n", rki->key_id);
+               }
+               RB_FOREACH_SAFE(rs, revoked_serial_tree,
&rc->revoked_serials, trs) {
+                       KRL_DBG(("%s: serial range %zu-%zu\n",
__func__, rs->lo, rs->hi));
+                       if(rs->lo == rs->hi) {
+                               printf("Serial Number: %zu\n", rs->lo);
+                       }
+                       else {
+                               printf("Serial Range: %zu-%zu\n",
rs->lo, rs->hi);
+                       }
+               }
+       }
+       if ((sect = sshbuf_new()) == NULL)
+               fatal("Error allocating buffer");
+       RB_FOREACH_SAFE(rb, revoked_blob_tree, &krl->revoked_sha1s, trb) {
+               retval = 0;
+               /* binary -> base64 will always be less than twice the
size of the binary repr */
+               retval = uuencode(rb->blob, rb->len,
sshbuf_mutable_ptr(sect), 2 * rb->len);
+               if (retval == -1) {
+                       fatal("Error encoding SHA1 blob");
+               }
+               KRL_DBG(("%s: SHA1 %s\n", __func__, rb->blob));
+               printf("SHA1 Digest: %s\n", sshbuf_ptr(sect));
+               sshbuf_reset(sect);
+       }
+       sshbuf_free(sect);
+}
+
+void
 ssh_krl_set_version(struct ssh_krl *krl, u_int64_t version)
 {
        krl->krl_version = version;
diff --git a/krl.h b/krl.h
index 675496cc..bf5b7e3f 100644
--- a/krl.h
+++ b/krl.h
@@ -59,6 +59,7 @@ int ssh_krl_from_blob(struct sshbuf *buf, struct
ssh_krl **krlp,
     const struct sshkey **sign_ca_keys, size_t nsign_ca_keys);
 int ssh_krl_check_key(struct ssh_krl *krl, const struct sshkey *key);
 int ssh_krl_file_contains_key(const char *path, const struct sshkey *key);
+void ssh_krl_dump(struct ssh_krl *krl);

 #endif /* _KRL_H */

diff --git a/ssh-keygen.1 b/ssh-keygen.1
index ce2213c7..17c873d5 100644
--- a/ssh-keygen.1
+++ b/ssh-keygen.1
@@ -134,7 +134,7 @@
 .Nm ssh-keygen
 .Fl Q
 .Fl f Ar krl_file
-.Ar
+.Op Ar
 .Ek
 .Sh DESCRIPTION
 .Nm
@@ -494,7 +494,7 @@ The program will prompt for the file
 containing the private key, for the old passphrase, and twice for the
 new passphrase.
 .It Fl Q
-Test whether keys have been revoked in a KRL.
+Test whether keys have been revoked, or display all revoked keys
stored, in a KRL.
 .It Fl q
 Silence
 .Nm ssh-keygen .
@@ -793,6 +793,8 @@ then
 .Nm
 will exit with a non-zero exit status.
 A zero exit status will only be returned if no key was revoked.
+If no keys are provided, then all revoked keys stored in the KRL are printed.
+The format of the output depends on how each of the revoked keys were stored.
 .Sh FILES
 .Bl -tag -width Ds -compact
 .It Pa ~/.ssh/identity
diff --git a/ssh-keygen.c b/ssh-keygen.c
index 2a7939bf..233f7025 100644
--- a/ssh-keygen.c
+++ b/ssh-keygen.c
@@ -2199,6 +2199,9 @@ do_check_krl(struct passwd *pw, int argc, char **argv)
                sshkey_free(k);
                free(comment);
        }
+       if (argc == 0) {
+               ssh_krl_dump(krl);
+       }
        ssh_krl_free(krl);
        exit(ret);
 }


More information about the openssh-unix-dev mailing list