mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-14 18:48:13 -07:00
Update USB Serial Number from SPI flash's uniqueID
Also allow flash to be separately enabled via PLATFORM_EXTRAS. NOTE: this does *NOT* enable the serial number in the bootrom. Still investigating options there.
This commit is contained in:
parent
944d6ee596
commit
5784c8de77
6 changed files with 71 additions and 5 deletions
|
@ -366,11 +366,56 @@ static const char StrProduct[] = {
|
|||
'p', 0, 'r', 0, 'o', 0, 'x', 0, 'm', 0, 'a', 0, 'r', 0, 'k', 0, '3', 0
|
||||
};
|
||||
|
||||
#ifndef WITH_FLASH
|
||||
static const char StrSerialNumber[] = {
|
||||
14, // Length
|
||||
0x03, // Type is string
|
||||
'i', 0, 'c', 0, 'e', 0, 'm', 0, 'a', 0, 'n', 0
|
||||
};
|
||||
#else // WITH_FLASH is defined
|
||||
|
||||
// Manually calculated size of descriptor with unique ID:
|
||||
// offset 0, lengt h 1: total length field
|
||||
// offset 1, length 1: descriptor type field
|
||||
// offset 2, length 12: 6x unicode chars (original string)
|
||||
// offset 14, length 4: 2x unicode chars (underscores) [[ to avoid descriptor being (size % 8) == 0, OS bug workaround ]]
|
||||
// offset 18, length 32: 16x unicode chars (8-byte serial as hex characters)
|
||||
// ============================
|
||||
// total: 50 bytes
|
||||
|
||||
#define USB_STRING_DESCRIPTOR_SERIAL_NUMBER_LENGTH 50
|
||||
char StrSerialNumber[] = {
|
||||
14, // Length is initially identical to non-unique version ... The length updated at boot, if unique serial is available
|
||||
0x03, // Type is string
|
||||
'i', 0, 'c', 0, 'e', 0, 'm', 0, 'a', 0, 'n', 0,
|
||||
'_', 0, '_', 0,
|
||||
'x', 0, 'x', 0, 'x', 0, 'x', 0, 'x', 0, 'x', 0, 'x', 0, 'x', 0,
|
||||
'x', 0, 'x', 0, 'x', 0, 'x', 0, 'x', 0, 'x', 0, 'x', 0, 'x', 0,
|
||||
};
|
||||
void usb_update_serial(uint64_t newSerialNumber) {
|
||||
static bool configured = false; // TODO: enable by setting to false here...
|
||||
if (configured) {
|
||||
return;
|
||||
}
|
||||
// run this only once per boot... even if it fails to find serial number
|
||||
configured = true;
|
||||
if ((newSerialNumber == 0x0000000000000000) || (newSerialNumber == 0xFFFFFFFFFFFFFFFF)) {
|
||||
return;
|
||||
}
|
||||
// Descriptor is, effectively, initially identical to non-unique serial
|
||||
// number because it reports the shorter length in the first byte.
|
||||
// Convert uniqueID's eight bytes to 16 unicode characters in the
|
||||
// descriptor and, finally, update the descriptor's length, which
|
||||
// causes the serial number to become visible.
|
||||
for (uint8_t i = 0; i < 16; i++) {
|
||||
uint8_t nibble = (uint8_t)((newSerialNumber >> (60 - (4*i))) & 0xFu);
|
||||
char c = nibble < 10 ? '0' + nibble : 'A' + (nibble-10);
|
||||
StrSerialNumber[18+(2*i)] = c; // [ 18, 20, 22, .., 46, 48 ]
|
||||
}
|
||||
StrSerialNumber[0] = USB_STRING_DESCRIPTOR_SERIAL_NUMBER_LENGTH;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
// size includes their own field.
|
||||
static const char StrMS_OSDescriptor[] = {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue