]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream: support for RFC4648 base64url encoding; ok markus
authordjm@openbsd.org <djm@openbsd.org>
Mon, 22 Jun 2020 05:54:10 +0000 (05:54 +0000)
committerDamien Miller <djm@mindrot.org>
Mon, 22 Jun 2020 06:11:14 +0000 (16:11 +1000)
OpenBSD-Commit-ID: 0ef22c55e772dda05c112c88412c0797fec66eb4

sshbuf-misc.c
sshbuf.h

index 86e5fa34f2336dd97b2d8ee17c116cad9f86fdf6..afaab8d61c8ba8138866ea4188c68f1805b56bce 100644 (file)
@@ -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
  *
@@ -167,6 +167,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)
 {
index ec7514eb31544df988a4a5d94e6ce7bcc45f1467..2ad0e61be120d9d657b9b124618ad4a21b0ae78f 100644 (file)
--- a/sshbuf.h
+++ b/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
  *
@@ -253,6 +253,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);