mirror of
https://github.com/palera1n/palera1n.git
synced 2026-10-21 09:47:01 +02:00
64 lines
1.8 KiB
C
64 lines
1.8 KiB
C
#include "dfu.h"
|
|||
|
|
|
||
|
|
#include <stdlib.h>
|
||
|
|
#include <stddef.h>
|
||
|
|
#include <stdint.h>
|
||
|
|
#include <string.h>
|
||
|
|
|
||
|
|
#ifndef __APPLE__
|
||
|
|
# include "usb-libusb.h"
|
||
|
|
#endif
|
||
|
|
#include "payload.h"
|
||
|
|
|
||
|
|
bool dfu_check_status(const usb_handle_t *handle, uint8_t status, uint8_t state) {
|
||
|
|
struct {
|
||
|
|
uint8_t status, poll_timeout[3], state, str_idx;
|
||
|
|
} dfu_status;
|
||
|
|
transfer_ret_t transfer_ret;
|
||
|
|
|
||
|
|
return send_usb_control_request(handle, 0xA1, DFU_GETSTATUS, 0, 0, &dfu_status, sizeof(dfu_status), &transfer_ret)
|
||
|
|
&& transfer_ret.ret == USB_TRANSFER_OK && transfer_ret.sz == sizeof(dfu_status)
|
||
|
|
&& dfu_status.status == status && dfu_status.state == state;
|
||
|
|
}
|
||
|
|
|
||
|
|
bool dfu_device_set_await_reset(const usb_handle_t *handle) {
|
||
|
|
transfer_ret_t transfer_ret;
|
||
|
|
|
||
|
|
return send_usb_control_request_no_data(handle, 0x21, DFU_DNLOAD, 0, 0, 0, &transfer_ret)
|
||
|
|
&& transfer_ret.ret == USB_TRANSFER_OK && transfer_ret.sz == 0
|
||
|
|
&& dfu_check_status(handle, DFU_STATUS_OK, DFU_STATE_MANIFEST_SYNC)
|
||
|
|
&& dfu_check_status(handle, DFU_STATUS_OK, DFU_STATE_MANIFEST)
|
||
|
|
&& dfu_check_status(handle, DFU_STATUS_OK, DFU_STATE_MANIFEST_WAIT_RESET);
|
||
|
|
}
|
||
|
|
|
||
|
|
int dfu_serial_number_get_cpid(char *serial) {
|
||
|
|
char *cpid = strstr(serial, "CPID:");
|
||
|
|
if (cpid == NULL) { return -1; }
|
||
|
|
return strtol(cpid + 5, NULL, 16);
|
||
|
|
}
|
||
|
|
|
||
|
|
int dfu_serial_number_get_bdid(char *serial) {
|
||
|
|
char *bdid = strstr(serial, "BDID:");
|
||
|
|
if (bdid == NULL) { return -1; }
|
||
|
|
return strtol(bdid + 5, NULL, 16);
|
||
|
|
}
|
||
|
|
|
||
|
|
bool dfu_serial_number_is_in_dfu_mode(char *serial) {
|
||
|
|
char *DFU = strstr(serial, "SRTG");
|
||
|
|
return DFU != NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
bool dfu_serial_number_is_pwned(char *serial) {
|
||
|
|
char *pwnd = strstr(serial, "PWND:");
|
||
|
|
return pwnd != NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
bool dfu_serial_number_is_in_yolo_dfu(char *serial) {
|
||
|
|
char *yolo = strstr(serial, "YOLO");
|
||
|
|
return yolo != NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
bool device_serial_number_is_in_pongo_os(char *serial) {
|
||
|
|
char *pongo = strstr(serial, "SRTG:[PongoOS");
|
||
|
|
return pongo != NULL;
|
||
|
|
}
|