diff options
| author | Bruce Hill <bitbucket@bruce-hill.com> | 2018-07-30 14:11:45 -0700 |
|---|---|---|
| committer | Bruce Hill <bitbucket@bruce-hill.com> | 2018-07-30 14:11:45 -0700 |
| commit | 2a12310b25f68208ff0101fce5d0137f267c7394 (patch) | |
| tree | 28a845cc5aaab477e6a6d87539a88162f5685365 /lib/base64.nom | |
| parent | 43e8da178084184db1701b0abb9d615046b4c51d (diff) | |
Switching hashes to use base64 instead of hex.
Diffstat (limited to 'lib/base64.nom')
| -rw-r--r-- | lib/base64.nom | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/lib/base64.nom b/lib/base64.nom new file mode 100644 index 0000000..a5bb9bb --- /dev/null +++ b/lib/base64.nom @@ -0,0 +1,54 @@ +#!/usr/bin/env nomsu -V2.5.5.4 +# + This file defines actions for encoding/decoding base 64, as specified in: + https://tools.ietf.org/html/rfc4648 + +%b64_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" +%reverse_b64 = (%b64_str.%i = (%i - 1) for %i in 1 to (length of %b64_str)) +%reverse_b64."=" = 0 +test: + %cases = ["", "Zg==", "Zm8=", "Zm9v", "Zm9vYg==", "Zm9vYmE=", "Zm9vYmFy"] + for %len = %encoded in %cases: + %plain = "foobar".[1, %len - 1] + assume ((base64 %plain) == %encoded) or barf ".." + \(quote %plain) base64 encoded to \(quote (base64 %plain)) \ + ..instead of \(quote %encoded) + assume ((base64 decode %encoded) == %plain) or barf ".." + \(quote %encoded) base64 decoded to \(quote (base64 decode %encoded)) \ + ..instead of \(quote %plain) + +action [base64 %str, base64 encode %str, %str base64]: + %chars = [] + for %i in 1 to (length of %str) via 3: + %bytes = [=lua "\%str:byte(\%i, \(%i + 2))"] + add %b64_str.(((%bytes.1 & 252) >> 2) + 1) to %chars + if (length of %bytes) is: + 3: + add %b64_str.(((%bytes.1 & 3) << 4) + ((%bytes.2 & 240) >> 4) + 1) to %chars + add %b64_str.(((%bytes.2 & 15) << 2) + ((%bytes.3 & 192) >> 6) + 1) to %chars + add %b64_str.((%bytes.3 & 63) + 1) to %chars + + 2: + add %b64_str.(((%bytes.1 & 3) << 4) + ((%bytes.2 & 240) >> 4) + 1) to %chars + add %b64_str.(((%bytes.2 & 15) << 2) + 1) to %chars + add "=" to %chars + + 1: + add %b64_str.(((%bytes.1 & 3) << 4) + 1) to %chars + add "=" to %chars + add "=" to %chars + + return (%chars joined) + +action [chr %] (=lua "string.char(\%)") +action [decode base64 %str, %str base64 decoded, base64 decode %str]: + %chars = [] + for %i in 1 to (length of %str) via 4: + %indices = (%reverse_b64.(%str.%) for % in %i to (%i + 3)) + add (chr ((%indices.1 << 2) + ((%indices.2 & 48) >> 4))) to %chars + if (%str.(%i+2) == "="): stop + add (chr (((%indices.2 & 15) << 4) + ((%indices.3 & 60) >> 2))) to %chars + if (%str.(%i+3) == "="): stop + add (chr (((%indices.3 & 3) << 6) + %indices.4)) to %chars + + return (%chars joined) |
