Class: Stellar::Util::StrKey
- Inherits:
-
Object
- Object
- Stellar::Util::StrKey
- 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
- .check_decode(expected_version, str) ⇒ Object
- .check_encode(version, byte_str) ⇒ Object
-
.checksum(bytes) ⇒ Object
return the “XModem CRC16” (CCITT-like, but with 0-init and MSB first) packed into a string in little-endian order.
Class Method Details
.check_decode(expected_version, str) ⇒ Object
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
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 |