diff options
author | James M Snell <jasnell@gmail.com> | 2020-08-25 20:05:51 +0300 |
---|---|---|
committer | James M Snell <jasnell@gmail.com> | 2020-10-08 03:27:05 +0300 |
commit | dae283d96fd31ad0f30840a7e55ac97294f505ac (patch) | |
tree | 8f7f87e50411e8965cb83d9b280035f36d355fbc /src/base64.h | |
parent | ba77dc8597cbcf42feea59f1381512d421ec9cc5 (diff) |
crypto: refactoring internals, add WebCrypto
Fixes: https://github.com/nodejs/node/issues/678
Refs: https://github.com/nodejs/node/issues/26854
Signed-off-by: James M Snell <jasnell@gmail.com>
PR-URL: https://github.com/nodejs/node/pull/35093
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Michaƫl Zasso <targos@protonmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Diffstat (limited to 'src/base64.h')
-rw-r--r-- | src/base64.h | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/src/base64.h b/src/base64.h index e58baa5f6e4..cf6e82539a5 100644 --- a/src/base64.h +++ b/src/base64.h @@ -5,13 +5,40 @@ #include "util.h" +#include <cmath> #include <cstddef> #include <cstdint> namespace node { //// Base 64 //// -static inline constexpr size_t base64_encoded_size(size_t size) { - return ((size + 2) / 3 * 4); + +enum class Base64Mode { + NORMAL, + URL +}; + +static constexpr char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; + +static constexpr char base64_table_url[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789-_"; + +static inline const char* base64_select_table(Base64Mode mode) { + switch (mode) { + case Base64Mode::NORMAL: return base64_table; + case Base64Mode::URL: return base64_table_url; + default: UNREACHABLE(); + } +} + +static inline constexpr size_t base64_encoded_size( + size_t size, + Base64Mode mode = Base64Mode::NORMAL) { + return mode == Base64Mode::NORMAL + ? ((size + 2) / 3 * 4) + : std::ceil(static_cast<double>(size * 4) / 3); } // Doesn't check for padding at the end. Can be 1-2 bytes over. @@ -32,7 +59,8 @@ size_t base64_decode(char* const dst, const size_t dstlen, inline size_t base64_encode(const char* src, size_t slen, char* dst, - size_t dlen); + size_t dlen, + Base64Mode mode = Base64Mode::NORMAL); } // namespace node |