Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames M Snell <jasnell@gmail.com>2020-08-25 20:05:51 +0300
committerJames M Snell <jasnell@gmail.com>2020-10-08 03:27:05 +0300
commitdae283d96fd31ad0f30840a7e55ac97294f505ac (patch)
tree8f7f87e50411e8965cb83d9b280035f36d355fbc /src/base64.h
parentba77dc8597cbcf42feea59f1381512d421ec9cc5 (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.h34
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