summaryrefslogtreecommitdiff
path: root/unpaddedbase64/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'unpaddedbase64/__init__.py')
-rw-r--r--unpaddedbase64/__init__.py41
1 files changed, 41 insertions, 0 deletions
diff --git a/unpaddedbase64/__init__.py b/unpaddedbase64/__init__.py
new file mode 100644
index 0000000..9f45bee
--- /dev/null
+++ b/unpaddedbase64/__init__.py
@@ -0,0 +1,41 @@
+# Copyright 2014, 2015 OpenMarket Ltd
+# Copyright 2021 The Matrix.org Foundation C.I.C.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import base64
+
+
+def encode_base64(input_bytes: bytes, urlsafe: bool = False) -> str:
+ """Encode bytes as an unpadded base64 string."""
+
+ if urlsafe:
+ encode = base64.urlsafe_b64encode
+ else:
+ encode = base64.b64encode
+
+ output_bytes = encode(input_bytes)
+ output_string = output_bytes.decode("ascii")
+ return output_string.rstrip("=")
+
+
+def decode_base64(input_string: str) -> bytes:
+ """Decode an unpadded standard or urlsafe base64 string to bytes."""
+
+ input_bytes = input_string.encode("ascii")
+ input_len = len(input_bytes)
+ padding = b"=" * (3 - ((input_len + 3) % 4))
+
+ # Passing altchars here allows decoding both standard and urlsafe base64
+ output_bytes = base64.b64decode(input_bytes + padding, altchars=b"-_")
+ return output_bytes