Skip to content

Commit 85d1b9f

Browse files
author
Lucien Grondin
committed
first draft at bech32
1 parent a80c966 commit 85d1b9f

File tree

1 file changed

+81
-0
lines changed

1 file changed

+81
-0
lines changed

bech32.sh

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# BECH32
2+
# see https://en.bitcoin.it/wiki/BIP_0173
3+
declare -a bech32=(
4+
q p z r y 9 x 8
5+
g f 2 t v d w 0
6+
s 3 j n 5 4 k h
7+
c e 6 m u a 7 l
8+
)
9+
declare -A bech32A
10+
for i in {0..31}
11+
do bech32A[${bech32[$i]}]=$i
12+
done
13+
14+
bech32_polymod() {
15+
declare -ia GEN=(0x3b6a57b2 0x26508e6d 0x1ea119fa 0x3d4233dd 0x2a1462b3)
16+
declare -i chk=1 b i v
17+
for v
18+
do
19+
b=$((chk >> 25))
20+
chk=$(( (chk & 0x1ffffff) << 5^v ))
21+
for i in {0..4}
22+
do ((chk^= (b >> i) & 1 ? GEN[i] : 0))
23+
done
24+
done
25+
echo $chk
26+
}
27+
ord() { LC_CTYPE=C printf '%d' "'$1"; }
28+
bech32_hrp_expand() {
29+
declare -i x
30+
for x
31+
do echo $(( $x >> 5 ))
32+
done
33+
echo 0
34+
for x
35+
do echo $(( $x & 31 ))
36+
done
37+
}
38+
bech32_verify_checksum() {
39+
mapfile -t hrp < <(echo -n "${1%1*}" |grep -o . |while read c; do ord $c; echo; done)
40+
mapfile -t data < <(echo -n "${1##*1}"|grep -o . |while read c; do echo ${bech32A[$c]}; done)
41+
42+
test $(
43+
bech32_polymod $(
44+
bech32_hrp_expand "${hrp[@]}"
45+
for x in "${data[@]}"
46+
do echo $x
47+
done
48+
)
49+
) -eq 1
50+
}
51+
bech32_create_checksum() {
52+
mapfile -t hrp < <(echo -n "${1%1*}" |grep -o . |while read c; do ord $c; echo; done)
53+
mapfile -t data < <(echo -n "${1##*1}"|grep -o . |while read c; do echo ${bech32A[$c]}; done)
54+
declare -i polymod=$(( $(bech32_polymod $(bech32_hrp_expand ${hrp[@]}) ${data[@]} 0 0 0 0 0 0) ^ 1))
55+
declare -a checksum
56+
for i in {0..5}
57+
do checksum[$i]=$(( (polymod >> 5 * (5 - i)) & 31 ))
58+
done
59+
for c in ${hrp[@]}
60+
do printf "\x$(printf "%x" $c)"
61+
done
62+
echo -n 1
63+
for c in ${data[@]} ${checksum[@]}
64+
do echo -n ${bech32[$c]}
65+
done
66+
echo
67+
}
68+
69+
declare -a valid_checksum=(
70+
a12uel5l
71+
an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio1tt5tgs
72+
abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw
73+
11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j
74+
split1checkupstagehandshakeupstreamerranterredcaperred2y9e3w
75+
)
76+
77+
for t in "${valid_checksum[@]}"
78+
do bech32_verify_checksum $t || echo wrong checksum
79+
done
80+
81+
bech32_verify_checksum $(bech32_create_checksum foo1zzzzzzzzzz)

0 commit comments

Comments
 (0)