// function for multiplying two big number in big endian
// big endian means, the number in a first index is the most significant byte.
static void multiply(const unsigned char *a, int la, const unsigned char *b, int lb, unsigned char *mul, int *lmul)
{
unsigned char *c = NULL;
unsigned char *temp = NULL;
int i,j,k=0,x=0,y;
long int r=0;
long sum = 0;

c = (unsigned char*)malloc(la+lb);
temp = (unsigned char*)malloc(la*lb*2);
la--;
lb--;

for(i=lb;i>=0;i--){
r=0;
for(j=la;j>=0;j--){
temp[k++] = (b[i]*a[j] + r)%256;
r = (b[i]*a[j]+r)/256;
}
temp[k++] = r;
x++;
for(y = 0;y<x;y++){
temp[k++] = 0;
}
}

k=0;
r=0;
for(i=0;i<la+lb+2;i++){
sum =0;
y=0;
for(j=1;j<=lb+1;j++){
if(i <= la+j){
sum = sum + temp[y+i];
}
y += j + la + 1;
}
c[k++] = (sum+r) %256;
r = (sum+r)/256;
}
c[k] = r;
j=0;
while(c[k-1]==0)
k--;
for(i=k-1;i>=0;i--){
mul[j++]=c[i];
}
*lmul = j;

free(c);
free(temp);
}
Posted by 배트
,