class Digitalbits::Util::StrKey
Constants
- VERSION_BYTES
Public Class Methods
check_decode(expected_version, str)
click to toggle source
# File lib/digitalbits/util/strkey.rb, line 45 def self.check_decode(expected_version, str) decoded = begin Base32.decode(str) rescue raise ArgumentError, "Invalid base32 string" end version_byte = decoded[0] payload = decoded[1...-2] check = decoded[-2..-1] version = VERSION_BYTES.key(version_byte) raise ArgumentError, "invalid encoded string" if str != Base32.encode(decoded).tr("=", "") 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)
click to toggle source
# File lib/digitalbits/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) # TODO: sort out, is it 100% safe to remove padding # SEP-23 says yes, but shit happens Base32.encode(payload + check).tr("=", "") end
checksum(bytes)
click to toggle source
return the “XModem CRC16” (CCITT-like, but with 0-init and MSB first) packed into a string in little-endian order
# File lib/digitalbits/util/strkey.rb, line 64 def self.checksum(bytes) crc = Digest::CRC16XModem.checksum(bytes) [crc].pack("S<") end
decode_muxed_account(strkey)
click to toggle source
Returns a Digitalbits::MuxedAccount
, forcing the ed25519 discriminant
@param strkey [String] address string to decode @return [Digitalbits::MuxedAccount] MuxedAccount
with ed25519 discriminant
# File lib/digitalbits/util/strkey.rb, line 41 def self.decode_muxed_account(strkey) Digitalbits::MuxedAccount.new(:key_type_ed25519, check_decode(:account_id, strkey)) end
encode_muxed_account(muxed_account)
click to toggle source
Converts an Digitalbits::MuxedAccount
to its string representation, forcing the ed25519 representation. @param muxed_account [Digitalbits::MuxedAccount] account @return [String] “G..”-like address
# File lib/digitalbits/util/strkey.rb, line 27 def self.encode_muxed_account(muxed_account) ed25519 = if muxed_account.switch == Digitalbits::CryptoKeyType.key_type_ed25519 muxed_account.ed25519! else muxed_account.med25519!.ed25519 end check_encode(:account_id, ed25519) end