char* integer_to_string(integer x) { int i, result_len; char* result = (char*)malloc((int)ceil(COMPONENT_BITS*x.num_components/LOG_2_10) + 2); integer ten = create_integer(1); ten.c[0] = 10; if (is_zero_integer(x)) { strcpy(result, "0"); } else { for (i = 0; !is_zero_integer(x); i++) { result[i] = (char)mod_small_integer(x, 10) + '0'; divide_small_integer(x, 10, x); } result[i] = '\0'; } result_len = strlen(result); for(i=0; i < result_len/2; i++) { char temp = result[i]; result[i] = result[result_len - i - 1]; result[result_len - i - 1] = temp; } free_integer(ten); return result; }
unsigned int integer_to_binary(unsigned char** result,integer data,int keyLenBytes){ integer base=string_to_integer("256"); integer div=create_integer(data.num_components); copy_integer(data,div); integer zero=create_integer(1); zero.c[0]=0; unsigned char* pf=new unsigned char[data.num_components]; for(int i=0; i<data.num_components; i++){ pf[i]=0; } int tpos=data.num_components-1; pf[tpos]=div.c[0]; tpos--; while(compare_integers(div,zero)==1){ integer mod=create_integer(div.num_components+1+1); mod_integer(div,base,mod); integer div_temp=create_integer(div.num_components); copy_integer(div,div_temp); divide_small_integer(div_temp,256,div); pf[tpos]=div.c[0]; tpos--; } int startpos=div.num_components-keyLenBytes; *result=new unsigned char[keyLenBytes]; for(int i=0; i<keyLenBytes; i++){ (*result)[i]=pf[i+startpos]; } return keyLenBytes; }
int pow_mod(unsigned char** result,unsigned char* p,unsigned char* q, unsigned char* r,unsigned int keyLengthBytes){ std::set_new_handler(newh); Array<integer> factors; integer div=hex_to_integer(q,keyLengthBytes,0); int siz=keyLengthBytes; integer power_of_two=create_integer(siz); set_zero_integer(power_of_two); integer zero=create_integer(1); set_zero_integer(zero); integer two=string_to_integer("2"); integer one=string_to_integer("1"); int i=0; integer div_temp=create_integer(div.num_components); integer rem=create_integer(div.num_components+2); while(compare_integers(div, zero) == 1){ set_zero_integer(rem); mod_integer(div, two,rem); copy_integer(div,div_temp); divide_small_integer(div_temp,2,div); if(compare_integers(rem, zero) == 1){ integer ptt=create_integer(power_of_two.num_components); copy_integer(power_of_two,ptt); factors.pushBack(ptt); } add_integer(power_of_two,one,power_of_two); i++; } free_integer(rem); free_integer(div_temp); Array<integer> partial_results; integer part_res=hex_to_integer(p,keyLengthBytes,2); integer ri=hex_to_integer(r,keyLengthBytes,1); integer idx = create_integer(part_res.num_components); set_zero_integer(idx); integer part_res_temp1=create_integer(part_res.num_components); integer part_res_temp2=create_integer(part_res.num_components); integer part_res_temp3=create_integer(part_res.num_components); for(int i=0; i<factors.size(); i++){ while(compare_integers(factors[i],idx)==1){ copy_integer(part_res,part_res_temp1); copy_integer(part_res,part_res_temp2); multiply_integer(part_res_temp1,part_res_temp2,part_res); copy_integer(part_res,part_res_temp3); mod_integer(part_res_temp3,ri,part_res); add_integer(idx,one,idx); } integer ptt=create_integer(part_res.num_components); copy_integer(part_res,ptt); partial_results.pushBack(ptt); } free_integer(part_res_temp1); free_integer(part_res_temp2); free_integer(part_res_temp3); integer resulti=create_integer(ri.num_components+1); set_zero_integer(resulti); resulti.c[0]=1; integer resulti_temp=create_integer(resulti.num_components); integer resulti_temp2=create_integer(resulti.num_components); for(int i=0; i<partial_results.size(); i++){ copy_integer(resulti,resulti_temp); multiply_integer(resulti_temp,partial_results[i],resulti); copy_integer(resulti,resulti_temp2); mod_integer(resulti_temp2,ri,resulti); } free_integer(resulti_temp); free_integer(resulti_temp2); int lol=integer_to_binary(result,resulti,keyLengthBytes); return lol; }