1 ! Copyright (C) 2019 John Benediktsson
2 ! See https://factorcode.org/license.txt for BSD license
4 USING: ascii assocs byte-arrays kernel literals math sequences ;
11 CONSTANT: ALPHABET $[ "0123456789ABCDEFGHJKMNPQRSTVWXYZ" >byte-array ]
14 CONSTANT: INVERSE $[ 256 [ ALPHABET index 0xff or ] B{ } map-integers-as ]
16 CONSTANT: CHECKSUM $[ ALPHABET "*~$=U" append ]
18 : normalize-base32 ( base32 -- base32' )
19 CHAR: - swap remove >upper H{
25 : parse-base32 ( base32 -- n )
26 0 swap [ [ 32 * ] [ INVERSE nth + ] bi* ] each ;
30 : base32-crockford> ( base32 -- n )
31 normalize-base32 parse-base32 ;
33 : >base32-crockford ( n -- base32 )
35 [ dup 0 > ] [ 32 /mod ALPHABET nth ] "" produce-as nip
36 [ "0" ] when-empty reverse! ;
38 : base32-crockford-checksum> ( base32 -- n )
39 normalize-base32 unclip-last [ parse-base32 ] dip
40 CHECKSUM index over 37 mod assert= ;
42 : >base32-crockford-checksum ( n -- base32 )
43 [ >base32-crockford ] keep 37 mod CHECKSUM nth suffix ;