From aac963315809bd5c97863274462b6d63fbac74ac Mon Sep 17 00:00:00 2001 From: Ben van Hartingsveldt Date: Mon, 11 May 2026 20:55:09 +1000 Subject: [PATCH 1/2] test: add Base45 and Proquint test vectors Add test vectors for the newly-registered base45 (RFC9285) and proquint encodings across the basic, leading_zero, two_leading_zeros and case_insensitivity test files. --- tests/basic.csv | 2 ++ tests/case_insensitivity.csv | 1 + tests/leading_zero.csv | 1 + tests/two_leading_zeros.csv | 2 ++ 4 files changed, 6 insertions(+) diff --git a/tests/basic.csv b/tests/basic.csv index 8c7a892..8c9320b 100644 --- a/tests/basic.csv +++ b/tests/basic.csv @@ -15,10 +15,12 @@ base32hexpadupper, "TF5IN683DC5N6I811" base32z, "hxf1zgedpcfzg1ebb" base36, "k2lcpzo5yikidynfl" base36upper, "K2LCPZO5YIKIDYNFL" +base45, "RRFF.OEB$D5/DZ24" base58flickr, "Z7Pznk19XTTzBtx" base58btc, "z7paNL19xttacUY" base64, "meWVzIG1hbmkgIQ" base64pad, "MeWVzIG1hbmkgIQ==" base64url, "ueWVzIG1hbmkgIQ" base64urlpad, "UeWVzIG1hbmkgIQ==" +proquint, "pro-lojoj-lasob-kujod-kunon-fabod" base256emoji, "🚀🏃✋🌈😅🌷🤤😻🌟😅👏" diff --git a/tests/case_insensitivity.csv b/tests/case_insensitivity.csv index 3037d9c..c292cd8 100644 --- a/tests/case_insensitivity.csv +++ b/tests/case_insensitivity.csv @@ -11,3 +11,4 @@ base32hexpad, "td1imor3f41RMUSJCCG======" base32hexpadupper, "Td1imor3f41RMUSJCCG======" base36, "kfUvrsIvVnfRbjWaJo" base36upper, "KfUVrSIVVnFRbJWAJo" +base45, "R+8d vd82ek4f.kea2" diff --git a/tests/leading_zero.csv b/tests/leading_zero.csv index c9bfc7e..a342b6a 100644 --- a/tests/leading_zero.csv +++ b/tests/leading_zero.csv @@ -15,6 +15,7 @@ base32hexpadupper, "T01SMASP0DLGMSQ9044======" base32z, "hybhskh3ypiosh4jyrr" base36, "k02lcpzo5yikidynfl" base36upper, "K02LCPZO5YIKIDYNFL" +base45, "RV206$CL44CEC2DDX0" base58flickr, "Z17Pznk19XTTzBtx" base58btc, "z17paNL19xttacUY" base64, "mAHllcyBtYW5pICE" diff --git a/tests/two_leading_zeros.csv b/tests/two_leading_zeros.csv index f591063..09fbc0f 100644 --- a/tests/two_leading_zeros.csv +++ b/tests/two_leading_zeros.csv @@ -15,10 +15,12 @@ base32hexpadupper, "T0007IPBJ41MM2RJ940GG====" base32z, "hyyy813murbssn5ujryoo" base36, "k002lcpzo5yikidynfl" base36upper, "K002LCPZO5YIKIDYNFL" +base45, "R000RFF.OEB$D5/DZ24" base58flickr, "Z117Pznk19XTTzBtx" base58btc, "z117paNL19xttacUY" base64, "mAAB5ZXMgbWFuaSAh" base64pad, "MAAB5ZXMgbWFuaSAh" base64url, "uAAB5ZXMgbWFuaSAh" base64urlpad, "UAAB5ZXMgbWFuaSAh" +proquint, "pro-babab-lojoj-lasob-kujod-kunon-fabod" base256emoji, "🚀🚀🚀🏃✋🌈😅🌷🤤😻🌟😅👏" From c79d7be53669819e6f945d79f96f9a5ce641c4f9 Mon Sep 17 00:00:00 2001 From: Rod Vagg Date: Mon, 11 May 2026 21:02:28 +1000 Subject: [PATCH 2/2] fix(spec): refine Base45 and Proquint encoding rules --- rfcs/Proquint.md | 16 +++++++++++++++- tests/case_insensitivity.csv | 1 - tests/leading_zero.csv | 1 + 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/rfcs/Proquint.md b/rfcs/Proquint.md index cc4a154..b0fe7ac 100644 --- a/rfcs/Proquint.md +++ b/rfcs/Proquint.md @@ -13,4 +13,18 @@ For example, the proquint encoding of the bytestring `[127, 0, 0, 1]` (the data ``` pro-lusab-babad -``` \ No newline at end of file +``` + +## Odd-byte inputs + +The original proquint specification operates on 16-bit chunks and is silent on inputs whose length is not a multiple of two bytes. Multibase requires arbitrary byte sequences to be encodable, so this document specifies the following extension: + +When the input has an odd number of bytes, every pair of bytes is encoded as a 5-character `CVCVC` block as usual, and the final byte is encoded as a 3-character `CVC` block representing the high 8 bits of a 16-bit value whose low 8 bits are zero. The trailing `CVC` block is joined to the preceding blocks with `-` in the usual way. + +For example, the single byte `[0x21]` (`!`) is encoded as: + +``` +pro-fah +``` + +The second consonant in the trailing `CVC` block carries the two least-significant bits of the input byte in its two most-significant bits; its two least-significant bits MUST be zero. Decoders MUST reject any trailing `CVC` block where this is not the case, so that the encoding is canonical and bijective. The four valid trailing consonants are `b`, `h`, `m`, and `s`. diff --git a/tests/case_insensitivity.csv b/tests/case_insensitivity.csv index c292cd8..3037d9c 100644 --- a/tests/case_insensitivity.csv +++ b/tests/case_insensitivity.csv @@ -11,4 +11,3 @@ base32hexpad, "td1imor3f41RMUSJCCG======" base32hexpadupper, "Td1imor3f41RMUSJCCG======" base36, "kfUvrsIvVnfRbjWaJo" base36upper, "KfUVrSIVVnFRbJWAJo" -base45, "R+8d vd82ek4f.kea2" diff --git a/tests/leading_zero.csv b/tests/leading_zero.csv index a342b6a..db840e3 100644 --- a/tests/leading_zero.csv +++ b/tests/leading_zero.csv @@ -22,4 +22,5 @@ base64, "mAHllcyBtYW5pICE" base64pad, "MAHllcyBtYW5pICE=" base64url, "uAHllcyBtYW5pICE" base64urlpad, "UAHllcyBtYW5pICE=" +proquint, "pro-badun-kijug-fadot-kajov-kohob-fah" base256emoji, "🚀🚀🏃✋🌈😅🌷🤤😻🌟😅👏"