Class: Stellar::Util::StrKey

Inherits:
Object
  • Object
show all
Defined in:
lib/stellar/util/strkey.rb

Constant Summary collapse

VERSION_BYTES =
{
  account_id: [ 6 << 3].pack("C"), # Base32-encodes to 'G...'
  seed:       [18 << 3].pack("C"), # Base32-encodes to 'S...'
}

Class Method Summary collapse

Class Method Details

.check_decode(expected_version, str) ⇒ Object

Raises:

  • (ArgumentError)


22
23
24
25
26
27
28
29
30
31
32
# File 'lib/stellar/util/strkey.rb', line 22

def self.check_decode(expected_version, str)
  decoded      = Base32.decode(str) rescue (raise ArgumentError, "Invalid base32 string")
  version_byte = decoded[0]
  payload      = decoded[1...-2]
  check        = decoded[-2..-1]
  version      = VERSION_BYTES.key(version_byte)

  raise ArgumentError, "Unexpected version: #{version.inspect}" if version != expected_version
  raise ArgumentError, "Invalid checksum" if check != checksum(decoded[0...-2])
  payload
end

.check_encode(version, byte_str) ⇒ Object

Raises:

  • (ArgumentError)


14
15
16
17
18
19
20
# File 'lib/stellar/util/strkey.rb', line 14

def self.check_encode(version, byte_str)
  version_byte = VERSION_BYTES[version]
  raise ArgumentError, "Invalid version: #{version}" if version_byte.blank?
  payload = version_byte + byte_str.dup.force_encoding("BINARY")
  check   = checksum(payload)
  Base32.encode(payload + check)
end

.checksum(bytes) ⇒ Object

return the “XModem CRC16” (CCITT-like, but with 0-init and MSB first) packed into a string in little-endian order



36
37
38
39
# File 'lib/stellar/util/strkey.rb', line 36

def self.checksum(bytes)
  crc = Digest::CRC16XModem.checksum(bytes)
  [crc].pack("S<")
end