📄 config.c
字号:
if (chosen)
{
printf("\nDo you want a C-only version of MIRACL (Y/N)?");
port=answer();
if (port) fprintf(fp,"#define MR_NOASM\n");
}
rounding=0;
if (double_type)
{
#ifdef __TURBOC__
rounding=1;
#endif
#ifdef _MSC_VER
rounding=1;
#endif
#ifdef __GNUC__
rounding=1;
#endif
if (!rounding)
{
printf("It will help if rounding control can be exercised on doubles\n");
printf("Can you implement this in mrarth1.c?? (Y/N)?");
if (answer()) rounding=1;
}
if (rounding)
{
fprintf(fp,"#define MR_FP_ROUNDING\n");
magic=1.0;
for (i=0;i<lmant-2;i++) magic*=2.0;
magic+=2*magic;
fprintf(fp,"#define MR_MAGIC %lf\n",magic);
}
}
printf("\nDo you want support for flash arithmetic? (Y/N)?");
flsh=answer();
if (flsh)
{ /* calculate size of mantissa in bits */
eps=1.0;
for (mant=0;;mant++)
{ /* IMPORTANT TO FOOL OPTIMIZER!!!!!! */
x=1.0+eps;
y=1.0;
if (x==y) break;
eps/=2.0;
}
mant--;
fprintf(fp,"#define MR_FLASH %d\n",mant);
fprintf(fpl,"mrflash.c\n");
fprintf(fpl,"mrfrnd.c\n");
fprintf(fpl,"mrdouble.c\n");
fprintf(fpl,"mrround.c\n");
fprintf(fpl,"mrbuild.c\n");
fprintf(fpl,"mrflsh1.c\n");
fprintf(fpl,"mrpi.c\n");
fprintf(fpl,"mrflsh2.c\n");
fprintf(fpl,"mrflsh3.c\n");
fprintf(fpl,"mrflsh4.c\n");
}
printf("Do you want stripped-down version (smaller - no error messages) (Y/N)?");
stripped=answer();
if (stripped) fprintf(fp,"#define MR_STRIPPED_DOWN\n");
printf("Do you want multi-threaded version of MIRACL\n");
printf("Not recommended for program development - read the manual (Y/N)?");
threaded=answer();
if (threaded)
{
printf("Do you want generic portable threading support (No C++) (Y/N)?");
choice=answer();
if (choice) fprintf(fp,"#define MR_GENERIC_MT\n");
if (!choice)
{
printf("Do you want multi-threaded support for MS Windows (Y/N)?");
choice=answer();
if (choice) fprintf(fp,"#define MR_WINDOWS_MT\n");
}
if (!choice)
{
printf("Do you want multi-threaded support for Unix (Y/N)?");
choice=answer();
if (choice) fprintf(fp,"#define MR_UNIX_MT\n");
}
}
printf("Does your development environment support standard screen/keyboard I/O?\n");
printf("(It doesn't for example in MS Windows, and embedded applications)\n");
printf("If in doubt, answer Yes (Y/N)?");
standard=answer();
if (!standard) fprintf(fp,"#define MR_NO_STANDARD_IO\n");
printf("Does your development environment support standard file I/O?\n");
printf("(It doesn't for example in an embedded application)\n");
printf("If in doubt, answer Yes (Y/N)?");
standard=answer();
if (!standard) fprintf(fp,"#define MR_NO_FILE_IO\n");
if (!chosen && !nofull)
{
printf("\n\nDo you for some reason NOT want to use a full-width number base?\n");
printf("\nYou may not if your processor instruction set does not support\n");
printf("%d-bit UNSIGNED multiply and divide instructions.\n",utlen);
printf("If NOT then a full-width number base will be difficult and \n");
printf("slow to implement, which is a pity, because its normally faster\n");
printf("If for some other reason you don't want to use a full-width\n");
printf("number base, (no muldvd()/muldvd2()/muldvm() available?), answer Yes\n");
printf("\nAnswer (Y/N)?");
nofull=answer();
if (nofull)
{
printf("\nRemember to use mirsys(...,MAXBASE), or somesuch, in your programs\n");
printf("as mirsys(...,0); will generate an 'Illegal Number base' error\n");
fprintf(fp,"#define MR_NOFULLWIDTH\n");
}
}
selected=special=0;
if (!nofull)
{
fprintf(fpl,"mrecgf2m.c\n");
fprintf(fp,"#define MAXBASE ((mr_small)1<<(MIRACL-1))\n");
printf("\nDo you wish to use the Karatsuba/Comba/Montgomery method\n");
printf("for modular arithmetic - as used by exponentiation\n");
printf("cryptosystems like RSA.\n");
if (port)
{
printf("This method may be faster than the standard method when\n");
printf("using larger moduli, or if your processor has no \n");
printf("unsigned integer multiply/divide instruction in its\n");
printf("instruction set. This is true of some popular RISC computers\n");
}
else
{
printf("This method is probably fastest om most processors which\n");
printf("which support unsigned mul and a carry flag\n");
printf("NOTE: your compiler must support in-line assembly,\n");
printf("and you must be able to supply a suitable .mcs file\n");
printf("like, for example, ms86.mcs for pentium processors\n");
}
printf("\nAnswer (Y/N)?");
r=answer();
if (r)
{
printf("\nThis method can only be used with moduli whose length in\n");
printf("bits can be represented as %d*(step size)*2^n, for any value\n",utlen);
printf("of n. For example if you input a step size of 8, then \n");
printf("moduli of 256, 512, 1024 bits etc will use this fast code\n");
if (port)
printf("In this case case a step size of 4 is probably optimal\n");
else
{
printf("The best step size can be determined by experiment, but\n");
printf("larger step sizes generate more code. For the Pentium 8 is \n");
printf("optimal. For the Pentium Pro/Pentium II 16 is optimal.\n");
printf("If in doubt, set to 8\n");
}
step_size=0;
while (step_size<2 || step_size>16)
{
printf("Enter step size = ");
scanf("%d",&step_size);
getchar();
}
printf("\nTo create the file MRKCM.C you must next execute\n");
if (port) printf("MEX %d C MRKCM\n",step_size);
else
{
printf("MEX %d <file> MRKCM\n",step_size);
printf("where <file> is the name of the macro .mcs file (e.g. ms86)\n");
}
printf("\nSpecial routines for modular multiplication will now be\n");
printf("automatically be invoked when, for example, powmod() is called\n");
printf("\nRemember to use a full-width base in your programs\n");
printf("by calling mirsys(..,0) or mirsys(..,256) at the start of the program\n");
fprintf(fp,"#define MR_KCM %d\n",step_size);
fprintf(fpl,"mrkcm.c\n");
selected=1;
}
else
{
printf("\nDo you want to create a Comba fixed size modular\n");
printf("multiplier, for faster modular multiplication with\n");
printf("smaller moduli. Can generates a *lot* of code \n");
printf("Useful particularly for Elliptic Curve cryptosystems.\n");
printf("\nAnswer (Y/N)?");
r=answer();
if (r)
{
step_size=0;
while (step_size<2 || step_size>32)
{
printf("Enter modulus size in bits = ");
scanf("%d",&nbits);
getchar();
step_size=nbits/utlen;
if ((nbits%utlen)!=0) step_size++;
}
printf("Are you willing to implement a \"special\" fast method\n");
printf("for modular reduction, for a particular modulus\n");
printf("See mrcomba.tpl. If in any doubt answer No (Y/N)?");
r=answer();
if (r)
{
special=1;
printf("\nYou must first edit the routine comba_redc() in MRCOMBA.TPL");
}
printf("\nTo create the file MRCOMBA.C you must next execute\n");
if (port) printf("MEX %d C MRCOMBA\n",step_size);
else
{
printf("MEX %d <file> MRCOMBA\n",step_size);
printf("where <file> is the name of the macro .mcs file (e.g. ms86)\n");
}
fprintf(fp,"#define MR_COMBA %d\n",step_size);
if (special) fprintf(fp,"#define MR_SPECIAL\n");
fprintf(fpl,"mrcomba.c\n");
printf("\nSpecial routines for modular multiplication will now \n");
printf("automatically be invoked when, for example, powmod() is called\n");
printf("\nRemember to use a full-width base in your programs\n");
printf("by calling mirsys(..,0) or mirsys(,..,256) at the start of the program\n");
selected=1;
}
}
}
else
{
if (!double_type) fprintf(fp,"#define MAXBASE ((mr_small)1<<(MIRACL-2))\n");
}
if (double_type)
{
maxbase=0;
#ifdef __TURBOC__
if (!port && !selected)
{
printf("\nDoes your computer have a Pentium processor\n");
printf("and do you wish to exploit its built-in FP coprocessor\n");
printf("NOTE: this may not be optimal for Pentium Pro or Pentium II\n");
printf("Supported only for 80x86 processors, and Borland C Compilers\n");
printf("This is a little experimental - so use with care\n");
printf("Answer (Y/N)?");
r=answer();
if (r)
{
printf("Enter (maximum) modulus size in bits = ");
scanf("%d",&nbits);
getchar();
b=31;
do {
b--;
r=64-b-b;
s=1.0;
for (i=0;i<r;i++) s*=2.0;
s*=b;
} while (s<=2*nbits);
s=1; for (i=0;i<b;i++) s*=2;
printf("\nDo you wish to generate variable length looping code, or\n");
printf("fixed length unrolled code? The former can be used with any\n");
printf("modulus less than the maximum size specified above. The latter will\n");
printf("only work with a fixed modulus of that size, but is usually a bit\n");
printf("faster, although it can generate a *lot* of code for larger moduli.\n");
printf("\nAnswer Yes for looping code(Y/N)?");
r=answer();
if (r)
{
fprintf(fp,"#define MR_PENTIUM -%d\n",nbits/b+1);
fprintf(fpl,"mr87v.c\n");
printf("Make sure to compile and link into your program the module MR87V.C\n");
}
else
{
fprintf(fp,"#define MR_PENTIUM %d\n",nbits/b+1);
fprintf(fpl,"mr87f.c\n");
printf("Make sure to compile and link into your program the module MR87F.C\n");
}
printf("\nSpecial fast routines for modular multiplication will now be\n");
printf("automatically be invoked when, for example, powmod() is called\n");
printf("\nIt is *vital* to use the appropriate number base, so\n");
printf("you *must* now call mirsys(...,MAXBASE) at the start of your program\n");
fprintf(fp,"#define MAXBASE %lf\n",s);
maxbase=1;
}
}
#endif
if (!maxbase)
{
s=1.0;
for (i=0;i<dmant-1;i++) /* extra bit "spare" so that 2 can be added */
{
if (i+i+1>=lmant) break;
s*=2.0;
}
fprintf(fp,"#define MAXBASE %lf\n",s);
}
}
if (!port)
{
if (!dlong) printf("\nYou must now provide an assembly language file mrmuldv.c,\n");
else printf("\nYou must now provide an assembly or C file mrmuldv.c,\n");
if (!nofull)
printf("containing implementations of muldiv(), muldvd(), muldvd2() and muldvm()\n");
else
{
printf("containing an implementation of muldiv()\n");
if (rounding) printf("..and imuldiv()\n");
}
if (!dlong)
printf("Check mrmuldv.any - an assembly language version may be\n");
else
printf("Check mrmuldv.any - a C or assembly language version is\n");
printf("there already\n");
fprintf(fpl,"mrmuldv.c\n");
}
printf("\nA file mirdef.tst has been generated. If you are happy with it,\n");
printf("rename it to mirdef.h and use for compiling the MIRACL library.\n");
printf("A file miracl.lst has been generated that includes all the \n");
printf("files to be included in this build of the MIRACL library.\n");
fprintf(fpl,"\nCompile the above with -O2 optimization\n");
if (threaded)
fprintf(fpl,"Also use appropriate flag for multi-threaded compilation\n");
if (!port)
{
fprintf(fpl,"Note that mrmuldv.c file may be pure assembly, so may \n");
fprintf(fpl,"be renamed to mrmuldv.asm or mrmuldv.s, and assembled \n");
fprintf(fpl,"rather than compiled\n");
}
fclose(fp);
fclose(fpl);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -