From: anon Date: Sun, 8 Jun 2008 14:17:46 +0000 (+0800) Subject: nagra-0101: fixed map3e X-Git-Tag: 0.9.1~84 X-Git-Url: http://www.vanbest.org/gitweb/?a=commitdiff_plain;h=153fa0e79665544c648c70af758c07bb71c9adb8;p=sasc-ng.git nagra-0101: fixed map3e --- diff --git a/systems/nagra/nagra2-0101.c b/systems/nagra/nagra2-0101.c index 5eac2f4..a8d4da4 100644 --- a/systems/nagra/nagra2-0101.c +++ b/systems/nagra/nagra2-0101.c @@ -238,14 +238,25 @@ fprintf(stderr,"map %x l=%d\n",f,l); break; case 0x3e: { - I.GetLE(data,l<<3); - BN_mod_exp(B,A,I,D,ctx); - BN_one(A); - int end=BN_num_bits(I); + cBN scalar; + scalar.GetLE(data,l<<3); + if(BN_is_zero(scalar) || BN_num_bits(D)<=1) { + MakeJ0(J,D); + if(BN_num_bits(D)==1 || !BN_is_zero(scalar)) BN_zero(B); + else BN_one(B); + BN_one(A); + } + else { + MonInit(); + MonMul(B,A,B); + MonExp(scalar); + } + BN_zero(C); + int end=BN_num_bits(scalar); int msb=data[(end-1)/8]; cycles=3848 + ((end-1)/8)*650 - 11; for(int i=8; --i>=1;) if(msb&(1<=0;) if(BN_is_bit_set(I,i)) cycles+=88; + for(int i=end; --i>=0;) if(BN_is_bit_set(scalar,i)) cycles+=88; break; } case 0x4d: diff --git a/systems/nagra/nagra2.c b/systems/nagra/nagra2.c index c3b6699..24c8c19 100644 --- a/systems/nagra/nagra2.c +++ b/systems/nagra/nagra2.c @@ -451,6 +451,18 @@ void cMapCore::MonInit(int bits) for(int i=0; i<4; i++) MonMul(B,B,B); } +void cMapCore::MonExp(BIGNUM *scalar) +{ + if(BN_is_zero(D)) { BN_one(A); return; } + BN_copy(A,B); + for(int i=BN_num_bits(scalar)-2; i>-1; i--) { + MonMul(B,B,B); + if(BN_is_bit_set(scalar,i)) MonMul(B,A,B); + } + BN_one(A); + MonMul(B,A,B); +} + void cMapCore::MonExpNeg(void) { if(BN_is_zero(D)) { BN_set_word(A,1); return; } diff --git a/systems/nagra/nagra2.h b/systems/nagra/nagra2.h index 0e68e8a..30889aa 100644 --- a/systems/nagra/nagra2.h +++ b/systems/nagra/nagra2.h @@ -143,6 +143,7 @@ protected: cBN sA0, sC0, sE0, s100, s120, s140, s160; // statefull void MonInit(int bits=0); + void MonExp(BIGNUM *scalar); void MonExpNeg(void); // ECC void DoubleP(int temp);