libcros 0.6.5

A Rust library that provides easy-to-use functions for interacting with a Chrome device
Documentation
use crate::{
  gsc::{
    constants::{
      board_id, first_response_pdu, signed_header_version,
      vendor_cmd_cc::{EXTENSION_FW_UPGRADE, VENDOR_CC_GET_BOARD_ID},
    },
    read_response, send_command,
  },
  keyval::{KvValue, key_types, keys, kv_get},
};

const PDU_MAX: first_response_pdu = first_response_pdu {
  return_value: u32::MAX,
  protocol_version: u32::MAX,
  backup_ro_offset: u32::MAX,
  backup_rw_offset: u32::MAX,
  shv: [
    signed_header_version {
      minor: u32::MAX,
      major: u32::MAX,
      epoch: u32::MAX,
    },
    signed_header_version {
      minor: u32::MAX,
      major: u32::MAX,
      epoch: u32::MAX,
    },
  ],
  keyid: [u32::MAX, u32::MAX],
};

const BID_MAX: board_id = board_id {
  board_type: u32::MAX,
  type_inv: u32::MAX,
  flags: u32::MAX,
};

pub fn get_gsc_version() -> first_response_pdu {
  let mut f = match kv_get(key_types::FILE, keys::GSC_SOCKET) {
    Some(KvValue::File(f)) => f,
    _ => return PDU_MAX,
  };

  if !send_command(&mut f, 0, 0, &[], EXTENSION_FW_UPGRADE) {
    return PDU_MAX;
  }

  let mut buf = [0u8; core::mem::size_of::<first_response_pdu>()];
  if read_response(&mut f, &mut buf) != 0 {
    return PDU_MAX;
  }

  unsafe { core::ptr::read_unaligned(buf.as_ptr() as *const first_response_pdu) }
}

pub fn get_gsc_board_id() -> board_id {
  let mut f = match kv_get(key_types::FILE, keys::GSC_SOCKET) {
    Some(KvValue::File(f)) => f,
    _ => return BID_MAX,
  };

  if !send_command(&mut f, 0, 0, &[], VENDOR_CC_GET_BOARD_ID) {
    return BID_MAX;
  }

  let mut buf = [0u8; core::mem::size_of::<board_id>()];
  if read_response(&mut f, &mut buf) != 0 {
    return BID_MAX;
  }

  unsafe { core::ptr::read_unaligned(buf.as_ptr() as *const board_id) }
}