diff --git a/src/lib/crypto/Base64.cxx b/src/lib/crypto/Base64.cxx new file mode 100644 index 000000000..58910a020 --- /dev/null +++ b/src/lib/crypto/Base64.cxx @@ -0,0 +1,58 @@ +/* + * Copyright 2019 Max Kellermann + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "Base64.hxx" +#include "lib/ffmpeg/Error.hxx" +#include "util/StringView.hxx" +#include "util/WritableBuffer.hxx" + +extern "C" { +#include +} + +#include + +size_t +DecodeBase64(WritableBuffer out, StringView in) +{ + /* since av_base64_decode() wants a null-terminated string, we + need to make a copy here and null-terminate it */ + const std::string copy(in.data, in.size); + return DecodeBase64(out, copy.c_str()); +} + +size_t +DecodeBase64(WritableBuffer out, const char *in) +{ + int nbytes = av_base64_decode((uint8_t *)out.data, in, out.size); + if (nbytes < 0) + throw MakeFfmpegError(nbytes, "Base64 decoder failed"); + + return nbytes; +} diff --git a/src/lib/crypto/Base64.hxx b/src/lib/crypto/Base64.hxx new file mode 100644 index 000000000..54bffde1b --- /dev/null +++ b/src/lib/crypto/Base64.hxx @@ -0,0 +1,56 @@ +/* + * Copyright 2019 Max Kellermann + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef BASE64_HXX +#define BASE64_HXX + +#include + +template struct WritableBuffer; +struct StringView; + +constexpr size_t +CalculateBase64OutputSize(size_t in_size) noexcept +{ + return in_size * 3 / 4; +} + +/** + * Throws on error. + */ +size_t +DecodeBase64(WritableBuffer out, StringView in); + +/** + * Throws on error. + */ +size_t +DecodeBase64(WritableBuffer out, const char *in); + +#endif diff --git a/src/lib/crypto/meson.build b/src/lib/crypto/meson.build index 5ea661baf..da543a2be 100644 --- a/src/lib/crypto/meson.build +++ b/src/lib/crypto/meson.build @@ -16,3 +16,22 @@ else endif conf.set('HAVE_MD5', crypto_md5_dep.found()) + +if libavutil_dep.found() + crypto_base64 = static_library( + 'crypto_base64', + 'Base64.cxx', + include_directories: inc, + dependencies: [ + libavutil_dep, + ], + ) + + crypto_base64_dep = declare_dependency( + link_with: crypto_base64, + ) +else + crypto_base64_dep = dependency('', required: false) +endif + +conf.set('HAVE_BASE64', crypto_base64_dep.found())