PRINTF(L_SYS_TPS,"mapping failed for "TPSBIN);
return false;
}
- else if(tpsbin->Size()<65536 || memcmp(mark,tpsbin->Addr()+32,sizeof(mark)) || memcmp(mark,tpsbin->Addr()+48,sizeof(mark))) {
+ const unsigned char *a=tpsbin->Addr();
+ int len=tpsbin->Size();
+ if(len<(68+56) || memcmp(mark,a+32,sizeof(mark)) || memcmp(mark,a+48,sizeof(mark))) {
PRINTF(L_SYS_TPS,TPSBIN" format not recognised");
tpsbin->Unmap();
return false;
}
- int size=tpsbin->Size()-56;
+ int size=*((const unsigned int *)(a+64));
+ a+=68; len-=68;
+ if(len<size) {
+ PRINTF(L_SYS_TPS,TPSBIN" key data length mismatch");
+ tpsbin->Unmap();
+ return false;
+ }
+
cSimpleList<cTpsKey> *nlist=new cSimpleList<cTpsKey>;
- for(int i=68; i<size; i+=56) {
- const unsigned char *a=tpsbin->Addr()+i;
+ for(int i=0; i<size; i+=56,a+=56,len-=56) {
if(*((const unsigned int *)a)==0x00000000L || *((const unsigned int *)a)==0xFFFFFFFFL)
break;
unsigned char tmp[56];
cTpsKey *k=new cTpsKey;
if(k) { k->Set(tmp); nlist->Add(k); }
}
- tpsbin->Unmap();
PRINTF(L_SYS_TPSAU,"loaded %d keys from "TPSBIN" file",nlist->Count());
Join(nlist);
+
+ static const unsigned char alg_mark[] = { 'A','L','G','3' };
+ while(len>64) {
+ if(!memcmp(alg_mark,a,sizeof(alg_mark)) && *(a+11)==0x02) {
+ size=*((const unsigned short *)(a+6));
+ if(len<size) {
+ PRINTF(L_SYS_TPS,TPSBIN" algo data length mismatch");
+ break;
+ }
+ int off=a-tpsbin->Addr()+64;
+ int cb1=*((const unsigned short *)(a+18))-off;
+ int cb2=*((const unsigned short *)(a+30))-off;
+ int cb3=*((const unsigned short *)(a+42))-off;
+ PRINTF(L_SYS_TPSAU,"algo pointers in "TPSBIN" off=%04x cb1=%04x cb2=%04x cb3=%04x size=%04x",off,cb1,cb2,cb3,size);
+ RegisterAlgo3(a+64,cb1,cb2,cb3,size);
+ break;
+ }
+ a+=4; len-=4;
+ }
+
+ tpsbin->Unmap();
return true;
}
break;
case 0xEA:
if(doPre) TpsDecrypt(&data[i+2],k->Mode(0),k->Key(0));
- if(doTPS) TpsDecrypt(&data[i+2],(hasDF)?k->Mode(2):1,k->Key(2));
- if(doPost) { postMode=k->Mode(1); memcpy(postKey,k->Key(1),sizeof(postKey)); }
+ if(doTPS) TpsDecrypt(&data[i+2],(hasDF)?k->Mode(1):1,k->Key(1));
+ if(doPost) { postMode=k->Mode(2); memcpy(postKey,k->Key(2),sizeof(postKey)); }
break;
}
}