diff options
author | djm@openbsd.org <djm@openbsd.org> | 2020-06-22 05:54:10 +0000 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2020-06-22 16:11:14 +1000 |
commit | 12848191f8fe725af4485d3600e0842d92f8637f (patch) | |
tree | 89f14e47a454dec73067e2f1c631d7ce6f65a664 /sshbuf-misc.c | |
parent | 473b4af43db12127137c7fc1a10928313f5a16d2 (diff) | |
download | openssh-git-12848191f8fe725af4485d3600e0842d92f8637f.tar.gz |
upstream: support for RFC4648 base64url encoding; ok markus
OpenBSD-Commit-ID: 0ef22c55e772dda05c112c88412c0797fec66eb4
Diffstat (limited to 'sshbuf-misc.c')
-rw-r--r-- | sshbuf-misc.c | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/sshbuf-misc.c b/sshbuf-misc.c index 86e5fa34..afaab8d6 100644 --- a/sshbuf-misc.c +++ b/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 * @@ -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) { |