upstream: support for RFC4648 base64url encoding; ok markus

OpenBSD-Commit-ID: 0ef22c55e772dda05c112c88412c0797fec66eb4
This commit is contained in:
djm@openbsd.org 2020-06-22 05:54:10 +00:00 committed by Damien Miller
parent 473b4af43d
commit 12848191f8
2 changed files with 47 additions and 2 deletions

View 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 * Copyright (c) 2011 Damien Miller
* *
@ -167,6 +167,49 @@ sshbuf_b64tod(struct sshbuf *buf, const char *b64)
return 0; 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 * char *
sshbuf_dup_string(struct sshbuf *buf) sshbuf_dup_string(struct sshbuf *buf)
{ {

View File

@ -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 * Copyright (c) 2011 Damien Miller
* *
@ -253,6 +253,8 @@ char *sshbuf_dtob16(struct sshbuf *buf);
/* Encode the contents of the buffer as base64 */ /* Encode the contents of the buffer as base64 */
char *sshbuf_dtob64_string(const struct sshbuf *buf, int wrap); char *sshbuf_dtob64_string(const struct sshbuf *buf, int wrap);
int sshbuf_dtob64(const struct sshbuf *d, struct sshbuf *b64, 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 */ /* Decode base64 data and append it to the buffer */
int sshbuf_b64tod(struct sshbuf *buf, const char *b64); int sshbuf_b64tod(struct sshbuf *buf, const char *b64);