| #!/usr/local/bin/perl |
| |
| $num=8; |
| $num2=8/2; |
| |
| print <<"EOF"; |
| /* crypto/bn/bn_comba.c */ |
| #include <stdio.h> |
| #include "bn_lcl.h" |
| /* Auto generated from crypto/bn/comba.pl |
| */ |
| |
| #undef bn_mul_comba8 |
| #undef bn_mul_comba4 |
| #undef bn_sqr_comba8 |
| #undef bn_sqr_comba4 |
| |
| #ifdef BN_LLONG |
| #define mul_add_c(a,b,c0,c1,c2) \\ |
| t=(BN_ULLONG)a*b; \\ |
| t1=(BN_ULONG)Lw(t); \\ |
| t2=(BN_ULONG)Hw(t); \\ |
| c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \\ |
| c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++; |
| |
| #define mul_add_c2(a,b,c0,c1,c2) \\ |
| t=(BN_ULLONG)a*b; \\ |
| tt=(t+t)&BN_MASK; \\ |
| if (tt < t) c2++; \\ |
| t1=(BN_ULONG)Lw(tt); \\ |
| t2=(BN_ULONG)Hw(tt); \\ |
| c0=(c0+t1)&BN_MASK2; \\ |
| if ((c0 < t1) && (((++t2)&BN_MASK2) == 0)) c2++; \\ |
| c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++; |
| |
| #define sqr_add_c(a,i,c0,c1,c2) \\ |
| t=(BN_ULLONG)a[i]*a[i]; \\ |
| t1=(BN_ULONG)Lw(t); \\ |
| t2=(BN_ULONG)Hw(t); \\ |
| c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \\ |
| c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++; |
| |
| #define sqr_add_c2(a,i,j,c0,c1,c2) \\ |
| mul_add_c2((a)[i],(a)[j],c0,c1,c2) |
| #else |
| #define mul_add_c(a,b,c0,c1,c2) \\ |
| t1=LBITS(a); t2=HBITS(a); \\ |
| bl=LBITS(b); bh=HBITS(b); \\ |
| mul64(t1,t2,bl,bh); \\ |
| c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \\ |
| c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++; |
| |
| #define mul_add_c2(a,b,c0,c1,c2) \\ |
| t1=LBITS(a); t2=HBITS(a); \\ |
| bl=LBITS(b); bh=HBITS(b); \\ |
| mul64(t1,t2,bl,bh); \\ |
| if (t2 & BN_TBIT) c2++; \\ |
| t2=(t2+t2)&BN_MASK2; \\ |
| if (t1 & BN_TBIT) t2++; \\ |
| t1=(t1+t1)&BN_MASK2; \\ |
| c0=(c0+t1)&BN_MASK2; \\ |
| if ((c0 < t1) && (((++t2)&BN_MASK2) == 0)) c2++; \\ |
| c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++; |
| |
| #define sqr_add_c(a,i,c0,c1,c2) \\ |
| sqr64(t1,t2,(a)[i]); \\ |
| c0=(c0+t1)&BN_MASK2; if ((c0) < t1) t2++; \\ |
| c1=(c1+t2)&BN_MASK2; if ((c1) < t2) c2++; |
| |
| #define sqr_add_c2(a,i,j,c0,c1,c2) \\ |
| mul_add_c2((a)[i],(a)[j],c0,c1,c2) |
| #endif |
| |
| void bn_mul_comba${num}(r,a,b) |
| BN_ULONG *r,*a,*b; |
| { |
| #ifdef BN_LLONG |
| BN_ULLONG t; |
| #else |
| BN_ULONG bl,bh; |
| #endif |
| BN_ULONG t1,t2; |
| BN_ULONG c1,c2,c3; |
| |
| EOF |
| $ret=&combas_mul("r","a","b",$num,"c1","c2","c3"); |
| printf <<"EOF"; |
| } |
| |
| void bn_mul_comba${num2}(r,a,b) |
| BN_ULONG *r,*a,*b; |
| { |
| #ifdef BN_LLONG |
| BN_ULLONG t; |
| #else |
| BN_ULONG bl,bh; |
| #endif |
| BN_ULONG t1,t2; |
| BN_ULONG c1,c2,c3; |
| |
| EOF |
| $ret=&combas_mul("r","a","b",$num2,"c1","c2","c3"); |
| printf <<"EOF"; |
| } |
| |
| void bn_sqr_comba${num}(r,a) |
| BN_ULONG *r,*a; |
| { |
| #ifdef BN_LLONG |
| BN_ULLONG t,tt; |
| #else |
| BN_ULONG bl,bh; |
| #endif |
| BN_ULONG t1,t2; |
| BN_ULONG c1,c2,c3; |
| |
| EOF |
| $ret=&combas_sqr("r","a",$num,"c1","c2","c3"); |
| printf <<"EOF"; |
| } |
| |
| void bn_sqr_comba${num2}(r,a) |
| BN_ULONG *r,*a; |
| { |
| #ifdef BN_LLONG |
| BN_ULLONG t,tt; |
| #else |
| BN_ULONG bl,bh; |
| #endif |
| BN_ULONG t1,t2; |
| BN_ULONG c1,c2,c3; |
| |
| EOF |
| $ret=&combas_sqr("r","a",$num2,"c1","c2","c3"); |
| printf <<"EOF"; |
| } |
| EOF |
| |
| sub bn_str |
| { |
| local($var,$val)=@_; |
| print "\t$var=$val;\n"; |
| } |
| |
| sub bn_ary |
| { |
| local($var,$idx)=@_; |
| return("${var}[$idx]"); |
| } |
| |
| sub bn_clr |
| { |
| local($var)=@_; |
| |
| print "\t$var=0;\n"; |
| } |
| |
| sub bn_mad |
| { |
| local($a,$b,$c0,$c1,$c2,$num)=@_; |
| |
| if ($num == 2) |
| { printf("\tmul_add_c2($a,$b,$c0,$c1,$c2);\n"); } |
| else |
| { printf("\tmul_add_c($a,$b,$c0,$c1,$c2);\n"); } |
| } |
| |
| sub bn_sad |
| { |
| local($a,$i,$j,$c0,$c1,$c2,$num)=@_; |
| |
| if ($num == 2) |
| { printf("\tsqr_add_c2($a,$i,$j,$c0,$c1,$c2);\n"); } |
| else |
| { printf("\tsqr_add_c($a,$i,$c0,$c1,$c2);\n"); } |
| } |
| |
| sub combas_mul |
| { |
| local($r,$a,$b,$num,$c0,$c1,$c2)=@_; |
| local($i,$as,$ae,$bs,$be,$ai,$bi); |
| local($tot,$end); |
| |
| $as=0; |
| $ae=0; |
| $bs=0; |
| $be=0; |
| $tot=$num+$num-1; |
| &bn_clr($c0); |
| &bn_clr($c1); |
| for ($i=0; $i<$tot; $i++) |
| { |
| $ai=$as; |
| $bi=$bs; |
| $end=$be+1; |
| @numa=@numb=(); |
| |
| #print "($as $ae) ($bs $be) $bs -> $end [$i $num]\n"; |
| for ($j=$bs; $j<$end; $j++) |
| { |
| push(@numa,$ai); |
| push(@numb,$bi); |
| $ai--; |
| $bi++; |
| } |
| |
| if ($i & 1) |
| { |
| @numa=reverse(@numa); |
| @numb=reverse(@numb); |
| } |
| |
| &bn_clr($c2); |
| for ($j=0; $j<=$#numa; $j++) |
| { |
| &bn_mad(&bn_ary($a,$numa[$j]), |
| &bn_ary($b,$numb[$j]),$c0,$c1,$c2,1); |
| } |
| &bn_str(&bn_ary($r,$i),$c0); |
| ($c0,$c1,$c2)=($c1,$c2,$c0); |
| |
| $as++ if ($i < ($num-1)); |
| $ae++ if ($i >= ($num-1)); |
| |
| $bs++ if ($i >= ($num-1)); |
| $be++ if ($i < ($num-1)); |
| } |
| &bn_str(&bn_ary($r,$i),$c0); |
| } |
| |
| sub combas_sqr |
| { |
| local($r,$a,$num,$c0,$c1,$c2)=@_; |
| local($i,$as,$ae,$bs,$be,$ai,$bi); |
| local($b,$tot,$end,$half); |
| |
| $b=$a; |
| $as=0; |
| $ae=0; |
| $bs=0; |
| $be=0; |
| $tot=$num+$num-1; |
| &bn_clr($c0); |
| &bn_clr($c1); |
| for ($i=0; $i<$tot; $i++) |
| { |
| $ai=$as; |
| $bi=$bs; |
| $end=$be+1; |
| @numa=@numb=(); |
| |
| #print "($as $ae) ($bs $be) $bs -> $end [$i $num]\n"; |
| for ($j=$bs; $j<$end; $j++) |
| { |
| push(@numa,$ai); |
| push(@numb,$bi); |
| $ai--; |
| $bi++; |
| last if ($ai < $bi); |
| } |
| if (!($i & 1)) |
| { |
| @numa=reverse(@numa); |
| @numb=reverse(@numb); |
| } |
| |
| &bn_clr($c2); |
| for ($j=0; $j <= $#numa; $j++) |
| { |
| if ($numa[$j] == $numb[$j]) |
| {&bn_sad($a,$numa[$j],$numb[$j],$c0,$c1,$c2,1);} |
| else |
| {&bn_sad($a,$numa[$j],$numb[$j],$c0,$c1,$c2,2);} |
| } |
| &bn_str(&bn_ary($r,$i),$c0); |
| ($c0,$c1,$c2)=($c1,$c2,$c0); |
| |
| $as++ if ($i < ($num-1)); |
| $ae++ if ($i >= ($num-1)); |
| |
| $bs++ if ($i >= ($num-1)); |
| $be++ if ($i < ($num-1)); |
| } |
| &bn_str(&bn_ary($r,$i),$c0); |
| } |