mirror of git://anongit.mindrot.org/openssh.git
upstream: support for RFC4648 base64url encoding; ok markus
OpenBSD-Commit-ID: 0ef22c55e772dda05c112c88412c0797fec66eb4
This commit is contained in:
parent
473b4af43d
commit
12848191f8
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
4
sshbuf.h
4
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
|
* 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);
|
||||||
|
|
Loading…
Reference in New Issue