bech32 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
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