module Bech32

Constants

BECH32M_CONST
CHARSET
SEPARATOR

Public Instance Methods

create_checksum(hrp, data, spec) click to toggle source

Returns computed checksum values of hrp and data

# File lib/platon/bech32.rb, line 42
def create_checksum(hrp, data, spec)
  values = expand_hrp(hrp) + data
  const = (spec == Bech32::Encoding::BECH32M ? Bech32::BECH32M_CONST : 1)
  polymod = polymod(values + [0, 0, 0, 0, 0, 0]) ^ const
  (0..5).map{|i|(polymod >> 5 * (5 - i)) & 31}
end
decode(bech, max_length = 90) click to toggle source

Returns the Bech32 decoded hrp and data.

# File lib/platon/bech32.rb, line 23
def decode(bech, max_length = 90)
  # check uppercase/lowercase
  return nil if bech.bytes.index{|x| x < 33 || x > 126}
  return nil if (bech.downcase != bech && bech.upcase != bech)
  bech = bech.downcase
  # check data length
  pos = bech.rindex(SEPARATOR)
  return nil if pos.nil? || pos + 7 > bech.length || bech.length > max_length
  # check valid charset
  bech[pos+1..-1].each_char{|c|return nil unless CHARSET.include?(c)}
  # split hrp and data
  hrp = bech[0..pos-1]
  data = bech[pos+1..-1].each_char.map{|c|CHARSET.index(c)}
  # check checksum
  spec = verify_checksum(hrp, data)
  spec ? [hrp, data[0..-7], spec] : nil
end
encode(hrp, data, spec) click to toggle source

Returns the encoded Bech32 string.

# File lib/platon/bech32.rb, line 17
def encode(hrp, data, spec)
  checksummed = data + create_checksum(hrp, data, spec)
  hrp + SEPARATOR + checksummed.map{|i|CHARSET[i]}.join
end
expand_hrp(hrp) click to toggle source

Expand the hrp into values for checksum computation.

# File lib/platon/bech32.rb, line 64
def expand_hrp(hrp)
  hrp.each_char.map{|c|c.ord >> 5} + [0] + hrp.each_char.map{|c|c.ord & 31}
end
polymod(values) click to toggle source

Compute Bech32 checksum

# File lib/platon/bech32.rb, line 69
def polymod(values)
  generator = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3]
  chk = 1
  values.each do |v|
    top = chk >> 25
    chk = (chk & 0x1ffffff) << 5 ^ v
    (0..4).each{|i|chk ^= ((top >> i) & 1) == 0 ? 0 : generator[i]}
  end
  chk
end
verify_checksum(hrp, data) click to toggle source

Verify a checksum given Bech32 string @param [String] hrp hrp part. @param [Array] data data array. @return [Integer] spec

# File lib/platon/bech32.rb, line 53
def verify_checksum(hrp, data)
  const = polymod(expand_hrp(hrp) + data)
  case const
  when 1
    Encoding::BECH32
  when BECH32M_CONST
    Encoding::BECH32M
  end
end