From 3ba560205cdaf0683e7a7086d357a858cdc4ed1f Mon Sep 17 00:00:00 2001 From: madrocketsci Date: Wed, 6 Dec 2023 12:26:59 -0500 Subject: [PATCH] Initial commit --- License.txt | 11 + README | 10 + bin_linux64/libamsclil1.linux64.a | Bin 0 -> 144026 bytes bin_linux64/tests | Bin 0 -> 8296 bytes bin_winx64/libamsclil1.mingw64.a | Bin 0 -> 79654 bytes bin_winx64/tests.exe | Bin 0 -> 430045 bytes .../__pycache__/complib2.cpython-310.pyc | Bin 0 -> 8300 bytes .../__pycache__/complib2.cpython-36.pyc | Bin 0 -> 8771 bytes compscripts/complib2.py | 530 +++++++ compscripts/linux64.makelib.py | 43 + compscripts/linux64.maketest.py | 38 + compscripts/mingwcc.makelib.py | 44 + compscripts/mingwcc.maketest.py | 38 + include/amsclil1/amsclil1.h | 42 + include/amsclil1/amsclil1_fbops.h | 140 ++ include/amsclil1/amsclil1_gutmannprng.h | 33 + include/amsclil1/amsclil1_hash.h | 17 + include/amsclil1/amsclil1_operations.h | 7 + include/amsclil1/amsclil1_tests.h | 39 + include/amsclil1/amsclil1_ulint.h | 82 ++ run.py | 17 + run2.py | 17 + src/amsclil1/amsclil1_fbops.c | 299 ++++ src/amsclil1/amsclil1_fbops2.c | 1246 +++++++++++++++++ src/amsclil1/amsclil1_fbops3.c | 300 ++++ src/amsclil1/amsclil1_fbops4.c | 256 ++++ src/amsclil1/amsclil1_gutmannprng.c | 12 + src/amsclil1/amsclil1_md5_hash.c | 126 ++ src/amsclil1/amsclil1_tests1.c | 193 +++ src/amsclil1/amsclil1_tests2.c | 340 +++++ src/amsclil1/amsclil1_tests3.c | 883 ++++++++++++ src/amsclil1/amsclil1_ulint.c | 287 ++++ src/amsclil1/amsclil1_ulint_ops.c | 157 +++ src/main.c | 39 + 34 files changed, 5246 insertions(+) create mode 100644 License.txt create mode 100644 README create mode 100644 bin_linux64/libamsclil1.linux64.a create mode 100644 bin_linux64/tests create mode 100644 bin_winx64/libamsclil1.mingw64.a create mode 100644 bin_winx64/tests.exe create mode 100644 compscripts/__pycache__/complib2.cpython-310.pyc create mode 100644 compscripts/__pycache__/complib2.cpython-36.pyc create mode 100644 compscripts/complib2.py create mode 100644 compscripts/linux64.makelib.py create mode 100644 compscripts/linux64.maketest.py create mode 100644 compscripts/mingwcc.makelib.py create mode 100644 compscripts/mingwcc.maketest.py create mode 100644 include/amsclil1/amsclil1.h create mode 100644 include/amsclil1/amsclil1_fbops.h create mode 100644 include/amsclil1/amsclil1_gutmannprng.h create mode 100644 include/amsclil1/amsclil1_hash.h create mode 100644 include/amsclil1/amsclil1_operations.h create mode 100644 include/amsclil1/amsclil1_tests.h create mode 100644 include/amsclil1/amsclil1_ulint.h create mode 100644 run.py create mode 100644 run2.py create mode 100644 src/amsclil1/amsclil1_fbops.c create mode 100644 src/amsclil1/amsclil1_fbops2.c create mode 100644 src/amsclil1/amsclil1_fbops3.c create mode 100644 src/amsclil1/amsclil1_fbops4.c create mode 100644 src/amsclil1/amsclil1_gutmannprng.c create mode 100644 src/amsclil1/amsclil1_md5_hash.c create mode 100644 src/amsclil1/amsclil1_tests1.c create mode 100644 src/amsclil1/amsclil1_tests2.c create mode 100644 src/amsclil1/amsclil1_tests3.c create mode 100644 src/amsclil1/amsclil1_ulint.c create mode 100644 src/amsclil1/amsclil1_ulint_ops.c create mode 100644 src/main.c diff --git a/License.txt b/License.txt new file mode 100644 index 0000000..e1bfc2b --- /dev/null +++ b/License.txt @@ -0,0 +1,11 @@ +Copyright 2021 Aaron M. Schinder + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README b/README new file mode 100644 index 0000000..dd82e38 --- /dev/null +++ b/README @@ -0,0 +1,10 @@ +Aaron M. Schinder +Jan 2021 + +C Large Integer Library 1 +Implementation of large integer manipulation algorithms. +Refer to the Handbook of Applied Cryptography + +copyright Aaron M. Schinder, 2021 +Released under the MIT License + diff --git a/bin_linux64/libamsclil1.linux64.a b/bin_linux64/libamsclil1.linux64.a new file mode 100644 index 0000000000000000000000000000000000000000..e5c2dcf12d145d1874d2bb07c5562a9fc2e6e89f GIT binary patch literal 144026 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 literal 0 HcmV?d00001 diff --git a/bin_linux64/tests b/bin_linux64/tests new file mode 100644 index 0000000000000000000000000000000000000000..ad314769ef1d5dd76a819141c87d1846df39424a GIT binary patch literal 8296 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 Uisw{LJ<#KvOWf6x*|10(dq;tlYi2a&+ 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 literal 0 HcmV?d00001 diff --git a/compscripts/__pycache__/complib2.cpython-310.pyc b/compscripts/__pycache__/complib2.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dabb3a6dd67fc3d37e94f3b4ad33398d23dac2fe GIT binary patch literal 8300 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 P>2MbBig@?HUn&3pE$)fF literal 0 HcmV?d00001 diff --git a/compscripts/__pycache__/complib2.cpython-36.pyc b/compscripts/__pycache__/complib2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73711afaa2382a63436b6c369e096fff21d465a6 GIT binary patch literal 8771 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 Ow-U_ZT@~+6`2RoLd)8=2): + ex = F2[1] + if(len(ex)>0): + if(ex[0]!='.'): + ex = '.'+ex + if(ex==ext): + b = True + if(b): + flst2.append(F) + + return flst2 + +#Find a file fname, starting in pth and recursing +#Used for finding library files to link +def findfile(fname,pth,**kwargs): + fullfname = "" + flst = flist(pth,recurse=True) + for F in flst: + F2 = os.path.split(F)[1] + if(F2 == fname): + fullfname = F + + return fullfname + +#List to space-seperated-string +def list_to_sss(lst): + lout = "" + for I in range(0,len(lst)-1): + lout = lout + lst[I] + " " + if(len(lst)>0): + lout = lout + lst[len(lst)-1] + return lout + +def strip_whitespace(strin): + strout = "" + I1 = -1 + I2 = -1 + for I in range(0,len(strin)): + if(strin[I]!=' ' and strin[I]!='\t' and strin[I]!='\r'and strin[I]!='\n'): + I1 = I + break + q = list(range(0,len(strin))) + q.reverse() + for I in q: + if(strin[I]!=' ' and strin[I]!='\t' and strin[I]!='\r'and strin[I]!='\n'): + I2 = I+1 + break + if(I1>=0 and I2>=0): + strout = strin[I1:I2] + return strout + +def sss_to_list(sss): + lout = [] + l1 = sss.split(' ') + for l in l1: + l2 = strip_whitespace(l) + lout.append(l2) + return lout + + +def replaceext(fname,ext): + fname2 = "" + if(len(ext)>0): + if(ext[0]!='.'): + ext = '.'+ext + fname2 = os.path.splitext(fname)[0]+ext + else: + fname2 = os.path.splitext(fname)[0] + return fname2 + +def replaceexts(fnamelist,ext): + fname2list = [] + for F in fnamelist: + F2 = replaceext(F,ext) + fname2list.append(F2) + return fname2list + +# def except_contains_oldv(lst1,exc): +# lst2 = [] +# for item in lst1: +# b = 1 +# for item2 in exc: +# if(item.find(item2)>=0): +# b = 0 +# break +# if(b==1): +# lst2.append(item) +# return lst2 + +#filenames must match +def except_contains(lst1,exc): + lst2 = [] + for item in lst1: + b = 1 + for item2 in exc: + fsplit = os.path.split(item) + fn = fsplit[len(fsplit)-1] + if(fn==item2): + b = 0 + break + if(b==1): + lst2.append(item) + return lst2 + +########################## +##System Call Procedures## +########################## + +def callproc(cmd, **kwargs): + if(not('logfile' in kwargs)): + use_lf = False + else: + logfile = kwargs['logfile'] + if(logfile!=""): + fp = open(kwargs['logfile'],'a+') + use_lf = True + else: + use_lf = False + + if(not('echo' in kwargs)): + echo = True + else: + echo = kwargs['echo'] + + if(echo): + print(cmd) + + #encoding/deconding to/from bytes is necessary to use the subprocess command + #in python3.7 + cmd2 = cmd.encode(encoding='utf-8') + proc = subprocess.Popen(cmd2,stderr = subprocess.STDOUT, stdout=subprocess.PIPE, shell=True) + (out, err) = proc.communicate() + out = out.decode(encoding='utf-8') + + if(echo): + print(out) + #print(err); + if(use_lf): + fp.writelines(cmd+'\n') + fp.writelines(out+'\n') + + if(use_lf): + fp.close() + +####################################### +##Compiler, Archive, and Linker Calls## +####################################### + +def smartcompile(srcfile,objext='.o'): + mtsrc = os.path.getmtime(srcfile) + objfile = replaceext(srcfile,objext) + objexists = os.path.exists(objfile) + ret = True + if(objexists): + mtobj = os.path.getmtime(objfile) + if(mtobj>=mtsrc): + ret = False + + return ret + +#gnu-style compiler compile: Should work with gcc, g++, gfortran +def gs_compile(compiler,srcfile,**kwargs): + if(not('include' in kwargs)): + include = '' + else: + include = kwargs['include'] + if(isinstance(include,list)): + include = list_to_sss(include) + + if(not('flags' in kwargs)): + flags = '' + else: + flags = kwargs['flags'] + if(isinstance(flags,list)): + flags = list_to_sss(flags) + + if(not('objext' in kwargs)): + objext = '.o' + else: + objext = kwargs['objext'] + + if(not('srcfileflag' in kwargs)): + srcfileflag = '-c' + else: + srcfileflag = kwargs['srcfileflag'] + + if(not('outfileflag' in kwargs)): + outfileflag = '-o' + else: + outfileflag = kwargs['outfileflag'] + + if(not('logfile' in kwargs)): + logfile = "" + else: + logfile = kwargs['logfile'] + + if(not('smartcompile' in kwargs)): + _smartcompile = True + else: + _smartcompile = kwargs['smartcompile'] + + #Do I want to make this thing this general? + + if(not(_smartcompile) or smartcompile(srcfile,objext)): + outfile = replaceext(srcfile,objext) + ln = compiler+" "+flags+" " + outfileflag+" "+outfile+" "+srcfileflag+" "+srcfile + ln = ln + " " + include + + callproc(ln,echo=True,logfile=logfile) + + return + +def gs_compile_list(compiler,srclist,**kwargs): + for S in srclist: + gs_compile(compiler,S,**kwargs) + return + +def gs_compile_all(compiler,srcdir,srcexts,**kwargs): + if(not('recurse' in kwargs)): + recurse = True + else: + recurse = kwargs['recurse'] + + srcfils = flist(srcdir,exts=srcexts,recurse=recurse) + + for S in srcfils: + gs_compile(compiler,S,**kwargs) + + return + +def gs_link_all(linker,srcpath,target,**kwargs): + + if(not('objext' in kwargs)): + objext = '.o' + else: + objext = kwargs['objext'] + + if(not('recurse' in kwargs)): + recurse = True + else: + recurse = kwargs['recurse'] + + + objfils = flist(srcpath,exts=objext,recurse=recurse) + oflst = list_to_sss(objfils) + + gs_link_list(linker,oflst,target,**kwargs) + + return + +def gs_link_list(linker,objlist,target,**kwargs): + + if(not('objext' in kwargs)): + objext = '.o' + else: + objext = kwargs['objext'] + + if(not('libdir' in kwargs)): + libdir = '' + else: + libdir = kwargs['libdir'] + + if(not('staticlibs' in kwargs)): + staticlibs = '' + else: + staticlibs = kwargs['staticlibs'] + + if(not('libflags' in kwargs)): + libflags = '' + else: + libflags = kwargs['libflags'] + + if(not('linkerflags' in kwargs)): + linkerflags = '' + else: + linkerflags = kwargs['linkerflags'] + + if(not('recurse' in kwargs)): + recurse = True + else: + recurse = kwargs['recurse'] + + if(not('logfile' in kwargs)): + logfile = '' + else: + logfile = kwargs['logfile'] + + ln = linker+" -o "+target+" "+libdir + ln = ln+" "+objlist+" "+staticlibs+" "+libflags+" "+linkerflags + + callproc(ln,logfile=logfile) + return + + +def ar_all(srcpath,arname,**kwargs): + if(not('recurse' in kwargs)): + recurse = True + else: + recurse = kwargs['recurse'] + if(not('objext' in kwargs)): + objext = '.o' + else: + objext = kwargs['objext'] + + objlist = flist(srcpath,exts=objext,recurse=recurse) + ar_list(objlist,arname,**kwargs) + + return + +def ar_list(objlist,arname,**kwargs): + objlist2 = list_to_sss(objlist) + + ln = "ar cr "+ arname+" "+objlist2 + callproc(ln) + + return + +def ar_add_list(objlist,arname,**kwargs): + objlist2 = list_to_sss(objlist) + + ln = "ar t "+arname+" "+objlist2 + callproc(ln) + return + +############################## +##Derived Compiler Functions## +############################## + +def gcc_compile(srcfile,**kwargs): + compiler = 'gcc' + kwargs['objext'] = '.o' + #srcexts = ['.c'] + + gs_compile(compiler,srcfile,**kwargs) + + return + +def gcc_compile_all(srcdir,**kwargs): + compiler = 'gcc' + kwargs['objext'] = '.o' + srcexts = ['.c'] + + gs_compile_all(compiler,srcdir,srcexts,**kwargs) + + return + +def gcc_compile_list(srclist,**kwargs): + compiler = 'gcc' + kwargs['objext'] = '.o' + #srcexts = ['.c'] + + gs_compile_list(compiler,srclist,**kwargs) + + return + +def gpp_compile(srcfile,**kwargs): + compiler = 'g++' + kwargs['objext'] = '.o' + #srcexts = ['.c','.cpp'] + + gs_compile(compiler,srcfile,**kwargs) + + return + +def gpp_compile_all(srcdir,**kwargs): + compiler = 'g++' + kwargs['objext'] = '.o' + srcexts = ['.c','.cpp'] + + gs_compile_all(compiler,srcdir,srcexts,**kwargs) + + return + +def gpp_compile_list(srclist,**kwargs): + compiler = 'g++' + kwargs['objext'] = '.o' + #srcexts = ['.c','.cpp'] + + gs_compile_list(compiler,srclist,**kwargs) + + return + +def gfortran_compile(srcfile,**kwargs): + compiler = 'gfortran' + kwargs['objext'] = '.o' + #srcexts = ['.f','.f90','.f77'] + + gs_compile(compiler,srcfile,**kwargs) + + return + +def gfortran_compile_all(srcdir,**kwargs): + compiler = 'gfortran' + kwargs['objext'] = '.o' + srcexts = ['.f','.f90','.f77'] + + gs_compile_all(compiler,srcdir,srcexts,**kwargs) + + return + +def gfortran_compile_list(srclist,**kwargs): + compiler = 'gfortran' + kwargs['objext'] = '.o' + #srcexts = ['.f','.f90','.f77'] + + gs_compile_list(compiler,srclist,**kwargs) + + return + +def clang_compile(srcfile,**kwargs): + compiler = 'clang++' + kwargs['objext'] = '.o' + #srcexts = ['.c','.cpp'] + + gs_compile(compiler,srcfile,**kwargs) + + return + +def clang_compile_all(srcdir,**kwargs): + compiler = 'clang++' + kwargs['objext'] = '.o' + srcexts = ['.c','.cpp'] + + gs_compile_all(compiler,srcdir,srcexts,**kwargs) + + return + +def clang_compile_list(srclist,**kwargs): + compiler = 'clang++' + kwargs['objext'] = '.o' + #srcexts = ['.c','.cpp'] + + gs_compile_list(compiler,srclist,**kwargs) + + return \ No newline at end of file diff --git a/compscripts/linux64.makelib.py b/compscripts/linux64.makelib.py new file mode 100644 index 0000000..b1b51b4 --- /dev/null +++ b/compscripts/linux64.makelib.py @@ -0,0 +1,43 @@ +#!/usr/bin/python3 + +import os,sys,subprocess,math +from complib2 import * + +import shutil +from distutils.dir_util import copy_tree as copy_tree #this version does overwrites + +libname = 'amsclil1.linux64' #prefix static library name to generate +targetname = 'tests' #create this executable when compiling tests +commonincdir = "../../linux64/include" +commonlibdir = "../../linux64/lib" +localbindir = "./bin_linux64" +cc = 'gcc' #compiler +srcexts = ['.c','.cpp'] +mainsrc = ['main.c'] #ignore these files when compiling the static library + +kwargs = dict() +include = "-I./include -I{}".format(commonincdir) +kwargs['include'] = include +kwargs['flags'] = "-O3" +kwargs['libdir'] = "-L{} -L{}".format(localbindir,commonlibdir) +kwargs['libflags'] = "-l{}".format(libname) +kwargs['linkerflags'] = "-Wl,-rpath=." +kwargs['recurse'] = True + +#find all source files, except the main project files +files = flist('./src',exts = srcexts, recurse=True) +files = except_contains(files,mainsrc) +objfiles = replaceexts(files,'.o') +objfiles_sss = list_to_sss(objfiles) + +#compile all the source files in the list +gs_compile_list(cc,files,**kwargs) + +#archive all the source files into a static library +ar_list(objfiles,'{}/lib{}.a'.format(localbindir,libname)) + +#Push any libraries to the common lib folder +shutil.copy('{}/lib{}.a'.format(localbindir,libname),commonlibdir) + +#Copy include files to the common include folder +copy_tree('./include/',commonincdir+'/') diff --git a/compscripts/linux64.maketest.py b/compscripts/linux64.maketest.py new file mode 100644 index 0000000..364df26 --- /dev/null +++ b/compscripts/linux64.maketest.py @@ -0,0 +1,38 @@ +#!/usr/bin/python3 + +import os,sys,subprocess,math +from complib2 import * + +import shutil +from distutils.dir_util import copy_tree as copy_tree #this version does overwrites + +libname = 'amsclil1.linux64' #prefix static library name to generate +targetname = 'tests' #create this executable when compiling tests +commonincdir = "../../linux64/include" +commonlibdir = "../../linux64/lib" +localbindir = "./bin_linux64" +cc = 'gcc' #compiler +srcexts = ['.c','.cpp'] +mainsrc = ['main.c'] #ignore these files when compiling the static library + +kwargs = dict() +include = "-I./include -I{}".format(commonincdir) +kwargs['include'] = include +kwargs['flags'] = "-O3" #-fPIC +kwargs['libdir'] = "-L{} -L{}".format(localbindir,commonlibdir) +kwargs['libflags'] = "-lamscutil1.linux64 -l{}".format(libname) +kwargs['linkerflags'] = "-Wl,-rpath=." +kwargs['recurse'] = True + +#Pull required binary dynamic libraries to the bin folder +#shutil.copy('{}/libamsimg.dll.a'.format(commonlibdir),localbindir); +#shutil.copy('{}/libamsimg.dll'.format(commonlibdir),localbindir); +#shutil.copy('../../lib_winx64/glew32.dll','./bin_winx64'); + +#Designate source files for main test program +fsrc = ['./src/main.c'] +fobj = replaceexts(fsrc,'.o') + +#Compile test programs +gs_compile_list(cc,fsrc,**kwargs) +gs_link_list(cc,list_to_sss(fobj),'{}/{}'.format(localbindir,targetname),**kwargs) diff --git a/compscripts/mingwcc.makelib.py b/compscripts/mingwcc.makelib.py new file mode 100644 index 0000000..8382fb6 --- /dev/null +++ b/compscripts/mingwcc.makelib.py @@ -0,0 +1,44 @@ +#!/usr/bin/python3 + +import os,sys,subprocess,math +from complib2 import * + +import shutil +from distutils.dir_util import copy_tree as copy_tree #this version does overwrites + +libname = 'amsclil1.mingw64' #prefix static library name to generate +targetname = 'tests.exe' #create this executable when compiling tests +commonincdir = "../../winx64/include" +commonlibdir = "../../winx64/lib" +localbindir = "./bin_winx64" +cc = 'x86_64-w64-mingw32-gcc' #compiler +srcexts = ['.c','.cpp'] +mainsrc = ['main.c'] #ignore these files when compiling the static library + +kwargs = dict() +include = "-I./include -I{}".format(commonincdir) +kwargs['include'] = include +kwargs['flags'] = "-fPIC -O3" +kwargs['libdir'] = "-L{} -L{}".format(localbindir,commonlibdir) +kwargs['libflags'] = "-l{}".format(libname) +kwargs['linkerflags'] = "-static -static-libgcc -Wl,-rpath=." +kwargs['recurse'] = True + + +#find all source files, except the main project files +files = flist('./src',exts = srcexts, recurse=True) +files = except_contains(files,mainsrc) +objfiles = replaceexts(files,'.o') +objfiles_sss = list_to_sss(objfiles) + +#compile all the source files in the list +gs_compile_list(cc,files,**kwargs) + +#archive all the source files into a static library +ar_list(objfiles,'{}/lib{}.a'.format(localbindir,libname)) + +#Push any libraries to the common lib folder +shutil.copy('{}/lib{}.a'.format(localbindir,libname),commonlibdir) + +#Copy include files to the common include folder +copy_tree('./include/',commonincdir+'/') diff --git a/compscripts/mingwcc.maketest.py b/compscripts/mingwcc.maketest.py new file mode 100644 index 0000000..cf8ae78 --- /dev/null +++ b/compscripts/mingwcc.maketest.py @@ -0,0 +1,38 @@ +#!/usr/bin/python3 + +import os,sys,subprocess,math +from complib2 import * + +import shutil +from distutils.dir_util import copy_tree as copy_tree #this version does overwrites + +libname = 'amsclil1.mingw64' #prefix static library name to generate +targetname = 'tests.exe' #create this executable when compiling tests +commonincdir = "../../winx64/include" +commonlibdir = "../../winx64/lib" +localbindir = "./bin_winx64" +cc = 'x86_64-w64-mingw32-gcc' #compiler +srcexts = ['.c','.cpp'] +mainsrc = ['main.c'] #ignore these files when compiling the static library + +kwargs = dict() +include = "-I./include -I{}".format(commonincdir) +kwargs['include'] = include +kwargs['flags'] = "-fPIC -O3" +kwargs['libdir'] = "-L{} -L{}".format(localbindir,commonlibdir) +kwargs['libflags'] = "-lamscutil1.mingw64 -l{}".format(libname) +kwargs['linkerflags'] = "-static -static-libgcc -Wl,-rpath=." +kwargs['recurse'] = True + +#Pull required binary dynamic libraries to the bin folder +#shutil.copy('{}/libamsimg.dll.a'.format(commonlibdir),localbindir); +#shutil.copy('{}/libamsimg.dll'.format(commonlibdir),localbindir); +#shutil.copy('../../lib_winx64/glew32.dll','./bin_winx64'); + +#Designate source files for main test program +fsrc = ['./src/main.c'] +fobj = replaceexts(fsrc,'.o') + +#Compile test programs +gs_compile_list(cc,fsrc,**kwargs) +gs_link_list(cc,list_to_sss(fobj),'{}/{}'.format(localbindir,targetname),**kwargs) diff --git a/include/amsclil1/amsclil1.h b/include/amsclil1/amsclil1.h new file mode 100644 index 0000000..8735d30 --- /dev/null +++ b/include/amsclil1/amsclil1.h @@ -0,0 +1,42 @@ +#ifndef __AMSCLIL1_H__ +#define __AMSCLIL1_H__ + +// Aaron M. Schinder +// Jan 2021 +// +// C Large Integer Library 1 + +///////////////////////////// +//Standard Library Includes// +///////////////////////////// + +#include +#include +#include +#include +#include +#include + +//Other Libraries// + +#include + +/////////////////////// +// Component Headers // +/////////////////////// + +static int amsclil1_verbose = 0; + +#include +#include + +#include + + +#include + +#include +#include + + +#endif \ No newline at end of file diff --git a/include/amsclil1/amsclil1_fbops.h b/include/amsclil1/amsclil1_fbops.h new file mode 100644 index 0000000..4b3f9b9 --- /dev/null +++ b/include/amsclil1/amsclil1_fbops.h @@ -0,0 +1,140 @@ +#ifndef __AMSCLIL_FBOPS_H__ +#define __AMSCLIL_FBOPS_H__ + +/////////////////////////////// +//AMS C Large Integer Library// +//Fixed Buffer Functions // +/////////////////////////////// + +//Fixed buffer unsigned large integer operations +// +//These are needed, because preallocating the working memory +//will be much faster than dynamically allocating within iterative +//operations + +//For the convenience of the caller, these can be wrapped in +//operations acting on resizeable buffers. For speed, these can +//be set up and called directly, with allocation/deallocation taking +//place at the start and end of the wrapping routine. + +//Uint32 Operators + +// 01234567890123456789012345678901 - MISRA 31 character identifier limit + +//Single "digit" operations - these are sometimes reimplimented directly for speed +void amsclil1_ui32_add(uint32_t op1, uint32_t op2, uint32_t *res, uint32_t *car); +void amsclil1_ui32_sub(uint32_t op1, uint32_t op2, uint32_t *res, uint32_t *car); +void amsclil1_ui32_mult(uint32_t op1, uint32_t op2, uint32_t *res, uint32_t *car); +void amsclil1_ui32_div(uint32_t op1, uint32_t op2, uint32_t *res, uint32_t *rem); + +//comparison: +//0: a and b are equal, 1: a is greater, 2: b is greater +int amsclil1_fb32_cmp(uint32_t* a, uint32_t* b, long blen); + +int amsclil1_fb32_iszero(uint32_t* a, long blen); + +void amsclil1_fb32_setzero(uint32_t *a, long blen); + +//most significant index +long amsclil1_fb32_msi(uint32_t*a, long blen); + +//large integer display functions +void amsclil1_fb32_liprint(uint32_t* a, long blen); //print hex representation +void amsclil1_fb16_liprint(uint16_t* a, long blen); //print hex representation +void amsclil1_fb32_libinprint(uint32_t* a, long blen); //print binary representation + +//bit shift operations +//lshift: <<: *2^shift +//wrk[blen] +void amsclil1_fb32_shiftl(uint32_t* a, long shift, uint32_t* wrk, long blen); +void amsclil1_fb32_shiftr(uint32_t* a, long shift, uint32_t* wrk, long blen); + +//Fixed Buffer Operators +void amsclil1_fb32_add(uint32_t *a, uint32_t *b, uint32_t *c, long blen); +void amsclil1_fb32_sub(uint32_t *a, uint32_t *b, uint32_t *c, long blen); + +//schoolbook multiplication +// karatsuba multiplication may be needed for large enough numbers +void amsclil1_fb32_mult(uint32_t *a, uint32_t *b, uint32_t *c, uint32_t *wrk, long blen); + +//Division using algorithm [HAC 14.20] +int amsclil1_fb32_div(uint32_t *a, uint32_t *b, uint32_t *res, uint32_t *rem, uint32_t* wrk, long blen); + +//Implement! +void amsclil1_fb32_decimal(uint32_t *a, uint8_t *dd, uint32_t* wrk, int blen); + +//Modular exponentiation [now using HAC14.42 Barrett Reduction] +void amsclil1_fb32_modpower(uint32_t *a, uint32_t *pw, uint32_t *md, uint32_t *res, uint32_t *wrk, uint32_t *stor, int blen); + +//non-cryptographic random integer for testing +void amsclil1_fb32_ncrandint(uint32_t *a, long blen); + +//Euler greatest common divisor algorithm +void amsclil1_fb32_eulergcd(uint32_t *a, uint32_t *b, uint32_t *gcd, uint32_t *wrk, long blen); + +//Least Common Multiple +void amsclil1_fb32_lcm(uint32_t *a, uint32_t *b, uint32_t *lcm, uint32_t *wrk, long blen); + +//Multiplicative Inverse Algorithm +int amsclil1_fb32_multinv(uint32_t *z, uint32_t *dom, uint32_t *zinv, uint32_t *wrk, int blen); + + +//Euler totient function + // for prime numbers it's just n-1 + +//Carmichels Totient Function + +//////////////////////////////////////// +//Miscellaneous and Internal Functions// +//////////////////////////////////////// + +//16 bit fixed buffer operations + +//used in HAC14.20 division algorithm +void amsclil1_fb16_mult(uint16_t *a, uint16_t *b, uint16_t *c, long blen); + +//[HAC 14.42]: Barrett reduction of modular arithmetic +//Precomputation of mu divisor +void amsclil1_fb32_barrettmu(uint32_t *m, uint32_t *mu, uint32_t *wrk, long K, long blen); + +//Barrett Reduced Modulus +//y = mod(x,m) +void amsclil1_fb32_barrettmod(uint32_t *x, uint32_t *m, uint32_t *y, + uint32_t *mu, uint32_t *wrk, long K, long Kx, long blen); + +//Classical Fast Modular Exponentiation +void amsclil1_fb32_modpower_cls(uint32_t *a, uint32_t *pw, uint32_t *md, uint32_t *res, uint32_t *wrk, uint32_t *stor, int blen); +//Fast Modular Exponentiation with Barrett Reduction +void amsclil1_fb32_modpower_bar(uint32_t *a, uint32_t *pw, uint32_t *md, uint32_t *res, uint32_t *wrk, uint32_t *stor, int blen); + +//Shifted Operations + +//bit-shifted reads and writes +//don't move the array in memory, move the read/write +//perhaps it will save time within the division operation +int amsclil1_fb32_readshift(uint32_t* arr, long ind, long shift, uint32_t* val, long blen); +int amsclil1_fb32_writeshift(uint32_t* arr, long ind, long shift, uint32_t* val, long blen); + +//Shifted Large Integer Display Function +void amsclil1_fb32_shiftliprint(uint32_t* a, long shift, long blen); //print hex representation +//Shifted integer, most significant index +long amsclil1_fb32_shiftmsi(uint32_t *a, long shift, long blen); +//Shifted comparison +int amsclil1_fb32_shiftcmp(uint32_t *a, uint32_t *b, long bshift, long blen); +//Shifted subtraction +void amsclil1_fb32_shiftsub(uint32_t *a, uint32_t *b, long bshift, uint32_t *c, long blen); + + + +//internal digit shift subtraction +//this is supposed to be something like c = a - b*base^diff +void amsclil1_fb16_intlssub(uint16_t *a, uint16_t *b, long bshft, uint16_t *c, long blen); + +//internal digit shift comparison +//this is supposed to be a <=> b*base^diff +int amsclil1_fb16_intlscmp(uint16_t *a, uint16_t *b, long bshft, long blen); + +void amsclil1_fb16_intlmultsing(uint16_t *a, uint16_t b, long blen); + + +#endif \ No newline at end of file diff --git a/include/amsclil1/amsclil1_gutmannprng.h b/include/amsclil1/amsclil1_gutmannprng.h new file mode 100644 index 0000000..51735a1 --- /dev/null +++ b/include/amsclil1/amsclil1_gutmannprng.h @@ -0,0 +1,33 @@ +#ifndef __AMSCLIL1_GUTMANNPRNG_H__ +#define __AMSCLIL1_GUTMANNPRNG_H__ + +typedef struct amsclil1_gprng_state +{ + int randpool_length; + uint8_t *randpool; + int write_pointer; + int cycle_pointer; + +} amsclil1_gprng_state; + +int amsclil1_gprng_state_new(amsclil1_gprng_state **s); +void amsclil1_gprng_state_delete(amsclil1_gprng_state **s); + +//sets new random pool length (default is 640 bytes) +int amsclil1_gprng_state_resize(amsclil1_gprng_state *s, int N); + +void amsclil1_gprng_add_byte(amsclil1_gprng_state *s, uint8_t byte); +void amsclil1_gprng_add_bytes(amsclil1_gprng_state *s, uint8_t *bytes, int N); + +void amsclil1_gprng_mix_once(amsclil1_gprng_state *s); +void amsclil1_gprng_mix(amsclil1_gprng_state *s); + +//Original gprng hash is MD5, set to take 84 bytes in, and provide 16 bytes out +void amsclil1_gprng_hash(uint8_t *bytes_in, int Nin, uint8_t *bytes_out); + +//: A randompool of 640 bytes (5120 bits) and a hash algorithm +// outputing 16 bytes (128) bits, requires 40 cycles, not 30, to +// completely cover the random pool. + + +#endif \ No newline at end of file diff --git a/include/amsclil1/amsclil1_hash.h b/include/amsclil1/amsclil1_hash.h new file mode 100644 index 0000000..ef71cf7 --- /dev/null +++ b/include/amsclil1/amsclil1_hash.h @@ -0,0 +1,17 @@ +#ifndef __AMSCLIL1_HASH_H__ +#define __AMSCLIL1_HASH_H__ + +////////////////// +//Hash Functions// +////////////////// + +//Low level components of many cryptographic operations + + +//MD5 Hash Algorithm +//Input: Some number of bytes in +//Output: 16 bytes (128 bits) digest out +int amsclil1_md5_hash(const uint8_t *bytes_in, size_t Nin, uint8_t *bytes16_out); + + +#endif \ No newline at end of file diff --git a/include/amsclil1/amsclil1_operations.h b/include/amsclil1/amsclil1_operations.h new file mode 100644 index 0000000..a61db42 --- /dev/null +++ b/include/amsclil1/amsclil1_operations.h @@ -0,0 +1,7 @@ +#ifndef __AMSCLIL_OPERATIONS_H__ +#define __AMSCLIL_OPERATIONS_H__ + + + + +#endif \ No newline at end of file diff --git a/include/amsclil1/amsclil1_tests.h b/include/amsclil1/amsclil1_tests.h new file mode 100644 index 0000000..e678b7a --- /dev/null +++ b/include/amsclil1/amsclil1_tests.h @@ -0,0 +1,39 @@ +#ifndef __AMSCLIL1_TESTS_H__ +#define __AMSCLIL1_TESTS_H__ + +void test_fbops_printcmp(); +void test_fbops_shiftread(); +void test_fbops_shiftwrite(); +void test_fbops_lshiftrshift(); +void test_modtdiv(); + +void test_addsub(); +void test_mult(); +void test_div(); + +void test_modpower(); + +void test_mult_time(); +void test_div_time(); + +//non_cryptographic test randomness +void amsclil1_fb32_testrandom(uint32_t* a,long blen); + +void test_barrettmod(); +void barret_modpower_test(); +void barrett_mod_fuzztest(); +void modpower_timetests(); + +void test_amsclil1_fb32_eulergcd(); + +void test_fb16_comparison_sub(); + +void test_div_stress_test(); + +void test_div_stress_test2(); + +void test_ui64bitshifts(); + +void amsclil1_test_fb32_lcm1(); + +#endif \ No newline at end of file diff --git a/include/amsclil1/amsclil1_ulint.h b/include/amsclil1/amsclil1_ulint.h new file mode 100644 index 0000000..2835b56 --- /dev/null +++ b/include/amsclil1/amsclil1_ulint.h @@ -0,0 +1,82 @@ +#ifndef __AMSCLIL1_ULINT_HPP__ +#define __AMSCLIL1_ULINT_HPP__ + +/////////////////////////////////// +// Unsigned Large Integer Object // +/////////////////////////////////// + +// This is an unsigned large integer object based on 32-bit words. 32 bits seems to be +// the fastest width for the underlying data. + +typedef struct amsclil1_ulint +{ + int N; + uint32_t *data; +} amsclil1_ulint; + +// Container Class Routines + +int amsclil1_ulint_new(amsclil1_ulint **pnt); +void amsclil1_ulint_delete(amsclil1_ulint **pnt); + +int amsclil1_ulint_init(amsclil1_ulint *pnt); +void amsclil1_ulint_cleanup(amsclil1_ulint *pnt); + +//resize integer buffer to new size _N +int amsclil1_ulint_resize(amsclil1_ulint *pnt, int _N); + +//If _N is greater than current size, expand to larger size, otherwise do nothing +int amsclil1_ulint_resizetomin(amsclil1_ulint *pnt, int _N); + +//Most significant index of number +int amsclil1_ulint_msindex(amsclil1_ulint *pnt); + +//shrink memory to most significant index +int amsclil1_ulint_shrinktofit(amsclil1_ulint *pnt); + +//sets all data to 0 +void amsclil1_ulint_clear(amsclil1_ulint *pnt); + +//copies src data to dest. resizes dest if necessary, otherwise does not. +int amsclil1_ulint_copy(amsclil1_ulint *dest, amsclil1_ulint *src); + +// Display + +void amsclil1_ulint_printhex(amsclil1_ulint *pnt); +void amsclil1_ulint_printbits(amsclil1_ulint *pnt); + +// Conversion To/From amscutil bytebuffer + + +// Comparators + +// Unsigned Large Integer Comparison Operator: +// 0 - a==b +// 1 - a>b +// 2 - a + +int amsclil1_fb32_cmp(uint32_t* a, uint32_t* b, long blen) +{ + int ret = 0; + long I; + + for(I=blen-1;I>=0;I--) + { + if(a[I]>b[I]) + { + ret = 1; + break; + } + if(b[I]>a[I]) + { + ret = 2; + break; + } + } + + return ret; +} + +int amsclil1_fb32_iszero(uint32_t* a, long blen) +{ + int ret = 1; + long I; + for(I=0;I=0;I--) + { + printf("%08x",a[I]); + } + return; +} + +void amsclil1_fb16_liprint(uint16_t* a, long blen) +{ + long I; + printf("0x"); + for(I=blen-1;I>=0;I--) + { + printf("%04x",a[I]); + } + return; +} + +void amsclil1_fb32_libinprint(uint32_t* a, long blen) +{ + long I; + int J; + uint32_t bit; + printf("0b:"); + for(I=blen-1;I>=0;I--) + { + for(J=32-1;J>=0;J--) + { + bit = (a[I] & (1<>J; + printf("%d",bit); + } + if(I!=0) printf(":"); + } +} + +//bit-shifted reads and writes +//don't move the array in memory, move the read/write +//perhaps it will save time within the division operation +int amsclil1_fb32_readshift(uint32_t* arr, long ind, long shift, uint32_t* val, long blen) +{ + int ret = 0; + //long Itop = ind + amsc_ltdiv(-shift,32)+1; + //long Ibot = ind + amsc_ltdiv(-shift,32); + long Itop = amsc_ltdiv((ind+1)*32-shift,32); + long Ibot = amsc_ltdiv(ind*32-shift,32); + int smin = amsc_lmod(-shift,32); + + //printf("\ndebug: %ld, %ld, %ld, %ld, %d\n",ind, shift, Itop, Ibot, smin); + + uint64_t w1,w2; + + *val = 0; + if(Itop>=0 && Itop> smin); //why does this 32 bit shift work? + *val = *val | (uint32_t) w1; + } + if(Ibot>=0 && Ibot> smin; + *val = *val | (uint32_t) w1; + } + + return ret; +} + +int amsclil1_fb32_writeshift(uint32_t* arr, long ind, long shift, uint32_t* val, long blen) +{ + int ret = 0; + long Itop = amsc_ltdiv((ind+1)*32+shift,32); + long Ibot = amsc_ltdiv(ind*32+shift,32); + int smin = amsc_lmod(shift,32); + int sminc = 32 - smin; + + uint64_t w1,w2; + + //weird problems with shift 32, even shifting uint64_t data types + //while theres a lot of RTFM garbage online, and everyone will roast you + //for shifting a type such as uint32_t 32 bits, no one will admit that + //shifting uint64_t by 32 bits, which by the standard should be defined + //behavior, fails on x86 processors. Some register is 32 bits wide, and + //so this doesn't work. + + if(Itop>=0 && Itop0) w1 = (*val) >> (32-smin); + else w1 = 0; + //w2 = (arr[Itop] >> smin) << smin; + w2 = (uint64_t) arr[Itop]; + w2 = w2 & (0x00000000ffffffff << smin); + arr[Itop] = (uint32_t) w1 | (uint32_t) w2; + } + if(Ibot>=0 && Ibot=0) + { + w1 = (uint64_t) wrk[I-smaj]; + w1 = (w1 << smin) & 0x00000000ffffffff; + a[I] = a[I] | (uint32_t) w1; + } + if(I-smaj-1>=0) + { + w1 = (uint64_t) wrk[I-smaj-1]; + w1 = ((w1 << smin) & 0xffffffff00000000); + w1 = (w1 >> 16) >> 16; + a[I] = a[I] | (uint32_t) w1; + } + } + } + +} + + +void amsclil1_fb32_shiftr(uint32_t* a, long shift, uint32_t* wrk, long blen) +{ + long smaj; + int smin; + long I; + uint64_t w1; + + if(shift<0) + { + amsclil1_fb32_shiftl(a,-shift,wrk,blen); + } + else + { + smaj = amsc_ltdiv(shift,32); + smin = amsc_lmod(shift,32); + amsc_ui32_memcpy(wrk,a,blen); + amsc_ui32_memset(a,0,blen); + for(I=0;I> smin); + a[I] = a[I] | (uint32_t) w1; + } + if(I+smaj+1> smin; + a[I] = a[I] | (uint32_t) w1; + } + } + } + return; +} + +void amsclil1_ui32_add(uint32_t op1, uint32_t op2, uint32_t *res, uint32_t *car) +{ + uint64_t a,b,c; + a = (uint64_t) op1; + b = (uint64_t) op2; + c = a+b; + *res = (uint32_t) c; + *car = (uint32_t) ((c>>16)>>16); + return; +} + +void amsclil1_ui32_sub(uint32_t op1, uint32_t op2, uint32_t *res, uint32_t *car) +{ + uint64_t a; + if(op1>=op2) + { + *res = op1-op2; + *car = 0; + } + else + { + a = (0x0000000100000000 + (uint64_t) op1) - (uint64_t) op2; + *res=(uint32_t) a; + *car = 1; + } + return; +} + +void amsclil1_ui32_mult(uint32_t op1, uint32_t op2, uint32_t *res, uint32_t *car) +{ + uint64_t a,b,c; + a = (uint64_t) op1; + b = (uint64_t) op2; + c = a*b; + *res = (uint32_t) c; + *car = (uint32_t) ((c>>16)>>16); + return; +} + +void amsclil1_ui32_div(uint32_t op1, uint32_t op2, uint32_t *res, uint32_t *rem) +{ + if(op2>op1) + { + *res = 0; + *rem = op1; + } + else + { + *res = op1 / op2; + *rem = op1 % op2; + } + + return; +} + +long amsclil1_fb32_msi(uint32_t*a, long blen) +{ + long ret = 0; + long I; + for(I=blen-1;I>=0;I--) + { + if(a[I] != 0) + { + ret = I; + break; + } + } + return ret; +} diff --git a/src/amsclil1/amsclil1_fbops2.c b/src/amsclil1/amsclil1_fbops2.c new file mode 100644 index 0000000..7e5b376 --- /dev/null +++ b/src/amsclil1/amsclil1_fbops2.c @@ -0,0 +1,1246 @@ +#include + +//a[blen] +//b[blen] +//c[blen] +void amsclil1_fb32_add(uint32_t *a, uint32_t *b, uint32_t *c, long blen) +{ + long I; + uint32_t w,c1,c2; + + w = 0; + c1 = 0; + c2 = 0; + amsc_ui32_memset(c,0,blen); + for(I=0;I=0;I--) + { + if(a[I]!=0) + { + msia = I; break; + } + } + + msib = 0; + for(I=blen-1;I>=0;I--) + { + if(b[I]!=0) + { + msib = I; break; + } + } + + + for(I=0;I<=msia;I++) + { + f = (uint64_t) a[I]; + carry = 0; + for(J=0;J<=msib;J++) + { + carry = carry + c[I+J] + ((uint64_t)b[J])*f; + //printf("I:%ld J:%ld a:%08x b:%08x\n",I,J,a[I],b[J]); + c[I+J] = (uint32_t) (carry & 0x00000000ffffffff); + carry = (carry >> 16) >> 16; + } + if(carry!=0 && ((I+J)<2*blen)) c[I+J] = (uint32_t) (carry & 0x00000000ffffffff); + } + + + return; +} + +void amsclil1_fb16_mult(uint16_t *a, uint16_t *b, uint16_t *c, long blen) +{ + long I,J; + long msia, msib; + uint32_t carry; + uint32_t f; + + //pull in some of these functions to avoid stack overhead + + for(I=0;I<2*blen;I++) c[I] = 0; + + for(I=blen-1;I>=0;I--) + { + if(a[I]!=0) + { + msia = I; break; + } + } + + for(I=blen-1;I>=0;I--) + { + if(b[I]!=0) + { + msib = I; break; + } + } + + + for(I=0;I<=msia;I++) + { + f = (uint64_t) a[I]; + carry = 0; + for(J=0;J<=msib;J++) + { + carry = carry + c[I+J] + ((uint32_t)b[J])*f; + //printf("I:%ld J:%ld a:%08x b:%08x\n",I,J,a[I],b[J]); + c[I+J] = (uint16_t) (carry & 0x0000ffff); + carry = (carry >> 16); + } + if(carry!=0 && (I+J<2*blen)) c[I+J] = (uint16_t) (carry & 0x0000ffff); + } + + + return; +} + +int amsclil1_fb32_shiftcmp(uint32_t *a, uint32_t *b, long bshift, long blen) +{ + int ret = 0; + long I; + uint32_t r; + for(I=blen-1;I>=0;I--) + { + amsclil1_fb32_readshift(b,I,bshift,&r,blen); + if(a[I]>r) + { + ret = 1; + break; + } + if(a[I]=0;I--) + { + amsclil1_fb32_readshift(a,I,shift,&r,blen); + if(r!=0) + { + ret = I; + break; + } + } + + return ret; +} + +void amsclil1_fb32_shiftsub(uint32_t *a, uint32_t *b, long bshift, uint32_t *c, long blen) +{ + long I; + uint32_t w,c1,c2,r; + + + amsc_ui32_memset(c,0,blen); + + if(amsclil1_fb32_shiftcmp(a,b,bshift,blen)==1) + { + w = 0; + c1 = 0; + c2 = 0; + for(I=0;I=0;I--) + { + amsclil1_fb32_readshift(a,I,shift,&r,blen); + printf("%08x",r); + } + return; +} + +//internal digit shift comparison +//this is supposed to be a <=> b*base^bshft +int amsclil1_fb16_intlscmp(uint16_t *a, uint16_t *b, long bshft, long blen) +{ + int cmp = 0; + long I; + uint16_t r1,r2; + + //cover the whole range, dont skip higher digits of b + for(I=(blen-1)+bshft;I>=0;I--) + { + //bug found: >=0, not >0 + if((I-bshft>=0) && (I-bshft=0)) r2=a[I]; else r2=0; //probably >=0 + + if(r2>r1) {cmp=1; break;} + if(r2=0;I--) + // { + // if(I-bshft>=0) r = b[I-bshft]; else r=0; + // if(a[I]>r) {cmp=1; break;} + // if(a[I]=w1) {c[I] = (uint16_t) (w0-w1); car=0;} + else {c[I] = (uint16_t) (0x00010000+w0-w1); car=1;} + } + } + + return; +} + +//note - blen must be one greater than msia to contain answer under all circumstances +void amsclil1_fb16_intlmultsing(uint16_t *a, uint16_t b, long blen) +{ + long I; + uint32_t car; + car = 0; + for(I=0;I> 16; + } + + return; +} + +//Division using the algorithm provided in +//Handbook of Applied Cryptography, Chapter 14 (Algorithm 14.20) +//I messed this up, and need to try to redo it +// there is something screwy going on where +//x [blen] +//y [blen] +//res [blen] +//rem [blen] +//wrk [5*(blen+1)] +//blen - length of integer buffers +// +// Updated 8 Nov 22 - fixed some bugs +// - why can step 2 not be *entirely* skipped if we just adapt step 3, starting with x[msix+1]? +int amsclil1_fb32_div_v3(uint32_t *x, uint32_t *y, uint32_t *res, uint32_t *rem, uint32_t* wrk, long blen) +{ + int ret = 0; + int rr = 0; + + long I,J; + + uint16_t* x2 = (uint16_t*) &wrk[0]; + uint16_t* y2 = (uint16_t*) &wrk[1*(blen+1)]; + uint16_t* q2 = (uint16_t*) &wrk[2*(blen+1)]; + uint16_t* r2 = (uint16_t*) &wrk[3*(blen+1)]; + uint16_t* r3 = (uint16_t*) &wrk[4*(blen+1)]; + uint16_t* tmp; + int dbg; + + + long N2 = 2*blen; //length of uint16 integers + + long msix2,msiy2; //most significant index of x and y + + //intiialize vars + for(I=0;I=0;I--) + { + if(x2[I]!=0) + { + msix2 = I; + break; + } + } + + msiy2 = 0; + for(I=N2-1;I>=0;I--) + { + if(y2[I]!=0) + { + msiy2 = I; + break; + } + } + + //if y==0 + if(msiy2==0 && y2[0]==0) + { + ret = 0; + return ret; + } + + //if x == 0 + if(msix2==0&&x2[0]==0) + { + ret = 1; + return ret; + } + + //if y>x ... 1 + if(msiy2>msix2) + { + ret = 1; + for(I=0;Ix ... 2 + if(msiy2==msix2) + { + for(I=msix2;I>=0;I--) + { + if(x2[I]>y2[I]) + { + break; + } + if(y2[I]>x2[I]) + { + ret = 1; + for(I=0;I=t>=1 + //if msix2==misy2==0, then do single digit division + if(msix2==0) + { + ret = 1; + res[0] = (uint32_t) (x2[0]/y2[0]); + rem[0] = (uint32_t) (x2[0] - y2[0]*((uint16_t)res[0])); + return ret; + } + + /// Start Over /// + //Refer to HAC 14.20 + + // In version 3, I'm going to try skipping step two, and starting at msix2+1 at step 3. + // I have room for it in memory, and x2[msix2+1] should be 0. + + uint64_t bv0,bv1,bv2; + + //3: for I from N down to (T+1) do... + for(I=msix2+1;I>=msiy2+1;I--) + { + + //3.1: if xi=yt q_i-t-1 = base-1; else qi-t-1 = (xi*base+xi-1)/y_t + + //Modify 3.1: q_i-t-1 = (x_i*b^2+x_i-1*b+x_i-2)/(yt*b+y_t-1) + if(x2[I]==y2[msiy2]) + { + q2[I-msiy2-1] = (uint16_t)(0xffff); + } + else + { + //I is guaranteed to be >=1 + bv0 = (((uint64_t)x2[I])<<16LL) + (uint64_t)x2[I-1]; + bv1 = ((uint64_t) y2[msiy2]); + + bv2 = bv0/bv1; + q2[I-msiy2-1] = (int16_t) (bv2 & 0x000000000000ffffLL); + } + + //3.2: while (expression > expression) do ... + dbg = 0; + + bv0 = ((uint64_t)q2[I-msiy2-1])*( (((uint64_t)y2[msiy2])<<16LL) + (uint64_t)y2[msiy2-1] ); + //printf("debug: 0x%lx 0x%lx 0x%lx\n",((uint64_t)q2[I-msiy2-1]),(((uint64_t)y2[msiy2])<<16LL),(uint64_t)y2[msiy2-1]); + + bv1 = (((uint64_t)x2[I])<<32LL)+(((uint64_t)x2[I-1])<<16LL)+((uint64_t)x2[I-2]); + //printf("bv0=0x%lx, bv1=0x%lx\n",bv0,bv1); + while(bv0>bv1) + { + //printf("%d %llx %llx %llx ",dbg,(long long unsigned)q2[I-msiy2-1],(long long unsigned)bv0,(long long unsigned)bv1); + //printf("%x %x %x \n",(int)x2[I],(int)x2[I-1],(int)x2[I-2]); + + q2[I-msiy2-1] = q2[I-msiy2-1]-1; + bv0 = ((uint64_t)q2[I-msiy2-1])*( (((uint64_t)y2[msiy2])<<16LL) + (uint64_t)y2[msiy2-1] ); + bv1 = (((uint64_t)x2[I])<<32LL)+(((uint64_t)x2[I-1])<<16LL)+((uint64_t)x2[I-2]); + + //printf("bv0=0x%lx, bv1=0x%lx\n",bv0,bv1); + //printf("debug: next q[%ld] = %d\n",I-msiy2-1,q2[I-msiy2-1]); + + dbg++; + } + + //3.3 and 3.4 + + //r3 = q[I-t-1]*y2*base^(I-t-1) + for(J=0;Jx + + //q[I-t-1] = q[I-t-1]-1 + dbg = 0; + while(amsclil1_fb16_intlscmp(x2,r3,I-msiy2-1,N2+1)==2) + { + q2[I-msiy2-1] = q2[I-msiy2-1]-1; + //recalc r3 + for(J=0;Jmsiy2+1; I-- + + //rem = x + //res = q + ret = 1; + for(I=0;I=0;I--) + { + if(x2[I]!=0) + { + msix2 = I; + break; + } + } + + msiy2 = 0; + for(I=N2-1;I>=0;I--) + { + if(y2[I]!=0) + { + msiy2 = I; + break; + } + } + + //if y==0 + if(msiy2==0 && y2[0]==0) + { + ret = 0; + return ret; + } + + //if x == 0 + if(msix2==0&&x2[0]==0) + { + ret = 1; + return ret; + } + + //if y>x ... 1 + if(msiy2>msix2) + { + ret = 1; + for(I=0;Ix ... 2 + if(msiy2==msix2) + { + for(I=msix2;I>=0;I--) + { + if(x2[I]>y2[I]) + { + break; + } + if(y2[I]>x2[I]) + { + //printf("debug: check1\n"); + ret = 1; + for(I=0;I=t>=1 + //if msix2==misy2==0, then do single digit division + if(msix2==0) + { + ret = 1; + res[0] = (uint32_t) (x2[0]/y2[0]); + rem[0] = (uint32_t) (x2[0] - y2[0]*((uint16_t)res[0])); + return ret; + } + + /// Start Over /// + //Refer to HAC 14.20 + + //2: find initial value for first digit + //while (x>y*b^(n-t)) + // this block is suspect - I don't understand what it's doing - why doesn't it start from a guessed value? + // it iterates, a *lot*. + + //initial q guess = x_t/y_n - 1 + + //printf("dbg: x2="); amsclil1_fb16_liprint(x2,N2+2); printf("\n"); + //printf("dbg: y2="); amsclil1_fb16_liprint(y2,N2+2); printf("\n"); + //printf("dbg: msix2=%ld msiy2=%ld\n",msix2,msiy2); + + q2[msix2-msiy2] = x2[msix2]/y2[msiy2]; + for(I=0;I<=N2+1;I++) //r3 = y2 + { + if(I<=msiy2) r3[I] = y2[I]; + else r3[I] = 0; + } + //printf("dbg: r3="); amsclil1_fb16_liprint(r3,N2+2); printf("\n"); + // //r3 = y*q[n-t] + amsclil1_fb16_intlmultsing(r3,q2[msix2-msiy2],N2+1); + //printf("dbg: r3="); amsclil1_fb16_liprint(r3,N2+2); printf("\n"); + + //updated initial guess iteration + //while (r3>x) + //{ r3 = r3 - y; q = q - 1 } + + + + while(amsclil1_fb16_intlscmp(x2,r3,msix2-msiy2,N2+1)==2) + { + amsclil1_fb16_intlssub(r3,y2,0,r2,N2+1); + tmp = r2; r2 = r3; r3 = tmp; + q2[msix2-msiy2] = q2[msix2-msiy2] - 1; + + //printf("q2=%d\n",q2[msix2-msiy2]); + //printf("x2="); amsclil1_fb16_liprint(x2,N2+2); printf("\n"); + //printf("r3="); amsclil1_fb16_liprint(r3,N2+2); printf("\n"); + } + //x2 = x2 - r3 + amsclil1_fb16_intlssub(x2,r3,msix2-msiy2,r2,N2+1); + tmp = x2; x2 = r2; r2 = tmp; + + //printf("x2="); amsclil1_fb16_liprint(x2,N2+2); printf("\n"); + + //printf("debug: q2[%ld]=%d\n",msix2-msiy2,q2[msix2-msiy2]); + + //old initial guess + // dbg = 0; + // while(amsclil1_fb16_intlscmp(x2,y2,msix2-msiy2,N2)!=2) + // { + // q2[msix2-msiy2] = q2[msix2-msiy2]+1; + + // // x = x - y*b^(n-t) + // amsclil1_fb16_intlssub(x2,y2,msix2-msiy2,r3,N2); // this might also be suspect + // tmp = x2; x2 = r3; r3 = tmp; //swap(x2,r3) + + + // //printf("dbg: x2="); amsclil1_fb16_liprint(x2,N2+2); printf("\n"); + // // this is not firing for some reason + // // amsclil1_fb16_intlscmp is suspect + + // // if(dbg>=100) + // // { + // // printf("debug1: dbg>100\n"); + // // exit(0); + // // } + // // dbg++; + // } + + // End step 2 + + uint64_t bv0,bv1,bv2; + + //3: for I from N down to (T+1) do... + for(I=msix2;I>=msiy2+1;I--) + { + + //3.1: if xi=yt q_i-t-1 = base-1; else qi-t-1 = (xi*base+xi-1)/y_t + + //Modify 3.1: q_i-t-1 = (x_i*b^2+x_i-1*b+x_i-2)/(yt*b+y_t-1) + if(x2[I]==y2[msiy2]) + { + q2[I-msiy2-1] = (uint16_t)(0xffff); + } + else + { + //I is guaranteed to be >=1 + bv0 = (((uint64_t)x2[I])<<16LL) + (uint64_t)x2[I-1]; + bv1 = ((uint64_t) y2[msiy2]); + + //bv1 = ((uint64_t)q2[I-msiy2-1])*( (((uint64_t)y2[msiy2])<<16LL) + (uint64_t)y[msiy2-1] ); + //bv0 = (((uint64_t)x2[I])<<32LL)+(((uint64_t)x2[I-1])<<16LL)+((uint64_t)x2[I-2]); + bv2 = bv0/bv1; + q2[I-msiy2-1] = (int16_t) (bv2 & 0x000000000000ffffLL); + } + + //printf("debug: initial q[%ld] = %d\n",I-msiy2-1,q2[I-msiy2-1]); + + //3.2: while (expression > expression) do ... + dbg = 0; + + bv0 = ((uint64_t)q2[I-msiy2-1])*( (((uint64_t)y2[msiy2])<<16LL) + (uint64_t)y2[msiy2-1] ); + //this expression is wrong for some reason - y! not y2! needs to be y2!!!! + //printf("debug: 0x%lx 0x%lx 0x%lx\n",((uint64_t)q2[I-msiy2-1]),(((uint64_t)y2[msiy2])<<16LL),(uint64_t)y2[msiy2-1]); + + bv1 = (((uint64_t)x2[I])<<32LL)+(((uint64_t)x2[I-1])<<16LL)+((uint64_t)x2[I-2]); + //printf("bv0=0x%lx, bv1=0x%lx\n",bv0,bv1); + while(bv0>bv1) + { + //printf("%d %llx %llx %llx ",dbg,(long long unsigned)q2[I-msiy2-1],(long long unsigned)bv0,(long long unsigned)bv1); + //printf("%x %x %x \n",(int)x2[I],(int)x2[I-1],(int)x2[I-2]); + + q2[I-msiy2-1] = q2[I-msiy2-1]-1; + bv0 = ((uint64_t)q2[I-msiy2-1])*( (((uint64_t)y2[msiy2])<<16LL) + (uint64_t)y2[msiy2-1] ); + bv1 = (((uint64_t)x2[I])<<32LL)+(((uint64_t)x2[I-1])<<16LL)+((uint64_t)x2[I-2]); + + //printf("bv0=0x%lx, bv1=0x%lx\n",bv0,bv1); + //printf("debug: next q[%ld] = %d\n",I-msiy2-1,q2[I-msiy2-1]); + + dbg++; + } + //printf("debug: step3.2: %d iterations\n",dbg); + + //3.3 and 3.4 + + //r3 = q[I-t-1]*y2*base^(I-t-1) + for(J=0;Jx + + //q[I-t-1] = q[I-t-1]-1 + dbg = 0; + while(amsclil1_fb16_intlscmp(x2,r3,I-msiy2-1,N2+1)==2) + { + q2[I-msiy2-1] = q2[I-msiy2-1]-1; + //recalc r3 + for(J=0;Jmsiy2+1; I-- + + //rem = x + //res = q + ret = 1; + for(I=0;I=0;I--) + { + if(x2[I]!=0) + { + msia = I; break; + } + } + + msib = 0; + for(I=N2-1;I>=0;I--) + { + if(y2[I]!=0) + { + msib = I; break; + } + } + + //printf("check2\n"); + + cmp = 0; + for(I=N2-1;I>=0;I--) + { + if(x2[I]>y2[I]) {cmp = 1; break;} + if(y2[I]>x2[I]) {cmp = 2; break;} + } + + //printf("check3\n"); + + izb = 1; + for(I=0;I=0;I--) + { + bv0 = bv0 + ((uint64_t)x2[I]); + bv1 = bv0/((uint64_t)y2[0]); + bv0 = (bv0 % ((uint64_t)y2[0])) << 16; + q2[I] = (uint16_t) (bv1 & 0x000000000000ffff); + } + r2[0] = (uint16_t) (bv0>>16); + + for(I=0;I=y*b^(diff-1) + //printf("check5\n"); + + //Note - certain numbers hang before step 6 + // 0x000...a62c4b + // 0x000...377d3a is an example + + dbg = 0; + while(amsclil1_fb16_intlscmp(x2,y2,diff-1,N2+2)!=2) + { + q2[diff-1] = q2[diff-1]+1; + + // if(dbg>=495 || dbg<=5) + // { + // printf("debug: %ld y2=", diff); amsclil1_fb16_liprint(y2,N2+2); printf("\n"); + // printf("debug: %ld x2=", diff); amsclil1_fb16_liprint(x2,N2+2); printf("\n"); + // } + + amsclil1_fb16_intlssub(x2,y2,diff-1,r2,N2+2); //x = x - y*b^(diff-1) + bswap = x2; x2 = r2; r2 = bswap; //swap(x2,r2) + + dbg++; + // if(dbg>=500) + // { + // printf("debug: dbg exceeded 500 iterations in loop 1.\n"); + // exit(0); + // } + } + + //printf("check6\n"); + + //next N digits quotient + by1 = (uint64_t)y2[msib]; + if(msib-1>=0) by0 = (uint64_t)y2[msib-1]; else by0 = 0; + + for(I=msia; I>=msib+1; I--) + { + bx2 = (uint64_t)x2[I]; + if(I-1>=0) bx1 = (uint64_t)x2[I-1]; else bx1 = 0; + if(I-2>=0) bx0 = (uint64_t)x2[I-2]; else bx2 = 0; + + bv0 = ((bx2<<16)+bx1)/by1; //3.1 + bv1 = bv0*((by1<<16)+by0); //3.2 + bv2 = ((bx2<<16)<<16)+(bx1<<16)+bx0; + + dbg = 0; + while(bv1>bv2) + { + bv0 = bv0 - 1; + bv1 = bv0*((by1<<16)+by0); + bv2 = ((bx2<<16)<<16)+(bx1<<16)+bx0; + + dbg++; + // if(dbg>=100) + // { + // printf("debug: dbg exceeded 100 iterations in loop 2.\n"); + // exit(0); + // } + } + + //3.3 and 3.4 rearranged a bit + q2[I-msib-1] = (uint16_t) bv0; + //n. r2 = q[I-msib-1]*y + //r2 = r2 << (i-msib-1) + for(J=0;Jx q2 = q2 - 1; repeat step n. + if(cmp==2) + { + q2[I-msib-1]=q2[I-msib-1]-1; + for(J=0;J>smin; + + if(bit!=0) + { + //printf("debug: I=%ld\n",I); + amsclil1_fb32_mult(acc,bm0,ra,wrk,blen); + bswap = acc; acc = ra; ra = bswap; //swap(acc,ra) + //printf("debug: acc="); amsclil1_fb32_liprint(acc,2*blen); printf("\n"); + //amsclil1_fb32_div(acc,mdb,ra,rb,wrk,2*blen+1); + amsclil1_fb32_div(acc,mdb,ra,rb,wrk,2*blen); + bswap = acc; acc = rb; rb = bswap; //swap(acc,rb) + //printf("debug: acc="); amsclil1_fb32_liprint(acc,2*blen); printf("\n"); + } + + //bm0 = (bm0**2) % md + amsclil1_fb32_mult(bm0,bm0,bm1,wrk,blen); + amsclil1_fb32_div(bm1,mdb,ra,bm0,wrk,2*blen); + } + + amsc_ui32_memcpy(res,acc,blen); + + return; +} diff --git a/src/amsclil1/amsclil1_fbops3.c b/src/amsclil1/amsclil1_fbops3.c new file mode 100644 index 0000000..a6456e9 --- /dev/null +++ b/src/amsclil1/amsclil1_fbops3.c @@ -0,0 +1,300 @@ +#include + +//precompute mu = b^(2*k)/m for Barrett Reduction algorithm [HAC 14.42] +//m[blen] - the modulus +//mu[2*(blen+1)] - precomputed factor for Barrett Reduction +//wrk[14*blen+19] - division working memory +//K - most significant index of m + 1 (at most blen) +//blen - length of m buffer +void amsclil1_fb32_barrettmu(uint32_t *m, uint32_t *mu, uint32_t *wrk, long K, long blen) +{ + long I; + //intl buffer lengths 2*(blen+1) + //division working length 5*(2*(blen+1)+1): 10*blen+15 + //total work length: 10*blen+15+4*(blen+1) 14*blen+19 + + const size_t divlen = 10*blen+15; + const size_t intblen = 2*(blen+1); + uint32_t *b2 = &(wrk[divlen+0*intblen]); + uint32_t *m2 = &(wrk[divlen+1*intblen]); + uint32_t *mu2 = &(wrk[divlen+2*intblen]); + uint32_t *rm2 = &(wrk[divlen+3*intblen]); + + for(I=0;I=(K-1);I--) + //for(I=blen-1;I>=(K-1);I--) + { + q1[I-(K-1)] = x[I]; + } + + //2. q2 = q1*mu + amsclil1_fb32_mult(mu,q1,q2,wrk,2*(blen+1)); + + //3. q3 = q2/ b^(K+1) + for(I=intblen-1;I>=K+1;I--) + { + q3[I-(K+1)] = q2[I]; + } + + //4. r1 = x mod b^(k+1) + for(I=0;I<(K+1) && I=m r3 = r3-m + cmp = amsclil1_fb32_cmp(r3,mi,2*(blen+1)); + + //dbg = 0; + while(cmp!=2) + { + amsclil1_fb32_sub(r3,mi,q2,2*(blen+1)); + bswap = r3; r3 = q2; q2 = bswap; + cmp = amsclil1_fb32_cmp(r3,mi,2*(blen+1)); + //dbg++; + } + + for(I=0;I2) + //{ + // printf("debug: %ld iters, should be at most 2\n",dbg); + // printf("debug: x="); amsclil1_fb32_liprint(x,blen); printf("\n"); + // printf("debug: m="); amsclil1_fb32_liprint(m,blen); printf("\n"); + // printf("debug: y="); amsclil1_fb32_liprint(y,blen); printf("\n"); + // printf("debug: mu="); amsclil1_fb32_liprint(mu,2*(blen+1)); printf("\n"); + // printf("debug: r1="); amsclil1_fb32_liprint(r1,2*(blen+1)); printf("\n"); + // printf("debug: r2="); amsclil1_fb32_liprint(r2,2*(blen+1)); printf("\n"); + //} + + return; +} + + +//Fast Modular Exponentiation using Barrett Reduction +//calculates mod(a^pw, md) +//a[blen] - base buffer +//pw[blen] - power +//md[blen] - modulus +//wrk[66*(blen+1)] +//stor[28*(blen+1)] +//blen - base buffer length +void amsclil1_fb32_modpower_bar(uint32_t *a, uint32_t *pw, uint32_t *md, uint32_t *res, uint32_t *wrk, uint32_t *stor, int blen) +{ + long I; + long msipw, msia; + uint32_t bit; + long smaj; + int smin; + long Kmd,Kacc,Kbm; + + const size_t intblen = 4*(blen+1); + + uint32_t* bswap = NULL; + uint32_t* bm0 = &(stor[0]); + uint32_t* bm1 = &(stor[1*intblen]); + uint32_t* ra = &(stor[2*intblen]); + uint32_t* rb = &(stor[3*intblen]); //unused? + uint32_t* acc = &(stor[4*intblen]); + uint32_t* mdb = &(stor[5*intblen]); + uint32_t* mu = &(stor[6*intblen]); + + msipw = amsclil1_fb32_msi(pw,blen); + msia = amsclil1_fb32_msi(a,blen); + + Kmd = amsclil1_fb32_msi(md,blen)+1; + + for(I=0;I>smin; + + if(bit!=0) + { + amsclil1_fb32_mult(acc,bm0,ra,wrk,blen); + bswap = acc; acc = ra; ra = bswap; //swap(acc,ra) + Kacc = amsclil1_fb32_msi(acc,2*blen)+1; + //printf("debug: acc="); amsclil1_fb32_liprint(acc,2*blen); printf("\n"); + //acc - [2*blen] buffer now + //so everything fed to barrettmod needs to be sized for 2*blen? + amsclil1_fb32_barrettmod(acc,mdb,ra,mu,wrk,Kmd,Kacc,2*blen); + bswap = acc; acc = ra; ra = bswap; //swap(acc,ra) + //printf("debug: acc="); amsclil1_fb32_liprint(acc,2*blen); printf("\n"); + } + + //printf("debug: acc="); amsclil1_fb32_liprint(acc,2*blen); printf("\n"); + + //bm0 = (bm0**2) % md + amsclil1_fb32_mult(bm0,bm0,bm1,wrk,blen); + Kbm = amsclil1_fb32_msi(bm1,2*blen)+1; + amsclil1_fb32_barrettmod(bm1,mdb,bm0,mu,wrk,Kmd,Kbm,2*blen); + + //amsclil1_fb32_div(bm1,mdb,ra,bm0,wrk,2*blen); + + } + + + return; +} + + +void amsclil1_fb32_ncrandint(uint32_t *a, long blen) +{ + long I; + uint32_t r; + for(I=0;I + + +//Euler greatest common divisor algorithm +//a [blen] +//b [blen] +//gcd [blen] +//use division algorithm for modulus - no need for modpower here +//wrk [9*(blen+1)] .... +void amsclil1_fb32_eulergcd(uint32_t *a, uint32_t *b, uint32_t *gcd, uint32_t *wrk, long blen) +{ + long I; + uint32_t *ai,*bi,*ci,*tmp,*ri,*wrki; + + int dbg; + + ai = &(wrk[0*(blen+1)]); //[blen+1] + bi = &(wrk[1*(blen+1)]); //[blen+1] + ci = &(wrk[2*(blen+1)]); //[blen+1] + ri = &(wrk[3*(blen+1)]); //gcd; //[blen] + wrki = &(wrk[4*(blen+1)]); //5*(blen+1) + //total 9*(blen+1) + + for(I=0;Ib + if(amsclil1_fb32_cmp(a,b,blen)!=2) + { + //copy a to ai, b to bi + for(I=0;I1) //b>a + { + aint = a; + bint = b; + } + else //a>=b + { + aint = b; + bint = a; + } + + if(amsclil1_fb32_iszero(bint,blen)) + { + //a = b = 0 + //set lcm to 0 (taken care of by default above) + return; + } + + msib = amsclil1_fb32_msi(bint,blen); + //msib > msia by bint>aint + + + //gcd = gcd(aint,bint) + // actually requires 9*(blen+1)? + amsclil1_fb32_eulergcd(aint,bint,gcd,wrki,msib); + + //s = bint / gcd + // requires 5*(blen+1) working memory + amsclil1_fb32_div(bint,gcd,q,r,wrki,msib); + + //lcm = aint*s + // requires no working memory + amsclil1_fb32_mult(aint,s,lcm,wrki,msib); + + return; +} + +//Multiplicative Inverse Algorithm +//Refer to FIPS Pub 186-4, Algorithm C.1 +//Inputs: +// z [blen] value to find the modular multiplicative inverse of +// dom [blen] modular domain +// wrk [17*(blen+1)] internal working memory +// blen - buffer length +//Outputs: +// zinv [blen] multiplicative inverse such that mod(z*zinv,dom)==1 +//Return: +// 1 - success, 0 - failure +int amsclil1_fb32_multinv(uint32_t *z, uint32_t *dom, uint32_t *zinv, uint32_t *wrk, int blen) +{ + int ret = 0; + + int cmp,res,res2; + int I; + + uint32_t *xi = &(wrk[0]); //blen + uint32_t *xj = &(wrk[1*blen]); //blen + uint32_t *y = &(wrk[2*blen]); //2*blen + uint32_t *y1 = &(wrk[4*blen]); //2*blen + uint32_t *y2 = &(wrk[6*blen]); //2*blen + uint32_t *y3 = &(wrk[8*blen]); //2*blen + uint32_t *q = &(wrk[10*blen]); //blen + uint32_t *r = &(wrk[11*blen]); //blen + uint32_t *wrki = &(wrk[12*blen]); //div: [5*(blen+1)] + //at least [17*(blen+1)] + + uint32_t *tmp = NULL; + + + //An alternative way of handling this is take z --> mod(z,dom), then proceed + + for(I=0;I=dom, error + cmp = amsclil1_fb32_cmp(z,dom,blen); + if(cmp!=1) + { + ret = 0; + return ret; + } + + for(I=0;I<17*(blen+1);I++) wrk[I] = 0; //clean work buffer to start with + + + //xi = dom + for(I=0;I + + + + + +void amsclil1_gutmannprng(uint8_t *randompool) +{ + + + return; +} \ No newline at end of file diff --git a/src/amsclil1/amsclil1_md5_hash.c b/src/amsclil1/amsclil1_md5_hash.c new file mode 100644 index 0000000..b05ee05 --- /dev/null +++ b/src/amsclil1/amsclil1_md5_hash.c @@ -0,0 +1,126 @@ +#include + +///////////////////// +//Utility Functions// +///////////////////// + +static void _local_pblocations(size_t N, int64_t *padbytes, int64_t *padstart, int64_t *padstop, uint64_t *sz) +{ + int64_t N1 = N; + + if(N1%64LL >= 56LL) + { + *padbytes = ((N1/64LL)+2LL)*64LL; + *padstart = N; + *padstop = *padbytes-8; + *sz = N*8; + } + else + { + *padbytes = ((N1/64LL)+1LL)*64LL; + *padstart = N; + *padstop = *padbytes-8; + *sz = N*8; + } + + return; +} + +static uint8_t _local_getpaddedbyte(const uint8_t *bytes, size_t Nin, size_t ind) +{ + uint8_t ret = 0; + int64_t padbytes; + int64_t padstart; + int64_t padstop; + uint64_t sz; + + uint64_t q; + uint64_t mask; + + _local_pblocations(Nin,&padbytes,&padstart,&padstop,&sz); + if(ind>padbytes) + { + ret = 0; return ret; + } + + if(indpadstart && ind>(q/8LL)) + } + + return ret; +} + +static uint32_t _local_getpaddedui32(const uint8_t *bytes, size_t Nin, size_t ui32ind) +{ + uint32_t ret = 0; + size_t N2; + uint8_t b[4]; + + if(ui32ind>padbytes/4) + { + ret = 0; return ret; + } + + b[0] = _local_getpaddedbyte(bytes,Nin,ui32ind*4+0); + b[1] = _local_getpaddedbyte(bytes,Nin,ui32ind*4+1); + b[2] = _local_getpaddedbyte(bytes,Nin,ui32ind*4+2); + b[3] = _local_getpaddedbyte(bytes,Nin,ui32ind*4+3); + + ret = ((uint32_t b[0])<<24) + ((uint32_t b[1])<<16) + ((uint32_t b[2])<<8) + ((uint32_t b[3])<<0) + + return ret; +} + + +///////////////// +//Main Function// +///////////////// + +//MD5 Hash Algorithm +//Input: Some number of bytes in +//Output: 16 bytes (128 bits) digest out +int amsclil1_md5_hash(const uint8_t *bytes_in, size_t Nin, uint8_t *bytes16_out) +{ + int ret = 0; + const uint8_t *pbytes = NULL; //I could do this without dynamic allocation, and it would be faster + size_t npbytes = 0; + size_t I; + + return ret; +} + +///////// +//Tests// +///////// + +//For "official answers", look at: +// https://www.md5hashgenerator.com/ + + + +void amsclil1_md5_hash_tests() +{ + char str1[250]; + + + + return; +} \ No newline at end of file diff --git a/src/amsclil1/amsclil1_tests1.c b/src/amsclil1/amsclil1_tests1.c new file mode 100644 index 0000000..b79c1be --- /dev/null +++ b/src/amsclil1/amsclil1_tests1.c @@ -0,0 +1,193 @@ +#include + +void test_fbops_printcmp() +{ + long N = 2; + uint32_t a[N]; + uint32_t b[N]; + int c0; + + printf("test_fbops_printcmp\n"); + + amsc_ui32_memset(a,0,N); + amsc_ui32_memset(b,0,N); + printf("a="); amsclil1_fb32_liprint(a,N); printf("\n"); + c0 = amsclil1_fb32_iszero(a,N); + printf("a is zero?: %d\n",c0); + a[0] = 0x000000ff; + printf("a="); amsclil1_fb32_liprint(a,N); printf("\n"); + c0 = amsclil1_fb32_iszero(a,N); + printf("a is zero?: %d\n",c0); + + printf("\n"); + printf("a="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b="); amsclil1_fb32_liprint(b,N); printf("\n"); + c0 = amsclil1_fb32_cmp(a,b,N); + printf("cmp(a,b): %d\n",c0); + + printf("\n"); + b[0] = 0x000000ff; + printf("a="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b="); amsclil1_fb32_liprint(b,N); printf("\n"); + c0 = amsclil1_fb32_cmp(a,b,N); + printf("cmp(a,b): %d\n",c0); + + printf("\n"); + b[0] = 0x00000fff; + printf("a="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("b="); amsclil1_fb32_libinprint(b,N); printf("\n"); + c0 = amsclil1_fb32_cmp(a,b,N); + printf("cmp(a,b): %d\n",c0); + + b[0] = 0b00000000111111110000000011111111; //checking to see whether C understands binary constants + printf("b="); amsclil1_fb32_libinprint(b,N); printf("\n"); + + fflush(stdout); + return; +} + +void amsclil1_intl_printbin(uint32_t b) +{ + int I; + uint32_t bit; + for(I=32-1;I>=0;I--) + { + bit = (b & (1<> I; + printf("%d",bit); + } +} + +void amsclil1_intl_printshift(uint32_t *a, long shift, long blen) +{ + long I; + uint32_t r; + printf("0b:"); + for(I=blen-1;I>=0;I--) + { + amsclil1_fb32_readshift(a,I,shift,&r,blen); + amsclil1_intl_printbin(r); + if(I!=0) printf(":"); + } +} + +void test_fbops_shiftread() +{ + long N=2; + uint32_t a[N]; + long I; + long shift; + uint32_t r; + + amsc_ui32_memset(a,0b00001111000011110000111100001111,N); + a[0] = 0b01010101010101010101010101010101; + + for(I=0;I<35;I++) + { + //something wrong when I=32 + printf("a<<%3ld= ",I); + amsclil1_intl_printshift(a,I,N); + printf("\n"); + } + + for(I=35;I>-35;I--) + { + printf("a<<%3ld= ",I); + amsclil1_intl_printshift(a,I,N); + printf("\n"); + } + + + return; +} + +void test_fbops_shiftwrite() +{ + long N = 2; + uint32_t a[N]; + uint32_t r; + long I; + + printf("hello?"); + for(I=-40;I<40;I++) + { + //a[1] = 0b11111111111111111111111111111111; + //a[0] = 0b00000000000000000000000000000000; + + a[0] = 0b11110000111100001111000011110000; + a[1] = 0b11111111000000001111111100000000; + //printf("a="); amsclil1_fb32_libinprint(a,N); printf("\n"); + r = 0b11100011111111111111111111000111; + amsclil1_fb32_writeshift(a,0,I,&r,N); + printf("a w%3ld=",I); amsclil1_fb32_libinprint(a,N); printf("\n"); + } + + return; +} + +void test_modtdiv() +{ + long I,J,K; + + printf("Tests of modular arithmetic function and true division.\n"); + + J = 5; + for(I=-20;I<20;I++) + { + K = amsc_ltdiv(I,J); + printf("%ld / %ld = %ld\n",I,J,K); + } + + J = 5; + for(I=-20;I<20;I++) + { + K = amsc_lmod(I,J); + printf("%ld %% %ld = %ld\n",I,J,K); + } + + + return; +} + +void test_fbops_lshiftrshift() +{ + long N = 2; + uint32_t a[N],b[N]; + long I; + uint32_t r; + + printf("Test lshift and rshift.\n"); + + a[1] = 0xff00ffff; + a[0] = 0xf0f0ff00; + + for(I=0;I<35;I++) + { + printf("a="); amsclil1_fb32_libinprint(a,N); printf("\n"); + amsclil1_fb32_shiftl(a,1,b,N); + } + + for(I=0;I<35;I++) + { + printf("a="); amsclil1_fb32_libinprint(a,N); printf("\n"); + amsclil1_fb32_shiftr(a,1,b,N); + } + + a[1] = 0xff00ffff; + a[0] = 0xf0f0ff00; + for(I=0;I<2;I++) + { + printf("a="); amsclil1_fb32_libinprint(a,N); printf("\n"); + amsclil1_fb32_shiftl(a,32,b,N); + } + + a[1] = 0xff00ffff; + a[0] = 0xf0f0ff00; + for(I=0;I<8;I++) + { + printf("a="); amsclil1_fb32_libinprint(a,N); printf("\n"); + amsclil1_fb32_shiftl(a,8,b,N); + } + + return; +} \ No newline at end of file diff --git a/src/amsclil1/amsclil1_tests2.c b/src/amsclil1/amsclil1_tests2.c new file mode 100644 index 0000000..9e61225 --- /dev/null +++ b/src/amsclil1/amsclil1_tests2.c @@ -0,0 +1,340 @@ +#include + +void test_addsub() +{ + long N = 2; + uint32_t a[N],b[N],c[N]; + + printf("amsclil1: Test addition and subtraction.\n"); + + + printf("\n"); + amsc_ui32_memset(a,0,2); + amsc_ui32_memset(b,0,2); + amsc_ui32_memset(c,0,2); + a[0] = 0x01; + b[0] = 0x01; + printf("a="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("a+b=c\n"); + amsclil1_fb32_add(a,b,c,N); + printf("c="); amsclil1_fb32_liprint(c,N); printf("\n"); + + printf("\n"); + amsc_ui32_memset(a,0,2); + amsc_ui32_memset(b,0,2); + amsc_ui32_memset(c,0,2); + a[0] = 0xffffffff; + b[0] = 0x10000000; + printf("a="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("a+b=c\n"); + amsclil1_fb32_add(a,b,c,N); + printf("c="); amsclil1_fb32_liprint(c,N); printf("\n"); + + printf("\n"); + amsc_ui32_memset(a,0,2); + amsc_ui32_memset(b,0,2); + amsc_ui32_memset(c,0,2); + a[0] = 0xffffffff; a[1] = 0xf0; + b[0] = 0x01000000; b[1] = 0x01; + printf("a="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("a+b=c\n"); + amsclil1_fb32_add(a,b,c,N); + printf("c="); amsclil1_fb32_liprint(c,N); printf("\n"); + + printf("\n"); + amsc_ui32_memset(a,0,2); + amsc_ui32_memset(b,0,2); + amsc_ui32_memset(c,0,2); + a[0] = 0xffffffff; a[1] = 0xffffffff; + b[0] = 0xffffffff; b[1] = 0xffffffff; + printf("a="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("a+b=c\n"); + amsclil1_fb32_add(a,b,c,N); + printf("c="); amsclil1_fb32_liprint(c,N); printf("\n"); + + printf("\n"); + amsc_ui32_memset(a,0,2); + amsc_ui32_memset(b,0,2); + amsc_ui32_memset(c,0,2); + a[0] = 0x01; + b[0] = 0x01; + printf("a="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("a-b=c\n"); + amsclil1_fb32_sub(a,b,c,N); + printf("c="); amsclil1_fb32_liprint(c,N); printf("\n"); + + printf("\n"); + amsc_ui32_memset(a,0,2); + amsc_ui32_memset(b,0,2); + amsc_ui32_memset(c,0,2); + a[0] = 0xf0; + b[0] = 0x01; + printf("a="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("a-b=c\n"); + amsclil1_fb32_sub(a,b,c,N); + printf("c="); amsclil1_fb32_liprint(c,N); printf("\n"); + + printf("\n"); + amsc_ui32_memset(a,0,2); + amsc_ui32_memset(b,0,2); + amsc_ui32_memset(c,0,2); + a[0] = 0x01; + b[0] = 0xf0; + printf("a="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("a-b=c\n"); + amsclil1_fb32_sub(a,b,c,N); + printf("c="); amsclil1_fb32_liprint(c,N); printf("\n"); + + printf("\n"); + amsc_ui32_memset(a,0,2); + amsc_ui32_memset(b,0,2); + amsc_ui32_memset(c,0,2); + a[0] = 0x0fffffff; a[1] = 0xffffffff; + b[0] = 0x30000000; b[1] = 0x00000000; + printf("a="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("a+b=c\n"); + amsclil1_fb32_sub(a,b,c,N); + printf("c="); amsclil1_fb32_liprint(c,N); printf("\n"); + + + return; +} + +void test_mult() +{ + long N = 2; + uint32_t a[N],b[N],c[2*N]; + uint32_t wrk[6*N]; + + printf("amsclil1: Test multiplication.\n"); + + printf("\n"); + amsc_ui32_memset(a,0,2); + amsc_ui32_memset(b,0,2); + amsc_ui32_memset(c,0,2); + a[0] = 0xffffffff; a[1] = 0x00000000; + b[0] = 0xffffffff; b[1] = 0x00000000; + printf("a="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("a*b=c\n"); + amsclil1_fb32_mult(a,b,c,wrk,N); + printf("c="); amsclil1_fb32_liprint(c,2*N); printf("\n"); + + + printf("\n"); + amsc_ui32_memset(a,0,2); + amsc_ui32_memset(b,0,2); + amsc_ui32_memset(c,0,2); + a[0] = 0x0fffffff; a[1] = 0xffffffff; + b[0] = 0x30000000; b[1] = 0x00000000; + printf("a="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("a*b=c\n"); + amsclil1_fb32_mult(a,b,c,wrk,N); + printf("c="); amsclil1_fb32_liprint(c,2*N); printf("\n"); + + printf("\n"); + amsc_ui32_memset(a,0,2); + amsc_ui32_memset(b,0,2); + amsc_ui32_memset(c,0,2); + a[0] = 0xffffffff; a[1] = 0xffffffff; + b[0] = 0xffffffff; b[1] = 0xffffffff; + printf("a="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("a*b=c\n"); + amsclil1_fb32_mult(a,b,c,wrk,N); + printf("c="); amsclil1_fb32_liprint(c,2*N); printf("\n"); + + + return; +} + +void test_div() +{ + long N = 2; + uint32_t a[N],b[N],c[N],d[N]; + //uint32_t wrk[3*(N+1)]; + uint32_t wrk[5*(N+1)]; + printf("amsclil1: Test division.\n"); + + printf("\n"); + amsc_ui32_memset(a,0,2); + amsc_ui32_memset(b,0,2); + amsc_ui32_memset(c,0,2); + a[0] = 0xffffaf0f; a[1] = 0x00000000; + b[0] = 0x00000001; b[1] = 0x00000000; + printf("a ="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b ="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("a/b=res,rem\n"); + amsclil1_fb32_div(a,b,c,d,wrk,N); + printf("res="); amsclil1_fb32_liprint(c,N); printf("\n"); + printf("rem="); amsclil1_fb32_liprint(d,N); printf("\n"); + + printf("\n"); + amsc_ui32_memset(a,0,2); + amsc_ui32_memset(b,0,2); + amsc_ui32_memset(c,0,2); + a[0] = 0xffffaf0f; a[1] = 0x00000000; + b[0] = 0x00000100; b[1] = 0x00000000; + printf("a ="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b ="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("a/b=res,rem\n"); + amsclil1_fb32_div(a,b,c,d,wrk,N); + printf("res="); amsclil1_fb32_liprint(c,N); printf("\n"); + printf("rem="); amsclil1_fb32_liprint(d,N); printf("\n"); + + printf("\n"); + amsc_ui32_memset(a,0,2); + amsc_ui32_memset(b,0,2); + amsc_ui32_memset(c,0,2); + a[0] = 0xffffaf0f; a[1] = 0x00000000; + b[0] = 0xf0000000; b[1] = 0x00000000; + printf("a ="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b ="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("a/b=res,rem\n"); + amsclil1_fb32_div(a,b,c,d,wrk,N); + printf("res="); amsclil1_fb32_liprint(c,N); printf("\n"); + printf("rem="); amsclil1_fb32_liprint(d,N); printf("\n"); + + printf("\n"); + amsc_ui32_memset(a,0,2); + amsc_ui32_memset(b,0,2); + amsc_ui32_memset(c,0,2); + a[0] = 0x00000001; a[1] = 0x00000000; + b[0] = 0xf0000000; b[1] = 0x00000000; + printf("a ="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b ="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("a/b=res,rem\n"); + amsclil1_fb32_div(a,b,c,d,wrk,N); + printf("res="); amsclil1_fb32_liprint(c,N); printf("\n"); + printf("rem="); amsclil1_fb32_liprint(d,N); printf("\n"); + + printf("\n"); + amsc_ui32_memset(a,0,2); + amsc_ui32_memset(b,0,2); + amsc_ui32_memset(c,0,2); + a[0] = 0x00000001; a[1] = 0x00000000; + b[0] = 0x00000000; b[1] = 0x00000000; + printf("a ="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b ="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("a/b=res,rem\n"); + amsclil1_fb32_div(a,b,c,d,wrk,N); + printf("res="); amsclil1_fb32_liprint(c,N); printf("\n"); + printf("rem="); amsclil1_fb32_liprint(d,N); printf("\n"); + + printf("\n"); + amsc_ui32_memset(a,0,2); + amsc_ui32_memset(b,0,2); + amsc_ui32_memset(c,0,2); + a[0] = 0x00000004; a[1] = 0xff0ff0ff; + b[0] = 0x00000004; b[1] = 0x00000000; + printf("a ="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b ="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("a/b=res,rem\n"); + amsclil1_fb32_div(a,b,c,d,wrk,N); + printf("res="); amsclil1_fb32_liprint(c,N); printf("\n"); + printf("rem="); amsclil1_fb32_liprint(d,N); printf("\n"); + + printf("\n"); + amsc_ui32_memset(a,0,2); + amsc_ui32_memset(b,0,2); + amsc_ui32_memset(c,0,2); + a[0] = 0x00000001; a[1] = 0x00000000; + b[0] = 0x00000000; b[1] = 0x00000000; + printf("a ="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b ="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("a/b=res,rem\n"); + amsclil1_fb32_div(a,b,c,d,wrk,N); + printf("res="); amsclil1_fb32_liprint(c,N); printf("\n"); + printf("rem="); amsclil1_fb32_liprint(d,N); printf("\n"); + + return; +} + +void test_modpower() +{ + long N = 2; + uint32_t a[N],b[N],c[N],d[N]; + uint32_t wrk[8*(N+2)]; + uint32_t stor[12*(N+1)]; + + printf("amsclil1: Mod power tests.\n"); + + printf("\n"); + amsc_ui32_memset(a,0,N); + amsc_ui32_memset(b,0,N); + amsc_ui32_memset(c,0,N); + amsc_ui32_memset(d,0,N); + a[0] = 0x00000010; a[1] = 0x00000000; + b[0] = 0x00000002; b[1] = 0x00000000; + c[0] = 0x000000ff; c[1] = 0x00000000; + printf("mod(a^b, c) = d\n"); + printf("a="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("c="); amsclil1_fb32_liprint(c,N); printf("\n"); + amsclil1_fb32_modpower(a,b,c,d,wrk,stor,N); + printf("d="); amsclil1_fb32_liprint(d,N); printf("\n"); //0x01 - check + + printf("\n"); + amsc_ui32_memset(a,0,N); + amsc_ui32_memset(b,0,N); + amsc_ui32_memset(c,0,N); + amsc_ui32_memset(d,0,N); + a[0] = 0x0000faf0; a[1] = 0x00000000; + b[0] = 0x00000c0a; b[1] = 0x00000000; + c[0] = 0x00ffaaff; c[1] = 0x00000000; + printf("mod(a^b, c) = d\n"); + printf("a="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("c="); amsclil1_fb32_liprint(c,N); printf("\n"); + amsclil1_fb32_modpower(a,b,c,d,wrk,stor,N); + printf("d="); amsclil1_fb32_liprint(d,N); printf("\n"); //0xf5ee89 - check + + printf("\n"); + amsc_ui32_memset(a,0,N); + amsc_ui32_memset(b,0,N); + amsc_ui32_memset(c,0,N); + amsc_ui32_memset(d,0,N); + a[0] = 0x0000afaf; a[1] = 0xafaf0000; + b[0] = 0xff00ff00; b[1] = 0xff00ff00; + c[0] = 0x10101010; c[1] = 0x10101010; + printf("mod(a^b, c) = d\n"); + printf("a="); amsclil1_fb32_liprint(a,N); printf("\n"); + printf("b="); amsclil1_fb32_liprint(b,N); printf("\n"); + printf("c="); amsclil1_fb32_liprint(c,N); printf("\n"); + amsclil1_fb32_modpower(a,b,c,d,wrk,stor,N); + printf("d="); amsclil1_fb32_liprint(d,N); printf("\n"); //0x6e10c57c1e7bc71 - check + + + //speed test - moment of truth: can you do 4096 bit (64) RSA? + long N2 = 64; + uint32_t a2[N2],b2[N2],c2[N2],d2[N2]; + uint32_t wrk2[8*(N2+2)]; + uint32_t stor2[12*(N2+1)]; + + printf("\n"); + amsc_ui32_memset(a2,0,N2); + amsc_ui32_memset(b2,0,N2); + amsc_ui32_memset(c2,0,N2); + amsc_ui32_memset(d2,0,N2); + a2[0] = 0x00000077; a2[N2-1] = 0x70000000; + b2[0] = 0x00000066; b2[N2-1] = 0xff000000; + c2[0] = 0x00000013; c2[N2-1] = 0x13000000; + printf("mod(a^b, c) = d\n"); + printf("a2="); amsclil1_fb32_liprint(a2,N2); printf("\n"); + printf("b2="); amsclil1_fb32_liprint(b2,N2); printf("\n"); + printf("c2="); amsclil1_fb32_liprint(c2,N2); printf("\n"); + amsclil1_fb32_modpower(a2,b2,c2,d2,wrk2,stor2,N2); + printf("d2="); amsclil1_fb32_liprint(d2,N2); printf("\n"); + //still takes too blasted long + + return; +} \ No newline at end of file diff --git a/src/amsclil1/amsclil1_tests3.c b/src/amsclil1/amsclil1_tests3.c new file mode 100644 index 0000000..647c0b3 --- /dev/null +++ b/src/amsclil1/amsclil1_tests3.c @@ -0,0 +1,883 @@ +#include + +#include + +//clock() +//CLOCKS_PER_SEC + +//non_cryptographic test randomness +void amsclil1_fb32_testrandom(uint32_t* a,long blen) +{ + long I; + + for(I=0;I=6 + //still hitting bad conditions for division + amsclil1_fb32_eulergcd(a,b,c,wrk,blen); + amsclil1_fb32_div(a,c,d,e,wrk,blen); + b1 = amsclil1_fb32_iszero(e,blen); + amsclil1_fb32_div(b,c,d,e,wrk,blen); + b2 = amsclil1_fb32_iszero(e,blen); + if(b1==1 && b2 == 1) + { + printf("\t pass.\n"); + } + else + { + printf("\t FAIL.\n"); + break; + } + } + + + free(a); + free(b); + free(c); + free(d); + free(e); + free(wrk); + + return; +} + +void test_fb16_comparison_sub() +{ + printf("tests of fb16 subtraction and comparison ops.\n"); + long blen = 4; + uint16_t *a,*b,*c,*wrk; + long diff; + int cmp; + + a = (uint16_t*) malloc(sizeof(uint16_t)*blen); + b = (uint16_t*) malloc(sizeof(uint16_t)*blen); + c = (uint16_t*) malloc(sizeof(uint16_t)*blen); + + //diff-1 = 0: a bug in subtraction +// debug: 1 y2=0x00000000000000000000000000000000000000000000000000377d3a +// debug: 1 x2=0x00000000000000000000000000000000000000000000000000a62c4b +// debug: 1 y2=0x00000000000000000000000000000000000000000000000000377d3a +// debug: 1 x2=0x000000000000000000000000000000000000000000000000006eaf11 +// debug: 1 y2=0x00000000000000000000000000000000000000000000000000377d3a +// debug: 1 x2=0x000000000000000000000000000000000000000000000000003731d7 +// debug: 1 y2=0x00000000000000000000000000000000000000000000000000377d3a +// debug: 1 x2=0xffffffffffffffffffffffffffffffffffffffffffffffffffffb49d + + a[2] = 0; + a[1] = 0x0037; + a[0] = 0x7d3a; + b[2] = 0; + b[1] = 0x0037; + b[0] = 0x31d7; + + printf("a="); amsclil1_fb16_liprint(a,blen); printf("\n"); + printf("b="); amsclil1_fb16_liprint(b,blen); printf("\n"); + + diff = 0; + cmp = amsclil1_fb16_intlscmp(a,b,diff,blen); + printf("cmp(a,b) diff = %ld, cmp = %d\n",diff,cmp); + + diff = 0; + cmp = amsclil1_fb16_intlscmp(b,a,diff,blen); + printf("cmp(b,a) diff = %ld, cmp = %d\n",diff,cmp); + + diff = 1; + cmp = amsclil1_fb16_intlscmp(a,b,diff,blen); + printf("diff = %ld, cmp = %d\n",diff,cmp); + + diff = -1; + cmp = amsclil1_fb16_intlscmp(a,b,diff,blen); + printf("diff = %ld, cmp = %d\n",diff,cmp); + + diff = 2; + cmp = amsclil1_fb16_intlscmp(a,b,diff,blen); + printf("diff = %ld, cmp = %d\n",diff,cmp); + + printf("subtraction a - b*base^diff\n"); + diff = 0; + printf("diff=%ld\n",diff); + amsclil1_fb16_intlssub(a,b,diff,c,blen); + printf("a="); amsclil1_fb16_liprint(a,blen); printf("\n"); + printf("b="); amsclil1_fb16_liprint(b,blen); printf("\n"); + printf("c="); amsclil1_fb16_liprint(c,blen); printf("\n"); + + printf("subtraction a - b*base^diff\n"); + diff = 1; + printf("diff=%ld\n",diff); + amsclil1_fb16_intlssub(a,b,diff,c,blen); + printf("a="); amsclil1_fb16_liprint(a,blen); printf("\n"); + printf("b="); amsclil1_fb16_liprint(b,blen); printf("\n"); + printf("c="); amsclil1_fb16_liprint(c,blen); printf("\n"); + + // printf("subtraction a - b*base^diff\n"); + // diff = -1; + // printf("diff=%ld\n",diff); + // amsclil1_fb16_intlssub(a,b,diff,c,blen); + // printf("a="); amsclil1_fb16_liprint(a,blen); printf("\n"); + // printf("b="); amsclil1_fb16_liprint(b,blen); printf("\n"); + // printf("c="); amsclil1_fb16_liprint(c,blen); printf("\n"); + + printf("subtraction b - a*base^diff\n"); + diff = 0; + printf("diff=%ld\n",diff); + amsclil1_fb16_intlssub(b,a,diff,c,blen); + printf("b="); amsclil1_fb16_liprint(b,blen); printf("\n"); + printf("a="); amsclil1_fb16_liprint(a,blen); printf("\n"); + printf("c="); amsclil1_fb16_liprint(c,blen); printf("\n"); + + + + free(a); + free(b); + free(c); + + return; +} + +void test_div_stress_test() +{ + uint32_t *a,*b,*q,*r,*m1,*m2, *wrk; + long I; + int res; + long blen = 6; + + + a = (uint32_t*) malloc(2*sizeof(uint32_t)*blen); + b = (uint32_t*) malloc(2*sizeof(uint32_t)*blen); + q = (uint32_t*) malloc(2*sizeof(uint32_t)*blen); + r = (uint32_t*) malloc(2*sizeof(uint32_t)*blen); + m1 = (uint32_t*) malloc(2*sizeof(uint32_t)*(blen+1)); + m2 = (uint32_t*) malloc(2*sizeof(uint32_t)*(blen+1)); + wrk = (uint32_t*) malloc(10*sizeof(uint32_t)*(blen+1)); + + + printf("Division stress test.\n"); + + long ntest = 10; + for(I=0;I (q,r) + amsclil1_fb32_div(a,b,q,r,wrk,blen); + + //q*b --> m1 + // Now I have a memory bug in the multiplication routine + // probably m1 must be blen+1? (2*blen) - I wonder where else I've messed that up? + amsclil1_fb32_mult(q,b,m1,wrk,blen); + + //m1+r --> m2 + amsclil1_fb32_add(m1,r,m2,2*blen); + res = amsclil1_fb32_cmp(m2,a,2*blen); + + printf("test %ld: %d\n",I,res); + printf("\ta= "); amsclil1_fb32_liprint(a,blen); printf("\n"); + printf("\tm2="); amsclil1_fb32_liprint(m2,blen); printf("\n"); + printf("\tb="); amsclil1_fb32_liprint(b,blen); printf("\n"); + printf("\tq="); amsclil1_fb32_liprint(q,blen); printf("\n"); + printf("\tr="); amsclil1_fb32_liprint(r,blen); printf("\n"); + + } + + free(a); + free(b); + free(q); + free(r); + free(m1); + free(m2); + free(wrk); + + return; +} + +int test_div_stress_test_sub(uint32_t *a, uint32_t *b, long blen) +{ + uint32_t *q,*r,*m1,*m2, *wrk; + long I; + int res,res2; + + q = (uint32_t*) malloc(2*sizeof(uint32_t)*blen); + r = (uint32_t*) malloc(2*sizeof(uint32_t)*blen); + m1 = (uint32_t*) malloc(2*sizeof(uint32_t)*(blen+1)); + m2 = (uint32_t*) malloc(2*sizeof(uint32_t)*(blen+1)); + wrk = (uint32_t*) malloc(10*sizeof(uint32_t)*(blen+1)); + + amsclil1_fb32_setzero(q,2*blen); + amsclil1_fb32_setzero(r,2*blen); + amsclil1_fb32_setzero(m1,2*(blen+1)); + amsclil1_fb32_setzero(m2,2*(blen+1)); + amsclil1_fb32_setzero(wrk,10*(blen+1)); + + //printf("\tm2="); amsclil1_fb32_liprint(m2,2*blen); printf("\n"); + + //why is there extra shit in m2? + + //a/b --> (q,r) + res2 = amsclil1_fb32_div(a,b,q,r,wrk,blen); + + //q*b --> m1 + // Now I have a memory bug in the multiplication routine + // probably m1 must be blen+1? (2*blen) - I wonder where else I've messed that up? + amsclil1_fb32_mult(q,b,m1,wrk,blen); + + //m1+r --> m2 + amsclil1_fb32_add(m1,r,m2,2*blen); + res = amsclil1_fb32_cmp(m2,a,2*blen); + + if(res!=0 && res2!=0) + { + printf("Division test fail:\n"); + printf("cmp=%d res=%d\n",res,res2); + printf("\ta= "); amsclil1_fb32_liprint(a,2*blen); printf("\n"); + printf("\tm2="); amsclil1_fb32_liprint(m2,2*blen); printf("\n"); + printf("\tb="); amsclil1_fb32_liprint(b,blen); printf("\n"); + printf("\tq="); amsclil1_fb32_liprint(q,blen); printf("\n"); + printf("\tr="); amsclil1_fb32_liprint(r,blen); printf("\n"); + + res = 0; + } + else + { + res = 1; + } + + free(q); + free(r); + free(m1); + free(m2); + free(wrk); + + return res; +} + +void test_div_stress_test2() +{ + long blenmax = 10; + uint32_t *a,*b; + + long I,J,B,K,L; + long Nt; + int res; + + + a = (uint32_t*) malloc(2*blenmax*sizeof(uint32_t)); + b = (uint32_t*) malloc(2*blenmax*sizeof(uint32_t)); + + Nt = 1000; //number of tests at each division + + //test series 1 + printf("Test series 1: random divisions.\n"); + for(I=1;I<=blenmax;I++) + { + for(J=1;J<=blenmax;J++) + { + printf("\t divisions (%d,%d)\n",(int)I,(int)J); + + for(L=0;L=J) B = I; else B = J; + + res = test_div_stress_test_sub(a,b,B); + if(res<=0) + { + printf("stopping on test failure...\n"); + exit(0); + } + + } + } + } + + printf("Test series 2: division by zero\n"); + for(I=1;I<=blenmax;I++) + { + for(J=1;J<=blenmax;J++) + { + printf("\t divisions (%d,%d)\n",(int)I,(int)J); + + for(L=0;L=J) B = I; else B = J; + + res = test_div_stress_test_sub(a,b,B); + if(res<=0) + { + printf("stopping on test failure...\n"); + exit(0); + } + + } + } + } + + + printf("Test series 3: division of zero\n"); + for(I=1;I<=blenmax;I++) + { + for(J=1;J<=blenmax;J++) + { + printf("\t divisions (%d,%d)\n",(int)I,(int)J); + + for(L=0;L=J) B = I; else B = J; + + res = test_div_stress_test_sub(a,b,B); + if(res<=0) + { + printf("stopping on test failure...\n"); + exit(0); + } + + } + } + } + + + printf("Test series 4: zero div zero\n"); + for(I=1;I<=blenmax;I++) + { + for(J=1;J<=blenmax;J++) + { + printf("\t divisions (%d,%d)\n",(int)I,(int)J); + + for(L=0;L=J) B = I; else B = J; + + res = test_div_stress_test_sub(a,b,B); + if(res<=0) + { + printf("stopping on test failure...\n"); + exit(0); + } + + } + } + } + + + free(a); + free(b); + + return; +} + +void test_ui64bitshifts() +{ + printf("Testing various aspects of uint64_t bit shifting...\n"); + + uint64_t a,b,c,d; + + a = 0x01LL<<16; + b = 0x01LL<<32; + c = ((uint64_t)0x01)<<48; + d = ((uint64_t)0x01)<<63; + + printf("%llx\n",(long long unsigned) a); + printf("%llx\n",(long long unsigned) b); + printf("%llx\n",(long long unsigned) c); + printf("%llx\n",(long long unsigned) d); + printf("%llx\n",(long long unsigned) (a+b+c+d)); + return; +} + + +static int amsclil1_test_fb32_lcm1_sub() +{ + int ret = 1; + int N = 2048/32; + uint32_t *a=NULL; + uint32_t *b=NULL; + uint32_t *c=NULL; + uint32_t *q=NULL; + uint32_t *r=NULL; + uint32_t *wrk=NULL; + + int res1,res2; + + + a = (uint32_t*) malloc(sizeof(uint32_t)*N); + b = (uint32_t*) malloc(sizeof(uint32_t)*N); + c = (uint32_t*) malloc(sizeof(uint32_t)*2*(N)); + q = (uint32_t*) malloc(sizeof(uint32_t)*2*N); + r = (uint32_t*) malloc(sizeof(uint32_t)*2*N); + wrk = (uint32_t*) malloc(sizeof(uint32_t)*14*(N+1)); + + amsclil1_fb32_ncrandint(a,N); + amsclil1_fb32_ncrandint(b,N); + + amsclil1_fb32_lcm(a,b,c,wrk,N); + + amsclil1_fb32_div(c,a,q,r,wrk,2*N); + res1 = amsclil1_fb32_iszero(r,2*N); + + amsclil1_fb32_div(c,b,q,r,wrk,2*N); + res2 = amsclil1_fb32_iszero(r,2*N); + + if(res1!=1 || res2!=1) + { + ret = 0; + } + + free(a); + free(b); + free(c); + free(q); + free(r); + free(wrk); + + + return ret; +} + +void amsclil1_test_fb32_lcm1() +{ + printf("Test LCM:\n\n"); + int I; + int N = 1000; + int ret; + + printf("Perofmring %d tests of LCM function\n",N); + for(I=0;I + +int amsclil1_ulint_new(amsclil1_ulint **pnt) +{ + int ret = 0; + if(*pnt!=NULL) amsclil1_ulint_delete(pnt); + + *pnt = malloc(sizeof(amsclil1_ulint)); + + (*pnt)->N = 0; + (*pnt)->data = malloc(sizeof(uint32_t)*1); + if((*pnt)->data==NULL) + { + ret = -1; + return ret; + } + + ret = 1; + (*pnt)->data[0] = 0; + + return ret; +} + +void amsclil1_ulint_delete(amsclil1_ulint **pnt) +{ + if(*pnt==NULL) return; + + if((*pnt)->data!=NULL) {free((*pnt)->data); (*pnt)->data=NULL;} + (*pnt)->N = 0; + + free(*pnt); *pnt=NULL; + + return; +} + +int amsclil1_ulint_init(amsclil1_ulint *pnt) +{ + int ret = 0; + if(pnt==NULL) + { + ret = -1; return ret; + } + + amsclil1_ulint_cleanup(pnt); + pnt->N = 0; + pnt->data = malloc(sizeof(uint32_t)*1); + pnt->data[0] = 0; + + if(pnt->data==NULL) + { + ret = -1; + } + else + { + ret = 1; + } + return ret; +} + +void amsclil1_ulint_cleanup(amsclil1_ulint *pnt) +{ + if(pnt!=NULL) + { + if(pnt->data!=NULL) {free(pnt->data); pnt->data=NULL;} + pnt->N = 0; + } + return; +} + +int amsclil1_ulint_resize(amsclil1_ulint *pnt, int _N) +{ + int ret = 0; + int I = 0; + uint32_t *newdata = NULL; + + + if(pnt==NULL) {ret = -1; return ret;} + + if(_N<=0) + { + _N = 0; + newdata = malloc(sizeof(uint32_t)*1); + newdata[0] = 0; + } + else + { + newdata = malloc(sizeof(uint32_t)*_N); + } + + if(newdata==NULL) + { + ret = -2; + return ret; + } + + if(pnt->data==NULL) + { + pnt->data = malloc(sizeof(uint32_t)*1); + pnt->data[0] = 0; + pnt->N = 0; + } + + if(pnt->data!=NULL) + { + for(I=0;IN && I<_N;I++) + { + newdata[I] = pnt->data[I]; + } + for(I=pnt->N;I<_N;I++) + { + newdata[I] = 0; + } + } + else + { + for(I=0;I<_N;I++) + { + newdata[I] = 0; + } + } + + if(pnt->data!=NULL) {free(pnt->data); pnt->data=NULL;} + pnt->data = newdata; + pnt->N = _N; + ret = 1; + + return ret; +} + +int amsclil1_ulint_msindex(amsclil1_ulint *pnt) +{ + int ret = 0; + int I = 0; + if(pnt==NULL) return ret; + for(I=pnt->N-1;I>=0;I--) + { + if(pnt->data[I]!=0) + { + ret = I; + break; + } + } + return ret; +} + +int amsclil1_ulint_shrinktofit(amsclil1_ulint *pnt) +{ + int ret = 0; + int msindex = 0; + + if(pnt==NULL) return -1; + msindex = amsclil1_ulint_msindex(pnt); + ret = amsclil1_ulint_resize(pnt,msindex+1); + + return ret; +} + +void amsclil1_ulint_printhex(amsclil1_ulint *pnt) +{ + int I = 0; + + if(pnt==NULL) return; + printf("0x"); + for(I=pnt->N-1;I>=0;I--) + { + printf("%08x",pnt->data[I]); + } + return; +} + +void amsclil1_ulint_printbits(amsclil1_ulint *pnt) +{ + int I = 0; + int J = 0; + + if(pnt==NULL) return; + + printf("0b "); + for(I=pnt->N-1;I>=0;I--) + { + for(J=31;J>=0;J--) + { + printf("%d", ((pnt->data[I]>>J) & 1) ); + } + printf(" "); + } + return; +} + +void amsclil1_ulint_clear(amsclil1_ulint *pnt) +{ + int I = 0; + for(I=0;IN;I++) + { + pnt->data[I] = 0; + } + return; +} + +//If _N is greater than current size, expand to larger size, otherwise do nothing +int amsclil1_ulint_resizetomin(amsclil1_ulint *pnt, int _N) +{ + int ret = 0; + if(pnt!=NULL) + { + ret = 1; + if(_N>pnt->N) + { + ret = amsclil1_ulint_resize(pnt,_N); + } + } + + return ret; +} + +int amsclil1_ulint_copy(amsclil1_ulint *dest, amsclil1_ulint *src) +{ + int ret = 0; + int res = 0; + int I; + + if(dest==NULL) + { + ret = -1; + return ret; + } + + if(src==NULL) + { + amsclil1_ulint_clear(dest); + ret = -1; + return ret; + } + + if(dest==src) + { + ret = 1; + return ret; + } + + res = amsclil1_ulint_resizetomin(dest,src->N); + if(res<0) + { + ret = -1; + return ret; + } + amsclil1_ulint_clear(dest); + + for(I=0;IN;I++) + { + dest->data[I] = src->data[I]; + } + + return ret; +} + +void amsclil1_ulint_tests1() +{ + amsclil1_ulint *a = NULL; + amsclil1_ulint *b = NULL; + + + amsclil1_ulint_new(&a); + amsclil1_ulint_new(&b); + + amsclil1_ulint_resize(a,2); + amsclil1_ulint_resize(b,2); + + a->data[1] = 0x0000ffff; + a->data[0] = 1; + b->data[1] = 0x0000ff01; + + printf("a="); amsclil1_ulint_printhex(a); printf("\n"); + printf("b="); amsclil1_ulint_printbits(b); printf("\n"); + + amsclil1_ulint_resize(a,1); + amsclil1_ulint_copy(b,a); + + printf("a="); amsclil1_ulint_printhex(a); printf("\n"); + printf("b="); amsclil1_ulint_printbits(b); printf("\n"); + + + amsclil1_ulint_delete(&a); + amsclil1_ulint_delete(&b); + + return; +} \ No newline at end of file diff --git a/src/amsclil1/amsclil1_ulint_ops.c b/src/amsclil1/amsclil1_ulint_ops.c new file mode 100644 index 0000000..52b0930 --- /dev/null +++ b/src/amsclil1/amsclil1_ulint_ops.c @@ -0,0 +1,157 @@ + +#include + + +// Unsigned Large Integer Comparison Operator: +// 0 - a==b +// 1 - a>b +// 2 - amsib) msimax = msia; else msimax = msib; + + for(I=msimax;I>=0;I--) + { + if(IN) ad = a->data[I]; else ad = 0; + if(IN) bd = b->data[I]; else bd = 0; + if(ad>bd) + { + ret = 1; + break; + } + if(bd>ad) + { + ret = 2; + break; + } + } + + return ret; +} + +int amsclil1_ulint_iszero(amsclil1_ulint *a) +{ + int ret = 1; + int I; + for(I=a->N-1;I>=0;I--) + { + if(a->data[I]!=0) + { + ret = 0; + break; + } + } + return ret; +} + +int amsclil1_ulint_add(amsclil1_ulint *a, amsclil1_ulint *b, amsclil1_ulint *c) +{ + int ret = 1; + + amsclil1_ulint *aint = NULL; + amsclil1_ulint *bint = NULL; + int msia,msib,msimax; + + if(c==NULL) + { + ret = 0; + return ret; + } + + msia = amsclil1_ulint_msindex(a); + msib = amsclil1_ulint_msindex(b); + if(msia>msib) msimax = msia; else msimax = msib; + + amsclil1_ulint_new(&aint); + amsclil1_ulint_new(&bint); + amsclil1_ulint_resize(aint,msimax+1); + amsclil1_ulint_resize(bint,msimax+1); + amsclil1_ulint_copy(aint,a); + amsclil1_ulint_copy(bint,b); + + amsclil1_ulint_resize(c,msimax+1); + amsclil1_ulint_clear(c); + + amsclil1_fb32_add(aint->data,bint->data,c->data,msimax+1); + + amsclil1_ulint_delete(&aint); + amsclil1_ulint_delete(&bint); + return ret; +} + +int amsclil1_ulint_sub(amsclil1_ulint *a, amsclil1_ulint *b, amsclil1_ulint *c) +{ + int ret = 1; + + amsclil1_ulint *aint = NULL; + amsclil1_ulint *bint = NULL; + int msia,msib,msimax; + + if(c==NULL) + { + ret = 0; + return ret; + } + + msia = amsclil1_ulint_msindex(a); + msib = amsclil1_ulint_msindex(b); + if(msia>msib) msimax = msia; else msimax = msib; + + amsclil1_ulint_new(&aint); + amsclil1_ulint_new(&bint); + amsclil1_ulint_resize(aint,msimax); + amsclil1_ulint_resize(bint,msimax); + amsclil1_ulint_copy(aint,a); + amsclil1_ulint_copy(bint,b); + + amsclil1_ulint_resize(c,msimax); + amsclil1_ulint_clear(c); + + amsclil1_fb32_sub(aint->data,bint->data,c->data,msimax); + + amsclil1_ulint_delete(&aint); + amsclil1_ulint_delete(&bint); + return ret; +} + +int amsclil1_ulint_mult(amsclil1_ulint *a, amsclil1_ulint *b, amsclil1_ulint *c) +{ + int ret = 1; + + amsclil1_ulint *aint = NULL; + amsclil1_ulint *bint = NULL; + int msia,msib,msimax; + + if(c==NULL) + { + ret = 0; + return ret; + } + + msia = amsclil1_ulint_msindex(a); + msib = amsclil1_ulint_msindex(b); + if(msia>msib) msimax = msia; else msimax = msib; + + amsclil1_ulint_new(&aint); + amsclil1_ulint_new(&bint); + amsclil1_ulint_resize(aint,msimax); + amsclil1_ulint_resize(bint,msimax); + amsclil1_ulint_copy(aint,a); + amsclil1_ulint_copy(bint,b); + + amsclil1_ulint_resize(c,msimax); + amsclil1_ulint_clear(c); + + amsclil1_fb32_sub(aint->data,bint->data,c->data,msimax); + + amsclil1_ulint_delete(&aint); + amsclil1_ulint_delete(&bint); + return ret; +} \ No newline at end of file diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..c4e02ff --- /dev/null +++ b/src/main.c @@ -0,0 +1,39 @@ +#include + +int main(int argc, char* argv[]) +{ + printf("AMS C Large Integer Library Tests.\n"); + //test_fbops_printcmp(); + //test_fbops_shiftread(); + //test_fbops_shiftwrite(); + //test_fbops_lshiftrshift(); + //test_modtdiv(); + + //test_addsub(); + //test_mult(); + //test_div(); + //test_modpower(); + //test_mult_time(); + //test_div_time(); + + //test_barrettmod(); + //barret_modpower_test(); + //barrett_mod_fuzztest(); + + //modpower_timetests(); + + //test_amsclil1_fb32_eulergcd(); + + //test_fb16_comparison_sub(); + + //test_div_stress_test(); //<---revisit + //test_div_stress_test2(); + + //test_ui64bitshifts(); + + //amsclil1_ulint_tests1(); + + //amsclil1_test_fb32_lcm1(); + + return 0; +} \ No newline at end of file