2019-03-21 22:54:06 +01:00
|
|
|
#include <fxg1a.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
2019-06-28 19:44:03 +02:00
|
|
|
#include <endianness.h>
|
2019-03-21 22:54:06 +01:00
|
|
|
|
|
|
|
/* sign(): Sign header by filling fixed fields and checksums */
|
|
|
|
void sign(struct g1a *g1a, size_t size)
|
|
|
|
{
|
|
|
|
struct header *header = &g1a->header;
|
|
|
|
|
|
|
|
/* Fixed elements */
|
|
|
|
|
|
|
|
memcpy(header->magic, "USBPower", 8);
|
|
|
|
header->mcs_type = 0xf3;
|
|
|
|
memcpy(header->seq1, "\x00\x10\x00\x10\x00", 5);
|
|
|
|
header->seq2 = 0x01;
|
|
|
|
|
|
|
|
header->filesize_be1 = htobe32(size);
|
|
|
|
header->filesize_be2 = htobe32(size);
|
|
|
|
|
|
|
|
/* Control bytes and checksums */
|
|
|
|
|
|
|
|
header->control1 = size + 0x41;
|
|
|
|
header->control2 = size + 0xb8;
|
|
|
|
header->checksum = htobe16(checksum(g1a, size));
|
|
|
|
}
|
|
|
|
|
|
|
|
/* edit_name(): Set application name */
|
|
|
|
void edit_name(struct g1a *g1a, const char *name)
|
|
|
|
{
|
|
|
|
memset(g1a->header.name, 0, 8);
|
|
|
|
if(!name) return;
|
|
|
|
|
|
|
|
for(int i = 0; name[i] && i < 8; i++)
|
|
|
|
g1a->header.name[i] = name[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
/* edit_internal(): Set internal name */
|
|
|
|
void edit_internal(struct g1a *g1a, const char *internal)
|
|
|
|
{
|
|
|
|
memset(g1a->header.internal, 0, 8);
|
|
|
|
if(!internal) return;
|
|
|
|
|
|
|
|
for(int i = 0; internal[i] && i < 8; i++)
|
|
|
|
g1a->header.internal[i] = internal[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
/* edit_version(): Set version string */
|
|
|
|
void edit_version(struct g1a *g1a, const char *version)
|
|
|
|
{
|
|
|
|
memset(g1a->header.version, 0, 10);
|
|
|
|
if(!version) return;
|
|
|
|
|
|
|
|
for(int i = 0; version[i] && i < 10; i++)
|
|
|
|
g1a->header.version[i] = version[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
/* edit_date(): Set build date */
|
|
|
|
void edit_date(struct g1a *g1a, const char *date)
|
|
|
|
{
|
|
|
|
memset(g1a->header.date, 0, 14);
|
|
|
|
if(!date) return;
|
|
|
|
|
|
|
|
for(int i = 0; date[i] && i < 14; i++)
|
|
|
|
g1a->header.date[i] = date[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
/* edit_icon(): Set icon from monochrome bitmap */
|
|
|
|
void edit_icon(struct g1a *g1a, uint8_t const *mono)
|
|
|
|
{
|
|
|
|
memcpy(g1a->header.icon, mono, 68);
|
|
|
|
}
|