m365 0.1.1

A lightweight rust library to receive BLE Xiaomi M365 scooter messages
Documentation
use hex_literal::hex;
use tracing::Level;
use tracing_subscriber::fmt::format::FmtSpan;
use m365::mi_crypto::{EncryptionKey, encrypt_uart, crc16, decrypt_uart};

#[test]
fn it_crc16() {
  let bytes = [0xa1, 0x21, 0xf3, 4, 5, 6, 7, 8, 9];
  let crc = crc16(&bytes);

  assert_eq!(crc, hex!("23fe"));
}

#[test]
fn it_encrypts_uart() {
  let encryption_key = EncryptionKey {
    key: hex!("5066d82368375a1f6a0a3eba1317b525"),
    iv: hex!("28cee53e")
  };

  let rand : [u8; 4] = hex!("897045e7");
  let cmd : [u8; 5] = hex!("032001100e");
  let ct = encrypt_uart(&encryption_key, &cmd, 0, Some(rand));

  let expected_result = hex!("55ab03000016b2eddb0b680532a988c4f2dbf9");

  assert_eq!(ct.len(), expected_result.len());
  assert_eq!(ct, expected_result)
}


#[test]
fn it_decrypt_uart() {
  tracing_subscriber::fmt()
    .with_max_level(Level::DEBUG)
    .with_span_events(FmtSpan::CLOSE)
    .init();
  let encryption_key = EncryptionKey {
    key: hex!("462f3fcc74200ca5f77ee2a581c42af0"),
    iv: hex!("f8901a05")
  };

  let encrypted : [u8; 32] = hex!("55ab1001009a70888f3a27d8378bb07f7d8ce4cce88ab54a50595ad6c019c7f2");
  let decrypted = decrypt_uart(&encryption_key, &encrypted).unwrap();
  let bytes = &decrypted[3..decrypted.len()-4];
  let text = String::from_utf8_lossy(bytes);

  assert_eq!("26354/00467353", text)
}