
NOTE: as of version 4.81 the CM program has been much improved. It is now up 
to 100 times faster than the original. See comments in cm.cpp

A precompiled Windows executable is available from 
ftp://ftp.compapp.dcu.ie/pub/crypto/cm.exe

To build the CM application, you must compile and link the modules 
together, and with the MIRACL library.

So for Borland C++

bcc32 cm.cpp poly.cpp flpoly.cpp complex.cpp floating.cpp big.cpp zzn.cpp 
ecn.cpp miracl.lib

On UNIX using g++, something like

g++ -I. -c poly.cpp
g++ -I. -c flpoly.cpp
g++ -I. -c complex.cpp
g++ -I. -c floating.cpp

g++ -I. cm.cpp poly.o flpoly.o complex.o floating.o big.o zzn.o ecn.o
miracl.a /usr/lib/libm.a -o cm

should work


For best performance, use a KCM build of MIRACL, with MR_KCM defined in 
mirdef.h to be a power of 2, for example 8.


For example on a PC use this mirdef.h file

/*
 *   MIRACL compiler/hardware definitions - mirdef.h
 */

#define MR_LITTLE_ENDIAN
#define MIRACL 32
#define mr_utype int
#define MR_IBITS 32
#define MR_LBITS 32
#define mr_unsign32 unsigned int
#define mr_dltype __int64
#define mr_unsign64 unsigned __int64
#define MR_FLASH 52
#define MAXBASE ((mr_small)1<<(MIRACL-1))
#define MR_KCM 16
#define MR_BITSINCHAR 8


and compile and run the mex utility

mex 16 ms86 mrkcm

This creates mrkcm.c


IMPORTANT!

If you have a Pentium 4 processor (which has SSE2 extensions), use

mex 16 sse2 mrkcm 

to create mrkcm.c This will be much faster.


Remember to include the module mrkcm.obj in the library - using MS C 
execute


cl /c /O2 /W3 mrcore.c
cl /c /O2 /W3 mrarth0.c
cl /c /O2 /W3 mrarth1.c
cl /c /O2 /W3 mrarth2.c
cl /c /O2 /W3 mralloc.c
cl /c /O2 /W3 mrsmall.c
cl /c /O2 /W3 mrio1.c
cl /c /O2 /W3 mrio2.c
cl /c /O2 /W3 mrgcd.c
cl /c /O2 /W3 mrjack.c
cl /c /O2 /W3 mrxgcd.c
cl /c /O2 /W3 mrarth3.c
cl /c /O2 /W3 mrrand.c
cl /c /O2 /W3 mrprime.c
cl /c /O2 /W3 mrcrt.c
cl /c /O2 /W3 mrscrt.c
cl /c /O2 /W3 mrmonty.c
cl /c /O2 /W3 mrpower.c
cl /c /O2 /W3 mrsroot.c
cl /c /O2 /W3 mrbits.c
cl /c /O2 /W3 mrcurve.c
cl /c /O2 /W3 mrfast.c
cl /c /O2 /W3 mrlucas.c
cl /c /O2 /W3 mrshs.c
cl /c /O2 /W3 mrshs256.c
cl /c /O2 /W3 mrshs512.c
cl /c /O2 /W3 mraes.c
cl /c /O2 /W3 mrgcm.c
cl /c /O2 /W3 mrstrong.c
cl /c /O2 /W3 mrbrick.c
cl /c /O2 /W3 mrebrick.c
cl /c /O2 /W3 mrec2m.c
cl /c /O2 /W3 mrgf2m.c
cl /c /O2 /W3 mrflash.c
cl /c /O2 /W3 mrfrnd.c
cl /c /O2 /W3 mrdouble.c
cl /c /O2 /W3 mrround.c
cl /c /O2 /W3 mrbuild.c
cl /c /O2 /W3 mrflsh1.c
cl /c /O2 /W3 mrpi.c
cl /c /O2 /W3 mrflsh2.c
cl /c /O2 /W3 mrflsh3.c
cl /c /O2 /W3 mrflsh4.c
cl /c /O2 /W3 mrkcm.c
cl /c /O2 /W3 mrmuldv.c

del miracl.lib

lib /OUT:miracl.lib mrflsh4.obj mrflsh3.obj mrflsh2.obj mrpi.obj mrflsh1.obj
lib /OUT:miracl.lib miracl.lib mrdouble.obj mrflash.obj mrfrnd.obj mrround.obj mrbuild.obj
lib /OUT:miracl.lib miracl.lib mrio2.obj mrio1.obj mrrand.obj mrprime.obj mrcrt.obj mrscrt.obj mrbits.obj mrfast.obj
lib /OUT:miracl.lib miracl.lib mrjack.obj mrxgcd.obj mrgcd.obj  mrarth3.obj mrarth2.obj mrpower.obj mrsroot.obj
lib /OUT:miracl.lib miracl.lib mrmonty.obj mralloc.obj mrarth1.obj mrarth0.obj mrsmall.obj mrcore.obj mrmuldv.obj
lib /OUT:miracl.lib miracl.lib mrcurve.obj mrshs.obj mraes.obj mrlucas.obj mrstrong.obj mrbrick.obj mrgcm.obj
lib /OUT:miracl.lib miracl.lib mrshs256.obj mrshs512.obj mrebrick.obj mrgf2m.obj mrec2m.obj mrkcm.obj
del mr*.obj

cl /O2 /GX cm.cpp poly.cpp flpoly.cpp complex.cpp floating.cpp big.cpp zzn.cpp ecn.cpp miracl.lib

