summaryrefslogtreecommitdiff
path: root/usr.bin/ssh
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/ssh')
-rw-r--r--usr.bin/ssh/sshbuf-misc.c45
-rw-r--r--usr.bin/ssh/sshbuf.h4
2 files changed, 47 insertions, 2 deletions
diff --git a/usr.bin/ssh/sshbuf-misc.c b/usr.bin/ssh/sshbuf-misc.c
index 287eb28552c..4255c14e74d 100644
--- a/usr.bin/ssh/sshbuf-misc.c
+++ b/usr.bin/ssh/sshbuf-misc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshbuf-misc.c,v 1.15 2020/06/05 03:24:36 djm Exp $ */
+/* $OpenBSD: sshbuf-misc.c,v 1.16 2020/06/22 05:54:10 djm Exp $ */
/*
* Copyright (c) 2011 Damien Miller
*
@@ -163,6 +163,49 @@ sshbuf_b64tod(struct sshbuf *buf, const char *b64)
return 0;
}
+int
+sshbuf_dtourlb64(const struct sshbuf *d, struct sshbuf *b64, int wrap)
+{
+ int r = SSH_ERR_INTERNAL_ERROR;
+ u_char *p;
+ struct sshbuf *b = NULL;
+ size_t i, l;
+
+ if ((b = sshbuf_new()) == NULL)
+ return SSH_ERR_ALLOC_FAIL;
+ /* Encode using regular base64; we'll transform it once done */
+ if ((r = sshbuf_dtob64(d, b, wrap)) != 0)
+ goto out;
+ /* remove padding from end of encoded string*/
+ for (;;) {
+ l = sshbuf_len(b);
+ if (l <= 1 || sshbuf_ptr(b) == NULL) {
+ r = SSH_ERR_INTERNAL_ERROR;
+ goto out;
+ }
+ if (sshbuf_ptr(b)[l - 1] != '=')
+ break;
+ if ((r = sshbuf_consume_end(b, 1)) != 0)
+ goto out;
+ }
+ /* Replace characters with rfc4648 equivalents */
+ l = sshbuf_len(b);
+ if ((p = sshbuf_mutable_ptr(b)) == NULL) {
+ r = SSH_ERR_INTERNAL_ERROR;
+ goto out;
+ }
+ for (i = 0; i < l; i++) {
+ if (p[i] == '+')
+ p[i] = '-';
+ else if (p[i] == '/')
+ p[i] = '_';
+ }
+ r = sshbuf_putb(b64, b);
+ out:
+ sshbuf_free(b);
+ return r;
+}
+
char *
sshbuf_dup_string(struct sshbuf *buf)
{
diff --git a/usr.bin/ssh/sshbuf.h b/usr.bin/ssh/sshbuf.h
index 2d90a052efe..2b77d154afb 100644
--- a/usr.bin/ssh/sshbuf.h
+++ b/usr.bin/ssh/sshbuf.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: sshbuf.h,v 1.22 2020/06/05 03:24:36 djm Exp $ */
+/* $OpenBSD: sshbuf.h,v 1.23 2020/06/22 05:54:10 djm Exp $ */
/*
* Copyright (c) 2011 Damien Miller
*
@@ -254,6 +254,8 @@ char *sshbuf_dtob16(struct sshbuf *buf);
/* Encode the contents of the buffer as base64 */
char *sshbuf_dtob64_string(const struct sshbuf *buf, int wrap);
int sshbuf_dtob64(const struct sshbuf *d, struct sshbuf *b64, int wrap);
+/* RFC4648 "base64url" encoding variant */
+int sshbuf_dtourlb64(const struct sshbuf *d, struct sshbuf *b64, int wrap);
/* Decode base64 data and append it to the buffer */
int sshbuf_b64tod(struct sshbuf *buf, const char *b64);