crockford base32: remove padding

This commit is contained in:
swrup 2026-02-06 21:39:53 +01:00
parent 0fd45ae1e7
commit dede5ac2dc
4 changed files with 16 additions and 8 deletions

View file

@ -14,7 +14,7 @@ db = postgres
attribute_encryption_key = "deadbeef" attribute_encryption_key = "deadbeef"
port = 3434 port = 3434
bind_to = localhost bind_to = localhost
master_public_key = "SJ0NYND22VQP3MP7FM754RDX8HCKVWAXTHY9SQNBTPRJZ2SPM2S0====" master_public_key = "SJ0NYND22VQP3MP7FM754RDX8HCKVWAXTHY9SQNBTPRJZ2SPM2S0"
stefan_abs = EUR:0.00 stefan_abs = EUR:0.00
stefan_log = EUR:0.00 stefan_log = EUR:0.00
stefan_lin = 0.00 stefan_lin = 0.00

View file

@ -1 +1 @@
A17JXR3E6J4CXDPYT7S1H25PGJ3ABS26TQ38654QCX0TB59RPMF0==== A17JXR3E6J4CXDPYT7S1H25PGJ3ABS26TQ38654QCX0TB59RPMF0

View file

@ -1,4 +1,3 @@
(* TODO test *)
(* Crockford's variant of Base32 (* Crockford's variant of Base32
http://www.crockford.com/wrmg/base32.html http://www.crockford.com/wrmg/base32.html
except that: except that:
@ -6,11 +5,18 @@
- '-' is not allowed - '-' is not allowed
- checksum is not allowed *) - checksum is not allowed *)
(* 'I' 'L' 'O' 'U' excluded *) (* 'I' 'L' 'O' 'U' excluded
no '=' padding in encoded string *)
type t = string type t = string
let alphabet = Base32.make_alphabet "0123456789ABCDEFGHJKMNPQRSTVWXYZ" let alphabet = Base32.make_alphabet "0123456789ABCDEFGHJKMNPQRSTVWXYZ"
let encode s = Base32.encode_string ~alphabet s
let encode s =
let s = Base32.encode_string ~alphabet s in
(* remove '=' padding *)
match String.index_opt s '=' with
| None -> s
| Some i -> String.sub s 0 i
let decode s = let decode s =
let s = let s =
@ -23,6 +29,10 @@ let decode s =
| c -> c) | c -> c)
s s
in in
(* restore padding for base32 lib *)
let n = 8 - (String.length s mod 8) in
let pad = String.make n '=' in
let s = s ^ pad in
match Base32.decode ~alphabet ~off:0 ~len:(String.length s) s with match Base32.decode ~alphabet ~off:0 ~len:(String.length s) s with
| Error (`Msg e) -> Error e | Error (`Msg e) -> Error e
| Ok v -> Ok v | Ok v -> Ok v

View file

@ -110,19 +110,17 @@ let () =
let () = let () =
let v = let v =
"04000274VF2F65WWABKGZYHREQWAFTVPMWEK9EQYMCPP1E6CMC224XDDDBVM7NRMNDX3TETHTK5G7GPPPYGN08FEMSY6B7NGBE8AYMG5HWT2BXRSAHAWDWW5Y16YVGXJG0BCKW3X17EWEF8MNGFGJBKVWQV5WPT0R2QK82QXFHFVGP3HR1D8HF69JXBC22B62M4SFETRJNXRG2GXX03BETSNQW0X7BYTMFJX5JQH4B2KJMABB02RFSNNMND7CT7MSAX5SCZY5ZB9XS4ZDKA9AVTS11V790KXXBSFZSD3NNEHKB6RS99RJD3MDJE04G1Q83HR50N5NVBDW3HPJZKQS5SSG7R2R2F7K8P06HJ4YSQFF52GF3RZW22N4FRQ28KQ2JZMZ1GJS1KBNHNNMS1RW9DZQ3882Z5V0000000004002===" "04000274VF2F65WWABKGZYHREQWAFTVPMWEK9EQYMCPP1E6CMC224XDDDBVM7NRMNDX3TETHTK5G7GPPPYGN08FEMSY6B7NGBE8AYMG5HWT2BXRSAHAWDWW5Y16YVGXJG0BCKW3X17EWEF8MNGFGJBKVWQV5WPT0R2QK82QXFHFVGP3HR1D8HF69JXBC22B62M4SFETRJNXRG2GXX03BETSNQW0X7BYTMFJX5JQH4B2KJMABB02RFSNNMND7CT7MSAX5SCZY5ZB9XS4ZDKA9AVTS11V790KXXBSFZSD3NNEHKB6RS99RJD3MDJE04G1Q83HR50N5NVBDW3HPJZKQS5SSG7R2R2F7K8P06HJ4YSQFF52GF3RZW22N4FRQ28KQ2JZMZ1GJS1KBNHNNMS1RW9DZQ3882Z5V0000000004002"
in in
let decode s = B32.decode s |> get_ok in let decode s = B32.decode s |> get_ok in
let v' = B32.encode (decode v) in let v' = B32.encode (decode v) in
let v'' = B32.encode (decode v') in let v'' = B32.encode (decode v') in
(*
Fmt.pr "v : %s@." v; Fmt.pr "v : %s@." v;
Fmt.pr "v' : %s@." v'; Fmt.pr "v' : %s@." v';
Fmt.pr "v'': %s@." v''; Fmt.pr "v'': %s@." v'';
Fmt.pr "len v : %d@." (String.length v); Fmt.pr "len v : %d@." (String.length v);
Fmt.pr "len v' : %d@." (String.length v'); Fmt.pr "len v' : %d@." (String.length v');
Fmt.pr "len v'': %d@." (String.length v''); Fmt.pr "len v'': %d@." (String.length v'');
*)
assert (v = v'); assert (v = v');
assert (v' = v''); assert (v' = v'');
() ()