bech32 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1556fd0046c912f798c99efd7162f3afc6ca970d618d0ba44dd38c05ab88de75
4
- data.tar.gz: fc267a9f2e3344f11f692f7749666ba099a5f5fd73326271c412bc1000fe8616
3
+ metadata.gz: b9dfad105c52c27a05e99b0576a46de13aac736914b8172b59766e393531857e
4
+ data.tar.gz: bdadf23d8b3ea58fbbc6c303ca657e6d151d4096cbb6dfc260d105c2d5b5869e
5
5
  SHA512:
6
- metadata.gz: 21045a72a45ddf3640801ed9845fa61e758a6199cf492f64cee355bec019f5f0e0a62696e6061aa3479c30d6e566c3e63663f3c8a9838b1bc2ba0e860265f335
7
- data.tar.gz: cfb2828365abd683dfeb0af311a583661cd2bc95d0c5af65a09f0d3b5d8cf38215cd95552f903667e4589764030b6a1da65473bc11f762262c63936a72340699
6
+ metadata.gz: 17c8acca310a4ebc24ba5e4b4f58132d79262ca73d6ebbe6b50952b2f0703c70b915b28500d866af86d3b9f715afdc614ddc2af9feb07d6de5fb16fff68dc16e
7
+ data.tar.gz: ae1ad3dd861bed9849878241ae9edac81d26980a4cf8a6e911ecb36b7bdc547756404347232aff5608d4b9f24d2b0f6ecfc0e6476c6f37855bfbc2ff0410a8e9
data/README.md CHANGED
@@ -104,10 +104,14 @@ After installing the gem, the `bech32` command will be available. Encoding and d
104
104
 
105
105
  #### Encode
106
106
 
107
+ The `encode` command takes `HRP`, `data`, and type (`bech32` or `bech32m`) as arguments and outputs a bech32/bech32m string.
108
+
107
109
  $ bech32 encode genesis 000409190707111719041a120308120a060c161408110d091b090009021b1e1d150e190215010d0a1603091e1f0b100609090d1a1c1a13030c120c0c0f1c020d1d1a0e170b1c17021018121e0a021c121a1c0d161b16131d1609130f1d13180f1e081d041d0a110f110d1313081c11100600180b000c08140c1e130e0f090c160e0018191e1d1c0016060c11101214121e19070d1a0c1c15020414001f10100c09090600181806001809080e180507021913031100030216141b100908160c1213120f1912011f07021c13190d1900170c1d1203040f071c1908050504130e080d0a100d130b03000a0a08191310090918120f11031104120c15180c15120a0f1919070c1c12060c1911091010120a0d191b040c1613020e1911081f000b1a0b0514150c1613010d0c1c030b17011805090119061e0b051e130c00030419000112030110181d011a000f020c0901080c1113060201041a0e1b060a15160506181c11140c1c1d0b1b14020c131e0b0f071519181e0b1f0e0a08170f1d0c05060e1c1b0e160c0f0a171d0b101a1a1f1417160e0d1414030e161b0a000709100d15020c000e010c00000000 bech32
108
110
  genesis1qyfe883hey6jrgj2xvk5g3dfmfqfzm7a4wez4pd2krf7ltsxffd6u6nrvjvv0uzda6whtuhzscj72zuj6udkmknakfn0anc07gaya2303dnngu3sxqctqvg5v7nw0fvkwqce7auqkxv3sj5j7e8d6vu4zy5qlssvffxqccxqcfgwc98zenr3qrzk5msfgkvjnj0ejpl8zunedeqhvajry08ueg99ynwgd2sdntrq22gensffcj03r3yjv4cv4j20ee8vujxve3fssj2demyvknzwe3glqt6t954vknpdvurthpc9fpex7t97nvqryeqpjrpscap6q0zvfpgv3nxzpy6wmx24k9xcu35vuatm5zvn7t084ec7tlw2gh0av9xwumwkv02hats66l5hkwd55rwkm2q8fsd4zvqwpvqqqqtdc6rp
109
111
 
110
- # Decode
112
+ #### Decode
113
+
114
+ The `decode` command takes bech32/bech32m string as arguments and outputs `HRP`, `data`, and type.
111
115
 
112
116
  $ bech32 decode genesis1qyfe883hey6jrgj2xvk5g3dfmfqfzm7a4wez4pd2krf7ltsxffd6u6nrvjvv0uzda6whtuhzscj72zuj6udkmknakfn0anc07gaya2303dnngu3sxqctqvg5v7nw0fvkwqce7auqkxv3sj5j7e8d6vu4zy5qlssvffxqccxqcfgwc98zenr3qrzk5msfgkvjnj0ejpl8zunedeqhvajry08ueg99ynwgd2sdntrq22gensffcj03r3yjv4cv4j20ee8vujxve3fssj2demyvknzwe3glqt6t954vknpdvurthpc9fpex7t97nvqryeqpjrpscap6q0zvfpgv3nxzpy6wmx24k9xcu35vuatm5zvn7t084ec7tlw2gh0av9xwumwkv02hats66l5hkwd55rwkm2q8fsd4zvqwpvqqqqtdc6rp
113
117
  HRP: genesis
data/exe/bech32 CHANGED
@@ -19,11 +19,15 @@ class CLI < Thor
19
19
  desc 'decode "bech32string"', 'Decoding bech32/bech32m string.'
20
20
  def decode(bech32_str)
