~/bend-docscommunity

LAWS.bend open laws/TODOs

raw source on the hub · import 0xd9193642e70279e288909ba354d1bb6a/LAWS.bend as LAWS

Laws for Base64's Base-only List<&2, U32> API.

The decoder is strict RFC 4648: input length is a multiple of four, only the standard alphabet is accepted, '=' occurs only in the final quartet, and unused padding bits must be zero. A decoded U32 is an octet (0..255).

2 imports
import Base
import ./lib.bend as B64

Laws

law encode_empty provedin PROOF.bendsource · line 10 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.encode([]) == "" : String}

Empty input encodes to the empty string.

law encode_one provedin PROOF.bendsource · line 14 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.encode([102]) == "Zg==" : String}

One byte uses two alphabet characters and two padding characters.

law encode_two provedin PROOF.bendsource · line 18 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.encode([102, 111]) == "Zm8=" : String}

Two bytes use three alphabet characters and one padding character.

law encode_three provedin PROOF.bendsource · line 22 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.encode([102, 111, 111]) == "Zm9v" : String}

A complete three-byte group has no padding.

law encode_multiple provedin PROOF.bendsource · line 26 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.encode([102, 111, 111, 98, 97, 114]) == "Zm9vYmFy" : String}

Multiple groups concatenate without separators.

law encode_masks_u32 provedin PROOF.bendsource · line 34 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.encode([256]) == "AA==" : String}

Elements are octet-oriented: the low eight bits are encoded.

law decode_empty provedin PROOF.bendsource · line 38 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.decode("") == Some{[]} : Maybe<&2, List<&2, U32>>}

Empty Base64 decodes to an empty list.

law decode_one_pad provedin PROOF.bendsource · line 42 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.decode("Zg==") == Some{[102]} : Maybe<&2, List<&2, U32>>}

One padded quartet decodes to one octet.

law decode_two_pad provedin PROOF.bendsource · line 46 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.decode("Zm8=") == Some{[102, 111]} : Maybe<&2, List<&2, U32>>}

Two padded quartet decodes to two octets.

law decode_full provedin PROOF.bendsource · line 50 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.decode("Zm9v") == Some{[102, 111, 111]} : Maybe<&2, List<&2, U32>>}

An unpadded quartet decodes to three octets.

law decode_multiple provedin PROOF.bendsource · line 57 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.decode("Zm9vYmFy") == Some{[102, 111, 111, 98, 97, 114]} : Maybe<&2, List<&2, U32>>}

Multiple quartets concatenate in input order.

law roundtrip_one provedin PROOF.bendsource · line 65 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.decode(0xd9193642e70279e288909ba354d1bb6a/lib.Base64.encode([102])) == Some{[102]} : Maybe<&2, List<&2, U32>>}

Canonical examples round-trip through both public functions.

law roundtrip_two provedin PROOF.bendsource · line 72 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.decode(0xd9193642e70279e288909ba354d1bb6a/lib.Base64.encode([102, 111])) == Some{[102, 111]} : Maybe<&2, List<&2, U32>>}

law roundtrip_three provedin PROOF.bendsource · line 79 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.decode(0xd9193642e70279e288909ba354d1bb6a/lib.Base64.encode([102, 111, 111])) == Some{[102, 111, 111]} : Maybe<&2, List<&2, U32>>}

law reject_invalid_alphabet provedin PROOF.bendsource · line 87 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.decode("not!") == None{} : Maybe<&2, List<&2, U32>>}

Invalid alphabet characters are rejected.

law reject_short_quartet provedin PROOF.bendsource · line 91 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.decode("Zg=") == None{} : Maybe<&2, List<&2, U32>>}

A non-multiple-of-four length is rejected.

law reject_early_padding provedin PROOF.bendsource · line 95 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.decode("Z=g=") == None{} : Maybe<&2, List<&2, U32>>}

Padding cannot appear before the final two positions.

law reject_bad_padding_shape provedin PROOF.bendsource · line 99 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.decode("Zg=A") == None{} : Maybe<&2, List<&2, U32>>}

One '=' requires a real third sextet and two '=' require c='='.

law reject_noncanonical_one provedin PROOF.bendsource · line 103 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.decode("Zh==") == None{} : Maybe<&2, List<&2, U32>>}

Nonzero unused bits are rejected rather than silently normalized.

law reject_noncanonical_two provedin PROOF.bendsource · line 106 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.decode("Zm/=") == None{} : Maybe<&2, List<&2, U32>>}

law reject_padding_before_tail provedin PROOF.bendsource · line 110 · raw

{0xd9193642e70279e288909ba354d1bb6a/lib.Base64.decode("Zg==AAAA") == None{} : Maybe<&2, List<&2, U32>>}

Padding is allowed only in the final quartet.