hop-sdk 0.1.0

Client SDK for the Polkadot HOP protocol
Documentation
use super::crypto::SignatureScheme;

pub const TICKET_BYTE_LEN: usize = 65;

const SCHEME_TO_BYTE: [SignatureScheme; 4] = [
    SignatureScheme::Ed25519,
    SignatureScheme::Sr25519,
    SignatureScheme::Ecdsa,
    SignatureScheme::Eth,
];

pub fn scheme_to_byte(scheme: SignatureScheme) -> u8 {
    match scheme {
        SignatureScheme::Ed25519 => 0,
        SignatureScheme::Sr25519 => 1,
        SignatureScheme::Ecdsa => 2,
        SignatureScheme::Eth => 3,
    }
}

pub fn byte_to_scheme(byte: u8) -> Option<SignatureScheme> {
    SCHEME_TO_BYTE.get(byte as usize).copied()
}

pub fn pack_ticket(scheme: SignatureScheme, hash: &[u8; 32], secret: &[u8; 32]) -> [u8; TICKET_BYTE_LEN] {
    let mut bytes = [0u8; TICKET_BYTE_LEN];
    bytes[0] = scheme_to_byte(scheme);
    bytes[1..33].copy_from_slice(hash);
    bytes[33..65].copy_from_slice(secret);
    bytes
}

pub fn unpack_scheme(bytes: &[u8; TICKET_BYTE_LEN]) -> Option<SignatureScheme> {
    byte_to_scheme(bytes[0])
}

pub fn unpack_hash(bytes: &[u8; TICKET_BYTE_LEN]) -> [u8; 32] {
    let mut h = [0u8; 32];
    h.copy_from_slice(&bytes[1..33]);
    h
}

pub fn unpack_secret(bytes: &[u8; TICKET_BYTE_LEN]) -> [u8; 32] {
    let mut s = [0u8; 32];
    s.copy_from_slice(&bytes[33..65]);
    s
}