Skip to content

Commit

Permalink
added parameter to specify generator
Browse files Browse the repository at this point in the history
fixed some generator related code
  • Loading branch information
tihmstar committed Apr 25, 2017
1 parent c7a07b3 commit 4700d85
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 24 deletions.
20 changes: 19 additions & 1 deletion tsschecker/main.c
Expand Up @@ -48,6 +48,7 @@ static struct option longopts[] = {
{ "boardconfig", required_argument, NULL, 'B' },
{ "buildid", required_argument, NULL, 'Z' },
{ "debug", no_argument, NULL, '0' },
{ "generator", required_argument, NULL, 'g' },
{ NULL, 0, NULL, 0 }
};

Expand All @@ -72,6 +73,7 @@ void cmd_help(){
printf(" --apnonce NONCE\t\tmanually specify APNONCE instead of using random one (not required for saving blobs)\n");
printf(" --sepnonce NONCE\t\tmanually specify SEPNONCE instead of using random one (not required for saving blobs)\n");
printf(" --save-path PATH\t\tspecify path for saving blobs\n");
printf(" --generator GEN\t\tmanually specify generator in format 0x%%16llx\n");
printf(" -h, --help\t\t\tprints usage information\n");
printf(" --beta\t\t\trequest ticket for beta instead of normal relase (use with -o)\n");
printf(" --list-devices\t\tlist all known devices\n");
Expand Down Expand Up @@ -159,7 +161,7 @@ int main(int argc, const char * argv[]) {
cmd_help();
return -1;
}
while ((opt = getopt_long(argc, (char* const *)argv, "d:i:e:m:B:hslbuo", longopts, &optindex)) > 0) {
while ((opt = getopt_long(argc, (char* const *)argv, "d:i:e:m:B:hg:slbuo", longopts, &optindex)) > 0) {
switch (opt) {
case 'h': // long option: "help"; can be called as short option
cmd_help();
Expand All @@ -180,6 +182,22 @@ int main(int argc, const char * argv[]) {
case 'e': // long option: "ecid"; can be called as short option
ecid = optarg;
break;
case 'g': // long option: "ecid"; can be called as short option
if (optarg[0] != '0' && optarg[1] != 'x')
goto failparse;
devVals.generator[0] = '0';
devVals.generator[1] = 'x';
devVals.generator[sizeof(devVals.generator)-1] = '\0';
devVals.generator[0+2] = tolower(optarg[0+2]);
for (int i=0;i<16; i++){
devVals.generator[i+2] = tolower(optarg[i+2]);
if (!isdigit(optarg[i+2]) && ((int)devVals.generator[i+2] < 'a' || devVals.generator[i+2] > 'f'))
failparse:
reterror(-10, "[TSSC] parsing generator \"%s\" failed\n",optarg);

}
info("[TSSC] manually specified generator \"%s\"\n",devVals.generator);
break;
case 'b': // long option: "no-baseband"; can be called as short option
if (optarg) versVals.basebandMode = atoi(optarg);
else versVals.basebandMode = kBasebandModeWithoutBaseband;
Expand Down
46 changes: 23 additions & 23 deletions tsschecker/tsschecker.c
Expand Up @@ -673,39 +673,39 @@ int tss_populate_random(plist_t tssreq, int is64bit, t_devicevals *devVals){
if (nonceLen == 20) {
//this is a pre iPhone7 device
//nonce is derived from generator with SHA1
unsigned char zz[8] = {0};
getRandNum((char*)zz, 8, 256);

for (int i=0; i<8; i++) {
if (devVals->generator[i]){
parseHex(devVals->generator+2, NULL, (char*)zz, NULL);
swapchar(zz[0], zz[7]);
swapchar(zz[1], zz[6]);
swapchar(zz[2], zz[5]);
swapchar(zz[3], zz[4]);
goto makesha1;
}
unsigned char zz[9] = {0};

for (int i=0; i<sizeof(devVals->generator)-1; i++) {
if (!devVals->generator[i]) goto makegen;
}
devVals->generator[sizeof(devVals->generator)-1] = 0;
parseHex(devVals->generator+2, NULL, (char*)zz, NULL);
swapchar(zz[0], zz[7]);
swapchar(zz[1], zz[6]);
swapchar(zz[2], zz[5]);
swapchar(zz[3], zz[4]);
goto makesha1;
makegen:
getRandNum((char*)zz, 8, 256);
snprintf(devVals->generator, 19, "0x%02x%02x%02x%02x%02x%02x%02x%02x",zz[7],zz[6],zz[5],zz[4],zz[3],zz[2],zz[1],zz[0]);
makesha1:
SHA1(zz, 8, (unsigned char*)devVals->apnonce);
}else if (nonceLen == 32){
unsigned char zz[8] = {0};
unsigned char genHash[48]; //SHA384 digest length

for (int i=0; i<8; i++) {
if (devVals->generator[i]){
parseHex(devVals->generator+2, NULL, (char*)zz, NULL);
swapchar(zz[0], zz[7]);
swapchar(zz[1], zz[6]);
swapchar(zz[2], zz[5]);
swapchar(zz[3], zz[4]);
goto makesha384;
}
for (int i=0; i<sizeof(devVals->generator)-1; i++) {
if (!devVals->generator[i]) goto makegen2;
}

devVals->generator[sizeof(devVals->generator)-1] = 0;
parseHex(devVals->generator+2, NULL, (char*)zz, NULL);
swapchar(zz[0], zz[7]);
swapchar(zz[1], zz[6]);
swapchar(zz[2], zz[5]);
swapchar(zz[3], zz[4]);
goto makesha384;
makegen2:
getRandNum((char*)zz, 8, 256);

snprintf(devVals->generator, 19, "0x%02x%02x%02x%02x%02x%02x%02x%02x",zz[7],zz[6],zz[5],zz[4],zz[3],zz[2],zz[1],zz[0]);
makesha384:
SHA384(zz, 8, genHash);
Expand Down

0 comments on commit 4700d85

Please sign in to comment.