100 lines
2.5 KiB
Plaintext
100 lines
2.5 KiB
Plaintext
|
|
xorArray = {0xAA,0x50,0x43,0x52}
|
|
securetyKeyCalc = function(pucSeed,ucSecurityLevel){
|
|
//SeedSec_t cal,key,seed;
|
|
var seed = {0,0,0,0};
|
|
var key = {0,0,0,0};
|
|
var cal = {0,0,0,0};
|
|
seed[1]=pucSeed[4];
|
|
seed[2]=pucSeed[3];
|
|
seed[3]=pucSeed[2];
|
|
seed[4]=pucSeed[1];
|
|
select(ucSecurityLevel) {
|
|
case 0x01 {
|
|
var dll = raw.loadDll("/DM_RP_SA.dll",,"cdecl" );
|
|
if(dll != null){
|
|
FuncDisplay("加载密钥dll成功");
|
|
var retlen = raw.buffer(4,0);
|
|
var seedraw = raw.buffer(4,0);
|
|
var iVariant = raw.buffer(20,0);
|
|
var keyraw = raw.buffer(4,0);
|
|
seedraw[1] = pucSeed[1];
|
|
seedraw[2] = pucSeed[2];
|
|
seedraw[3] = pucSeed[3];
|
|
seedraw[4] = pucSeed[4];
|
|
var ret = 0;
|
|
ret = dll.GenerateKeyEx(seedraw,4,0x01,iVariant,keyraw,4,retlen);
|
|
FuncDisplay("ret = " ++ ret );
|
|
|
|
key[1] = keyraw[1];
|
|
key[2] = keyraw[2];
|
|
key[3] = keyraw[3];
|
|
key[4] = keyraw[4];
|
|
return key;
|
|
}
|
|
else {
|
|
FuncDisplay("加载密钥dll失败");
|
|
}
|
|
|
|
|
|
}
|
|
case 0x09 {
|
|
var dll = raw.loadDll("/DM_RP_SA.dll",,"cdecl" );
|
|
if(dll != null){
|
|
FuncDisplay("加载密钥dll成功");
|
|
var retlen = raw.buffer(4,0);
|
|
var seedraw = raw.buffer(4,0);
|
|
var iVariant = raw.buffer(20,0);
|
|
var keyraw = raw.buffer(4,0);
|
|
seedraw[1] = pucSeed[1];
|
|
seedraw[2] = pucSeed[2];
|
|
seedraw[3] = pucSeed[3];
|
|
seedraw[4] = pucSeed[4];
|
|
var ret = 0;
|
|
ret = dll.GenerateKeyEx(seedraw,4,0x09,iVariant,keyraw,4,retlen);
|
|
FuncDisplay("ret = " ++ ret );
|
|
|
|
key[1] = keyraw[1];
|
|
key[2] = keyraw[2];
|
|
key[3] = keyraw[3];
|
|
key[4] = keyraw[4];
|
|
return key;
|
|
}
|
|
else {
|
|
FuncDisplay("加载密钥dll失败");
|
|
}
|
|
}
|
|
case 0x11 {
|
|
/*
|
|
cal.byte[0] = seed.byte[0]^xorArray[0];
|
|
cal.byte[1] = seed.byte[1]^xorArray[1];
|
|
cal.byte[2] = seed.byte[2]^xorArray[2];
|
|
cal.byte[3] = seed.byte[3]^xorArray[3];
|
|
|
|
key.byte[3] = ((cal.byte[1]&0x03)<<6)|(( cal.byte[0]&0xFC)>>2);
|
|
key.byte[2] = ((cal.byte[0]&0x03)<<6)|(cal.byte[3]&0x3F);
|
|
key.byte[1] = (cal.byte[3]&0xFC)|((cal.byte[2]&0xC0)>>6);
|
|
key.byte[0] = (cal.byte[2]&0xFC)|(cal.byte[1]&0x03);
|
|
*/
|
|
cal[1] = seed[1]^xorArray[1];
|
|
cal[2] = seed[2]^xorArray[2];
|
|
cal[3] = seed[3]^xorArray[3];
|
|
cal[4] = seed[4]^xorArray[4];
|
|
|
|
key[4] = ((cal[2]&0x03)<<6)|(( cal[1]&0xFC)>>2);
|
|
key[3] = ((cal[1]&0x03)<<6)|(cal[4]&0x3F);
|
|
key[2] = (cal[4]&0xFC)|((cal[3]&0xC0)>>6);
|
|
key[1] = (cal[3]&0xFC)|(cal[2]&0x03);
|
|
}
|
|
else {
|
|
}
|
|
}
|
|
var pucKey = {0,0,0,0};
|
|
pucKey[1]=key[4];
|
|
pucKey[2]=key[3];
|
|
pucKey[3]=key[2];
|
|
pucKey[4]=key[1];
|
|
|
|
return pucKey;
|
|
}
|