📄 nagra2-0101.cpp
字号:
/*
* Softcam plugin to VDR (C++)
*
* This code is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This code is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* Or, point your browser to http://www.gnu.org/copyleft/gpl.html
*/
// -- cAuxSrv ------------------------------------------------------------------
#define HAS_AUXSRV
static int auxPort=7777;
static char auxAddr[80]="localhost";
static char auxPassword[250]="auxserver";
static int auxUseEmu = 1;
#include "map57.h"
class cAuxSrv : public cMutex
{
private:
cNetSocket so;
//
bool Login(void);
public:
cAuxSrv(void);
bool Map(int map, unsigned char *data, int len, int outlen);
};
cAuxSrv::cAuxSrv(void)
:so(DEFAULT_CONNECT_TIMEOUT,7,DEFAULT_IDLE_TIMEOUT)
{}
bool cAuxSrv::Login()
{
unsigned char buff[256];
dn(printf("auxsrv: connecting to %s:%d\n",auxAddr,auxPort))
if(so.Connect(auxAddr,auxPort)) {
buff[0]=0xA7;
buff[1]=0x7A;
buff[2]=0;
int l=strlen(auxPassword);
buff[3]=l;
memcpy(&buff[4],auxPassword,l);
buff[4+l]=0xFF;
if(so.Write(buff,l+5)==l+5) return true;
dn(printf("auxsrv: login write failed\n"))
}
so.Disconnect();
return false;
}
bool cAuxSrv::Map(int map, unsigned char *data, int len, int outlen)
{
if(len>500 || outlen>500) return false;
cMutexLock lock(this);
if(!so.Connected() && !Login()) return false;
dn(printf("auxsrv: calling map%02x\n",map))
unsigned char buff[512];
buff[0]=0xA7;
buff[1]=0x7A;
buff[2]=((len+1)>>8) & 0xff;
buff[3]=(len+1)&0xff;
buff[4]=map;
memcpy(&buff[5],data,len);
buff[len+5]=0xFF;
if(so.Write(buff,len+6)==len+6) {
if((len=so.Read(buff,sizeof(buff)))>0) {
if(buff[0]==0x7A && buff[1]==0xA7) {
if(buff[4]==0x00) {
int l=buff[2]*256+buff[3];
if(len>=l+5 && l==outlen+1) {
if(buff[l+4]==0xFF) {
memcpy(data,buff+5,outlen);
return true;
}
else dn(printf("auxsrv: bad footer in map%02x response\n",map))
}
else dn(printf("auxsrv: bad length in map%02x response (got=%d want=%d)\n",map,l-1,outlen))
}
else dn(printf("auxsrv: map%02x not successfull (unsupported?)\n",map))
}
else dn(printf("auxsrv: bad response to map%02x\n",map))
}
else dn(printf("auxsrv: map%02x read failed\n",map))
}
else dn(printf("auxsrv: map%02x write failed\n",map))
so.Disconnect();
return false;
}
// -- cN2Map0101 ----------------------------------------------------------------
class cN2Map0101 {
private:
cBN keymulinv, keybig, ukey, reinput;
cBN ushift;
cBN sum, num1, num2;
cBNctx ctx;
void mod_add(BIGNUM *arg1, BIGNUM *arg2, BIGNUM *arg3, BIGNUM *arg4);
void bn_cmplx1(BIGNUM *arg1, BIGNUM *arg2, BIGNUM *arg3,
BIGNUM *arg4, BIGNUM *arg5);
void bn_cmplx1a(BIGNUM *arg1, BIGNUM *arg2, BIGNUM *arg3,
BIGNUM *arg4, BIGNUM *arg5);
void mod_sub(void);
void bn_func1(BIGNUM *arg0);
void bn_func2(int arg0);
void bn_func3(int arg0);
void bn_cmplx7(void);
void bn_cmplx2(BIGNUM *var1, BIGNUM *var2, BIGNUM *var3,
BIGNUM *var4, BIGNUM *var5, BIGNUM *var6);
BIGNUM *bn_glb0, *bn_glb1, *bn_glb3, *bn_glb5, *bn_glb6, *bn_glb7;
BIGNUM *bn_glb_a, *bn_glb_b, *bn_glb_c, *bn_glb_d, *bn_glb_e, *bn_glb_f, *bn_glb_g;
BIGNUM *bn_glb_h, *bn_glb_i, *bn_glb_j, *bn_glb_k, *bn_glb_l, *bn_glb_m;
BIGNUM *glb2pow128, *mask128, *glb2pow64, *mask64;
BN_CTX *t1;
protected:
void Map3b(unsigned char *data);
void Map57(unsigned char *data);
public:
cN2Map0101(void);
void DoMap(int f, unsigned char *data, int l);
};
cN2Map0101::cN2Map0101(void)
{
BN_set_bit(ushift,128);
}
void cN2Map0101::mod_add(BIGNUM *arg1, BIGNUM *arg2, BIGNUM *arg3, BIGNUM *arg4)
{
BN_add(arg1, arg2, arg3);
if(BN_cmp(arg1, arg4) >= 0) {
BN_sub(arg1, arg1, arg4);
}
BN_mask_bits(arg1, 128);
}
void cN2Map0101::bn_cmplx1(BIGNUM *arg1, BIGNUM *arg2, BIGNUM *arg3,
BIGNUM *arg4, BIGNUM *arg5)
{
int j;
BIGNUM *var44, *var64, *var84, *vara4;
var44 = BN_new();
var64 = BN_new();
var84 = BN_new();
vara4 = BN_new();
BN_copy(var44, arg2);
BN_copy(var64, arg3);
BN_clear(vara4);
for(j=0; j<2; j++) {
BN_copy(var84, var64);
BN_mask_bits(var84, 64);
BN_rshift(var64, var64, 64);
BN_mul(var84, var84, var44, t1);
BN_add(vara4, vara4, var84);
BN_copy(var84, vara4);
BN_mask_bits(var84, 128);
BN_mul(var84, vara4, arg4, t1);
BN_mask_bits(var84, 64);
BN_mul(var84, var84, arg5, t1);
BN_add(vara4, vara4, var84);
BN_rshift(vara4, vara4, 64);
if(BN_cmp(vara4, arg5) >= 0) {
BN_sub(vara4, vara4, arg5);
}
BN_mask_bits(vara4, 128);
}
BN_copy(arg1, vara4);
BN_free(var44);
BN_free(var64);
BN_free(var84);
BN_free(vara4);
}
void cN2Map0101::bn_cmplx1a(BIGNUM *arg1, BIGNUM *arg2, BIGNUM *arg3,
BIGNUM *arg4, BIGNUM *arg5)
{
int j;
BIGNUM *var44, *var64, *var84, *vara4;
var44 = BN_new();
var64 = BN_new();
var84 = BN_new();
vara4 = BN_new();
BN_copy(var44, arg2);
BN_copy(var64, arg3);
BN_clear(vara4);
for(j=0; j<2; j++) {
BN_copy(var84, var64);
BN_mask_bits(var84, 64);
BN_rshift(var64, var64, 64);
BN_mul(var84, var84, var44, t1);
BN_add(vara4, vara4, var84);
BN_copy(var84, vara4);
BN_mask_bits(var84, 128);
BN_mul(var84, vara4, arg4, t1);
BN_mask_bits(var84, 64);
BN_mul(var84, var84, arg5, t1);
BN_add(vara4, vara4, var84);
BN_rshift(vara4, vara4, 64);
if(j==0 && BN_cmp(vara4, arg5) >= 0) {
BN_sub(vara4, vara4, arg5);
}
BN_mask_bits(vara4, 128);
}
BN_copy(arg1, vara4);
BN_free(var44);
BN_free(var64);
BN_free(var84);
BN_free(vara4);
}
//uses 3, 1, glb2pow128
//sets 1, 0 (unused)
void cN2Map0101::mod_sub()
{
BN_copy(bn_glb0, bn_glb3);
BN_mod_sub(bn_glb1, bn_glb3, bn_glb1, glb2pow128, t1);
BN_mask_bits(bn_glb1, 128);
}
//uses 1, 3, 6
//sets 1, 0 (unused), 7(unused)
void cN2Map0101::bn_func1(BIGNUM *arg0) {
BIGNUM *var30 = BN_new();
BIGNUM *var50 = BN_new();
BN_copy(var30,arg0);
BN_mask_bits(var30, 8);
unsigned int x = BN_get_word(var30);
BN_copy(var30,arg0);
if( x != 0) {
BN_clear(var50);
BN_set_word(var50, 2);
BN_sub(var30, var30, var50);
} else {
BN_clear(var50);
BN_set_word(var50, 0xfe);
BN_add(var30, var30, var50);
}
BN_copy(bn_glb7, bn_glb1);
if(BN_is_zero(arg0)) {
BN_clear(bn_glb7);
BN_set_word(bn_glb7, 1);
BN_clear(bn_glb0);
mod_add(bn_glb1, bn_glb7, bn_glb0, bn_glb3);
BN_free(var30);
BN_free(var50);
return;
} else {
int msb = BN_num_bits(var30) -1;
while (msb > 0) {
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
msb--;
if(BN_is_bit_set(var30, msb)) {
bn_cmplx1(bn_glb1, bn_glb1, bn_glb7, bn_glb6, bn_glb3);
}
}
BN_clear(bn_glb7);
BN_set_word(bn_glb7, 1);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb7, bn_glb6, bn_glb3);
BN_clear(bn_glb0);
}
BN_free(var30);
BN_free(var50);
}
//uses 3, 6, a, b, c, l, glb2pow128
//sets 0, 1, 5, 7, a, b, c, f, g
void cN2Map0101::bn_func2(int arg0)
{
BN_copy(bn_glb1, bn_glb_b);
mod_add(bn_glb1, bn_glb1, bn_glb1, bn_glb3);
BN_copy(bn_glb7, bn_glb1);
BN_copy(bn_glb5, bn_glb_c);
BN_mask_bits(bn_glb1, 128);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb5, bn_glb6, bn_glb3);
BN_copy(bn_glb_g, bn_glb1);
BN_copy(bn_glb1, bn_glb7);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
BN_copy(bn_glb7, bn_glb_a);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb7, bn_glb6, bn_glb3);
mod_sub();
BN_copy(bn_glb_f, bn_glb1);
BN_copy(bn_glb1, bn_glb7);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
BN_copy(bn_glb7, bn_glb1);
mod_add(bn_glb1, bn_glb1, bn_glb1, bn_glb3);
mod_add(bn_glb1, bn_glb1, bn_glb7, bn_glb3);
BN_copy(bn_glb7, bn_glb1);
BN_copy(bn_glb1, bn_glb_c);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
BN_copy(bn_glb5, bn_glb_l);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb5, bn_glb6, bn_glb3);
mod_add(bn_glb1, bn_glb1, bn_glb7, bn_glb3);
BN_copy(bn_glb7, bn_glb1);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
BN_copy(bn_glb0, bn_glb_f);
mod_add(bn_glb1, bn_glb0, bn_glb1, bn_glb3);
mod_add(bn_glb1, bn_glb0, bn_glb1, bn_glb3);
if(arg0 == 0) {
BN_copy(bn_glb_a, bn_glb1);
} else {
BN_copy(bn_glb_f, bn_glb1);
}
mod_add(bn_glb1, bn_glb0, bn_glb1, bn_glb3);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb7, bn_glb6, bn_glb3);
BN_copy(bn_glb7, bn_glb1);
BN_copy(bn_glb1, bn_glb_b);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
mod_add(bn_glb1, bn_glb1, bn_glb1, bn_glb3);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
mod_add(bn_glb1, bn_glb1, bn_glb1, bn_glb3);
mod_add(bn_glb1, bn_glb1, bn_glb7, bn_glb3);
mod_sub();
if(arg0 == 0) {
BN_copy(bn_glb_b, bn_glb1);
BN_copy(bn_glb_c, bn_glb_g);
} else {
BN_copy(bn_glb_f, bn_glb1);
BN_copy(bn_glb_f, bn_glb_g);
}
}
//uses 3, 6, a, b, c, d, e, k
//sets 0, 1, 5, 7, a, b, c, f, g, h, i, j
void cN2Map0101::bn_func3(int arg0)
{
BN_copy(bn_glb1, bn_glb_c);
BN_copy(bn_glb7, bn_glb1);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb1, bn_glb6, bn_glb3);
bn_cmplx1(bn_glb0, bn_glb1, bn_glb7, bn_glb6, bn_glb3);
BN_copy(bn_glb_f, bn_glb0);
BN_copy(bn_glb5, bn_glb_d);
bn_cmplx1(bn_glb1, bn_glb1, bn_glb5, bn_glb6, bn_glb3);
BN_copy(bn_glb7, bn_glb1);
mod_sub();
BN_copy(bn_glb0, bn_glb_a);
mod_add(bn_glb1, bn_glb0, bn_glb1, bn_glb3);
BN_copy(bn_glb_g, bn_glb1);
BN_copy(bn_glb5, bn_glb_c);
bn_cmplx1(bn_glb0, bn_glb1, bn_glb5, bn_glb6, bn_glb3);
if(arg0 == 0) {
BN_copy(bn_glb_c, bn_glb0);
} else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -