Initial commit
commit
3ba560205c
@ -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.
|
@ -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
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,530 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
#Python3 compilation library
|
||||
#Aaron M. Schinder
|
||||
#29 Dec 2020
|
||||
#
|
||||
#Cleanup and refactor from 2017 python2 version compilation libraries
|
||||
|
||||
import os,sys,math,subprocess
|
||||
|
||||
#####################
|
||||
#Directory Functions#
|
||||
#####################
|
||||
|
||||
##flist - list all files in a given directory pth
|
||||
##optional arguments:
|
||||
# recurse - (T/F): Whether to recursively search for files in directory tree
|
||||
# exts - (list): A list of file extensions to filter on
|
||||
# normpath (T/F): whether to normalize path variables after
|
||||
#filelist = flist(pth,**kwargs):
|
||||
def flist(pth,**kwargs):
|
||||
flst = []
|
||||
if(not('recurse' in kwargs)):
|
||||
recurse_ = False
|
||||
else:
|
||||
recurse_ = kwargs['recurse']
|
||||
if(not('exts' in kwargs)):
|
||||
filterexts_ = False
|
||||
else:
|
||||
filterexts_ = True
|
||||
exts = kwargs['exts']
|
||||
if(not('normpath' in kwargs)):
|
||||
normpath_ = True
|
||||
else:
|
||||
normpath_ = kwargs['normpath']
|
||||
if(not('linuxpath' in kwargs)):
|
||||
linuxpath_ = False
|
||||
else:
|
||||
linuxpath_ = kwargs['linuxpath']
|
||||
if(not('followlinks' in kwargs)):
|
||||
followlinks_ = False
|
||||
else:
|
||||
followlinks_ = kwargs['followlinks']
|
||||
|
||||
dirlist = []
|
||||
rawlist = os.listdir(pth)
|
||||
|
||||
for F in rawlist:
|
||||
F2 = os.path.join(pth,F)
|
||||
if(os.path.isdir(F2)):
|
||||
b = (followlinks_) or ((not followlinks_) and not(os.path.islink(F2)))
|
||||
if(b):
|
||||
if((F2!=".")&(F2!="..")):
|
||||
dirlist.append(F2)
|
||||
elif(os.path.isfile(F2)):
|
||||
flst.append(F2)
|
||||
|
||||
#Recurse through directories
|
||||
if(recurse_):
|
||||
for D in dirlist:
|
||||
lst = flist(D,**kwargs)
|
||||
for L in lst:
|
||||
flst.append(L)
|
||||
|
||||
#Postprocess:
|
||||
#Filter out all extensions except the selected ext list
|
||||
if(filterexts_):
|
||||
flst = filterexts(flst,exts)
|
||||
|
||||
#Normalize filename path according to os
|
||||
if(normpath_):
|
||||
flst2 = list(flst)
|
||||
for I in range(0,len(flst2)):
|
||||
flst[I] = os.path.normpath(flst2[I])
|
||||
|
||||
#If linuxpath, convert all \\ to /
|
||||
#if(linuxpath_):
|
||||
# flst2 = list(flst)
|
||||
# for I in range(0,len(flst2)):
|
||||
# flst[I] = linuxpath(flst2[I])
|
||||
|
||||
return flst
|
||||
|
||||
#Filters by extensions in a list of files
|
||||
#flst = def filterexts(flst,exts):
|
||||
def filterexts(flst,exts):
|
||||
flst2 = []
|
||||
if(isinstance(exts,str)):
|
||||
exts = list([exts])
|
||||
for F in flst:
|
||||
b = False
|
||||
for ext in exts:
|
||||
if(ext[0]!='.'):
|
||||
ext = '.'+ext
|
||||
F2 = os.path.splitext(F)
|
||||
if(len(F2)>=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
|
@ -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+'/')
|
@ -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)
|
@ -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+'/')
|
@ -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)
|
@ -0,0 +1,42 @@
|
||||
#ifndef __AMSCLIL1_H__
|
||||
#define __AMSCLIL1_H__
|
||||
|
||||
// Aaron M. Schinder
|
||||
// Jan 2021
|
||||
//
|
||||
// C Large Integer Library 1
|
||||
|
||||
/////////////////////////////
|
||||
//Standard Library Includes//
|
||||
/////////////////////////////
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <stdint.h>
|
||||
#include <time.h>
|
||||
#include <string.h>
|
||||
|
||||
//Other Libraries//
|
||||
|
||||
#include <amscutil1/amscutil1.h>
|
||||
|
||||
///////////////////////
|
||||
// Component Headers //
|
||||
///////////////////////
|
||||
|
||||
static int amsclil1_verbose = 0;
|
||||
|
||||
#include <amsclil1/amsclil1_operations.h>
|
||||
#include <amsclil1/amsclil1_fbops.h>
|
||||
|
||||
#include <amsclil1/amsclil1_tests.h>
|
||||
|
||||
|
||||
#include <amsclil1/amsclil1_ulint.h>
|
||||
|
||||
#include <amsclil1/amsclil1_hash.h>
|
||||
#include <amsclil1/amsclil1_gutmannprng.h>
|
||||
|
||||
|
||||
#endif
|
@ -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
|
@ -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
|
@ -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
|
@ -0,0 +1,7 @@
|
||||
#ifndef __AMSCLIL_OPERATIONS_H__
|
||||
#define __AMSCLIL_OPERATIONS_H__
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
@ -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
|
@ -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<b
|
||||
int amsclil1_ulint_cmp(amsclil1_ulint *a, amsclil1_ulint *b);
|
||||
|
||||
int amsclil1_ulint_iszero(amsclil1_ulint *a);
|
||||
|
||||
// Math Operations
|
||||
// These operations may be slower than the preallocated fixed buffer operations
|
||||
// They are included for simplicity in constructing and testing algorithms.
|
||||
// The necessary sizes and working memory is preallocated during execution.
|
||||
// Inputs are copied internally, so output can point to the same integer as input.
|
||||
|
||||
int amsclil1_ulint_add(amsclil1_ulint *a, amsclil1_ulint *b, amsclil1_ulint *c);
|
||||
int amsclil1_ulint_sub(amsclil1_ulint *a, amsclil1_ulint *b, amsclil1_ulint *c);
|
||||
int amsclil1_ulint_mult(amsclil1_ulint *a, amsclil1_ulint *b, amsclil1_ulint *c);
|
||||
//int amsclil1_ulint_div(amsclil1_ulint *a, amsclil1_ulint *b, amsclil1_ulint *q, amsclil1_ulint *r);
|
||||
//modpower
|
||||
//rep_modpower
|
||||
//gcd
|
||||
//lcm
|
||||
|
||||
|
||||
//Tests
|
||||
|
||||
void amsclil1_ulint_tests1();
|
||||
|
||||
#endif
|
||||
|
@ -0,0 +1,17 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import os,sys,math;
|
||||
from compscripts.complib2 import *;
|
||||
|
||||
|
||||
os.system('python3 ./compscripts/linux64.makelib.py')
|
||||
os.system('python3 ./compscripts/linux64.maketest.py')
|
||||
|
||||
obj_list = flist('./',recurse=True,exts=['.o'])
|
||||
for o in obj_list:
|
||||
os.system('rm {}'.format(o))
|
||||
|
||||
os.chdir('./bin_linux64')
|
||||
callproc('./tests')
|
||||
os.chdir('..')
|
||||
|
@ -0,0 +1,17 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import os,sys,math;
|
||||
from compscripts.complib2 import *;
|
||||
|
||||
|
||||
os.system('python3 ./compscripts/mingwcc.makelib.py')
|
||||
os.system('python3 ./compscripts/mingwcc.maketest.py')
|
||||
|
||||
obj_list = flist('./',recurse=True,exts=['.o'])
|
||||
for o in obj_list:
|
||||
os.system('rm {}'.format(o))
|
||||
|
||||
os.chdir('./bin_winx64')
|
||||
callproc('wine ./tests.exe')
|
||||
os.chdir('..')
|
||||
|
@ -0,0 +1,299 @@
|
||||
#include <amsclil1/amsclil1.h>
|
||||
|
||||
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<blen;I++)
|
||||
{
|
||||
if(a[I]!=0)
|
||||
{
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void amsclil1_fb32_liprint(uint32_t* a, long blen)
|
||||
{
|
||||
long I;
|
||||
printf("0x");
|
||||
for(I=blen-1;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))>>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<blen)
|
||||
{
|
||||
w1 = arr[Itop];
|
||||
w1 = ((w1 << 32) >> smin); //why does this 32 bit shift work?
|
||||
*val = *val | (uint32_t) w1;
|
||||
}
|
||||
if(Ibot>=0 && Ibot<blen)
|
||||
{
|
||||
w1 = arr[Ibot];
|
||||
w1 = w1 >> 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 && Itop<blen)
|
||||
{
|
||||
if(smin>0) 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<blen)
|
||||
{
|
||||
w1 = (*val) << smin;
|
||||
if(smin<32)
|
||||
{
|
||||
w2 = (uint64_t) arr[Ibot];
|
||||
w2 = w2 & (0xffffffffffffffff - (0x00000000ffffffff << smin));
|
||||
}
|
||||
else w2 = (uint64_t) arr[Ibot];
|
||||
arr[Ibot] = (uint32_t) w1 | (uint32_t) w2;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
//bit shift operations
|
||||
//lshift: <<: *2^shift
|
||||
//wrk[blen]
|
||||
void amsclil1_fb32_shiftl(uint32_t* a, long shift, uint32_t* wrk, long blen)
|
||||
{
|
||||
long smaj;
|
||||
int smin;
|
||||
long I;
|
||||
uint64_t w1;
|
||||
|
||||
if(shift<0)
|
||||
{
|
||||
amsclil1_fb32_shiftr(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<blen;I++)
|
||||
{
|
||||
if(I-smaj>=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<blen;I++)
|
||||
{
|
||||
if(I+smaj<blen)
|
||||
{
|
||||
w1 = (uint64_t) wrk[I+smaj];
|
||||
w1 = (w1 >> smin);
|
||||
a[I] = a[I] | (uint32_t) w1;
|
||||
}
|
||||
if(I+smaj+1<blen)
|
||||
{
|
||||
w1 = (uint64_t) wrk[I+smaj+1];
|
||||
w1 = ((w1 << 16) << 16) >> 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;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,300 @@
|
||||
#include <amsclil1/amsclil1.h>
|
||||
|
||||
//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<blen;I++)
|
||||
{
|
||||
b2[I] = 0;
|
||||
m2[I] = m[I];
|
||||
mu2[I] = 0;
|
||||
}
|
||||
for(I=blen;I<2*(blen+1);I++)
|
||||
{
|
||||
b2[I] = 0;
|
||||
m2[I] = 0;
|
||||
mu2[I] = 0;
|
||||
}
|
||||
|
||||
b2[2*K] = 1;
|
||||
|
||||
//amsclil1_fb32_div(b2,m2,mu2,rm2,wrk,2*K+1);
|
||||
amsclil1_fb32_div(b2,m2,mu2,rm2,wrk,2*(blen+1));
|
||||
|
||||
//if(amsclil1_fb32_iszero(mu2,2*(blen+1)))
|
||||
//{
|
||||
// printf("debug:mu="); amsclil1_fb32_liprint(mu2,2*(blen+1)); printf("\n");
|
||||
// printf("debug:b2="); amsclil1_fb32_liprint(b2,2*(blen+1)); printf("\n");
|
||||
// printf("debug:m2="); amsclil1_fb32_liprint(m2,2*(blen+1)); printf("\n");
|
||||
//}
|
||||
|
||||
//printf("debug:mu="); amsclil1_fb32_liprint(mu2,2*K+2); printf("\n");
|
||||
|
||||
for(I=0;I<2*(blen+1);I++)
|
||||
{
|
||||
mu[I] = mu2[I];
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//compute y = mod(x,m) using Barrett Reduction Algorithm [HAC 14.42]
|
||||
//x[blen] - x has (according to the algorithm) an msi of 2*k-1
|
||||
// here, supply only k-1 digits to keep buffers even
|
||||
//m[blen] - m has msi of (K-1) which must be <- blen-2
|
||||
//mu[2*(blen+1)] - precompute mu=(1<<(2*32*blen) / m)
|
||||
//y[blen] - output
|
||||
//wrk[33*(blen+1)]
|
||||
//K - provide most significant index of m +1
|
||||
//Kx - provide most significant index of x +1
|
||||
//blen - length of buffers
|
||||
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)
|
||||
{
|
||||
long I;
|
||||
|
||||
const size_t divlen = 5*(blen+1); //length of working buffer for division algorithm
|
||||
//offset for beginning of mod buffer
|
||||
const size_t intblen = 4*(blen+1);
|
||||
//wrk size: 5*blen+5 + 7*(4*blen+4): 33*(blen+1)
|
||||
|
||||
int cmp;
|
||||
|
||||
uint32_t* bswap = NULL;
|
||||
uint32_t* q1 = &(wrk[divlen+0*intblen]);
|
||||
uint32_t* q2 = &(wrk[divlen+1*intblen]);
|
||||
uint32_t* q3 = &(wrk[divlen+2*intblen]);
|
||||
uint32_t* r1 = &(wrk[divlen+3*intblen]);
|
||||
uint32_t* r2 = &(wrk[divlen+4*intblen]);
|
||||
uint32_t* r3 = &(wrk[divlen+5*intblen]);
|
||||
uint32_t* mi = &(wrk[divlen+6*intblen]);
|
||||
|
||||
long dbg;
|
||||
|
||||
//handle mod 1 and mod 0 cases fast
|
||||
if(K==1)
|
||||
{
|
||||
if(m[0]==0 || m[0]==1)
|
||||
{
|
||||
for(I=0;I<blen;I++)
|
||||
{
|
||||
y[I] = 0;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
for(I=0;I<intblen;I++)
|
||||
{
|
||||
q1[I] = 0;
|
||||
q2[I] = 0; //mult takes care of that
|
||||
q3[I] = 0;
|
||||
r1[I] = 0;
|
||||
r2[I] = 0;
|
||||
r3[I] = 0;
|
||||
mi[I] = 0;
|
||||
}
|
||||
|
||||
for(I=0;I<blen;I++) //copy m to larger internal buffer
|
||||
{
|
||||
mi[I] = m[I];
|
||||
}
|
||||
|
||||
//1. q1 = x / b^(K-1)
|
||||
for(I=Kx-1;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<Kx;I++)
|
||||
{
|
||||
r1[I] = x[I];
|
||||
}
|
||||
|
||||
//5. r2 = (q3 * m) mod b^(K+1)
|
||||
amsclil1_fb32_mult(q3,mi,r2,wrk,2*(blen+1));
|
||||
for(I=K+1;I<intblen;I++)
|
||||
{
|
||||
r2[I] = 0;
|
||||
}
|
||||
|
||||
//printf("debug: r1="); amsclil1_fb32_liprint(r1,2*(blen+1)); printf("\n");
|
||||
//printf("debug: r2="); amsclil1_fb32_liprint(r2,2*(blen+1)); printf("\n");
|
||||
//printf("debug: md="); amsclil1_fb32_liprint(mi,2*(blen+1)); printf("\n");
|
||||
|
||||
|
||||
//6. if(r1<r2) r3 = r3 + b^(K+1)
|
||||
cmp = amsclil1_fb32_cmp(r1,r2,2*(blen+1));
|
||||
if(cmp==2)
|
||||
{
|
||||
r3[K+1] = 1;
|
||||
}
|
||||
//r3 = r3-r2+r1
|
||||
amsclil1_fb32_add(r3,r1,q1,2*(blen+1));
|
||||
amsclil1_fb32_sub(q1,r2,r3,2*(blen+1));
|
||||
|
||||
//amsclil1_fb32_sub(r3,r2,q1,2*(blen+1));
|
||||
//amsclil1_fb32_add(q1,r1,r3,2*(blen+1));
|
||||
|
||||
//printf("debug: r3="); amsclil1_fb32_liprint(r3,2*(blen+1)); printf("\n");
|
||||
|
||||
//while r3>=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;I<blen;I++)
|
||||
{
|
||||
y[I] = r3[I];
|
||||
}
|
||||
|
||||
//if(dbg>2)
|
||||
//{
|
||||
// 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<blen;I++)
|
||||
{
|
||||
mdb[I] = md[I]; //init mdb to md
|
||||
acc[I] = 0;
|
||||
bm0[I] = a[I]; //init bm0 to a
|
||||
mu[I] = 0;
|
||||
}
|
||||
for(I=blen;I<intblen;I++)
|
||||
{
|
||||
mdb[I] = 0;
|
||||
acc[I] = 0;
|
||||
bm0[I] = 0;
|
||||
mu[I] = 0;
|
||||
}
|
||||
acc[0] = 1; //init acc to 1
|
||||
|
||||
//precompute mu
|
||||
amsclil1_fb32_barrettmu(mdb, mu, wrk, Kmd, blen);
|
||||
//printf("debug: mu="); amsclil1_fb32_liprint(mu,2*blen); printf("\n");
|
||||
|
||||
for(I=0;I<32*(msipw+1);I++)
|
||||
{
|
||||
smaj = I/32;
|
||||
smin = I%32;
|
||||
bit = (pw[smaj] & (1<<smin))>>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<blen;I++)
|
||||
{
|
||||
r = rand();
|
||||
a[I] = r;
|
||||
}
|
||||
return;
|
||||
}
|
@ -0,0 +1,256 @@
|
||||
#include <amsclil1/amsclil1.h>
|
||||
|
||||
|
||||
//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;I<blen+1;I++)
|
||||
{
|
||||
ci[I] = 0;
|
||||
}
|
||||
|
||||
// if a>b
|
||||
if(amsclil1_fb32_cmp(a,b,blen)!=2)
|
||||
{
|
||||
//copy a to ai, b to bi
|
||||
for(I=0;I<blen;I++)
|
||||
{
|
||||
ai[I] = a[I];
|
||||
bi[I] = b[I];
|
||||
ri[I] = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//copy a to bi, b to ai
|
||||
for(I=0;I<blen;I++)
|
||||
{
|
||||
bi[I] = a[I];
|
||||
ai[I] = b[I];
|
||||
ri[I] = 0;
|
||||
}
|
||||
}
|
||||
ai[blen] = 0;
|
||||
bi[blen] = 0;
|
||||
ri[blen] = 0;
|
||||
|
||||
dbg = 0;
|
||||
|
||||
while(amsclil1_fb32_iszero(bi,blen)==0)
|
||||
{
|
||||
//ri = ai mod bi
|
||||
|
||||
//printf("%d pre div.\n", dbg);
|
||||
//printf("a="); amsclil1_fb32_liprint(ai,blen); printf("\n");
|
||||
//printf("b="); amsclil1_fb32_liprint(bi,blen); printf("\n");
|
||||
|
||||
amsclil1_fb32_div(ai,bi,ci,ri,wrki,blen);
|
||||
//printf("post div.\n");
|
||||
|
||||
|
||||
//printf("c="); amsclil1_fb32_liprint(ci,blen); printf("\n");
|
||||
//printf("r="); amsclil1_fb32_liprint(ri,blen); printf("\n");
|
||||
//printf("\n");
|
||||
|
||||
//a = b, b=r
|
||||
tmp = ai;
|
||||
ai = bi;
|
||||
bi = ri;
|
||||
ri = tmp;
|
||||
|
||||
dbg++;
|
||||
}
|
||||
//printf("post loop");
|
||||
|
||||
//gcd = a
|
||||
for(I=0;I<blen;I++)
|
||||
{
|
||||
gcd[I] = ai[I];
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//Least Common Multiple
|
||||
//
|
||||
// returns lcm = lcm(a,b)
|
||||
// lcm(0,0) = 0 (special case)
|
||||
//
|
||||
//a [blen]
|
||||
//b [blen]
|
||||
//lcm [2*blen]
|
||||
//wrk [14*(blen+1)]
|
||||
//blen - max number of digits in a and b
|
||||
//
|
||||
void amsclil1_fb32_lcm(uint32_t *a, uint32_t *b, uint32_t *lcm, uint32_t *wrk, long blen)
|
||||
{
|
||||
uint32_t *aint; //internal smallest input
|
||||
uint32_t *bint; //internal largest input
|
||||
uint32_t *gcd = &(wrk[0]); //2*blen
|
||||
uint32_t *q = &(wrk[2*blen]); //1*blen
|
||||
uint32_t *s = &(wrk[3*blen]); //1*blen
|
||||
uint32_t *r = &(wrk[4*blen]); //1*blen
|
||||
uint32_t *wrki = &(wrk[5*blen]); //9*(blen+1)
|
||||
|
||||
int cmp;
|
||||
int msib;
|
||||
int I;
|
||||
|
||||
for(I=0;I<13*(blen+1);I++) //init working memory to 0
|
||||
wrk[I] = 0;
|
||||
for(I=0;I<2*blen;I++) //init lcm=0
|
||||
lcm[I] = 0;
|
||||
|
||||
cmp = amsclil1_fb32_cmp(a,b,blen); //bint is whichever is larger
|
||||
if(cmp>1) //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<blen;I++) zinv[I] = 0; //init zinv to 0
|
||||
|
||||
//if z>=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<blen;I++) xi[I] = dom[I];
|
||||
//xj = z
|
||||
for(I=0;I<blen;I++) xj[I] = z[I];
|
||||
//y2 = 0
|
||||
for(I=0;I<blen;I++) y2[I] = 0;
|
||||
//y1 = 1
|
||||
for(I=0;I<blen;I++) y1[I] = 0; y1[0] = 1;
|
||||
|
||||
res = amsclil1_fb32_iszero(xj,blen);
|
||||
while(res!=1)
|
||||
{
|
||||
//(q,r) = xi/xj
|
||||
res2 = amsclil1_fb32_div(xi,xj,q,r,wrki,blen);
|
||||
//y = y2-y1*q
|
||||
amsclil1_fb32_mult(y1,q,y3,wrki,blen);
|
||||
amsclil1_fb32_sub(y2,y3,y,blen);
|
||||
//xi = xj
|
||||
tmp = xi; xi = xj; xj = tmp;
|
||||
//xj = r
|
||||
tmp = xj; xj = r; r = tmp;
|
||||
//y2 = y1
|
||||
tmp = y2; y2 = y1; y1 = tmp;
|
||||
//y1 = y
|
||||
tmp = y1; y1=y; y=tmp;
|
||||
}
|
||||
|
||||
//if xi != 1, failure
|
||||
res = amsclil1_fb32_msi(xi,blen);
|
||||
if(res!=1)
|
||||
{
|
||||
ret = 0;
|
||||
return ret;
|
||||
}
|
||||
if(xi[0]!=1)
|
||||
{
|
||||
ret = 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = 1;
|
||||
//zinv = y2, success
|
||||
for(I=0;I<blen;I++)
|
||||
{
|
||||
zinv[I] = y2[I];
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
#include <amsclil1/amsclil1.h>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void amsclil1_gutmannprng(uint8_t *randompool)
|
||||
{
|
||||
|
||||
|
||||
return;
|
||||
}
|
@ -0,0 +1,126 @@
|
||||
#include <amsclil1/amsclil1.h>
|
||||
|
||||
/////////////////////
|
||||
//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(ind<padstart && ind<Nin)
|
||||
{
|
||||
ret = bytes[ind];
|
||||
}
|
||||
else if(ind==padstart)
|
||||
{
|
||||
ret = 0b10000000;
|
||||
}
|
||||
else if(ind>padstart && ind<padstop)
|
||||
{
|
||||
ret = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
//one byte of the padded byte size
|
||||
//0xaabb0111
|
||||
q = padbytes-ind-1; //7, 6, ... 0
|
||||
mask = 0x00000000000000ffLL;
|
||||
|
||||
ret = (uint8_t)(sz&(mask<<(q/8LL))>>(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;
|
||||
}
|
@ -0,0 +1,193 @@
|
||||
#include <amsclil1/amsclil1.h>
|
||||
|
||||
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)) >> 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;
|
||||
}
|
@ -0,0 +1,340 @@
|
||||
#include <amsclil1/amsclil1.h>
|
||||
|
||||
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;
|
||||
}
|
@ -0,0 +1,883 @@
|
||||
#include <amsclil1/amsclil1.h>
|
||||
|
||||
#include <time.h>
|
||||
|
||||
//clock()
|
||||
//CLOCKS_PER_SEC
|
||||
|
||||
//non_cryptographic test randomness
|
||||
void amsclil1_fb32_testrandom(uint32_t* a,long blen)
|
||||
{
|
||||
long I;
|
||||
|
||||
for(I=0;I<blen;I++)
|
||||
{
|
||||
a[I] = (uint32_t) rand();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void test_mult_time()
|
||||
{
|
||||
long I;
|
||||
long N;
|
||||
uint32_t* a = NULL;
|
||||
uint32_t* b = NULL;
|
||||
uint32_t* c = NULL;
|
||||
uint32_t* d = NULL;
|
||||
uint32_t* wrk = NULL;
|
||||
|
||||
double t0,t1;
|
||||
|
||||
printf("amsclil1: Multiplication time test.\n");
|
||||
printf("bits \t time (msec)\n");
|
||||
printf("-----------------------------\n");
|
||||
for(I=1;I<=64;I++)
|
||||
{
|
||||
a = amsc_malloc(I*sizeof(uint32_t));
|
||||
b = amsc_malloc(I*sizeof(uint32_t));
|
||||
c = amsc_malloc(2*I*sizeof(uint32_t));
|
||||
d = amsc_malloc(I*sizeof(uint32_t));
|
||||
wrk = amsc_malloc(6*I*sizeof(uint32_t));
|
||||
amsclil1_fb32_testrandom(a,I);
|
||||
amsclil1_fb32_testrandom(b,I);
|
||||
amsclil1_fb32_testrandom(c,I);
|
||||
t0 = amsc_timemsec();
|
||||
amsclil1_fb32_mult(a,b,c,wrk,I);
|
||||
t1 = amsc_timemsec();
|
||||
|
||||
printf("%ld \t %1.4f\n",I*32,t1-t0);
|
||||
|
||||
free(a); a = NULL;
|
||||
free(b); b = NULL;
|
||||
free(c); c = NULL;
|
||||
free(d); d = NULL;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void test_div_time()
|
||||
{
|
||||
printf("amsclil1: division time test.\n");
|
||||
long I;
|
||||
long N;
|
||||
uint32_t* a = NULL;
|
||||
uint32_t* b = NULL;
|
||||
uint32_t* c = NULL;
|
||||
uint32_t* d = NULL;
|
||||
uint32_t* wrk = NULL;
|
||||
|
||||
double t0,t1;
|
||||
|
||||
printf("bits \t time (msec)\n");
|
||||
printf("-----------------------------\n");
|
||||
for(I=1;I<=64;I++)
|
||||
{
|
||||
a = amsc_malloc(I*sizeof(uint32_t));
|
||||
b = amsc_malloc(I*sizeof(uint32_t));
|
||||
c = amsc_malloc(I*sizeof(uint32_t));
|
||||
d = amsc_malloc(I*sizeof(uint32_t));
|
||||
wrk = amsc_malloc(5*(I+1)*sizeof(uint32_t));
|
||||
amsclil1_fb32_testrandom(a,I);
|
||||
amsc_ui32_memset(b,0,I);
|
||||
amsclil1_fb32_testrandom(b,I/2);
|
||||
t0 = amsc_timemsec();
|
||||
amsclil1_fb32_div(a,b,c,d,wrk,I);
|
||||
t1 = amsc_timemsec();
|
||||
|
||||
printf("%ld \t %1.4f\n",I*32,t1-t0);
|
||||
|
||||
free(a); a = NULL;
|
||||
free(b); b = NULL;
|
||||
free(c); c = NULL;
|
||||
free(d); d = NULL;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void test_barrettmod()
|
||||
{
|
||||
long N = 2;
|
||||
long K,Kx;
|
||||
uint32_t x[N],y[N],z[N],res[N],rem[N],mu[2*(N+1)];
|
||||
uint32_t wrk[33*(N+1)];
|
||||
uint32_t stor[14*(N+1)];
|
||||
|
||||
printf("Barrett modulus tests.\n");
|
||||
|
||||
printf("\n");
|
||||
amsc_ui32_memset(x,0,N); //x and y must have one leading zero digit
|
||||
amsc_ui32_memset(y,0,N);
|
||||
amsc_ui32_memset(mu,0,2*(N+1)); //because mu can have mis(y)+1 leading digit
|
||||
x[1] = 0x000000ab; x[0] = 0x12344321;
|
||||
y[1] = 0x00000001; y[0] = 0xf000000f;
|
||||
K = amsclil1_fb32_msi(y,N)+1;
|
||||
Kx = amsclil1_fb32_msi(x,N)+1;
|
||||
printf("K=%ld\n",K);
|
||||
printf("x="); amsclil1_fb32_liprint(x,N); printf("\n");
|
||||
printf("y="); amsclil1_fb32_liprint(y,N); printf("\n");
|
||||
amsclil1_fb32_barrettmu(y,mu,wrk,K,N);
|
||||
printf("mu="); amsclil1_fb32_liprint(mu,2*(N+1)); printf("\n");
|
||||
amsclil1_fb32_barrettmod(x,y,z,mu,wrk,K,Kx,N);
|
||||
printf("z=mod(x,y):"); amsclil1_fb32_liprint(z,N); printf("\n");
|
||||
//hangs with improper mu?
|
||||
|
||||
// x=0x00000000000000ab12344321
|
||||
// y=0x0000000000000001f000000f
|
||||
// debug:mu=0x0000000000000000000000008421083e1194e97a4e97e82c
|
||||
// mu=0x8421083e1194e97a4e97e82c
|
||||
// z=mod(x,y):0x000000000000000092343df9
|
||||
//official answer: 92343df9 - okay, so that works
|
||||
|
||||
printf("\n");
|
||||
amsc_ui32_memset(x,0,N); //x and y must have one leading zero digit
|
||||
amsc_ui32_memset(y,0,N);
|
||||
amsc_ui32_memset(mu,0,2*(N+1)); //because mu can have mis(y)+1 leading digit
|
||||
x[1] = 0x00000000; x[0] = 0x00000100;
|
||||
y[1] = 0x00000000; y[0] = 0x000000ff;
|
||||
K = amsclil1_fb32_msi(y,N)+1;
|
||||
Kx = amsclil1_fb32_msi(x,N)+1;
|
||||
printf("K=%ld\n",K);
|
||||
printf("x="); amsclil1_fb32_liprint(x,N); printf("\n");
|
||||
printf("y="); amsclil1_fb32_liprint(y,N); printf("\n");
|
||||
amsclil1_fb32_barrettmu(y,mu,wrk,K,N);
|
||||
printf("mu="); amsclil1_fb32_liprint(mu,2*(N+1)); printf("\n");
|
||||
amsclil1_fb32_barrettmod(x,y,z,mu,wrk,K,Kx,N);
|
||||
printf("z=mod(x,y):"); amsclil1_fb32_liprint(z,N); printf("\n");
|
||||
//answer should be 0x01
|
||||
|
||||
printf("\n");
|
||||
amsc_ui32_memset(x,0,N); //x and y must have one leading zero digit
|
||||
amsc_ui32_memset(y,0,N);
|
||||
amsc_ui32_memset(mu,0,2*(N+1)); //because mu can have mis(y)+1 leading digit
|
||||
x[1] = 0x00000000; x[0] = 0x00000007;
|
||||
y[1] = 0x00000000; y[0] = 0x000000ff;
|
||||
K = amsclil1_fb32_msi(y,N)+1;
|
||||
Kx = amsclil1_fb32_msi(x,N)+1;
|
||||
printf("K=%ld\n",K);
|
||||
printf("x="); amsclil1_fb32_liprint(x,N); printf("\n");
|
||||
printf("y="); amsclil1_fb32_liprint(y,N); printf("\n");
|
||||
amsclil1_fb32_barrettmu(y,mu,wrk,K,N);
|
||||
printf("mu="); amsclil1_fb32_liprint(mu,2*(N+1)); printf("\n");
|
||||
amsclil1_fb32_barrettmod(x,y,z,mu,wrk,K,Kx,N);
|
||||
printf("z=mod(x,y):"); amsclil1_fb32_liprint(z,N); printf("\n");
|
||||
|
||||
printf("\n");
|
||||
amsc_ui32_memset(x,0,N); //x and y must have one leading zero digit
|
||||
amsc_ui32_memset(y,0,N);
|
||||
amsc_ui32_memset(mu,0,2*(N+1)); //because mu can have mis(y)+1 leading digit
|
||||
x[1] = 0x00000000; x[0] = 0x00010000;
|
||||
y[1] = 0x00000000; y[0] = 0x0000ff00;
|
||||
K = amsclil1_fb32_msi(y,N)+1;
|
||||
Kx = amsclil1_fb32_msi(x,N)+1;
|
||||
printf("K=%ld\n",K);
|
||||
printf("x="); amsclil1_fb32_liprint(x,N); printf("\n");
|
||||
printf("y="); amsclil1_fb32_liprint(y,N); printf("\n");
|
||||
amsclil1_fb32_barrettmu(y,mu,wrk,K,N);
|
||||
printf("mu="); amsclil1_fb32_liprint(mu,2*(N+1)); printf("\n");
|
||||
amsclil1_fb32_barrettmod(x,y,z,mu,wrk,K,Kx,N);
|
||||
printf("z=mod(x,y):"); amsclil1_fb32_liprint(z,N); printf("\n");
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void barret_modpower_test()
|
||||
{
|
||||
long N = 2;
|
||||
long K,Kx;
|
||||
uint32_t x[N],y[N],z[N],res[N],rem[N],mu[2*(N+1)];
|
||||
uint32_t wrk[66*(N+1)];
|
||||
uint32_t stor[28*(N+1)];
|
||||
uint32_t a[N],b[N],c[N], d[N];
|
||||
|
||||
|
||||
printf("\nBarrett modpower 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_cls(a,b,c,d,wrk,stor,N);
|
||||
printf("d="); amsclil1_fb32_liprint(d,N); printf("\n"); //0x01 - check
|
||||
amsclil1_fb32_modpower_bar(a,b,c,d,wrk,stor,N);
|
||||
printf("d2="); amsclil1_fb32_liprint(d,N); printf("\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] = 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_cls(a,b,c,d,wrk,stor,N);
|
||||
printf("d="); amsclil1_fb32_liprint(d,N); printf("\n"); //0xf5ee89 - check
|
||||
amsclil1_fb32_modpower_bar(a,b,c,d,wrk,stor,N);
|
||||
printf("d2="); amsclil1_fb32_liprint(d,N); printf("\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] = 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_cls(a,b,c,d,wrk,stor,N);
|
||||
printf("d="); amsclil1_fb32_liprint(d,N); printf("\n"); //0x6e10c57c1e7bc71 - check
|
||||
amsclil1_fb32_modpower_bar(a,b,c,d,wrk,stor,N);
|
||||
printf("d2="); amsclil1_fb32_liprint(d,N); printf("\n");
|
||||
|
||||
//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[66*(N2+2)];
|
||||
uint32_t stor2[28*(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_cls(a2,b2,c2,d2,wrk2,stor2,N2);
|
||||
printf("d2="); amsclil1_fb32_liprint(d2,N2); printf("\n");
|
||||
amsclil1_fb32_modpower_bar(a2,b2,c2,d2,wrk2,stor2,N2);
|
||||
printf("d2="); amsclil1_fb32_liprint(d2,N2); printf("\n");
|
||||
|
||||
}
|
||||
|
||||
void barrett_mod_fuzztest()
|
||||
{
|
||||
long N = 32;
|
||||
long K,Kx;
|
||||
uint32_t x[N],y[N],z[N],res[N],rem[N],mu[2*(N+1)];
|
||||
uint32_t wrk[33*(N+1)];
|
||||
uint32_t stor[14*(N+1)];
|
||||
long I;
|
||||
int cmp;
|
||||
long Nfail;
|
||||
|
||||
Nfail = 0;
|
||||
for(I=0;I<100;I++)
|
||||
{
|
||||
printf("Test %ld\n",I);
|
||||
amsc_ui32_memset(x,0,N);
|
||||
amsc_ui32_memset(y,0,N);
|
||||
amsc_ui32_memset(z,0,N);
|
||||
amsc_ui32_memset(res,0,N);
|
||||
amsc_ui32_memset(rem,0,N);
|
||||
amsc_ui32_memset(mu,0,2*(N+1));
|
||||
|
||||
amsclil1_fb32_ncrandint(x,N);
|
||||
amsclil1_fb32_ncrandint(y,N/2);
|
||||
amsclil1_fb32_div(x,y,res,rem,wrk,N);
|
||||
|
||||
K = amsclil1_fb32_msi(y,N)+1;
|
||||
Kx = amsclil1_fb32_msi(x,N)+1;
|
||||
amsclil1_fb32_barrettmu(y,mu,wrk,K,N);
|
||||
amsclil1_fb32_barrettmod(x,y,z,mu,wrk,K,Kx,N);
|
||||
|
||||
cmp = amsclil1_fb32_cmp(z,rem,N);
|
||||
|
||||
printf(" x="); amsclil1_fb32_liprint(x,N); printf("\n");
|
||||
printf(" y="); amsclil1_fb32_liprint(y,N); printf("\n");
|
||||
printf("rem="); amsclil1_fb32_liprint(rem,N); printf("\n");
|
||||
printf(" z="); amsclil1_fb32_liprint(z,N); printf("\n");
|
||||
|
||||
if(cmp!=0)
|
||||
{
|
||||
printf("Mod accuracy failure:\n");
|
||||
printf("x="); amsclil1_fb32_liprint(x,N); printf("\n");
|
||||
printf("y="); amsclil1_fb32_liprint(y,N); printf("\n");
|
||||
printf("rem="); amsclil1_fb32_liprint(rem,N); printf("\n");
|
||||
printf("z="); amsclil1_fb32_liprint(z,N); printf("\n");
|
||||
Nfail++;
|
||||
}
|
||||
}
|
||||
printf("Nfailures = %ld out of %ld\n",Nfail,100L);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void modpower_timetests()
|
||||
{
|
||||
printf("Modpower Time Tests.\n");
|
||||
|
||||
long N;
|
||||
long I;
|
||||
uint32_t *x = NULL;
|
||||
uint32_t *y = NULL;
|
||||
uint32_t *md = NULL;
|
||||
uint32_t *pw = NULL;
|
||||
uint32_t *wrk = NULL;
|
||||
uint32_t *stor = NULL;
|
||||
|
||||
double t0,t1;
|
||||
|
||||
printf("bits \t time (msec)\n");
|
||||
printf("------------------");
|
||||
|
||||
for(I=1;I<=64;I++)
|
||||
{
|
||||
N = I;
|
||||
x = amsc_malloc(I*sizeof(uint32_t));
|
||||
y = amsc_malloc(I*sizeof(uint32_t));
|
||||
md = amsc_malloc(I*sizeof(uint32_t));
|
||||
pw = amsc_malloc(I*sizeof(uint32_t));
|
||||
wrk = amsc_malloc(66*(I+1)*sizeof(uint32_t));
|
||||
stor = amsc_malloc(28*(I+1)*sizeof(uint32_t));
|
||||
|
||||
amsclil1_fb32_testrandom(x,N);
|
||||
amsclil1_fb32_testrandom(md,N);
|
||||
amsclil1_fb32_testrandom(pw,N);
|
||||
|
||||
t0 = amsc_timemsec();
|
||||
amsclil1_fb32_modpower(x,pw,md,y,wrk,stor,N);
|
||||
t1 = amsc_timemsec();
|
||||
printf("%ld \t %1.4f \n",N*32,t1-t0);
|
||||
|
||||
free(x); x=NULL;
|
||||
free(y); y=NULL;
|
||||
free(md); md=NULL;
|
||||
free(pw); pw=NULL;
|
||||
free(wrk); wrk=NULL;
|
||||
free(stor); stor=NULL;
|
||||
}
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void test_amsclil1_fb32_eulergcd()
|
||||
{
|
||||
printf("Test for amsclil1_fb32_eulergcd...\n");
|
||||
|
||||
long blen = 6;
|
||||
uint32_t *a,*b,*c,*d,*e,*wrk;
|
||||
long I;
|
||||
int b1,b2;
|
||||
|
||||
a = (uint32_t*) malloc(sizeof(uint32_t)*blen);
|
||||
b = (uint32_t*) malloc(sizeof(uint32_t)*blen);
|
||||
c = (uint32_t*) malloc(sizeof(uint32_t)*blen);
|
||||
d = (uint32_t*) malloc(sizeof(uint32_t)*blen);
|
||||
e = (uint32_t*) malloc(sizeof(uint32_t)*blen);
|
||||
wrk = (uint32_t*) malloc(10*sizeof(uint32_t)*(blen+1));
|
||||
|
||||
for(I=0;I<1000;I++)
|
||||
{
|
||||
printf("euler gcd test %ld\n",I);
|
||||
amsclil1_fb32_ncrandint(a,blen);
|
||||
amsclil1_fb32_ncrandint(b,blen);
|
||||
|
||||
//some sort of memory bug when blen>=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<ntest;I++)
|
||||
{
|
||||
amsclil1_fb32_ncrandint(a,blen);
|
||||
amsclil1_fb32_ncrandint(b,blen-1);
|
||||
|
||||
//a/b --> (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<Nt;L++)
|
||||
{
|
||||
|
||||
for(K=0;K<blenmax;K++)
|
||||
{
|
||||
a[K] = 0;
|
||||
b[K] = 0;
|
||||
}
|
||||
|
||||
amsclil1_fb32_ncrandint(a,I);
|
||||
amsclil1_fb32_ncrandint(b,J);
|
||||
|
||||
if(I>=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<Nt;L++)
|
||||
{
|
||||
|
||||
for(K=0;K<blenmax;K++)
|
||||
{
|
||||
a[K] = 0;
|
||||
b[K] = 0;
|
||||
}
|
||||
|
||||
amsclil1_fb32_ncrandint(a,I);
|
||||
//amsclil1_fb32_ncrandint(b,J);
|
||||
|
||||
if(I>=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<Nt;L++)
|
||||
{
|
||||
|
||||
for(K=0;K<blenmax;K++)
|
||||
{
|
||||
a[K] = 0;
|
||||
b[K] = 0;
|
||||
}
|
||||
|
||||
//amsclil1_fb32_ncrandint(a,I);
|
||||
amsclil1_fb32_ncrandint(b,J);
|
||||
|
||||
if(I>=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<Nt;L++)
|
||||
{
|
||||
|
||||
for(K=0;K<blenmax;K++)
|
||||
{
|
||||
a[K] = 0;
|
||||
b[K] = 0;
|
||||
}
|
||||
|
||||
//amsclil1_fb32_ncrandint(a,I);
|
||||
//amsclil1_fb32_ncrandint(b,J);
|
||||
|
||||
if(I>=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<N;I++)
|
||||
{
|
||||
ret = amsclil1_test_fb32_lcm1_sub();
|
||||
if(ret!=1)
|
||||
{
|
||||
printf("LCM Tests failed at run %d of %d\n",I,N);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(ret==1)
|
||||
{
|
||||
printf("All tests passed.\n");
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
@ -0,0 +1,287 @@
|
||||
#include <amsclil1/amsclil1.h>
|
||||
|
||||
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;I<pnt->N && 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;I<pnt->N;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;I<src->N;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;
|
||||
}
|
@ -0,0 +1,157 @@
|
||||
|
||||
#include <amsclil1/amsclil1.h>
|
||||
|
||||
|
||||
// Unsigned Large Integer Comparison Operator:
|
||||
// 0 - a==b
|
||||
// 1 - a>b
|
||||
// 2 - a<b
|
||||
int amsclil1_ulint_cmp(amsclil1_ulint *a, amsclil1_ulint *b)
|
||||
{
|
||||
int ret = 0;
|
||||
int msia = amsclil1_ulint_msindex(a);
|
||||
int msib = amsclil1_ulint_msindex(b);
|
||||
int msimax;
|
||||
int I;
|
||||
uint32_t ad,bd;
|
||||
|
||||
if(msia>msib) msimax = msia; else msimax = msib;
|
||||
|
||||
for(I=msimax;I>=0;I--)
|
||||
{
|
||||
if(I<a->N) ad = a->data[I]; else ad = 0;
|
||||
if(I<b->N) 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;
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
#include <amsclil1/amsclil1.h>
|
||||
|
||||
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;
|
||||
}
|
Loading…
Reference in New Issue