21
21
  bech32 = Bech32.decode(bech32_str, bech32_str.length)
22
- puts <<~EOS
23
- HRP: #{bech32[0]}
24
- DATA: #{bech32[1].pack('C*').unpack1('H*')}
25
- TYPE: #{bech32[2] == Bech32::Encoding::BECH32 ? 'bech32' : 'bech32m'}
26
- EOS
22
+ if bech32
23
+ puts <<~EOS
24
+ HRP: #{bech32[0]}
25
+ DATA: #{bech32[1].pack('C*').unpack1('H*')}
26
+ TYPE: #{bech32[2] == Bech32::Encoding::BECH32 ? 'bech32' : 'bech32m'}
27
+ EOS
28
+ else
29
+ puts 'Can not decode.'
30
+ end
27
31
  end
28
32
 
29
33
  end
@@ -18,7 +18,7 @@ module Bech32
18
18
  # Returns segwit script pubkey which generated from witness version and witness program.
19
19
  def to_script_pubkey
20
20
  v = ver == 0 ? ver : ver + 0x50
21
- ([v, prog.length].pack("CC") + prog.map{|p|[p].pack("C")}.join).unpack('H*').first
21
+ ([v, prog.length] + prog).pack('C*').unpack("H*").first
22
22
  end
23
23
 
24
24
  # parse script pubkey into witness version and witness program
@@ -31,7 +31,7 @@ module Bech32
31
31
  # Returns segwit address string which generated from hrp, witness version and witness program.
32
32
  def addr
33
33
  spec = (ver == 0 ? Bech32::Encoding::BECH32 : Bech32::Encoding::BECH32M)
34
- Bech32.encode(hrp, [ver] + convert_bits(prog, 8, 5), spec)
34
+ Bech32.encode(hrp, [ver] + Bech32.convert_bits(prog, 8, 5), spec)
35
35
  end
36
36
 
37
37
  private
@@ -41,34 +41,11 @@ module Bech32
41
41
  raise 'Invalid address.' if hrp.nil? || data[0].nil? || ![HRP_MAINNET, HRP_TESTNET, HRP_REGTEST].include?(hrp)
42
42
  @ver = data[0]
43
43
  raise 'Invalid witness version' if @ver > 16
44
- @prog = convert_bits(data[1..-1], 5, 8, false)
44
+ @prog = Bech32.convert_bits(data[1..-1], 5, 8, false)
45
45
  raise 'Invalid witness program' if @prog.nil? || @prog.length < 2 || @prog.length > 40
46
46
  raise 'Invalid witness program with version 0' if @ver == 0 && (@prog.length != 20 && @prog.length != 32)
47
47
  raise 'Witness version and encoding spec do not match' if (@ver == 0 && spec != Bech32::Encoding::BECH32) || (@ver != 0 && spec != Bech32::Encoding::BECH32M)
48
48
  end
49
49
 
50
- def convert_bits(data, from, to, padding=true)
51
- acc = 0
52
- bits = 0
53
- ret = []
54
- maxv = (1 << to) - 1
55
- max_acc = (1 << (from + to - 1)) - 1
56
- data.each do |v|
57
- return nil if v < 0 || (v >> from) != 0
58
- acc = ((acc << from) | v) & max_acc
59
- bits += from
60
- while bits >= to
61
- bits -= to
62
- ret << ((acc >> bits) & maxv)
63
- end
64
- end
65
- if padding
66
- ret << ((acc << (to - bits)) & maxv) unless bits == 0
67
- elsif bits >= from || ((acc << (to - bits)) & maxv) != 0
68
- return nil
69
- end
70
- ret
71
- end
72
-
73
50
  end
74
51
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Bech32
4
- VERSION = '1.2.0'
4
+ VERSION = '1.3.0'
5
5
  end
data/lib/bech32.rb CHANGED
@@ -86,6 +86,35 @@ module Bech32
86
86
  hrp.each_char.map{|c|c.ord >> 5} + [0] + hrp.each_char.map{|c|c.ord & 31}
87
87
  end
88
88
 
89
+ # Convert a +data+ where each byte is encoding +from+ bits to a byte slice where each byte is encoding +to+ bits.
90
+ # @param [Array] data
91
+ # @param [Integer] from
92
+ # @param [Integer] to
93
+ # @param [Boolean] padding
94
+ # @return [Array]
95
+ def convert_bits(data, from, to, padding=true)
96
+ acc = 0
97
+ bits = 0
98
+ ret = []
99
+ maxv = (1 << to) - 1
100
+ max_acc = (1 << (from + to - 1)) - 1
101
+ data.each do |v|
102
+ return nil if v < 0 || (v >> from) != 0
103
+ acc = ((acc << from) | v) & max_acc
104
+ bits += from
105
+ while bits >= to
106
+ bits -= to
107
+ ret << ((acc >> bits) & maxv)
108
+ end
109
+ end
110
+ if padding
111
+ ret << ((acc << (to - bits)) & maxv) unless bits == 0
112
+ elsif bits >= from || ((acc << (to - bits)) & maxv) != 0
113
+ return nil
114
+ end
115
+ ret
116
+ end
117
+
89
118
  # Compute Bech32 checksum
90
119
  def polymod(values)
91
120
  generator = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bech32
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shigeyuki Azuchi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-07-01 00:00:00.000000000 Z
11
+ date: 2022-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor