Import gcrypt public-key cryptography and implement signature checking.
This commit is contained in:
parent
535714bdcf
commit
5e3b8dcbb5
238 changed files with 40500 additions and 417 deletions
831
grub-core/lib/libgcrypt/mpi/ChangeLog-2011
Normal file
831
grub-core/lib/libgcrypt/mpi/ChangeLog-2011
Normal file
|
|
@ -0,0 +1,831 @@
|
|||
2011-12-01 Werner Koch <wk@g10code.com>
|
||||
|
||||
NB: ChangeLog files are no longer manually maintained. Starting
|
||||
on December 1st, 2011 we put change information only in the GIT
|
||||
commit log, and generate a top-level ChangeLog file from logs at
|
||||
"make dist". See doc/HACKING for details.
|
||||
|
||||
2011-07-04 Werner Koch <wk@g10code.com>
|
||||
|
||||
* longlong.h (add_ssaaaa) [__arm__]: Do no use asm if thumb code
|
||||
generation is enabled. This is bug#1202. Reported for gpg 1.4.
|
||||
|
||||
2011-03-28 Werner Koch <wk@g10code.com>
|
||||
|
||||
* mpi-pow.c (gcry_mpi_powm): Remove unused var RSEC.
|
||||
|
||||
2011-02-01 Werner Koch <wk@g10code.com>
|
||||
|
||||
* mpi-cmp.c (gcry_mpi_cmp): Allow comparing of opaque MPIs.
|
||||
|
||||
2010-04-12 Brad Hards <bradh@frogmouth.net> (wk)
|
||||
|
||||
Spelling fixes.
|
||||
|
||||
2010-02-22 Aurelien Jarno <aurel32@debian.org> (wk)
|
||||
|
||||
* longlong.h (umul_ppmm) <mips> [__GNUC__ >= 4.4]: Patch according
|
||||
to recommended gcc 4.4 changes.
|
||||
|
||||
2009-12-09 Werner Koch <wk@g10code.com>
|
||||
|
||||
* config.links: Remove asm modules for all sparc64. This is
|
||||
debian#560028.
|
||||
|
||||
2009-05-26 Werner Koch <wk@g10code.com>
|
||||
|
||||
* mpicoder.c (mpi_read_from_buffer): Allow zero-sized MPIs (i.e a
|
||||
zero).
|
||||
|
||||
2009-02-16 Werner Koch <wk@g10code.com>
|
||||
|
||||
* mpiutil.c: Remove memory.h.
|
||||
|
||||
2008-12-05 Werner Koch <wk@g10code.com>
|
||||
|
||||
* mpicoder.c (mpi_read_from_buffer): Do not bail out if the mpi is
|
||||
larger than the buffer (potential problem). Do not print error
|
||||
messages.
|
||||
(mpi_fromstr): Return an error instead of hitting an assert.
|
||||
(gcry_mpi_scan) <PGP>: Fix potential double free problem.
|
||||
(gcry_mpi_scan) <HEX>: Fix potential memory leak.
|
||||
(do_get_buffer): Return NULL on memory allocation failure.
|
||||
(gcry_mpi_print): Check result of do_get_buffer.
|
||||
(gcry_mpi_aprint): Return error on a memory allocation failure.
|
||||
|
||||
* mpicoder.c: Re-indent.
|
||||
|
||||
2008-12-03 Werner Koch <wk@g10code.com>
|
||||
|
||||
* mpi-pow.c (gcry_mpi_powm): Fix last change. Asserts are really
|
||||
useful!
|
||||
|
||||
2008-12-02 Werner Koch <wk@g10code.com>
|
||||
|
||||
* mpi-pow.c (gcry_mpi_powm): Re-indent.
|
||||
(gcry_mpi_powm): Simplified allocation of the result to fix a
|
||||
double free bug. This is bug#977. Reported by Haakon Ringberg.
|
||||
|
||||
2008-08-20 Werner Koch <wk@g10code.com>
|
||||
|
||||
* mpi-bit.c (gcry_mpi_lshift): Actually implement.
|
||||
|
||||
2008-08-19 Werner Koch <wk@g10code.com>
|
||||
|
||||
* mpi-bit.c (gcry_mpi_lshift): New.
|
||||
|
||||
2007-10-31 Werner Koch <wk@g10code.com>
|
||||
|
||||
* mpi-mod.c (gcry_mpi_mod): Remove
|
||||
* mpi-inv.c (_gcry_mpi_invm): Remove _ prefix.
|
||||
* mpiutil.c (_gcry_mpi_swap): Remove.
|
||||
(_gcry_mpi_new): Remove.
|
||||
(_gcry_mpi_snew): Remove.
|
||||
(gcry_mpi_invm): Remove.
|
||||
(gcry_mpi_copy): Remove and rename _version to this.
|
||||
(gcry_mpi_set, gcry_mpi_set_ui): Merge with _ version.
|
||||
* mpi-inv.c (gcry_mpi_invm): Remove _ prefix and return 1.
|
||||
* mpi-mul.c (gcry_mpi_mul_2exp): Remove and rename _ version to this.
|
||||
|
||||
2007-10-29 Werner Koch <wk@g10code.com>
|
||||
|
||||
* config.links: No Candadian Cross here, thus use $host instead of
|
||||
$target.
|
||||
|
||||
2007-10-26 Werner Koch <wk@g10code.com>
|
||||
|
||||
* config.links (mpi_optional_modules): Special rules for Apple
|
||||
Darwin on ia32 from Gregor Riepl.
|
||||
|
||||
2007-05-09 Marcus Brinkmann <marcus@g10code.de>
|
||||
|
||||
* config.links: Rename assembler file links by suffixing "-asm".
|
||||
* Makefile.am (CCASCOMPILE, LTCCASCOMPILE, CLEANFILES,
|
||||
libmpi_la_LIBADD, libmpi_la_DEPENDENCIES, SUFFIXES, .S.o, .S.obj,
|
||||
.S.lo): Removed variables and targets.
|
||||
(mpih_add1, mpih_sub1, mpih_mul1, mpih_mul2, mpih_mul3,
|
||||
mpih_lshift, mpih_rshift, mpih_udiv, mpih_udiv_qrnnd,
|
||||
nodist_libmpi_la_SOURCES): New variables.
|
||||
(DISTCLEANFILES): Rename assembler file links by suffixing "-asm".
|
||||
Add variants for C file links.
|
||||
|
||||
2007-05-04 Werner Koch <wk@g10code.com>
|
||||
|
||||
* config.links (path): Allowthe sue of colons as delimiters.
|
||||
|
||||
2007-05-03 Werner Koch <wk@g10code.com>
|
||||
|
||||
* pentium4/distfiles: Fixed.
|
||||
|
||||
2007-04-30 Werner Koch <wk@g10code.com>
|
||||
|
||||
* config.links: Create a file mod-source-info.h.
|
||||
* Makefile.am (DISTCLEANFILES): Add that file.
|
||||
* mpiutil.c (_gcry_mpi_get_hw_config): New.
|
||||
|
||||
2007-04-28 Marcus Brinkmann <marcus@g10code.de>
|
||||
|
||||
* config.links: Add additional assembler search directories.
|
||||
|
||||
2007-03-28 Werner Koch <wk@g10code.com>
|
||||
|
||||
* ec.c: New.
|
||||
|
||||
2007-03-23 Werner Koch <wk@g10code.com>
|
||||
|
||||
* mpi-bit.c (_gcry_mpi_lshift_limbs): Assign AP after the resize.
|
||||
|
||||
* mpi-div.c (gcry_mpi_mod, _gcry_mpi_mod): Moved to ..
|
||||
* mpi-mod.c: .. new file.
|
||||
(_gcry_mpi_barrett_init, _gcry_mpi_barrett_free): New.
|
||||
(_gcry_mpi_mod_barrett): New.
|
||||
(_gcry_mpi_mul_barrett): New.
|
||||
|
||||
2007-03-22 Werner Koch <wk@g10code.com>
|
||||
|
||||
* mpi-div.c (_gcry_mpi_mod): New.
|
||||
* mpiutil.c (_gcry_mpi_new, _gcry_mpi_snew): New.
|
||||
|
||||
2007-03-13 Werner Dittmann <Werner.Dittmann@t-online.de> (wk)
|
||||
|
||||
* amd64/mpih-add1.S, amd64/mpih-add1.S, amd64/mpih-lshift.S
|
||||
* amd64/mpih-mul1.S, amd64/mpih-mul2.S, amd64/mpih-mul3.S
|
||||
* amd64/mpih-rshift.S, amd64/mpih-sub1.S: New.
|
||||
* config.links: Add case for x86_64.
|
||||
|
||||
2007-02-23 Werner Koch <wk@g10code.com>
|
||||
|
||||
* mpi-pow.c (gcry_mpi_powm): Remove unused var ESIGN.
|
||||
|
||||
* mpiutil.c (gcry_mpi_get_flag): Let it return a value to silent
|
||||
MIPSpro cc warning.
|
||||
|
||||
2007-02-21 Werner Koch <wk@g10code.com>
|
||||
|
||||
* mpicoder.c (_gcry_mpi_set_buffer): Made BUFFER a void*.
|
||||
|
||||
2006-11-15 Werner Koch <wk@g10code.com>
|
||||
|
||||
* Makefile.am (.S.o): Check for srcdir also in in CPP pass.
|
||||
(INCLUDES): Removed.
|
||||
(AM_CPPFLAGS, AM_CFLAGS): New, modified. Merged with Moritz'
|
||||
changes.
|
||||
|
||||
2006-11-05 Moritz Schulte <moritz@g10code.com>
|
||||
|
||||
* Makefile.am (AM_CFLAGS): Added -I$(top_builddir)/src so that the
|
||||
new gcrypt.h is used, not the one installed in the system.
|
||||
|
||||
2006-10-23 Werner Koch <wk@g10code.com>
|
||||
|
||||
* config.links (mpi_optional_modules): Make sure that powerpc64 is
|
||||
matched before a generic powerpc. Reported by Andreas Metzler.
|
||||
Should fix Debian bug 284609.
|
||||
|
||||
2006-08-25 Werner Koch <wk@g10code.com>
|
||||
|
||||
* mpi-bit.c (gcry_mpi_rshift): Don't shift if N == 0 but do a
|
||||
plain copy.
|
||||
|
||||
2006-08-04 Werner Koch <wk@g10code.com>
|
||||
|
||||
* mpi-bit.c (gcry_mpi_rshift): Rewritten to remove the limitation
|
||||
on N (which used to be less than BITS_PER_MPI_LIMB).
|
||||
|
||||
2006-08-03 Werner Koch <wk@g10code.com>
|
||||
|
||||
* mpi-bit.c (gcry_mpi_set_bit, gcry_mpi_set_highbit): Fixed
|
||||
allocation. Reported by bpgcrypt at itaparica.org.
|
||||
* mpiutil.c (_gcry_mpi_resize): Clear the new part of the resized
|
||||
limb space.
|
||||
|
||||
2006-07-26 Werner Koch <wk@g10code.com>
|
||||
|
||||
* mpiutil.c (gcry_mpi_randomize): Changed P to unsigned char*.
|
||||
|
||||
* mpicoder.c (gcry_mpi_scan): Changed arg BUFFER to void*.
|
||||
(mpi_read_from_buffer): Made BUFFER arg const.
|
||||
(gcry_mpi_scan): Removed now needless cast. Add cast for arg to
|
||||
mpi_fromstr.
|
||||
(gcry_mpi_print): Made TMP unsigned.
|
||||
|
||||
* Makefile.am (AM_CCASFLAGS): New.
|
||||
|
||||
2005-10-09 Moritz Schulte <moritz@g10code.com>
|
||||
|
||||
* mpi-cmp.c (gcry_mpi_cmp_ui): Rewritten; correctly handle case of
|
||||
zero limbs in U.
|
||||
|
||||
2005-04-27 Moritz Schulte <moritz@g10code.com>
|
||||
|
||||
* mpiutil.c (gcry_mpi_randomize): Store random data in secure
|
||||
memory if the given MPI is secure - not the other way around (argl).
|
||||
|
||||
2005-04-23 Moritz Schulte <moritz@g10code.com>
|
||||
|
||||
* Makefile.am: Don't assume the compiler will pre-process the .S
|
||||
files. Some compilers, like those from HP and IBM, don't do
|
||||
this. So, we use the same solution gnupg-1.4.0 does. Preprocess
|
||||
first and then compile.
|
||||
|
||||
* hppa1.1/mpih-mul3.S: Add "level 1.1" directive to disable
|
||||
warning about using PA-RISC1.1 opcodes.
|
||||
* hppa1.1/mpih-mul2.S: Likewise.
|
||||
* hppa1.1/mpih-mul1.S: Likewise.
|
||||
* hppa1.1/udiv-qrnnd.S: Likewise.
|
||||
|
||||
2005-02-16 Moritz Schulte <moritz@g10code.com>
|
||||
|
||||
* mpiutil.c (_gcry_mpi_alloc_limb_space): Rewritten, fixed memory
|
||||
corruption.
|
||||
|
||||
2005-02-06 Moritz Schulte <moritz@g10code.com>
|
||||
|
||||
* mpiutil.c (_gcry_mpi_get_ui, gcry_mpi_get_ui): New functions.
|
||||
|
||||
2005-01-05 Werner Koch <wk@g10code.com>
|
||||
|
||||
* hppa1.1/udiv-qrnnd.S: Reverted change of 2004-03-02 but kept the
|
||||
.align directive.
|
||||
|
||||
2004-12-16 Werner Koch <wk@g10code.com>
|
||||
|
||||
* config.links (mpi_optional_modules): Move entry for powerpc64
|
||||
before generic powerpc. Suggested by Rafael Ávila de Espíndola.
|
||||
|
||||
2004-03-02 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* hppa1.1/udiv-qrnnd.S: Alignment fix from Lamont Jones for
|
||||
Debian. Taken from gnupg-1.3.
|
||||
|
||||
* longlong.h: Added PowerPC 64 bit code from GPM-4.1.2 but didn't
|
||||
enable it yet. Some whitespace changes in HPPA to fix assembler
|
||||
problems on HP-UX. From gnupg 1.3
|
||||
|
||||
* mpiutil.c (_gcry_mpi_alloc_limb_space): Better allocate
|
||||
something even if NLIMBS is passed as 0.
|
||||
|
||||
* config.links: Updated system list to match gnupg 1.3.
|
||||
|
||||
2003-12-19 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* mpi-internal.h [M_DEBUG]: Removed this unused code.
|
||||
(struct karatsuba_ctx): Added TSPACE_NLIMBS and TP_NLIMBS.
|
||||
* mpiutil.c (_gcry_mpi_free_limb_space): Add arg NLIMBS and wipe
|
||||
out the memory. Changed all callers.
|
||||
* mpih-mul.c (_gcry_mpih_mul_karatsuba_case): Keep track of
|
||||
allocated limbs.
|
||||
* mpi-div.c (_gcry_mpi_tdiv_qr): Keep track of allocated limbs.
|
||||
* mpi-mul.c (gcry_mpi_mul): Ditto.
|
||||
* mpi-pow.c (gcry_mpi_powm): Ditto.
|
||||
|
||||
* Manifest: Empty new file. Also add Manifest files to all CPU
|
||||
specific directories.
|
||||
* Makefile.am: Added.
|
||||
|
||||
* mpiutil.c (gcry_mpi_randomize): Use gcry_create_nonce if WEAK
|
||||
random has been requested.
|
||||
|
||||
2003-10-31 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* i386/mpih-rshift.S, i386/mpih-lshift.S: Use %dl and not %edx for
|
||||
testb; this avoids an assembler warning.
|
||||
|
||||
* mpi-pow.c (gcry_mpi_powm): s/exp/expo/ to avoid shadowing warning.
|
||||
|
||||
2003-08-19 Marcus Brinkmann <marcus@g10code.de>
|
||||
|
||||
* Makefile.am (SUFFIXES): New variable.
|
||||
(.S.o, .S.lo, .S.obj): Rewritten.
|
||||
|
||||
2003-07-30 Moritz Schulte <moritz@g10code.com>
|
||||
|
||||
* longlong.h (__clz_tab): Renamed to _gcry_clz_tab.
|
||||
* mpi-bit.c (__clz_tab): Likewise.
|
||||
|
||||
2003-07-27 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* mpicoder.c (gcry_mpi_scan): New argument BUFLEN to replace the
|
||||
use of the intial value of NBYTES. Changed BUFFER to unsigned.
|
||||
(gcry_mpi_print): Likewise.
|
||||
(gcry_mpi_dump): New.
|
||||
(_gcry_log_mpidump): Make use of gcry_mpi_dump.
|
||||
(mpi_print): Removed.
|
||||
(gcry_mpi_scan): Allocated mpi in secure memory when required.
|
||||
(gcry_mpi_aprint): Changed BUFFER to unsigned char*.
|
||||
|
||||
2003-07-14 Moritz Schulte <moritz@g10code.com>
|
||||
|
||||
* mpicoder.c: Used gcry_err* wrappers for libgpg-error symbols.
|
||||
|
||||
2003-06-16 Moritz Schulte <moritz@g10code.com>
|
||||
|
||||
* mpi-add.c: Replace last occurences of old type names with newer
|
||||
names (i.e. replace MPI with gcry_mpi_t).
|
||||
* mpi-bit.c: Likewise.
|
||||
* mpi-cmp.c: Likewise.
|
||||
* mpi-div.c: Likewise.
|
||||
* mpi-gcd.c: Likewise.
|
||||
* mpi-internal.h: Likewise.
|
||||
* mpi-inv.c: Likewise.
|
||||
* mpi-mpow.c: Likewise.
|
||||
* mpi-mul.c: Likewise.
|
||||
* mpi-pow.c: Likewise.
|
||||
* mpi-scan.c: Likewise.
|
||||
* mpicoder.c: Likewise.
|
||||
* mpiutil.c: Likewise.
|
||||
|
||||
2003-06-09 Moritz Schulte <moritz@g10code.com>
|
||||
|
||||
* mpicoder.c (gcry_mpi_scan): Adjust for libgpg-error.
|
||||
(gcry_mpi_print): Likewise.
|
||||
(gcry_mpi_aprint): Likewise.
|
||||
|
||||
2003-06-07 Moritz Schulte <moritz@g10code.com>
|
||||
|
||||
* longlong.h, mpi-add.c, mpi-bit.c, mpi-cmp.c, mpi-div.c,
|
||||
mpi-gcd.c, mpi-inline.c, mpi-inline.h, mpi-internal.h, mpi-inv.c,
|
||||
mpi-mpow.c, mpi-mul.c, mpi-pow.c, mpi-scan.c, mpicoder.c,
|
||||
mpih-div.c, mpih-mul.c, mpiutil.c, generic/mpi-asm-defs.h,
|
||||
generic/mpih-add1.c, generic/mpih-lshift.c, generic/mpih-mul1.c,
|
||||
generic/mpih-mul2.c, generic/mpih-mul3.c, generic/mpih-rshift.c,
|
||||
generic/mpih-sub1.c, generic/udiv-w-sdiv.c, i386/syntax.h,
|
||||
m68k/syntax.h, mips3/mpi-asm-defs.h, powerpc32/syntax.h: Edited
|
||||
all preprocessor instructions to remove whitespace before the '#'.
|
||||
This is not required by C89, but there are some compilers out
|
||||
there that don't like it. Replaced any occurence of the now
|
||||
deprecated type names with the new ones.
|
||||
|
||||
2003-05-21 Moritz Schulte <moritz@g10code.com>
|
||||
|
||||
* mpiutil.c (_gcry_mpi_alloc_limb_space): Only try to allocate
|
||||
memory in case the amount of bytes to allocate is non-zero.
|
||||
|
||||
2003-04-27 Moritz Schulte <moritz@g10code.com>
|
||||
|
||||
* mpiutil.c (_gcry_mpi_resize): Allocate secure memory, in case
|
||||
bit zero of `flags' is set.
|
||||
|
||||
* mpi-add.c (gcry_mpi_sub): Simplify function; always use a
|
||||
temporary variable now.
|
||||
|
||||
2003-04-15 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* longlong.h (umul_ppmm): Support SH3 and SH4. Thanks to
|
||||
kazuya.s@jp.yokogawa.com.
|
||||
|
||||
2003-04-02 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* mpicoder.c (gcry_mpi_print): Fixed testing against possible
|
||||
uninitialized LEN. Valgrinded by Nikos Mavroyanopoulos.
|
||||
|
||||
2003-01-15 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* longlong.h: Removed some spaces between backslashes and newlines.
|
||||
|
||||
2002-09-20 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* mpi-mul.c (gcry_mpi_mul_2exp): New. This was declared in
|
||||
gcrypt.h but only implemented as internal function. Noted by Timo
|
||||
but a few minutes to late for today's release.
|
||||
|
||||
* Makefile.am (DISTCLEANFILES): Include mpi-asm-defs.h
|
||||
|
||||
2002-09-18 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* Makefile.am (.S.lo): Pass -DPIC. i386, PPC and Sparc code
|
||||
require it. It worked for me because I am using the i586 code.
|
||||
|
||||
2002-08-23 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* Makefile.am (.S.lo): Fixed for libtool build with --disable-shared.
|
||||
|
||||
2002-07-24 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* longlong.h: Replaced all K&R multiline strings by ISO ones for
|
||||
the sake of modern compilers. Suggested by Marco Parrone.
|
||||
|
||||
2002-06-24 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* mpiutil.c (gcry_mpi_swap): New.
|
||||
|
||||
* mpi-div.c (gcry_mpi_div): New.
|
||||
(gcry_mpi_mod): New.
|
||||
* mpi-inv.c (gcry_mpi_invm): New.
|
||||
|
||||
* mpicoder.c (do_get_buffer): Make sure that we allocate at least
|
||||
one byte.
|
||||
|
||||
2002-06-12 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* hppa1.1/udiv-qrnnd.S: Changes for PIC by Randolph Chung.
|
||||
|
||||
2002-05-15 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* config.links: Chnage the way the mpi modules are determined.
|
||||
* Makefile.am: Revamped to better handle modules
|
||||
|
||||
2002-05-14 Werner Koch <wk@gnupg.org>
|
||||
|
||||
Changed license of all files to the LGPL.
|
||||
|
||||
2002-04-18 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* mpicoder.c (gcry_mpi_scan): Don't use normalize on a NULL MPI.
|
||||
|
||||
2002-03-20 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* mpicoder.c (mpi_read_from_buffer): Bail out on a zero length
|
||||
buffer because we can't eventually do an malloc of this size.
|
||||
Reported by Timo.
|
||||
|
||||
2002-01-14 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* mpi-inv.c (_gcry_mpi_invm): Typo fixes, noted by Carlo Perassi.
|
||||
|
||||
2001-11-01 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* mpicoder.c (gcry_mpi_scan): Allow to pass a nbytes as NULL or
|
||||
with value 0 for format GCRY_FMT_SSH, so that the length is not
|
||||
used for any checks, only the length stored in the bufer is used.
|
||||
This is a nice format becuase we can just pass a buffer around and
|
||||
don't need to care about its length.
|
||||
|
||||
2001-08-03 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* config.links: Changed the way the list of files to be
|
||||
symlinked is returned.
|
||||
|
||||
2001-05-31 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* mpih-cmp.c: Removed and moved mpihelp_cmp to ..
|
||||
* mpi-inline.h: .. here.
|
||||
|
||||
Major function renaming. All global functions are now prefixed
|
||||
with _gcry_ or gcry_. Renamed also all mpihelp_ to just mpih_ so
|
||||
that functions names are not getting to long an unreadable and for
|
||||
better matching with the filenames.
|
||||
|
||||
2001-05-28 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* mpicoder.c (mpi_fromstr): Made static and assume that all input
|
||||
is in hexformat.
|
||||
|
||||
Updated all CPU specific code with the one from GnuPG-1.0.5. This
|
||||
is just a change of text formatting and the use of .label
|
||||
instead of labels for hppa and pa7100.
|
||||
|
||||
* longlong.h: Fixes for ARM by Phil Blundell.
|
||||
|
||||
2001-03-29 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* mpi-mul.c (mpi_mul): Make sure that secret temporary results are
|
||||
not stored in w. Suggested by Florian Weimer.
|
||||
|
||||
* config.links: Use i386 code for i386. According to tests by
|
||||
Kevin Ryde the i586 code runs slow on i386 CPUs. Ditto for i786.
|
||||
|
||||
2001-01-11 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* Makefile.am: Removed mpi.h.
|
||||
|
||||
2000-12-19 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* mpi-internal.h: Put limb_t definition in an ifdef.
|
||||
|
||||
Major change:
|
||||
Removed all GnuPG stuff and renamed this piece of software
|
||||
to gcrypt.
|
||||
|
||||
2000-11-14 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* mpi-internal.h, mpi.h: Changed the way they are called and
|
||||
introduced DID_MPI_LIMP_TYPEDEF hack. Very ugly, should all be
|
||||
revamped.
|
||||
|
||||
* Makefile.am (OMIT_DEPENDENCIES): Hack to work around dependency
|
||||
problems.
|
||||
|
||||
2000-10-11 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* generic/mpi-asm-defs.h: New.
|
||||
* mips3/mpi-asm-defs.h: New.
|
||||
* config.links: Create a link to one of the above files.
|
||||
|
||||
Fri Jul 28 18:19:11 CEST 2000 Werner Koch <wk@openit.de>
|
||||
|
||||
* mpicoder.c (gcry_mpi_scan): Normalize the returned MPI.
|
||||
|
||||
Tue Jul 25 17:44:15 CEST 2000 Werner Koch <wk@openit.de>
|
||||
|
||||
* config.links: Support for powerpc--netbsd by Gabriel Rosenkoetter.
|
||||
|
||||
Mon Jul 17 16:35:47 CEST 2000 Werner Koch <wk@>
|
||||
|
||||
* power/: Add all files from GMP for this CPU. Converted comments to
|
||||
CPP comments because some ASes complain about ' in comments.
|
||||
|
||||
* config.links: Support for BSDI 4.x; by Wayne Chapeskie. Add support
|
||||
for FreeBSD 5 and made the case stmt looking nicer; by Jun Kuriyama.
|
||||
Add support for NetBSD.
|
||||
(sparc8): Made the search path the same as sparc9
|
||||
(sparc64-unknown-linux-gnu): use udiv module; by Adam Mitchell.
|
||||
|
||||
* Makefile.am: c/SFLAGS/ASFLAGS/. This has only been used by the
|
||||
powerpc and actually never passed the -Wa,foo to the cc.
|
||||
|
||||
* mpih-div.c (mpihelp_divrem): The MPN_COPY_DECR copied one element
|
||||
too many. This is a gmp2.0.2p9.txt patch.
|
||||
|
||||
* longlong.h (umul_ppmm): Fixes for ARM-4. By Sean MacLennan.
|
||||
|
||||
* mpi-internal.h (karatsuba_ctx): New.
|
||||
* mpih-mul.c (mpihelp_release_karatsuba_ctx): New.
|
||||
(mpihelp_mul_karatsuba_case): New.
|
||||
(mpihelp_mul): Splitted to make use of the new functions.
|
||||
* mpi-pow.c (mpi_powm): Make use of the new splitted function to avoid
|
||||
multiple allocation of temporary memory during the karatsuba operations.
|
||||
* mpi_mpow.c: Removed the unused Barrett code.
|
||||
|
||||
2000-03-21 16:17:30 Werner Koch (wk@habibti.openit.de)
|
||||
|
||||
* config.links: Add support for FreeBSD 5.
|
||||
|
||||
Mon Jan 24 22:24:38 CET 2000 Werner Koch <wk@gnupg.de>
|
||||
|
||||
* mpicoder.c (gcry_mpi_aprint): Now really returns the length.
|
||||
|
||||
Mon Jan 24 13:04:28 CET 2000 Werner Koch <wk@gnupg.de>
|
||||
|
||||
* mpiutil.c: Removed all memory debugging code.
|
||||
|
||||
* mpicoder.c (gcry_mpi_aprint): New.
|
||||
|
||||
* Replaced all m_ memory functions by g10_ ones.
|
||||
|
||||
Fri Dec 31 14:06:56 CET 1999 Werner Koch <wk@gnupg.de>
|
||||
|
||||
* mpi-bit.c (gcry_mpi_get_nbits): New.
|
||||
|
||||
* mpiutil.c (mpi_set_secure): made static.
|
||||
(gcry_mpi_get_flag): New.
|
||||
(gcry_mpi_set_flag): New.
|
||||
(gcry_mpi_clear_flag): New.
|
||||
(mpi_set_opaque): renamed to gcry_mpi_set_opaque.
|
||||
(mpi_get_opaque): renamed to gcry_mpi_get_opaque.
|
||||
|
||||
Fri Dec 31 12:48:31 CET 1999 Werner Koch <wk@gnupg.de>
|
||||
|
||||
* mpicoder.c (mpi_read_from_buffer): Made static.
|
||||
(gcry_mpi_print): A buffer of NULL is now allowed to get the required
|
||||
length back.
|
||||
(mpi_get_keyid): Removed.
|
||||
(mpi_print): Made static - should be removed.
|
||||
|
||||
Wed Dec 8 21:58:32 CET 1999 Werner Koch <wk@gnupg.de>
|
||||
|
||||
* Makefile.am (INCLUDES): Add ../gcrypt.
|
||||
|
||||
* g10m.c : Removed.
|
||||
|
||||
* mpicoder.c (mpi_write): Removed.
|
||||
(mpi_read): Removed.
|
||||
(gcry_mpi_scan): New. Taken from ../gcrypt/mpiapi.c.
|
||||
(gcry_mpi_print): Ditto.
|
||||
|
||||
* mpi-pow.c (mpi_powm): Renamed to ...
|
||||
(gcry_mpi_powm): ... this.
|
||||
|
||||
* mpiutil.c (gcry_mpi_new): New as a wrapper around the old function.
|
||||
Taken from ../gcrypt/mpiapi.c.
|
||||
(gcry_mpi_snew): Ditto.
|
||||
(gcry_mpi_release): Ditto.
|
||||
(gcry_mpi_copy): Ditto.
|
||||
(gcry_mpi_set): Ditto.
|
||||
(gcry_mpi_set_ui): Ditto.
|
||||
(gcry_mpi_cmp): Ditto.
|
||||
(gcry_mpi_cmp_ui): Ditto.
|
||||
(gcry_mpi_randomize): Ditto.
|
||||
|
||||
* mpicoder.c (mpi_print): Removed the nbit_info kludge.
|
||||
* mpi-bits.c (mpi_get_nbits): Replaced the is_protected stuff by
|
||||
checking whether it is an opaque mpi and then returns it's length
|
||||
in bits.
|
||||
* mpiutil.c (mpi_set_opaque): Changed the interface to take a number
|
||||
of bits for the length. Adjusted all users.
|
||||
(mpi_get_opaque): Ditto.
|
||||
|
||||
Fri Nov 19 17:15:20 CET 1999 Werner Koch <wk@gnupg.de>
|
||||
|
||||
* mpicoder.c (g10_log_mpidump): Add a temporary workaround
|
||||
|
||||
* mpih-mul.c (mpihelp_mul_n): s/m_is_ecure/g10_is_secure/
|
||||
|
||||
* mpiutil.c (mpi_alloc): Remved the debug mode because it has turned
|
||||
out, that this feature was not very useful in the past. Use the
|
||||
new alloc functions.
|
||||
(mpi_alloc_secure): Ditto.
|
||||
(mpi_alloc_limb_space): Ditto.
|
||||
(mpi_free_limb_space): Ditto.
|
||||
(mpi_resize): Ditto.
|
||||
(mpi_free): Ditto.
|
||||
(mpi_set_secure): Removed the debug stuff.
|
||||
(mpi_set_opaque): Ditto.
|
||||
(mpi_copy): Ditto.
|
||||
(mpi_alloc_set_ui): Ditto.
|
||||
(mpi_m_check): Use g10_ wrapper.
|
||||
|
||||
Mon Aug 30 20:38:33 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
|
||||
* config.links: Add case label for DJGPP
|
||||
|
||||
Wed Jul 14 19:42:08 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
|
||||
* Makefile.am: Use .s files as temporaries, disabled other .S rules.
|
||||
|
||||
Wed Jul 7 13:08:40 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
|
||||
* mpicoder.c (g10_log_mpidump): New.
|
||||
|
||||
* Makefile.am: Support for libtool.
|
||||
|
||||
Fri Jul 2 11:45:54 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
|
||||
* mpi-bit.c (mpi_lshift_limbs,mpi_rshift_limbs): New.
|
||||
* mpi-mpow.c (barrett_mulm): New but diabled.
|
||||
|
||||
Tue Jun 1 16:01:46 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* config.links (i[56]86*-*-freebsdelf*): New.
|
||||
|
||||
Sun May 23 14:20:22 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* config.links (sysdep.h): Not any more conditionally created.
|
||||
|
||||
Tue May 4 15:47:53 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* mpiutil.c (mpi_alloc_like): New.
|
||||
|
||||
Mon Apr 26 17:48:15 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* mpih-add.c, mpih-sub.c: Removed
|
||||
* mpi-inline.c: New.
|
||||
* mpi-inline.h: Make it usable by mpi-inline.c.
|
||||
|
||||
Sun Apr 18 10:11:28 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* mpih-mul.c (mpihelp_mul_n): Fixed use of memory region.
|
||||
(mpihelp_mul): Ditto.
|
||||
|
||||
Wed Apr 7 20:51:39 CEST 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* Makefile.am: Explicit rules to invoke cpp on *.S
|
||||
|
||||
Mon Mar 8 20:47:17 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* config.links: Take advantage of the with_symbol_underscore macro.
|
||||
Add support for freebsd 4.
|
||||
|
||||
Wed Feb 24 11:07:27 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* mips3/mpih-sub1.S: Removed left over junk in last line. (Should I
|
||||
blame me or my editor?).
|
||||
|
||||
Sat Feb 13 12:04:43 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* Makefile.am: Removed the +=. Add MPI_OPT_FLAGS.
|
||||
|
||||
Sat Jan 9 16:02:23 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* mpi-cmp.c (mpi_cmp_ui): Normalized the arg.
|
||||
|
||||
Thu Jan 7 18:00:58 CET 1999 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* mpi-bit.c (mpi_normalize): New.
|
||||
(mpi_get_nbits): Normalize the MPI.
|
||||
* mpi-bit.c (mpi_cmp): Normalize the MPI before the compare.
|
||||
|
||||
|
||||
Tue Dec 8 13:15:16 CET 1998 Werner Koch <wk@isil.d.shuttle.de>
|
||||
|
||||
* config.links: Moved the case for powerpc*linux
|
||||
* powerpcp32/*.S: Removed some underscores.
|
||||
|
||||
Thu Nov 26 07:27:52 1998 Werner Koch <werner.koch@guug.de>
|
||||
|
||||
* config.links: Support for ppc with ELF
|
||||
* powerpc32/syntax.h: New.
|
||||
* powerpc32/*.S: Applied ELF patches (glibc patches)
|
||||
|
||||
Tue Nov 10 19:31:37 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* power*/ : Started with stuff for PPC
|
||||
* config.links: Some stuff for PPC.
|
||||
* generic/udiv-w-sdiv.c: New but disabled.
|
||||
|
||||
Tue Oct 27 12:37:46 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* config.links (freebsd): Fixes for FreeBSD 3.0
|
||||
|
||||
Wed Oct 14 09:59:30 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* config.links (freebsd): ELF patches from Jun Kuriyama.
|
||||
|
||||
Thu Oct 8 13:28:17 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* mpi-mpow.c (mpi_mulpowm): Fixed mem leak (m_free/mpi_free).
|
||||
|
||||
Thu Sep 17 18:08:50 1998 Werner Koch (wk@(none))
|
||||
|
||||
* hppa1.1/udiv-qrnnd.S: Fix from Steffen Zahn for HPUX 10.20
|
||||
|
||||
Thu Aug 6 16:39:28 1998 Werner Koch,mobil,,, (wk@tobold)
|
||||
|
||||
* mpi-bit.c (mpi_set_bytes): Removed.
|
||||
|
||||
Wed Aug 5 15:11:12 1998 Werner Koch (wk@(none))
|
||||
|
||||
* mpicoder.c (mpi_read_from_buffer): New.
|
||||
|
||||
* mpiutil.c (mpi_set_opaque): New.
|
||||
(mpi_get_opaque): New.
|
||||
(mpi_copy): Changed to support opauqe flag
|
||||
(mpi_free): Ditto.
|
||||
|
||||
Sat Jul 4 10:11:11 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* mpiutil.c (mpi_clear): Reset flags.
|
||||
(mpi_set): Ditto.
|
||||
(mpi_alloc_secure): Set flag to 1 and not ored the 1 in, tsss..
|
||||
|
||||
Fri Jun 26 11:19:06 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* mpiutil.c (mpi_alloc): set nbits to 0.
|
||||
(mpi_alloc_secure): Ditto.
|
||||
(mpi_clear): Ditto.
|
||||
|
||||
Thu Jun 25 11:50:01 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* mips3/*.S: New
|
||||
|
||||
Mon May 18 13:47:06 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* config.links: split mpih-shift into mpih-[lr]shift and
|
||||
changed all implementations.
|
||||
* mpi/alpha: add some new assembler stuff.
|
||||
|
||||
Wed May 13 11:04:29 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* config.links: Add support for MIPS
|
||||
|
||||
Thu Apr 9 11:31:36 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* mpicoder.c (mpi_get_secure_buffer): New.
|
||||
|
||||
Wed Apr 8 09:44:33 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* config.links: Applied small fix from Ulf Möller.
|
||||
|
||||
Mon Apr 6 12:38:52 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* mpicoder.c (mpi_get_buffer): Removed returned leading zeroes
|
||||
and changed all callers.
|
||||
|
||||
Tue Mar 10 13:40:34 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* mpi-bit.c (mpi_clear_highbit): New.
|
||||
|
||||
Mon Mar 2 19:29:00 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* Makefile.am (DISTCLEANFILES): New
|
||||
|
||||
Thu Feb 26 06:48:54 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* config.links (X86_BROKEN_ALIGN): Added for some systems.
|
||||
|
||||
Mon Feb 23 12:21:40 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* mpi/m68k/mpih-shift.S (Lspecial): Changed duplicate symbol.
|
||||
|
||||
Mon Feb 16 13:00:27 1998 Werner Koch (wk@isil.d.shuttle.de)
|
||||
|
||||
* config.links : Add detection of m68k cpus
|
||||
|
||||
|
||||
Copyright 1998,1999,2000,2001,2002,2003 Free Software Foundation, Inc.
|
||||
|
||||
This file is free software; as a special exception the author gives
|
||||
unlimited permission to copy and/or distribute it, with or without
|
||||
modifications, as long as this notice is preserved.
|
||||
|
||||
This file is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
|
||||
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
Local Variables:
|
||||
buffer-read-only: t
|
||||
End:
|
||||
177
grub-core/lib/libgcrypt/mpi/Makefile.am
Normal file
177
grub-core/lib/libgcrypt/mpi/Makefile.am
Normal file
|
|
@ -0,0 +1,177 @@
|
|||
## Process this file with automake to produce Makefile.in
|
||||
# Copyright (C) 1992, 1999, 2000, 2002 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of Libgcrypt.
|
||||
#
|
||||
# Libgcrypt is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as
|
||||
# published by the Free Software Foundation; either version 2.1 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# Libgcrypt is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
|
||||
# 1.5 leads to a combinatorial explosion due to all the conditionals
|
||||
# I was not able to build it with 64Megs - 1.6 fixes this.
|
||||
# not anymore required: AUTOMAKE_OPTIONS = 1.6
|
||||
|
||||
# Need to include ../src in addition to top_srcdir because gcrypt.h is
|
||||
# a built header.
|
||||
AM_CPPFLAGS = -I../src -I$(top_srcdir)/src
|
||||
AM_CFLAGS = $(GPG_ERROR_CFLAGS)
|
||||
|
||||
AM_ASFLAGS = $(MPI_SFLAGS)
|
||||
AM_CCASFLAGS = $(NOEXECSTACK_FLAGS)
|
||||
|
||||
EXTRA_DIST = Manifest config.links
|
||||
DISTCLEANFILES = mpi-asm-defs.h \
|
||||
mpih-add1-asm.S mpih-mul1-asm.S mpih-mul2-asm.S mpih-mul3-asm.S \
|
||||
mpih-lshift-asm.S mpih-rshift-asm.S mpih-sub1-asm.S asm-syntax.h \
|
||||
mpih-add1.c mpih-mul1.c mpih-mul2.c mpih-mul3.c \
|
||||
mpih-lshift.c mpih-rshift.c mpih-sub1.c \
|
||||
sysdep.h mod-source-info.h
|
||||
|
||||
# Beware: The following list is not a comment but grepped by
|
||||
# config.links to get the list of symlinked modules
|
||||
# Optional modules are marked with an O in the second column.
|
||||
#BEGIN_ASM_LIST
|
||||
# mpih-add1 C
|
||||
# mpih-sub1 C
|
||||
# mpih-mul1 C
|
||||
# mpih-mul2 C
|
||||
# mpih-mul3 C
|
||||
# mpih-lshift C
|
||||
# mpih-rshift C
|
||||
# udiv O
|
||||
# udiv-qrnnd O
|
||||
#END_ASM_LIST
|
||||
|
||||
# Note: This function has not yet been implemented. There is only a dummy in
|
||||
# generic/
|
||||
# udiv-w-sdiv O
|
||||
|
||||
# And we need to have conditionals for all modules because
|
||||
# we don't know whether they are .c or .S. Very ugly; I know.
|
||||
# Remember to define them all in configure.ac
|
||||
if MPI_MOD_ASM_MPIH_ADD1
|
||||
mpih_add1 = mpih-add1-asm.S
|
||||
else
|
||||
if MPI_MOD_C_MPIH_ADD1
|
||||
mpih_add1 = mpih-add1.c
|
||||
else
|
||||
mpih_add1 =
|
||||
endif
|
||||
endif
|
||||
|
||||
if MPI_MOD_ASM_MPIH_SUB1
|
||||
mpih_sub1 = mpih-sub1-asm.S
|
||||
else
|
||||
if MPI_MOD_C_MPIH_SUB1
|
||||
mpih_sub1 = mpih-sub1.c
|
||||
else
|
||||
mpih_sub1 =
|
||||
endif
|
||||
endif
|
||||
|
||||
if MPI_MOD_ASM_MPIH_MUL1
|
||||
mpih_mul1 = mpih-mul1-asm.S
|
||||
else
|
||||
if MPI_MOD_C_MPIH_MUL1
|
||||
mpih_mul1 = mpih-mul1.c
|
||||
else
|
||||
mpih_mul1 =
|
||||
endif
|
||||
endif
|
||||
|
||||
if MPI_MOD_ASM_MPIH_MUL2
|
||||
mpih_mul2 = mpih-mul2-asm.S
|
||||
else
|
||||
if MPI_MOD_C_MPIH_MUL2
|
||||
mpih_mul2 = mpih-mul2.c
|
||||
else
|
||||
mpih_mul2 =
|
||||
endif
|
||||
endif
|
||||
|
||||
if MPI_MOD_ASM_MPIH_MUL3
|
||||
mpih_mul3 = mpih-mul3-asm.S
|
||||
else
|
||||
if MPI_MOD_C_MPIH_MUL3
|
||||
mpih_mul3 = mpih-mul3.c
|
||||
else
|
||||
mpih_mul3 =
|
||||
endif
|
||||
endif
|
||||
|
||||
if MPI_MOD_ASM_MPIH_LSHIFT
|
||||
mpih_lshift = mpih-lshift-asm.S
|
||||
else
|
||||
if MPI_MOD_C_MPIH_LSHIFT
|
||||
mpih_lshift = mpih-lshift.c
|
||||
else
|
||||
mpih_lshift =
|
||||
endif
|
||||
endif
|
||||
|
||||
if MPI_MOD_ASM_MPIH_RSHIFT
|
||||
mpih_rshift = mpih-rshift-asm.S
|
||||
else
|
||||
if MPI_MOD_C_MPIH_RSHIFT
|
||||
mpih_rshift = mpih-rshift.c
|
||||
else
|
||||
mpih_rshift =
|
||||
endif
|
||||
endif
|
||||
|
||||
if MPI_MOD_ASM_UDIV
|
||||
udiv = udiv-asm.S
|
||||
else
|
||||
if MPI_MOD_C_UDIV
|
||||
udiv = udiv.c
|
||||
else
|
||||
udiv =
|
||||
endif
|
||||
endif
|
||||
|
||||
if MPI_MOD_ASM_UDIV_QRNND
|
||||
udiv_qrnnd = udiv-qrnnd-asm.S
|
||||
else
|
||||
if MPI_MOD_C_UDIV_QRNND
|
||||
udiv_qrnnd = udiv-qrnnd.c
|
||||
else
|
||||
udiv_qrnnd =
|
||||
endif
|
||||
endif
|
||||
|
||||
noinst_LTLIBRARIES = libmpi.la
|
||||
|
||||
libmpi_la_LDFLAGS =
|
||||
nodist_libmpi_la_SOURCES = $(mpih_add1) $(mpih_sub1) $(mpih_mul1) \
|
||||
$(mpih_mul2) $(mpih_mul3) $(mpih_lshift) $(mpih_rshift) \
|
||||
$(udiv) $(udiv_qrnnd)
|
||||
libmpi_la_SOURCES = longlong.h \
|
||||
mpi-add.c \
|
||||
mpi-bit.c \
|
||||
mpi-cmp.c \
|
||||
mpi-div.c \
|
||||
mpi-gcd.c \
|
||||
mpi-internal.h \
|
||||
mpi-inline.h \
|
||||
mpi-inline.c \
|
||||
mpi-inv.c \
|
||||
mpi-mul.c \
|
||||
mpi-mod.c \
|
||||
mpi-pow.c \
|
||||
mpi-mpow.c \
|
||||
mpi-scan.c \
|
||||
mpicoder.c \
|
||||
mpih-div.c \
|
||||
mpih-mul.c \
|
||||
mpiutil.c \
|
||||
ec.c
|
||||
41
grub-core/lib/libgcrypt/mpi/Manifest
Normal file
41
grub-core/lib/libgcrypt/mpi/Manifest
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
# Manifest - checksums of the mpi directory
|
||||
# Copyright 2003 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of Libgcrypt.
|
||||
#
|
||||
# Libgcrypt is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser general Public License as
|
||||
# published by the Free Software Foundation; either version 2.1 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# Libgcrypt is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
|
||||
Makefile.am
|
||||
config.links
|
||||
longlong.h
|
||||
mpi-add.c
|
||||
mpi-bit.c
|
||||
mpi-cmp.c
|
||||
mpi-div.c
|
||||
mpi-gcd.c
|
||||
mpi-inline.c
|
||||
mpi-inline.h
|
||||
mpi-internal.h
|
||||
mpi-inv.c
|
||||
mpi-mpow.c
|
||||
mpi-mul.c
|
||||
mpi-pow.c
|
||||
mpi-scan.c
|
||||
mpicoder.c
|
||||
mpih-div.c
|
||||
mpih-mul.c
|
||||
mpiutil.c
|
||||
$names$ iQCVAwUAP+LmfDEAnp832S/7AQKZJQQAkR/gQITUM+6Ygy9WAOAO17btyKAlCtGTXp5XSZ+J3X0o/rYneRdSCW89IJvwFRJjAOcFJd52MXs6ZVFF/RQBC8MvJzuQChbEzvihK8o2VgK34YWjU+6XH9sFgRMIgzkHs/51ZZxeQUOPy1XF7TyKB0WE7YBUVisFiRaqB1qGIOs==Z3qB
|
||||
|
||||
53
grub-core/lib/libgcrypt/mpi/alpha/README
Normal file
53
grub-core/lib/libgcrypt/mpi/alpha/README
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
This directory contains mpn functions optimized for DEC Alpha processors.
|
||||
|
||||
RELEVANT OPTIMIZATION ISSUES
|
||||
|
||||
EV4
|
||||
|
||||
1. This chip has very limited store bandwidth. The on-chip L1 cache is
|
||||
write-through, and a cache line is transfered from the store buffer to the
|
||||
off-chip L2 in as much 15 cycles on most systems. This delay hurts
|
||||
mpn_add_n, mpn_sub_n, mpn_lshift, and mpn_rshift.
|
||||
|
||||
2. Pairing is possible between memory instructions and integer arithmetic
|
||||
instructions.
|
||||
|
||||
3. mulq and umulh is documented to have a latency of 23 cycles, but 2 of
|
||||
these cycles are pipelined. Thus, multiply instructions can be issued at a
|
||||
rate of one each 21nd cycle.
|
||||
|
||||
EV5
|
||||
|
||||
1. The memory bandwidth of this chip seems excellent, both for loads and
|
||||
stores. Even when the working set is larger than the on-chip L1 and L2
|
||||
caches, the perfromance remain almost unaffected.
|
||||
|
||||
2. mulq has a measured latency of 13 cycles and an issue rate of 1 each 8th
|
||||
cycle. umulh has a measured latency of 15 cycles and an issue rate of 1
|
||||
each 10th cycle. But the exact timing is somewhat confusing.
|
||||
|
||||
3. mpn_add_n. With 4-fold unrolling, we need 37 instructions, whereof 12
|
||||
are memory operations. This will take at least
|
||||
ceil(37/2) [dual issue] + 1 [taken branch] = 20 cycles
|
||||
We have 12 memory cycles, plus 4 after-store conflict cycles, or 16 data
|
||||
cache cycles, which should be completely hidden in the 20 issue cycles.
|
||||
The computation is inherently serial, with these dependencies:
|
||||
addq
|
||||
/ \
|
||||
addq cmpult
|
||||
| |
|
||||
cmpult |
|
||||
\ /
|
||||
or
|
||||
I.e., there is a 4 cycle path for each limb, making 16 cycles the absolute
|
||||
minimum. We could replace the `or' with a cmoveq/cmovne, which would save
|
||||
a cycle on EV5, but that might waste a cycle on EV4. Also, cmov takes 2
|
||||
cycles.
|
||||
addq
|
||||
/ \
|
||||
addq cmpult
|
||||
| \
|
||||
cmpult -> cmovne
|
||||
|
||||
STATUS
|
||||
|
||||
11
grub-core/lib/libgcrypt/mpi/alpha/distfiles
Normal file
11
grub-core/lib/libgcrypt/mpi/alpha/distfiles
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
README
|
||||
mpih-add1.S
|
||||
mpih-sub1.S
|
||||
mpih-mul1.S
|
||||
mpih-mul2.S
|
||||
mpih-mul3.S
|
||||
mpih-lshift.S
|
||||
mpih-rshift.S
|
||||
|
||||
udiv-qrnnd.S
|
||||
|
||||
124
grub-core/lib/libgcrypt/mpi/alpha/mpih-add1.S
Normal file
124
grub-core/lib/libgcrypt/mpi/alpha/mpih-add1.S
Normal file
|
|
@ -0,0 +1,124 @@
|
|||
/* alpha add_n -- Add two limb vectors of the same length > 0 and store
|
||||
* sum in a third limb vector.
|
||||
* Copyright (C) 1995, 1998, 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_add_n( mpi_ptr_t res_ptr, ($16)
|
||||
* mpi_ptr_t s1_ptr, ($17)
|
||||
* mpi_ptr_t s2_ptr, ($18)
|
||||
* mpi_size_t size) ($19)
|
||||
*/
|
||||
|
||||
|
||||
.set noreorder
|
||||
.set noat
|
||||
.text
|
||||
.align 3
|
||||
.globl _gcry_mpih_add_n
|
||||
.ent _gcry_mpih_add_n
|
||||
_gcry_mpih_add_n:
|
||||
.frame $30,0,$26,0
|
||||
|
||||
ldq $3,0($17)
|
||||
ldq $4,0($18)
|
||||
|
||||
subq $19,1,$19
|
||||
and $19,4-1,$2 # number of limbs in first loop
|
||||
bis $31,$31,$0
|
||||
beq $2,.L0 # if multiple of 4 limbs, skip first loop
|
||||
|
||||
subq $19,$2,$19
|
||||
|
||||
.Loop0: subq $2,1,$2
|
||||
ldq $5,8($17)
|
||||
addq $4,$0,$4
|
||||
ldq $6,8($18)
|
||||
cmpult $4,$0,$1
|
||||
addq $3,$4,$4
|
||||
cmpult $4,$3,$0
|
||||
stq $4,0($16)
|
||||
or $0,$1,$0
|
||||
|
||||
addq $17,8,$17
|
||||
addq $18,8,$18
|
||||
bis $5,$5,$3
|
||||
bis $6,$6,$4
|
||||
addq $16,8,$16
|
||||
bne $2,.Loop0
|
||||
|
||||
.L0: beq $19,.Lend
|
||||
|
||||
.align 3
|
||||
.Loop: subq $19,4,$19
|
||||
|
||||
ldq $5,8($17)
|
||||
addq $4,$0,$4
|
||||
ldq $6,8($18)
|
||||
cmpult $4,$0,$1
|
||||
addq $3,$4,$4
|
||||
cmpult $4,$3,$0
|
||||
stq $4,0($16)
|
||||
or $0,$1,$0
|
||||
|
||||
ldq $3,16($17)
|
||||
addq $6,$0,$6
|
||||
ldq $4,16($18)
|
||||
cmpult $6,$0,$1
|
||||
addq $5,$6,$6
|
||||
cmpult $6,$5,$0
|
||||
stq $6,8($16)
|
||||
or $0,$1,$0
|
||||
|
||||
ldq $5,24($17)
|
||||
addq $4,$0,$4
|
||||
ldq $6,24($18)
|
||||
cmpult $4,$0,$1
|
||||
addq $3,$4,$4
|
||||
cmpult $4,$3,$0
|
||||
stq $4,16($16)
|
||||
or $0,$1,$0
|
||||
|
||||
ldq $3,32($17)
|
||||
addq $6,$0,$6
|
||||
ldq $4,32($18)
|
||||
cmpult $6,$0,$1
|
||||
addq $5,$6,$6
|
||||
cmpult $6,$5,$0
|
||||
stq $6,24($16)
|
||||
or $0,$1,$0
|
||||
|
||||
addq $17,32,$17
|
||||
addq $18,32,$18
|
||||
addq $16,32,$16
|
||||
bne $19,.Loop
|
||||
|
||||
.Lend: addq $4,$0,$4
|
||||
cmpult $4,$0,$1
|
||||
addq $3,$4,$4
|
||||
cmpult $4,$3,$0
|
||||
stq $4,0($16)
|
||||
or $0,$1,$0
|
||||
ret $31,($26),1
|
||||
|
||||
.end _gcry_mpih_add_n
|
||||
|
||||
122
grub-core/lib/libgcrypt/mpi/alpha/mpih-lshift.S
Normal file
122
grub-core/lib/libgcrypt/mpi/alpha/mpih-lshift.S
Normal file
|
|
@ -0,0 +1,122 @@
|
|||
/* alpha - left shift
|
||||
*
|
||||
* Copyright (C) 1994, 1995, 1998, 2001,
|
||||
* 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_lshift( mpi_ptr_t wp, (r16)
|
||||
* mpi_ptr_t up, (r17)
|
||||
* mpi_size_t usize, (r18)
|
||||
* unsigned cnt) (r19)
|
||||
*
|
||||
* This code runs at 4.8 cycles/limb on the 21064. With infinite unrolling,
|
||||
* it would take 4 cycles/limb. It should be possible to get down to 3
|
||||
* cycles/limb since both ldq and stq can be paired with the other used
|
||||
* instructions. But there are many restrictions in the 21064 pipeline that
|
||||
* makes it hard, if not impossible, to get down to 3 cycles/limb:
|
||||
*
|
||||
* 1. ldq has a 3 cycle delay, srl and sll have a 2 cycle delay.
|
||||
* 2. Only aligned instruction pairs can be paired.
|
||||
* 3. The store buffer or silo might not be able to deal with the bandwidth.
|
||||
*/
|
||||
|
||||
.set noreorder
|
||||
.set noat
|
||||
.text
|
||||
.align 3
|
||||
.globl _gcry_mpih_lshift
|
||||
.ent _gcry_mpih_lshift
|
||||
_gcry_mpih_lshift:
|
||||
.frame $30,0,$26,0
|
||||
|
||||
s8addq $18,$17,$17 # make r17 point at end of s1
|
||||
ldq $4,-8($17) # load first limb
|
||||
subq $17,8,$17
|
||||
subq $31,$19,$7
|
||||
s8addq $18,$16,$16 # make r16 point at end of RES
|
||||
subq $18,1,$18
|
||||
and $18,4-1,$20 # number of limbs in first loop
|
||||
srl $4,$7,$0 # compute function result
|
||||
|
||||
beq $20,.L0
|
||||
subq $18,$20,$18
|
||||
|
||||
.align 3
|
||||
.Loop0:
|
||||
ldq $3,-8($17)
|
||||
subq $16,8,$16
|
||||
subq $17,8,$17
|
||||
subq $20,1,$20
|
||||
sll $4,$19,$5
|
||||
srl $3,$7,$6
|
||||
bis $3,$3,$4
|
||||
bis $5,$6,$8
|
||||
stq $8,0($16)
|
||||
bne $20,.Loop0
|
||||
|
||||
.L0: beq $18,.Lend
|
||||
|
||||
.align 3
|
||||
.Loop: ldq $3,-8($17)
|
||||
subq $16,32,$16
|
||||
subq $18,4,$18
|
||||
sll $4,$19,$5
|
||||
srl $3,$7,$6
|
||||
|
||||
ldq $4,-16($17)
|
||||
sll $3,$19,$1
|
||||
bis $5,$6,$8
|
||||
stq $8,24($16)
|
||||
srl $4,$7,$2
|
||||
|
||||
ldq $3,-24($17)
|
||||
sll $4,$19,$5
|
||||
bis $1,$2,$8
|
||||
stq $8,16($16)
|
||||
srl $3,$7,$6
|
||||
|
||||
ldq $4,-32($17)
|
||||
sll $3,$19,$1
|
||||
bis $5,$6,$8
|
||||
stq $8,8($16)
|
||||
srl $4,$7,$2
|
||||
|
||||
subq $17,32,$17
|
||||
bis $1,$2,$8
|
||||
stq $8,0($16)
|
||||
|
||||
bgt $18,.Loop
|
||||
|
||||
.Lend: sll $4,$19,$8
|
||||
stq $8,-8($16)
|
||||
ret $31,($26),1
|
||||
.end _gcry_mpih_lshift
|
||||
|
||||
|
||||
90
grub-core/lib/libgcrypt/mpi/alpha/mpih-mul1.S
Normal file
90
grub-core/lib/libgcrypt/mpi/alpha/mpih-mul1.S
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
/* Alpha 21064 mpih-mul1.S -- Multiply a limb vector with a limb and store
|
||||
* the result in a second limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1995, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_mul_1( mpi_ptr_t res_ptr, (r16)
|
||||
* mpi_ptr_t s1_ptr, (r17)
|
||||
* mpi_size_t s1_size, (r18)
|
||||
* mpi_limb_t s2_limb) (r19)
|
||||
*
|
||||
* This code runs at 42 cycles/limb on the EV4 and 18 cycles/limb on the EV5.
|
||||
*
|
||||
* To improve performance for long multiplications, we would use
|
||||
* 'fetch' for S1 and 'fetch_m' for RES. It's not obvious how to use
|
||||
* these instructions without slowing down the general code: 1. We can
|
||||
* only have two prefetches in operation at any time in the Alpha
|
||||
* architecture. 2. There will seldom be any special alignment
|
||||
* between RES_PTR and S1_PTR. Maybe we can simply divide the current
|
||||
* loop into an inner and outer loop, having the inner loop handle
|
||||
* exactly one prefetch block?
|
||||
*/
|
||||
|
||||
.set noreorder
|
||||
.set noat
|
||||
.text
|
||||
.align 3
|
||||
.globl _gcry_mpih_mul_1
|
||||
.ent _gcry_mpih_mul_1 2
|
||||
_gcry_mpih_mul_1:
|
||||
.frame $30,0,$26
|
||||
|
||||
ldq $2,0($17) # $2 = s1_limb
|
||||
subq $18,1,$18 # size--
|
||||
mulq $2,$19,$3 # $3 = prod_low
|
||||
bic $31,$31,$4 # clear cy_limb
|
||||
umulh $2,$19,$0 # $0 = prod_high
|
||||
beq $18,Lend1 # jump if size was == 1
|
||||
ldq $2,8($17) # $2 = s1_limb
|
||||
subq $18,1,$18 # size--
|
||||
stq $3,0($16)
|
||||
beq $18,Lend2 # jump if size was == 2
|
||||
|
||||
.align 3
|
||||
Loop: mulq $2,$19,$3 # $3 = prod_low
|
||||
addq $4,$0,$0 # cy_limb = cy_limb + 'cy'
|
||||
subq $18,1,$18 # size--
|
||||
umulh $2,$19,$4 # $4 = cy_limb
|
||||
ldq $2,16($17) # $2 = s1_limb
|
||||
addq $17,8,$17 # s1_ptr++
|
||||
addq $3,$0,$3 # $3 = cy_limb + prod_low
|
||||
stq $3,8($16)
|
||||
cmpult $3,$0,$0 # $0 = carry from (cy_limb + prod_low)
|
||||
addq $16,8,$16 # res_ptr++
|
||||
bne $18,Loop
|
||||
|
||||
Lend2: mulq $2,$19,$3 # $3 = prod_low
|
||||
addq $4,$0,$0 # cy_limb = cy_limb + 'cy'
|
||||
umulh $2,$19,$4 # $4 = cy_limb
|
||||
addq $3,$0,$3 # $3 = cy_limb + prod_low
|
||||
cmpult $3,$0,$0 # $0 = carry from (cy_limb + prod_low)
|
||||
stq $3,8($16)
|
||||
addq $4,$0,$0 # cy_limb = prod_high + cy
|
||||
ret $31,($26),1
|
||||
Lend1: stq $3,0($16)
|
||||
ret $31,($26),1
|
||||
|
||||
.end _gcry_mpih_mul_1
|
||||
|
||||
|
||||
97
grub-core/lib/libgcrypt/mpi/alpha/mpih-mul2.S
Normal file
97
grub-core/lib/libgcrypt/mpi/alpha/mpih-mul2.S
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
/* Alpha 21064 addmul_1 -- Multiply a limb vector with a limb and add
|
||||
* the result to a second limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1995, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_addmul_1( mpi_ptr_t res_ptr, (r16)
|
||||
* mpi_ptr_t s1_ptr, (r17)
|
||||
* mpi_size_t s1_size, (r18)
|
||||
* mpi_limb_t s2_limb) (r19)
|
||||
*
|
||||
* This code runs at 42 cycles/limb on EV4 and 18 cycles/limb on EV5.
|
||||
*/
|
||||
|
||||
|
||||
.set noreorder
|
||||
.set noat
|
||||
.text
|
||||
.align 3
|
||||
.globl _gcry_mpih_addmul_1
|
||||
.ent _gcry_mpih_addmul_1 2
|
||||
_gcry_mpih_addmul_1:
|
||||
.frame $30,0,$26
|
||||
|
||||
ldq $2,0($17) # $2 = s1_limb
|
||||
addq $17,8,$17 # s1_ptr++
|
||||
subq $18,1,$18 # size--
|
||||
mulq $2,$19,$3 # $3 = prod_low
|
||||
ldq $5,0($16) # $5 = *res_ptr
|
||||
umulh $2,$19,$0 # $0 = prod_high
|
||||
beq $18,.Lend1 # jump if size was == 1
|
||||
ldq $2,0($17) # $2 = s1_limb
|
||||
addq $17,8,$17 # s1_ptr++
|
||||
subq $18,1,$18 # size--
|
||||
addq $5,$3,$3
|
||||
cmpult $3,$5,$4
|
||||
stq $3,0($16)
|
||||
addq $16,8,$16 # res_ptr++
|
||||
beq $18,.Lend2 # jump if size was == 2
|
||||
|
||||
.align 3
|
||||
.Loop: mulq $2,$19,$3 # $3 = prod_low
|
||||
ldq $5,0($16) # $5 = *res_ptr
|
||||
addq $4,$0,$0 # cy_limb = cy_limb + 'cy'
|
||||
subq $18,1,$18 # size--
|
||||
umulh $2,$19,$4 # $4 = cy_limb
|
||||
ldq $2,0($17) # $2 = s1_limb
|
||||
addq $17,8,$17 # s1_ptr++
|
||||
addq $3,$0,$3 # $3 = cy_limb + prod_low
|
||||
cmpult $3,$0,$0 # $0 = carry from (cy_limb + prod_low)
|
||||
addq $5,$3,$3
|
||||
cmpult $3,$5,$5
|
||||
stq $3,0($16)
|
||||
addq $16,8,$16 # res_ptr++
|
||||
addq $5,$0,$0 # combine carries
|
||||
bne $18,.Loop
|
||||
|
||||
.Lend2: mulq $2,$19,$3 # $3 = prod_low
|
||||
ldq $5,0($16) # $5 = *res_ptr
|
||||
addq $4,$0,$0 # cy_limb = cy_limb + 'cy'
|
||||
umulh $2,$19,$4 # $4 = cy_limb
|
||||
addq $3,$0,$3 # $3 = cy_limb + prod_low
|
||||
cmpult $3,$0,$0 # $0 = carry from (cy_limb + prod_low)
|
||||
addq $5,$3,$3
|
||||
cmpult $3,$5,$5
|
||||
stq $3,0($16)
|
||||
addq $5,$0,$0 # combine carries
|
||||
addq $4,$0,$0 # cy_limb = prod_high + cy
|
||||
ret $31,($26),1
|
||||
.Lend1: addq $5,$3,$3
|
||||
cmpult $3,$5,$5
|
||||
stq $3,0($16)
|
||||
addq $0,$5,$0
|
||||
ret $31,($26),1
|
||||
|
||||
.end _gcry_mpih_addmul_1
|
||||
|
||||
95
grub-core/lib/libgcrypt/mpi/alpha/mpih-mul3.S
Normal file
95
grub-core/lib/libgcrypt/mpi/alpha/mpih-mul3.S
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
/* Alpha 21064 submul_1 -- Multiply a limb vector with a limb and
|
||||
* subtract the result from a second limb vector.
|
||||
* Copyright (C) 1992, 1994, 1995, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_submul_1( mpi_ptr_t res_ptr, (r16 )
|
||||
* mpi_ptr_t s1_ptr, (r17 )
|
||||
* mpi_size_t s1_size, (r18 )
|
||||
* mpi_limb_t s2_limb) (r19 )
|
||||
*
|
||||
* This code runs at 42 cycles/limb on EV4 and 18 cycles/limb on EV5.
|
||||
*/
|
||||
|
||||
.set noreorder
|
||||
.set noat
|
||||
.text
|
||||
.align 3
|
||||
.globl _gcry_mpih_submul_1
|
||||
.ent _gcry_mpih_submul_1 2
|
||||
_gcry_mpih_submul_1:
|
||||
.frame $30,0,$26
|
||||
|
||||
ldq $2,0($17) # $2 = s1_limb
|
||||
addq $17,8,$17 # s1_ptr++
|
||||
subq $18,1,$18 # size--
|
||||
mulq $2,$19,$3 # $3 = prod_low
|
||||
ldq $5,0($16) # $5 = *res_ptr
|
||||
umulh $2,$19,$0 # $0 = prod_high
|
||||
beq $18,.Lend1 # jump if size was == 1
|
||||
ldq $2,0($17) # $2 = s1_limb
|
||||
addq $17,8,$17 # s1_ptr++
|
||||
subq $18,1,$18 # size--
|
||||
subq $5,$3,$3
|
||||
cmpult $5,$3,$4
|
||||
stq $3,0($16)
|
||||
addq $16,8,$16 # res_ptr++
|
||||
beq $18,.Lend2 # jump if size was == 2
|
||||
|
||||
.align 3
|
||||
.Loop: mulq $2,$19,$3 # $3 = prod_low
|
||||
ldq $5,0($16) # $5 = *res_ptr
|
||||
addq $4,$0,$0 # cy_limb = cy_limb + 'cy'
|
||||
subq $18,1,$18 # size--
|
||||
umulh $2,$19,$4 # $4 = cy_limb
|
||||
ldq $2,0($17) # $2 = s1_limb
|
||||
addq $17,8,$17 # s1_ptr++
|
||||
addq $3,$0,$3 # $3 = cy_limb + prod_low
|
||||
cmpult $3,$0,$0 # $0 = carry from (cy_limb + prod_low)
|
||||
subq $5,$3,$3
|
||||
cmpult $5,$3,$5
|
||||
stq $3,0($16)
|
||||
addq $16,8,$16 # res_ptr++
|
||||
addq $5,$0,$0 # combine carries
|
||||
bne $18,.Loop
|
||||
|
||||
.Lend2: mulq $2,$19,$3 # $3 = prod_low
|
||||
ldq $5,0($16) # $5 = *res_ptr
|
||||
addq $4,$0,$0 # cy_limb = cy_limb + 'cy'
|
||||
umulh $2,$19,$4 # $4 = cy_limb
|
||||
addq $3,$0,$3 # $3 = cy_limb + prod_low
|
||||
cmpult $3,$0,$0 # $0 = carry from (cy_limb + prod_low)
|
||||
subq $5,$3,$3
|
||||
cmpult $5,$3,$5
|
||||
stq $3,0($16)
|
||||
addq $5,$0,$0 # combine carries
|
||||
addq $4,$0,$0 # cy_limb = prod_high + cy
|
||||
ret $31,($26),1
|
||||
.Lend1: subq $5,$3,$3
|
||||
cmpult $5,$3,$5
|
||||
stq $3,0($16)
|
||||
addq $0,$5,$0
|
||||
ret $31,($26),1
|
||||
|
||||
.end _gcry_mpih_submul_1
|
||||
|
||||
118
grub-core/lib/libgcrypt/mpi/alpha/mpih-rshift.S
Normal file
118
grub-core/lib/libgcrypt/mpi/alpha/mpih-rshift.S
Normal file
|
|
@ -0,0 +1,118 @@
|
|||
/* alpha rshift
|
||||
* Copyright (C) 1994, 1995, 1998, 1999,
|
||||
* 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_rshift( mpi_ptr_t wp, (r16)
|
||||
* mpi_ptr_t up, (r17)
|
||||
* mpi_size_t usize, (r18)
|
||||
* unsigned cnt) (r19)
|
||||
*
|
||||
* This code runs at 4.8 cycles/limb on the 21064. With infinite unrolling,
|
||||
* it would take 4 cycles/limb. It should be possible to get down to 3
|
||||
* cycles/limb since both ldq and stq can be paired with the other used
|
||||
* instructions. But there are many restrictions in the 21064 pipeline that
|
||||
* makes it hard, if not impossible, to get down to 3 cycles/limb:
|
||||
*
|
||||
* 1. ldq has a 3 cycle delay, srl and sll have a 2 cycle delay.
|
||||
* 2. Only aligned instruction pairs can be paired.
|
||||
* 3. The store buffer or silo might not be able to deal with the bandwidth.
|
||||
*/
|
||||
|
||||
.set noreorder
|
||||
.set noat
|
||||
.text
|
||||
.align 3
|
||||
.globl _gcry_mpih_rshift
|
||||
.ent _gcry_mpih_rshift
|
||||
_gcry_mpih_rshift:
|
||||
.frame $30,0,$26,0
|
||||
|
||||
ldq $4,0($17) # load first limb
|
||||
addq $17,8,$17
|
||||
subq $31,$19,$7
|
||||
subq $18,1,$18
|
||||
and $18,4-1,$20 # number of limbs in first loop
|
||||
sll $4,$7,$0 # compute function result
|
||||
|
||||
beq $20,.R0
|
||||
subq $18,$20,$18
|
||||
|
||||
.align 3
|
||||
.Roop0:
|
||||
ldq $3,0($17)
|
||||
addq $16,8,$16
|
||||
addq $17,8,$17
|
||||
subq $20,1,$20
|
||||
srl $4,$19,$5
|
||||
sll $3,$7,$6
|
||||
bis $3,$3,$4
|
||||
bis $5,$6,$8
|
||||
stq $8,-8($16)
|
||||
bne $20,.Roop0
|
||||
|
||||
.R0: beq $18,.Rend
|
||||
|
||||
.align 3
|
||||
.Roop: ldq $3,0($17)
|
||||
addq $16,32,$16
|
||||
subq $18,4,$18
|
||||
srl $4,$19,$5
|
||||
sll $3,$7,$6
|
||||
|
||||
ldq $4,8($17)
|
||||
srl $3,$19,$1
|
||||
bis $5,$6,$8
|
||||
stq $8,-32($16)
|
||||
sll $4,$7,$2
|
||||
|
||||
ldq $3,16($17)
|
||||
srl $4,$19,$5
|
||||
bis $1,$2,$8
|
||||
stq $8,-24($16)
|
||||
sll $3,$7,$6
|
||||
|
||||
ldq $4,24($17)
|
||||
srl $3,$19,$1
|
||||
bis $5,$6,$8
|
||||
stq $8,-16($16)
|
||||
sll $4,$7,$2
|
||||
|
||||
addq $17,32,$17
|
||||
bis $1,$2,$8
|
||||
stq $8,-8($16)
|
||||
|
||||
bgt $18,.Roop
|
||||
|
||||
.Rend: srl $4,$19,$8
|
||||
stq $8,0($16)
|
||||
ret $31,($26),1
|
||||
.end _gcry_mpih_rshift
|
||||
|
||||
124
grub-core/lib/libgcrypt/mpi/alpha/mpih-sub1.S
Normal file
124
grub-core/lib/libgcrypt/mpi/alpha/mpih-sub1.S
Normal file
|
|
@ -0,0 +1,124 @@
|
|||
/* Alpha sub_n -- Subtract two limb vectors of the same length > 0 and
|
||||
* store difference in a third limb vector.
|
||||
* Copyright (C) 1995, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_sub_n( mpi_ptr_t res_ptr, (r16)
|
||||
* mpi_ptr_t s1_ptr, (r17)
|
||||
* mpi_ptr_t s2_ptr, (r18)
|
||||
* mpi_size_t size) (r19)
|
||||
*/
|
||||
|
||||
.set noreorder
|
||||
.set noat
|
||||
.text
|
||||
.align 3
|
||||
.globl _gcry_mpih_sub_n
|
||||
.ent _gcry_mpih_sub_n
|
||||
_gcry_mpih_sub_n:
|
||||
.frame $30,0,$26,0
|
||||
|
||||
ldq $3,0($17)
|
||||
ldq $4,0($18)
|
||||
|
||||
subq $19,1,$19
|
||||
and $19,4-1,$2 # number of limbs in first loop
|
||||
bis $31,$31,$0
|
||||
beq $2,.L0 # if multiple of 4 limbs, skip first loop
|
||||
|
||||
subq $19,$2,$19
|
||||
|
||||
.Loop0: subq $2,1,$2
|
||||
ldq $5,8($17)
|
||||
addq $4,$0,$4
|
||||
ldq $6,8($18)
|
||||
cmpult $4,$0,$1
|
||||
subq $3,$4,$4
|
||||
cmpult $3,$4,$0
|
||||
stq $4,0($16)
|
||||
or $0,$1,$0
|
||||
|
||||
addq $17,8,$17
|
||||
addq $18,8,$18
|
||||
bis $5,$5,$3
|
||||
bis $6,$6,$4
|
||||
addq $16,8,$16
|
||||
bne $2,.Loop0
|
||||
|
||||
.L0: beq $19,.Lend
|
||||
|
||||
.align 3
|
||||
.Loop: subq $19,4,$19
|
||||
|
||||
ldq $5,8($17)
|
||||
addq $4,$0,$4
|
||||
ldq $6,8($18)
|
||||
cmpult $4,$0,$1
|
||||
subq $3,$4,$4
|
||||
cmpult $3,$4,$0
|
||||
stq $4,0($16)
|
||||
or $0,$1,$0
|
||||
|
||||
ldq $3,16($17)
|
||||
addq $6,$0,$6
|
||||
ldq $4,16($18)
|
||||
cmpult $6,$0,$1
|
||||
subq $5,$6,$6
|
||||
cmpult $5,$6,$0
|
||||
stq $6,8($16)
|
||||
or $0,$1,$0
|
||||
|
||||
ldq $5,24($17)
|
||||
addq $4,$0,$4
|
||||
ldq $6,24($18)
|
||||
cmpult $4,$0,$1
|
||||
subq $3,$4,$4
|
||||
cmpult $3,$4,$0
|
||||
stq $4,16($16)
|
||||
or $0,$1,$0
|
||||
|
||||
ldq $3,32($17)
|
||||
addq $6,$0,$6
|
||||
ldq $4,32($18)
|
||||
cmpult $6,$0,$1
|
||||
subq $5,$6,$6
|
||||
cmpult $5,$6,$0
|
||||
stq $6,24($16)
|
||||
or $0,$1,$0
|
||||
|
||||
addq $17,32,$17
|
||||
addq $18,32,$18
|
||||
addq $16,32,$16
|
||||
bne $19,.Loop
|
||||
|
||||
.Lend: addq $4,$0,$4
|
||||
cmpult $4,$0,$1
|
||||
subq $3,$4,$4
|
||||
cmpult $3,$4,$0
|
||||
stq $4,0($16)
|
||||
or $0,$1,$0
|
||||
ret $31,($26),1
|
||||
|
||||
.end _gcry_mpih_sub_n
|
||||
|
||||
|
||||
159
grub-core/lib/libgcrypt/mpi/alpha/udiv-qrnnd.S
Normal file
159
grub-core/lib/libgcrypt/mpi/alpha/udiv-qrnnd.S
Normal file
|
|
@ -0,0 +1,159 @@
|
|||
/* Alpha 21064 __udiv_qrnnd
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1995, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
.set noreorder
|
||||
.set noat
|
||||
.text
|
||||
.align 3
|
||||
.globl __udiv_qrnnd
|
||||
.ent __udiv_qrnnd
|
||||
__udiv_qrnnd:
|
||||
.frame $30,0,$26,0
|
||||
.prologue 0
|
||||
#define cnt $2
|
||||
#define tmp $3
|
||||
#define rem_ptr $16
|
||||
#define n1 $17
|
||||
#define n0 $18
|
||||
#define d $19
|
||||
#define qb $20
|
||||
|
||||
ldiq cnt,16
|
||||
blt d,.Largedivisor
|
||||
|
||||
.Loop1: cmplt n0,0,tmp
|
||||
addq n1,n1,n1
|
||||
bis n1,tmp,n1
|
||||
addq n0,n0,n0
|
||||
cmpule d,n1,qb
|
||||
subq n1,d,tmp
|
||||
cmovne qb,tmp,n1
|
||||
bis n0,qb,n0
|
||||
cmplt n0,0,tmp
|
||||
addq n1,n1,n1
|
||||
bis n1,tmp,n1
|
||||
addq n0,n0,n0
|
||||
cmpule d,n1,qb
|
||||
subq n1,d,tmp
|
||||
cmovne qb,tmp,n1
|
||||
bis n0,qb,n0
|
||||
cmplt n0,0,tmp
|
||||
addq n1,n1,n1
|
||||
bis n1,tmp,n1
|
||||
addq n0,n0,n0
|
||||
cmpule d,n1,qb
|
||||
subq n1,d,tmp
|
||||
cmovne qb,tmp,n1
|
||||
bis n0,qb,n0
|
||||
cmplt n0,0,tmp
|
||||
addq n1,n1,n1
|
||||
bis n1,tmp,n1
|
||||
addq n0,n0,n0
|
||||
cmpule d,n1,qb
|
||||
subq n1,d,tmp
|
||||
cmovne qb,tmp,n1
|
||||
bis n0,qb,n0
|
||||
subq cnt,1,cnt
|
||||
bgt cnt,.Loop1
|
||||
stq n1,0(rem_ptr)
|
||||
bis $31,n0,$0
|
||||
ret $31,($26),1
|
||||
|
||||
.Largedivisor:
|
||||
and n0,1,$4
|
||||
|
||||
srl n0,1,n0
|
||||
sll n1,63,tmp
|
||||
or tmp,n0,n0
|
||||
srl n1,1,n1
|
||||
|
||||
and d,1,$6
|
||||
srl d,1,$5
|
||||
addq $5,$6,$5
|
||||
|
||||
.Loop2: cmplt n0,0,tmp
|
||||
addq n1,n1,n1
|
||||
bis n1,tmp,n1
|
||||
addq n0,n0,n0
|
||||
cmpule $5,n1,qb
|
||||
subq n1,$5,tmp
|
||||
cmovne qb,tmp,n1
|
||||
bis n0,qb,n0
|
||||
cmplt n0,0,tmp
|
||||
addq n1,n1,n1
|
||||
bis n1,tmp,n1
|
||||
addq n0,n0,n0
|
||||
cmpule $5,n1,qb
|
||||
subq n1,$5,tmp
|
||||
cmovne qb,tmp,n1
|
||||
bis n0,qb,n0
|
||||
cmplt n0,0,tmp
|
||||
addq n1,n1,n1
|
||||
bis n1,tmp,n1
|
||||
addq n0,n0,n0
|
||||
cmpule $5,n1,qb
|
||||
subq n1,$5,tmp
|
||||
cmovne qb,tmp,n1
|
||||
bis n0,qb,n0
|
||||
cmplt n0,0,tmp
|
||||
addq n1,n1,n1
|
||||
bis n1,tmp,n1
|
||||
addq n0,n0,n0
|
||||
cmpule $5,n1,qb
|
||||
subq n1,$5,tmp
|
||||
cmovne qb,tmp,n1
|
||||
bis n0,qb,n0
|
||||
subq cnt,1,cnt
|
||||
bgt cnt,.Loop2
|
||||
|
||||
addq n1,n1,n1
|
||||
addq $4,n1,n1
|
||||
bne $6,.LOdd
|
||||
stq n1,0(rem_ptr)
|
||||
bis $31,n0,$0
|
||||
ret $31,($26),1
|
||||
|
||||
.LOdd:
|
||||
/* q' in n0. r' in n1 */
|
||||
addq n1,n0,n1
|
||||
cmpult n1,n0,tmp # tmp := carry from addq
|
||||
beq tmp,.LLp6
|
||||
addq n0,1,n0
|
||||
subq n1,d,n1
|
||||
.LLp6: cmpult n1,d,tmp
|
||||
bne tmp,.LLp7
|
||||
addq n0,1,n0
|
||||
subq n1,d,n1
|
||||
.LLp7:
|
||||
stq n1,0(rem_ptr)
|
||||
bis $31,n0,$0
|
||||
ret $31,($26),1
|
||||
|
||||
.end __udiv_qrnnd
|
||||
7
grub-core/lib/libgcrypt/mpi/amd64/distfiles
Normal file
7
grub-core/lib/libgcrypt/mpi/amd64/distfiles
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
mpih-add1.S
|
||||
mpih-lshift.S
|
||||
mpih-mul1.S
|
||||
mpih-mul2.S
|
||||
mpih-mul3.S
|
||||
mpih-rshift.S
|
||||
mpih-sub1.S
|
||||
63
grub-core/lib/libgcrypt/mpi/amd64/mpih-add1.S
Normal file
63
grub-core/lib/libgcrypt/mpi/amd64/mpih-add1.S
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
/* AMD64 (x86_64) add_n -- Add two limb vectors of the same length > 0 and store
|
||||
* sum in a third limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1995, 1998,
|
||||
* 2001, 2002, 2006 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_add_n( mpi_ptr_t res_ptr, rdi
|
||||
* mpi_ptr_t s1_ptr, rsi
|
||||
* mpi_ptr_t s2_ptr, rdx
|
||||
* mpi_size_t size) rcx
|
||||
*/
|
||||
|
||||
.text
|
||||
.globl C_SYMBOL_NAME(_gcry_mpih_add_n)
|
||||
C_SYMBOL_NAME(_gcry_mpih_add_n:)
|
||||
leaq (%rsi,%rcx,8), %rsi
|
||||
leaq (%rdi,%rcx,8), %rdi
|
||||
leaq (%rdx,%rcx,8), %rdx
|
||||
negq %rcx
|
||||
xorl %eax, %eax /* clear cy */
|
||||
|
||||
ALIGN(4) /* minimal alignment for claimed speed */
|
||||
.Loop: movq (%rsi,%rcx,8), %rax
|
||||
movq (%rdx,%rcx,8), %r10
|
||||
adcq %r10, %rax
|
||||
movq %rax, (%rdi,%rcx,8)
|
||||
incq %rcx
|
||||
jne .Loop
|
||||
|
||||
movq %rcx, %rax /* zero %rax */
|
||||
adcq %rax, %rax
|
||||
ret
|
||||
|
||||
77
grub-core/lib/libgcrypt/mpi/amd64/mpih-lshift.S
Normal file
77
grub-core/lib/libgcrypt/mpi/amd64/mpih-lshift.S
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
/* AMD64 (x86_64) lshift -- Left shift a limb vector and store
|
||||
* result in a second limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1995, 1998,
|
||||
* 2001, 2002, 2006 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_lshift( mpi_ptr_t wp, rdi
|
||||
* mpi_ptr_t up, rsi
|
||||
* mpi_size_t usize, rdx
|
||||
* unsigned cnt) rcx
|
||||
*/
|
||||
|
||||
.text
|
||||
.globl C_SYMBOL_NAME(_gcry_mpih_lshift)
|
||||
C_SYMBOL_NAME(_gcry_mpih_lshift:)
|
||||
movq -8(%rsi,%rdx,8), %mm7
|
||||
movd %ecx, %mm1
|
||||
movl $64, %eax
|
||||
subl %ecx, %eax
|
||||
movd %eax, %mm0
|
||||
movq %mm7, %mm3
|
||||
psrlq %mm0, %mm7
|
||||
movd %mm7, %rax
|
||||
subq $2, %rdx
|
||||
jl .Lendo
|
||||
|
||||
ALIGN(4) /* minimal alignment for claimed speed */
|
||||
.Loop: movq (%rsi,%rdx,8), %mm6
|
||||
movq %mm6, %mm2
|
||||
psrlq %mm0, %mm6
|
||||
psllq %mm1, %mm3
|
||||
por %mm6, %mm3
|
||||
movq %mm3, 8(%rdi,%rdx,8)
|
||||
je .Lende
|
||||
movq -8(%rsi,%rdx,8), %mm7
|
||||
movq %mm7, %mm3
|
||||
psrlq %mm0, %mm7
|
||||
psllq %mm1, %mm2
|
||||
por %mm7, %mm2
|
||||
movq %mm2, (%rdi,%rdx,8)
|
||||
subq $2, %rdx
|
||||
jge .Loop
|
||||
|
||||
.Lendo: movq %mm3, %mm2
|
||||
.Lende: psllq %mm1, %mm2
|
||||
movq %mm2, (%rdi)
|
||||
emms
|
||||
ret
|
||||
65
grub-core/lib/libgcrypt/mpi/amd64/mpih-mul1.S
Normal file
65
grub-core/lib/libgcrypt/mpi/amd64/mpih-mul1.S
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
/* AMD64 mul_1 -- Multiply a limb vector with a limb and store
|
||||
* the result in a second limb vector.
|
||||
* Copyright (C) 1992, 1994, 1998,
|
||||
* 2001, 2002, 2006 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_mul_1( mpi_ptr_t res_ptr, (rdi)
|
||||
* mpi_ptr_t s1_ptr, (rsi)
|
||||
* mpi_size_t s1_size, (rdx)
|
||||
* mpi_limb_t s2_limb) (rcx)
|
||||
*/
|
||||
|
||||
|
||||
TEXT
|
||||
ALIGN(5)
|
||||
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
|
||||
GLOBL C_SYMBOL_NAME(_gcry_mpih_mul_1)
|
||||
C_SYMBOL_NAME(_gcry_mpih_mul_1:)
|
||||
|
||||
movq %rdx, %r11
|
||||
leaq (%rsi,%rdx,8), %rsi
|
||||
leaq (%rdi,%rdx,8), %rdi
|
||||
negq %r11
|
||||
xorl %r8d, %r8d
|
||||
|
||||
.Loop: movq (%rsi,%r11,8), %rax
|
||||
mulq %rcx
|
||||
addq %r8, %rax
|
||||
movl $0, %r8d
|
||||
adcq %rdx, %r8
|
||||
movq %rax, (%rdi,%r11,8)
|
||||
incq %r11
|
||||
jne .Loop
|
||||
|
||||
movq %r8, %rax
|
||||
ret
|
||||
107
grub-core/lib/libgcrypt/mpi/amd64/mpih-mul2.S
Normal file
107
grub-core/lib/libgcrypt/mpi/amd64/mpih-mul2.S
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
/* AMD64 addmul2 -- Multiply a limb vector with a limb and add
|
||||
* the result to a second limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1998,
|
||||
* 2001, 2002, 2006 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_addmul_2( mpi_ptr_t res_ptr, (sp + 4)
|
||||
* mpi_ptr_t s1_ptr, (sp + 8)
|
||||
* mpi_size_t s1_size, (sp + 12)
|
||||
* mpi_limb_t s2_limb) (sp + 16)
|
||||
*/
|
||||
|
||||
/* i80386 addmul_1 -- Multiply a limb vector with a limb and add
|
||||
* the result to a second limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_addmul_1( mpi_ptr_t res_ptr, (rdi)
|
||||
* mpi_ptr_t s1_ptr, (rsi)
|
||||
* mpi_size_t s1_size, (rdx)
|
||||
* mpi_limb_t s2_limb) (rcx)
|
||||
*/
|
||||
TEXT
|
||||
GLOBL C_SYMBOL_NAME(_gcry_mpih_addmul_1)
|
||||
C_SYMBOL_NAME(_gcry_mpih_addmul_1:)
|
||||
movq %rdx, %r11
|
||||
leaq (%rsi,%rdx,8), %rsi
|
||||
leaq (%rdi,%rdx,8), %rdi
|
||||
negq %r11
|
||||
xorl %r8d, %r8d
|
||||
xorl %r10d, %r10d
|
||||
|
||||
ALIGN(3) /* minimal alignment for claimed speed */
|
||||
.Loop: movq (%rsi,%r11,8), %rax
|
||||
mulq %rcx
|
||||
addq (%rdi,%r11,8), %rax
|
||||
adcq %r10, %rdx
|
||||
addq %r8, %rax
|
||||
movq %r10, %r8
|
||||
movq %rax, (%rdi,%r11,8)
|
||||
adcq %rdx, %r8
|
||||
incq %r11
|
||||
jne .Loop
|
||||
|
||||
movq %r8, %rax
|
||||
ret
|
||||
66
grub-core/lib/libgcrypt/mpi/amd64/mpih-mul3.S
Normal file
66
grub-core/lib/libgcrypt/mpi/amd64/mpih-mul3.S
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
/* AMD64 submul_1 -- Multiply a limb vector with a limb and add
|
||||
* the result to a second limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1998,
|
||||
* 2001, 2002, 2006 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_submul_1( mpi_ptr_t res_ptr, (rdi)
|
||||
* mpi_ptr_t s1_ptr, (rsi)
|
||||
* mpi_size_t s1_size, (rdx)
|
||||
* mpi_limb_t s2_limb) (rcx)
|
||||
*/
|
||||
TEXT
|
||||
GLOBL C_SYMBOL_NAME(_gcry_mpih_submul_1)
|
||||
C_SYMBOL_NAME(_gcry_mpih_submul_1:)
|
||||
|
||||
movq %rdx, %r11
|
||||
leaq (%rsi,%r11,8), %rsi
|
||||
leaq (%rdi,%r11,8), %rdi
|
||||
negq %r11
|
||||
xorl %r8d, %r8d
|
||||
|
||||
ALIGN(3) /* minimal alignment for claimed speed */
|
||||
.Loop: movq (%rsi,%r11,8), %rax
|
||||
movq (%rdi,%r11,8), %r10
|
||||
mulq %rcx
|
||||
subq %r8, %r10
|
||||
movl $0, %r8d
|
||||
adcl %r8d, %r8d
|
||||
subq %rax, %r10
|
||||
adcq %rdx, %r8
|
||||
movq %r10, (%rdi,%r11,8)
|
||||
incq %r11
|
||||
jne .Loop
|
||||
|
||||
movq %r8, %rax
|
||||
ret
|
||||
80
grub-core/lib/libgcrypt/mpi/amd64/mpih-rshift.S
Normal file
80
grub-core/lib/libgcrypt/mpi/amd64/mpih-rshift.S
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
/* AMD64 (x86_64) rshift -- Right shift a limb vector and store
|
||||
* result in a second limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1995, 1998,
|
||||
* 2001, 2002, 2006 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_rshift( mpi_ptr_t wp, rdi
|
||||
* mpi_ptr_t up, rsi
|
||||
* mpi_size_t usize, rdx
|
||||
* unsigned cnt) rcx
|
||||
*/
|
||||
|
||||
.text
|
||||
.globl C_SYMBOL_NAME(_gcry_mpih_rshift)
|
||||
C_SYMBOL_NAME(_gcry_mpih_rshift:)
|
||||
movq (%rsi), %mm7
|
||||
movd %ecx, %mm1
|
||||
movl $64, %eax
|
||||
subl %ecx, %eax
|
||||
movd %eax, %mm0
|
||||
movq %mm7, %mm3
|
||||
psllq %mm0, %mm7
|
||||
movd %mm7, %rax
|
||||
leaq (%rsi,%rdx,8), %rsi
|
||||
leaq (%rdi,%rdx,8), %rdi
|
||||
negq %rdx
|
||||
addq $2, %rdx
|
||||
jg .Lendo
|
||||
|
||||
ALIGN(8) /* minimal alignment for claimed speed */
|
||||
.Loop: movq -8(%rsi,%rdx,8), %mm6
|
||||
movq %mm6, %mm2
|
||||
psllq %mm0, %mm6
|
||||
psrlq %mm1, %mm3
|
||||
por %mm6, %mm3
|
||||
movq %mm3, -16(%rdi,%rdx,8)
|
||||
je .Lende
|
||||
movq (%rsi,%rdx,8), %mm7
|
||||
movq %mm7, %mm3
|
||||
psllq %mm0, %mm7
|
||||
psrlq %mm1, %mm2
|
||||
por %mm7, %mm2
|
||||
movq %mm2, -8(%rdi,%rdx,8)
|
||||
addq $2, %rdx
|
||||
jle .Loop
|
||||
|
||||
.Lendo: movq %mm3, %mm2
|
||||
.Lende: psrlq %mm1, %mm2
|
||||
movq %mm2, -8(%rdi)
|
||||
emms
|
||||
ret
|
||||
61
grub-core/lib/libgcrypt/mpi/amd64/mpih-sub1.S
Normal file
61
grub-core/lib/libgcrypt/mpi/amd64/mpih-sub1.S
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
/* AMD64 (x86_64) sub_n -- Subtract two limb vectors of the same length > 0 and store
|
||||
* sum in a third limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1995, 1998,
|
||||
* 2001, 2002, 2006 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_sub_n( mpi_ptr_t res_ptr, rdi
|
||||
* mpi_ptr_t s1_ptr, rsi
|
||||
* mpi_ptr_t s2_ptr, rdx
|
||||
* mpi_size_t size) rcx
|
||||
*/
|
||||
.text
|
||||
.globl C_SYMBOL_NAME(_gcry_mpih_sub_n)
|
||||
C_SYMBOL_NAME(_gcry_mpih_sub_n:)
|
||||
leaq (%rsi,%rcx,8), %rsi
|
||||
leaq (%rdi,%rcx,8), %rdi
|
||||
leaq (%rdx,%rcx,8), %rdx
|
||||
negq %rcx
|
||||
xorl %eax, %eax /* clear cy */
|
||||
|
||||
ALIGN(4) /* minimal alignment for claimed speed */
|
||||
.Loop: movq (%rsi,%rcx,8), %rax
|
||||
movq (%rdx,%rcx,8), %r10
|
||||
sbbq %r10, %rax
|
||||
movq %rax, (%rdi,%rcx,8)
|
||||
incq %rcx
|
||||
jne .Loop
|
||||
|
||||
movq %rcx, %rax /* zero %rax */
|
||||
adcq %rax, %rax
|
||||
ret
|
||||
360
grub-core/lib/libgcrypt/mpi/config.links
Normal file
360
grub-core/lib/libgcrypt/mpi/config.links
Normal file
|
|
@ -0,0 +1,360 @@
|
|||
# config.links - helper for ../configure -*- mode: sh -*-
|
||||
# Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of Libgcrypt.
|
||||
#
|
||||
# Libgcrypt is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as
|
||||
# published by the Free Software Foundation; either version 2.1 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# Libgcrypt is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
#
|
||||
# sourced by ../configure to get the list of files to link
|
||||
# this should set $mpi_ln_list.
|
||||
# Note: this is called from the above directory.
|
||||
|
||||
mpi_sflags=
|
||||
mpi_extra_modules=
|
||||
|
||||
test -d ./mpi || mkdir ./mpi
|
||||
|
||||
# We grep the list of modules from the Makefile so that
|
||||
# we don't need to maintain them here.
|
||||
mpi_standard_modules=`$AWK '/^#BEGIN_ASM_LIST/,/^#END_ASM_LIST/ {
|
||||
if( $3 != "O" ) print $2 }' $srcdir/mpi/Makefile.am`
|
||||
mpi_optional_modules=`$AWK '/^#BEGIN_ASM_LIST/,/^#END_ASM_LIST/ {
|
||||
if( $3 == "O" ) print $2 }' $srcdir/mpi/Makefile.am`
|
||||
|
||||
|
||||
echo '/* created by config.links - do not edit */' >./mpi/asm-syntax.h
|
||||
echo "/* Host: ${host} */" >>./mpi/asm-syntax.h
|
||||
|
||||
if test "$try_asm_modules" = "yes" ; then
|
||||
case "${host}" in
|
||||
powerpc-apple-darwin* | \
|
||||
i[34567]86*-*-openbsd[12]* | \
|
||||
i[34567]86*-*-openbsd3.[0123]*)
|
||||
echo '/* No working assembler modules available */' >>./mpi/asm-syntax.h
|
||||
path=""
|
||||
;;
|
||||
i[3467]86*-*-openbsd* | \
|
||||
i[3467]86*-*-freebsd*-elf | \
|
||||
i[3467]86*-*-freebsd[3-9]* | \
|
||||
i[3467]86*-*-freebsdelf* | \
|
||||
i[3467]86*-*-netbsd* | \
|
||||
i[3467]86*-*-k*bsd*)
|
||||
echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
|
||||
cat $srcdir/mpi/i386/syntax.h >>./mpi/asm-syntax.h
|
||||
path="i386"
|
||||
;;
|
||||
i586*-*-openbsd* | \
|
||||
i586*-*-freebsd*-elf | \
|
||||
i586*-*-freebsd[3-9]* | \
|
||||
i586*-*-freebsdelf* | \
|
||||
i586*-*-netbsd* | \
|
||||
i586*-*-k*bsd* | \
|
||||
pentium-*-netbsd* | \
|
||||
pentiumpro-*-netbsd*)
|
||||
echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
|
||||
cat $srcdir/mpi/i386/syntax.h >>./mpi/asm-syntax.h
|
||||
path="i586 i386"
|
||||
;;
|
||||
i[34]86*-*-bsdi4*)
|
||||
echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
|
||||
cat $srcdir/mpi/i386/syntax.h >>./mpi/asm-syntax.h
|
||||
path="i386"
|
||||
;;
|
||||
i[3467]86*-*-linuxaout* | \
|
||||
i[3467]86*-*-linuxoldld* | \
|
||||
i[3467]86*-*-*bsd*)
|
||||
echo '#define BSD_SYNTAX' >>./mpi/asm-syntax.h
|
||||
echo '#define X86_BROKEN_ALIGN' >>./mpi/asm-syntax.h
|
||||
cat $srcdir/mpi/i386/syntax.h >>./mpi/asm-syntax.h
|
||||
path="i386"
|
||||
;;
|
||||
i586*-*-linuxaout* | \
|
||||
i586*-*-linuxoldld* | \
|
||||
i586*-*-*bsd*)
|
||||
echo '#define BSD_SYNTAX' >>./mpi/asm-syntax.h
|
||||
echo '#define X86_BROKEN_ALIGN' >>./mpi/asm-syntax.h
|
||||
cat $srcdir/mpi/i386/syntax.h >>./mpi/asm-syntax.h
|
||||
path="i586 i386"
|
||||
;;
|
||||
i[3467]86*-msdosdjgpp* | \
|
||||
i[34]86*-apple-darwin*)
|
||||
echo '#define BSD_SYNTAX' >>./mpi/asm-syntax.h
|
||||
cat $srcdir/mpi/i386/syntax.h >>./mpi/asm-syntax.h
|
||||
path="i386"
|
||||
;;
|
||||
i586*-msdosdjgpp* | \
|
||||
i[567]86*-apple-darwin*)
|
||||
echo '#define BSD_SYNTAX' >>./mpi/asm-syntax.h
|
||||
cat $srcdir/mpi/i386/syntax.h >>./mpi/asm-syntax.h
|
||||
path="i586 i386"
|
||||
;;
|
||||
i[3467]86*-*-*)
|
||||
echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
|
||||
cat $srcdir/mpi/i386/syntax.h >>./mpi/asm-syntax.h
|
||||
path="i386"
|
||||
;;
|
||||
i586*-*-* | \
|
||||
pentium-*-* | \
|
||||
pentiumpro-*-*)
|
||||
echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
|
||||
cat $srcdir/mpi/i386/syntax.h >>./mpi/asm-syntax.h
|
||||
path="i586 i386"
|
||||
;;
|
||||
x86_64-*-*)
|
||||
echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
|
||||
cat $srcdir/mpi/i386/syntax.h >>./mpi/asm-syntax.h
|
||||
path="amd64"
|
||||
;;
|
||||
alpha*-*-*)
|
||||
echo '/* configured for alpha */' >>./mpi/asm-syntax.h
|
||||
path="alpha"
|
||||
mpi_extra_modules="udiv-qrnnd"
|
||||
;;
|
||||
hppa7000*-*-*)
|
||||
echo '/* configured for HPPA (pa7000) */' >>./mpi/asm-syntax.h
|
||||
path="hppa1.1 hppa"
|
||||
mpi_extra_modules="udiv-qrnnd"
|
||||
;;
|
||||
hppa1.0*-*-*)
|
||||
echo '/* configured for HPPA 1.0 */' >>./mpi/asm-syntax.h
|
||||
path="hppa"
|
||||
mpi_extra_modules="udiv-qrnnd"
|
||||
;;
|
||||
hppa*-*-*) # assume pa7100
|
||||
echo '/* configured for HPPA (pa7100) */' >>./mpi/asm-syntax.h
|
||||
path="pa7100 hppa1.1 hppa"
|
||||
mpi_extra_modules="udiv-qrnnd"
|
||||
;;
|
||||
sparc64-*-linux-gnu)
|
||||
echo '/* No working assembler modules available */' >>./mpi/asm-syntax.h
|
||||
path=""
|
||||
;;
|
||||
sparc64-sun-solaris2*)
|
||||
echo '/* No working assembler modules available */' >>./mpi/asm-syntax.h
|
||||
path=""
|
||||
;;
|
||||
sparc64-*-netbsd* | sparc64-*-freebsd* | sparc64-*-openbsd*)
|
||||
# There are no sparc64 assembler modules that work on the
|
||||
# *BSDs, so use the generic C functions.
|
||||
echo '/* No working assembler modules available */' >>./mpi/asm-syntax.h
|
||||
path=""
|
||||
;;
|
||||
sparc64*-*-*)
|
||||
echo '/* No working assembler modules available */' >>./mpi/asm-syntax.h
|
||||
path=""
|
||||
;;
|
||||
sparc9*-*-* | \
|
||||
ultrasparc*-*-* )
|
||||
echo '/* configured for sparc9 or higher */' >>./mpi/asm-syntax.h
|
||||
path="sparc32v8 sparc32"
|
||||
;;
|
||||
sparc8*-*-* | \
|
||||
microsparc*-*-*)
|
||||
echo '/* configured for sparc8 */' >>./mpi/asm-syntax.h
|
||||
path="sparc32v8 sparc32"
|
||||
;;
|
||||
supersparc*-*-*)
|
||||
echo '/* configured for supersparc */' >>./mpi/asm-syntax.h
|
||||
path="supersparc sparc32v8 sparc32"
|
||||
mpi_extra_modules="udiv"
|
||||
;;
|
||||
sparc*-*-*)
|
||||
echo '/* configured for sparc */' >>./mpi/asm-syntax.h
|
||||
path="sparc32"
|
||||
mpi_extra_modules="udiv"
|
||||
;;
|
||||
mips[34]*-*-* | \
|
||||
mips*-*-irix6*)
|
||||
echo '/* configured for MIPS3 */' >>./mpi/asm-syntax.h
|
||||
path="mips3"
|
||||
;;
|
||||
mips*-*-*)
|
||||
echo '/* configured for MIPS2 */' >>./mpi/asm-syntax.h
|
||||
path="mips2"
|
||||
;;
|
||||
|
||||
# Motorola 68k configurations. Let m68k mean 68020-68040.
|
||||
# mc68000 or mc68060 configurations need to be specified explicitly
|
||||
m680[234]0*-*-linuxaout* | \
|
||||
m68k*-*-linuxaout*)
|
||||
echo '#define MIT_SYNTAX' >>./mpi/asm-syntax.h
|
||||
cat $srcdir/mpi/m68k/syntax.h >>./mpi/asm-syntax.h
|
||||
path="m68k/mc68020 m68k"
|
||||
;;
|
||||
m68060*-*-linuxaout*)
|
||||
echo '#define MIT_SYNTAX' >>./mpi/asm-syntax.h
|
||||
cat $srcdir/mpi/m68k/syntax.h >>./mpi/asm-syntax.h
|
||||
path="m68k"
|
||||
;;
|
||||
m680[234]0*-*-linux* | \
|
||||
m68k*-*-linux*)
|
||||
echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
|
||||
cat $srcdir/mpi/m68k/syntax.h >>./mpi/asm-syntax.h
|
||||
;;
|
||||
m68060*-*-linux*)
|
||||
echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
|
||||
cat $srcdir/mpi/m68k/syntax.h >>./mpi/asm-syntax.h
|
||||
path="m68k"
|
||||
;;
|
||||
m68k-atari-mint)
|
||||
echo '#define MIT_SYNTAX' >>./mpi/asm-syntax.h
|
||||
cat $srcdir/mpi/m68k/syntax.h >>./mpi/asm-syntax.h
|
||||
path="m68k/mc68020 m68k"
|
||||
;;
|
||||
m68000*-*-* | \
|
||||
m68060*-*-*)
|
||||
echo '#define MIT_SYNTAX' >>./mpi/asm-syntax.h
|
||||
cat $srcdir/mpi/m68k/syntax.h >>./mpi/asm-syntax.h
|
||||
path="m68k/mc68000"
|
||||
;;
|
||||
m680[234]0*-*-* | \
|
||||
m68k*-*-*)
|
||||
echo '#define MIT_SYNTAX' >>./mpi/asm-syntax.h
|
||||
cat $srcdir/mpi/m68k/syntax.h >>./mpi/asm-syntax.h
|
||||
path="m68k/mc68020 m68k"
|
||||
;;
|
||||
|
||||
powerpc*-*-netbsd* | powerpc*-*-openbsd*)
|
||||
echo '/* configured {Open,Net}BSD on powerpc */' >>./mpi/asm-syntax.h
|
||||
echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
|
||||
cat $srcdir/mpi/powerpc32/syntax.h >>./mpi/asm-syntax.h
|
||||
mpi_sflags="-Wa,-mppc"
|
||||
path="powerpc32"
|
||||
;;
|
||||
|
||||
ppc620-*-* | \
|
||||
powerpc64*-*-*)
|
||||
mpi_sflags="-Wa,-mppc"
|
||||
path="powerpc64"
|
||||
;;
|
||||
powerpc*-*-linux*)
|
||||
echo '/* configured for powerpc/ELF */' >>./mpi/asm-syntax.h
|
||||
echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
|
||||
cat $srcdir/mpi/powerpc32/syntax.h >>./mpi/asm-syntax.h
|
||||
path="powerpc32"
|
||||
;;
|
||||
|
||||
rs6000-*-aix[456789]* | \
|
||||
rs6000-*-aix3.2.[456789])
|
||||
mpi_sflags="-Wa,-mpwr"
|
||||
path="power"
|
||||
mpi_extra_modules="udiv-w-sdiv"
|
||||
;;
|
||||
rs6000-*-* | \
|
||||
power-*-* | \
|
||||
power2-*-*)
|
||||
mpi_sflags="-Wa,-mppc"
|
||||
path="power"
|
||||
mpi_extra_modules="udiv-w-sdiv"
|
||||
;;
|
||||
powerpc-ibm-aix4.2.* )
|
||||
# I am not sure about this one but a machine identified by
|
||||
# powerpc-ibm-aix4.2.1.0 cannot use the powerpc32 code.
|
||||
mpi_sflags="-Wa,-mpwr"
|
||||
path="power"
|
||||
mpi_extra_modules="udiv-w-sdiv"
|
||||
;;
|
||||
ppc601-*-*)
|
||||
mpi_sflags="-Wa,-mppc"
|
||||
path="power powerpc32"
|
||||
;;
|
||||
ppc60[234]*-*-*)
|
||||
mpi_sflags="-Wa,-mppc"
|
||||
path="powerpc32"
|
||||
;;
|
||||
powerpc*-*-*)
|
||||
mpi_sflags="-Wa,-mppc"
|
||||
path="powerpc32"
|
||||
;;
|
||||
*)
|
||||
echo '/* No assembler modules configured */' >>./mpi/asm-syntax.h
|
||||
path=""
|
||||
;;
|
||||
esac
|
||||
else
|
||||
echo '/* Assembler modules disabled on request */' >>./mpi/asm-syntax.h
|
||||
path=""
|
||||
fi
|
||||
|
||||
|
||||
# Make sysdep.h
|
||||
echo '/* created by config.links - do not edit */' >./mpi/sysdep.h
|
||||
if test x$ac_cv_sys_symbol_underscore = xyes; then
|
||||
cat <<EOF >>./mpi/sysdep.h
|
||||
#if __STDC__
|
||||
#define C_SYMBOL_NAME(name) _##name
|
||||
#else
|
||||
#define C_SYMBOL_NAME(name) _/**/name
|
||||
#endif
|
||||
EOF
|
||||
else
|
||||
cat <<EOF >>./mpi/sysdep.h
|
||||
#define C_SYMBOL_NAME(name) name
|
||||
EOF
|
||||
fi
|
||||
|
||||
|
||||
# Figure the required modules out
|
||||
mpi_required_modules=$mpi_standard_modules
|
||||
if test "$mpi_extra_modules" != ""; then
|
||||
for fn in $mpi_extra_modules; do
|
||||
for i in $mpi_optional_modules; do
|
||||
if test "$fn" = "$i" ; then
|
||||
mpi_required_modules="$mpi_required_modules $fn"
|
||||
fi
|
||||
done
|
||||
done
|
||||
fi
|
||||
|
||||
# Try to get file to link from the assembler subdirectory and
|
||||
# if this fails get it from the generic subdirectory.
|
||||
mpi_ln_list=
|
||||
mpi_mod_list=
|
||||
path=`echo "$mpi_extra_path $path generic" | tr ':' ' '`
|
||||
echo '/* Created by config.links - do not edit */' >./mpi/mod-source-info.h
|
||||
echo "/* Host: ${host} */" >>./mpi/mod-source-info.h
|
||||
echo "static char mod_source_info[] =" >>./mpi/mod-source-info.h
|
||||
for fn in $mpi_required_modules ; do
|
||||
fnu=`echo $fn | sed 's/-/_/g'`
|
||||
eval mpi_mod_c_${fnu}=no
|
||||
eval mpi_mod_asm_${fnu}=no
|
||||
for dir in $path ; do
|
||||
rm -f $srcdir/mpi/$fn.[Sc]
|
||||
if test -f $srcdir/mpi/$dir/$fn.S ; then
|
||||
echo " \":$dir/$fn.S\"" >>./mpi/mod-source-info.h
|
||||
mpi_ln_list="$mpi_ln_list mpi/$fn-asm.S:mpi/$dir/$fn.S"
|
||||
eval mpi_mod_asm_${fnu}=yes
|
||||
mpi_mod_list="$mpi_mod_list $fn"
|
||||
break;
|
||||
elif test -f $srcdir/mpi/$dir/$fn.c ; then
|
||||
echo " \":$dir/$fn.c\"" >>./mpi/mod-source-info.h
|
||||
mpi_ln_list="$mpi_ln_list mpi/$fn.c:mpi/$dir/$fn.c"
|
||||
eval mpi_mod_c_${fnu}=yes
|
||||
mpi_mod_list="$mpi_mod_list $fn"
|
||||
break;
|
||||
fi
|
||||
done
|
||||
done
|
||||
echo " ;" >>./mpi/mod-source-info.h
|
||||
|
||||
# Same thing for the file which defines the limb size
|
||||
path=`echo "$path generic" | tr ':' ' '`
|
||||
for dir in $path ; do
|
||||
rm -f $srcdir/mpi/mpi-asm-defs.h
|
||||
if test -f $srcdir/mpi/$dir/mpi-asm-defs.h ; then
|
||||
mpi_ln_list="$mpi_ln_list mpi/mpi-asm-defs.h:mpi/$dir/mpi-asm-defs.h"
|
||||
break;
|
||||
fi
|
||||
done
|
||||
708
grub-core/lib/libgcrypt/mpi/ec.c
Normal file
708
grub-core/lib/libgcrypt/mpi/ec.c
Normal file
|
|
@ -0,0 +1,708 @@
|
|||
/* ec.c - Elliptic Curve functions
|
||||
Copyright (C) 2007 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of Libgcrypt.
|
||||
|
||||
Libgcrypt is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
Libgcrypt is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
USA. */
|
||||
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "mpi-internal.h"
|
||||
#include "longlong.h"
|
||||
#include "g10lib.h"
|
||||
|
||||
|
||||
#define point_init(a) _gcry_mpi_ec_point_init ((a))
|
||||
#define point_free(a) _gcry_mpi_ec_point_free ((a))
|
||||
|
||||
|
||||
/* Object to represent a point in projective coordinates. */
|
||||
/* Currently defined in mpi.h */
|
||||
|
||||
/* This context is used with all our EC functions. */
|
||||
struct mpi_ec_ctx_s
|
||||
{
|
||||
/* Domain parameters. */
|
||||
gcry_mpi_t p; /* Prime specifying the field GF(p). */
|
||||
gcry_mpi_t a; /* First coefficient of the Weierstrass equation. */
|
||||
|
||||
int a_is_pminus3; /* True if A = P - 3. */
|
||||
|
||||
/* Some often used constants. */
|
||||
gcry_mpi_t one;
|
||||
gcry_mpi_t two;
|
||||
gcry_mpi_t three;
|
||||
gcry_mpi_t four;
|
||||
gcry_mpi_t eight;
|
||||
gcry_mpi_t two_inv_p;
|
||||
|
||||
/* Scratch variables. */
|
||||
gcry_mpi_t scratch[11];
|
||||
|
||||
/* Helper for fast reduction. */
|
||||
/* int nist_nbits; /\* If this is a NIST curve, the number of bits. *\/ */
|
||||
/* gcry_mpi_t s[10]; */
|
||||
/* gcry_mpi_t c; */
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* Initialized a point object. gcry_mpi_ec_point_free shall be used
|
||||
to release this object. */
|
||||
void
|
||||
_gcry_mpi_ec_point_init (mpi_point_t *p)
|
||||
{
|
||||
p->x = mpi_new (0);
|
||||
p->y = mpi_new (0);
|
||||
p->z = mpi_new (0);
|
||||
}
|
||||
|
||||
|
||||
/* Release a point object. */
|
||||
void
|
||||
_gcry_mpi_ec_point_free (mpi_point_t *p)
|
||||
{
|
||||
mpi_free (p->x); p->x = NULL;
|
||||
mpi_free (p->y); p->y = NULL;
|
||||
mpi_free (p->z); p->z = NULL;
|
||||
}
|
||||
|
||||
/* Set the value from S into D. */
|
||||
static void
|
||||
point_set (mpi_point_t *d, mpi_point_t *s)
|
||||
{
|
||||
mpi_set (d->x, s->x);
|
||||
mpi_set (d->y, s->y);
|
||||
mpi_set (d->z, s->z);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
ec_addm (gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, mpi_ec_t ctx)
|
||||
{
|
||||
mpi_addm (w, u, v, ctx->p);
|
||||
}
|
||||
|
||||
static void
|
||||
ec_subm (gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, mpi_ec_t ctx)
|
||||
{
|
||||
mpi_subm (w, u, v, ctx->p);
|
||||
}
|
||||
|
||||
static void
|
||||
ec_mulm (gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, mpi_ec_t ctx)
|
||||
{
|
||||
#if 0
|
||||
/* NOTE: This code works only for limb sizes of 32 bit. */
|
||||
mpi_limb_t *wp, *sp;
|
||||
|
||||
if (ctx->nist_nbits == 192)
|
||||
{
|
||||
mpi_mul (w, u, v);
|
||||
mpi_resize (w, 12);
|
||||
wp = w->d;
|
||||
|
||||
sp = ctx->s[0]->d;
|
||||
sp[0*2+0] = wp[0*2+0];
|
||||
sp[0*2+1] = wp[0*2+1];
|
||||
sp[1*2+0] = wp[1*2+0];
|
||||
sp[1*2+1] = wp[1*2+1];
|
||||
sp[2*2+0] = wp[2*2+0];
|
||||
sp[2*2+1] = wp[2*2+1];
|
||||
|
||||
sp = ctx->s[1]->d;
|
||||
sp[0*2+0] = wp[3*2+0];
|
||||
sp[0*2+1] = wp[3*2+1];
|
||||
sp[1*2+0] = wp[3*2+0];
|
||||
sp[1*2+1] = wp[3*2+1];
|
||||
sp[2*2+0] = 0;
|
||||
sp[2*2+1] = 0;
|
||||
|
||||
sp = ctx->s[2]->d;
|
||||
sp[0*2+0] = 0;
|
||||
sp[0*2+1] = 0;
|
||||
sp[1*2+0] = wp[4*2+0];
|
||||
sp[1*2+1] = wp[4*2+1];
|
||||
sp[2*2+0] = wp[4*2+0];
|
||||
sp[2*2+1] = wp[4*2+1];
|
||||
|
||||
sp = ctx->s[3]->d;
|
||||
sp[0*2+0] = wp[5*2+0];
|
||||
sp[0*2+1] = wp[5*2+1];
|
||||
sp[1*2+0] = wp[5*2+0];
|
||||
sp[1*2+1] = wp[5*2+1];
|
||||
sp[2*2+0] = wp[5*2+0];
|
||||
sp[2*2+1] = wp[5*2+1];
|
||||
|
||||
ctx->s[0]->nlimbs = 6;
|
||||
ctx->s[1]->nlimbs = 6;
|
||||
ctx->s[2]->nlimbs = 6;
|
||||
ctx->s[3]->nlimbs = 6;
|
||||
|
||||
mpi_add (ctx->c, ctx->s[0], ctx->s[1]);
|
||||
mpi_add (ctx->c, ctx->c, ctx->s[2]);
|
||||
mpi_add (ctx->c, ctx->c, ctx->s[3]);
|
||||
|
||||
while ( mpi_cmp (ctx->c, ctx->p ) >= 0 )
|
||||
mpi_sub ( ctx->c, ctx->c, ctx->p );
|
||||
mpi_set (w, ctx->c);
|
||||
}
|
||||
else if (ctx->nist_nbits == 384)
|
||||
{
|
||||
int i;
|
||||
mpi_mul (w, u, v);
|
||||
mpi_resize (w, 24);
|
||||
wp = w->d;
|
||||
|
||||
#define NEXT(a) do { ctx->s[(a)]->nlimbs = 12; \
|
||||
sp = ctx->s[(a)]->d; \
|
||||
i = 0; } while (0)
|
||||
#define X(a) do { sp[i++] = wp[(a)];} while (0)
|
||||
#define X0(a) do { sp[i++] = 0; } while (0)
|
||||
NEXT(0);
|
||||
X(0);X(1);X(2);X(3);X(4);X(5);X(6);X(7);X(8);X(9);X(10);X(11);
|
||||
NEXT(1);
|
||||
X0();X0();X0();X0();X(21);X(22);X(23);X0();X0();X0();X0();X0();
|
||||
NEXT(2);
|
||||
X(12);X(13);X(14);X(15);X(16);X(17);X(18);X(19);X(20);X(21);X(22);X(23);
|
||||
NEXT(3);
|
||||
X(21);X(22);X(23);X(12);X(13);X(14);X(15);X(16);X(17);X(18);X(19);X(20);
|
||||
NEXT(4);
|
||||
X0();X(23);X0();X(20);X(12);X(13);X(14);X(15);X(16);X(17);X(18);X(19);
|
||||
NEXT(5);
|
||||
X0();X0();X0();X0();X(20);X(21);X(22);X(23);X0();X0();X0();X0();
|
||||
NEXT(6);
|
||||
X(20);X0();X0();X(21);X(22);X(23);X0();X0();X0();X0();X0();X0();
|
||||
NEXT(7);
|
||||
X(23);X(12);X(13);X(14);X(15);X(16);X(17);X(18);X(19);X(20);X(21);X(22);
|
||||
NEXT(8);
|
||||
X0();X(20);X(21);X(22);X(23);X0();X0();X0();X0();X0();X0();X0();
|
||||
NEXT(9);
|
||||
X0();X0();X0();X(23);X(23);X0();X0();X0();X0();X0();X0();X0();
|
||||
#undef X0
|
||||
#undef X
|
||||
#undef NEXT
|
||||
mpi_add (ctx->c, ctx->s[0], ctx->s[1]);
|
||||
mpi_add (ctx->c, ctx->c, ctx->s[1]);
|
||||
mpi_add (ctx->c, ctx->c, ctx->s[2]);
|
||||
mpi_add (ctx->c, ctx->c, ctx->s[3]);
|
||||
mpi_add (ctx->c, ctx->c, ctx->s[4]);
|
||||
mpi_add (ctx->c, ctx->c, ctx->s[5]);
|
||||
mpi_add (ctx->c, ctx->c, ctx->s[6]);
|
||||
mpi_sub (ctx->c, ctx->c, ctx->s[7]);
|
||||
mpi_sub (ctx->c, ctx->c, ctx->s[8]);
|
||||
mpi_sub (ctx->c, ctx->c, ctx->s[9]);
|
||||
|
||||
while ( mpi_cmp (ctx->c, ctx->p ) >= 0 )
|
||||
mpi_sub ( ctx->c, ctx->c, ctx->p );
|
||||
while ( ctx->c->sign )
|
||||
mpi_add ( ctx->c, ctx->c, ctx->p );
|
||||
mpi_set (w, ctx->c);
|
||||
}
|
||||
else
|
||||
#endif /*0*/
|
||||
mpi_mulm (w, u, v, ctx->p);
|
||||
}
|
||||
|
||||
static void
|
||||
ec_powm (gcry_mpi_t w, const gcry_mpi_t b, const gcry_mpi_t e,
|
||||
mpi_ec_t ctx)
|
||||
{
|
||||
mpi_powm (w, b, e, ctx->p);
|
||||
}
|
||||
|
||||
static void
|
||||
ec_invm (gcry_mpi_t x, gcry_mpi_t a, mpi_ec_t ctx)
|
||||
{
|
||||
mpi_invm (x, a, ctx->p);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* This function returns a new context for elliptic curve based on the
|
||||
field GF(p). P is the prime specifying thuis field, A is the first
|
||||
coefficient.
|
||||
|
||||
This context needs to be released using _gcry_mpi_ec_free. */
|
||||
mpi_ec_t
|
||||
_gcry_mpi_ec_init (gcry_mpi_t p, gcry_mpi_t a)
|
||||
{
|
||||
int i;
|
||||
mpi_ec_t ctx;
|
||||
gcry_mpi_t tmp;
|
||||
|
||||
mpi_normalize (p);
|
||||
mpi_normalize (a);
|
||||
|
||||
/* Fixme: Do we want to check some constraints? e.g.
|
||||
a < p
|
||||
*/
|
||||
|
||||
ctx = gcry_xcalloc (1, sizeof *ctx);
|
||||
|
||||
ctx->p = mpi_copy (p);
|
||||
ctx->a = mpi_copy (a);
|
||||
|
||||
tmp = mpi_alloc_like (ctx->p);
|
||||
mpi_sub_ui (tmp, ctx->p, 3);
|
||||
ctx->a_is_pminus3 = !mpi_cmp (ctx->a, tmp);
|
||||
mpi_free (tmp);
|
||||
|
||||
|
||||
/* Allocate constants. */
|
||||
ctx->one = mpi_alloc_set_ui (1);
|
||||
ctx->two = mpi_alloc_set_ui (2);
|
||||
ctx->three = mpi_alloc_set_ui (3);
|
||||
ctx->four = mpi_alloc_set_ui (4);
|
||||
ctx->eight = mpi_alloc_set_ui (8);
|
||||
ctx->two_inv_p = mpi_alloc (0);
|
||||
ec_invm (ctx->two_inv_p, ctx->two, ctx);
|
||||
|
||||
/* Allocate scratch variables. */
|
||||
for (i=0; i< DIM(ctx->scratch); i++)
|
||||
ctx->scratch[i] = mpi_alloc_like (ctx->p);
|
||||
|
||||
/* Prepare for fast reduction. */
|
||||
/* FIXME: need a test for NIST values. However it does not gain us
|
||||
any real advantage, for 384 bits it is actually slower than using
|
||||
mpi_mulm. */
|
||||
/* ctx->nist_nbits = mpi_get_nbits (ctx->p); */
|
||||
/* if (ctx->nist_nbits == 192) */
|
||||
/* { */
|
||||
/* for (i=0; i < 4; i++) */
|
||||
/* ctx->s[i] = mpi_new (192); */
|
||||
/* ctx->c = mpi_new (192*2); */
|
||||
/* } */
|
||||
/* else if (ctx->nist_nbits == 384) */
|
||||
/* { */
|
||||
/* for (i=0; i < 10; i++) */
|
||||
/* ctx->s[i] = mpi_new (384); */
|
||||
/* ctx->c = mpi_new (384*2); */
|
||||
/* } */
|
||||
|
||||
return ctx;
|
||||
}
|
||||
|
||||
void
|
||||
_gcry_mpi_ec_free (mpi_ec_t ctx)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!ctx)
|
||||
return;
|
||||
|
||||
mpi_free (ctx->p);
|
||||
mpi_free (ctx->a);
|
||||
|
||||
mpi_free (ctx->one);
|
||||
mpi_free (ctx->two);
|
||||
mpi_free (ctx->three);
|
||||
mpi_free (ctx->four);
|
||||
mpi_free (ctx->eight);
|
||||
|
||||
mpi_free (ctx->two_inv_p);
|
||||
|
||||
for (i=0; i< DIM(ctx->scratch); i++)
|
||||
mpi_free (ctx->scratch[i]);
|
||||
|
||||
/* if (ctx->nist_nbits == 192) */
|
||||
/* { */
|
||||
/* for (i=0; i < 4; i++) */
|
||||
/* mpi_free (ctx->s[i]); */
|
||||
/* mpi_free (ctx->c); */
|
||||
/* } */
|
||||
/* else if (ctx->nist_nbits == 384) */
|
||||
/* { */
|
||||
/* for (i=0; i < 10; i++) */
|
||||
/* mpi_free (ctx->s[i]); */
|
||||
/* mpi_free (ctx->c); */
|
||||
/* } */
|
||||
|
||||
gcry_free (ctx);
|
||||
}
|
||||
|
||||
/* Compute the affine coordinates from the projective coordinates in
|
||||
POINT. Set them into X and Y. If one coordinate is not required,
|
||||
X or Y may be passed as NULL. CTX is the usual context. Returns: 0
|
||||
on success or !0 if POINT is at infinity. */
|
||||
int
|
||||
_gcry_mpi_ec_get_affine (gcry_mpi_t x, gcry_mpi_t y, mpi_point_t *point,
|
||||
mpi_ec_t ctx)
|
||||
{
|
||||
gcry_mpi_t z1, z2, z3;
|
||||
|
||||
if (!mpi_cmp_ui (point->z, 0))
|
||||
return -1;
|
||||
|
||||
z1 = mpi_new (0);
|
||||
z2 = mpi_new (0);
|
||||
ec_invm (z1, point->z, ctx); /* z1 = z^(-1) mod p */
|
||||
ec_mulm (z2, z1, z1, ctx); /* z2 = z^(-2) mod p */
|
||||
|
||||
if (x)
|
||||
ec_mulm (x, point->x, z2, ctx);
|
||||
|
||||
if (y)
|
||||
{
|
||||
z3 = mpi_new (0);
|
||||
ec_mulm (z3, z2, z1, ctx); /* z3 = z^(-3) mod p */
|
||||
ec_mulm (y, point->y, z3, ctx);
|
||||
mpi_free (z3);
|
||||
}
|
||||
|
||||
mpi_free (z2);
|
||||
mpi_free (z1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* RESULT = 2 * POINT */
|
||||
void
|
||||
_gcry_mpi_ec_dup_point (mpi_point_t *result, mpi_point_t *point, mpi_ec_t ctx)
|
||||
{
|
||||
#define x3 (result->x)
|
||||
#define y3 (result->y)
|
||||
#define z3 (result->z)
|
||||
#define t1 (ctx->scratch[0])
|
||||
#define t2 (ctx->scratch[1])
|
||||
#define t3 (ctx->scratch[2])
|
||||
#define l1 (ctx->scratch[3])
|
||||
#define l2 (ctx->scratch[4])
|
||||
#define l3 (ctx->scratch[5])
|
||||
|
||||
if (!mpi_cmp_ui (point->y, 0) || !mpi_cmp_ui (point->z, 0))
|
||||
{
|
||||
/* P_y == 0 || P_z == 0 => [1:1:0] */
|
||||
mpi_set_ui (x3, 1);
|
||||
mpi_set_ui (y3, 1);
|
||||
mpi_set_ui (z3, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ctx->a_is_pminus3) /* Use the faster case. */
|
||||
{
|
||||
/* L1 = 3(X - Z^2)(X + Z^2) */
|
||||
/* T1: used for Z^2. */
|
||||
/* T2: used for the right term. */
|
||||
ec_powm (t1, point->z, ctx->two, ctx);
|
||||
ec_subm (l1, point->x, t1, ctx);
|
||||
ec_mulm (l1, l1, ctx->three, ctx);
|
||||
ec_addm (t2, point->x, t1, ctx);
|
||||
ec_mulm (l1, l1, t2, ctx);
|
||||
}
|
||||
else /* Standard case. */
|
||||
{
|
||||
/* L1 = 3X^2 + aZ^4 */
|
||||
/* T1: used for aZ^4. */
|
||||
ec_powm (l1, point->x, ctx->two, ctx);
|
||||
ec_mulm (l1, l1, ctx->three, ctx);
|
||||
ec_powm (t1, point->z, ctx->four, ctx);
|
||||
ec_mulm (t1, t1, ctx->a, ctx);
|
||||
ec_addm (l1, l1, t1, ctx);
|
||||
}
|
||||
/* Z3 = 2YZ */
|
||||
ec_mulm (z3, point->y, point->z, ctx);
|
||||
ec_mulm (z3, z3, ctx->two, ctx);
|
||||
|
||||
/* L2 = 4XY^2 */
|
||||
/* T2: used for Y2; required later. */
|
||||
ec_powm (t2, point->y, ctx->two, ctx);
|
||||
ec_mulm (l2, t2, point->x, ctx);
|
||||
ec_mulm (l2, l2, ctx->four, ctx);
|
||||
|
||||
/* X3 = L1^2 - 2L2 */
|
||||
/* T1: used for L2^2. */
|
||||
ec_powm (x3, l1, ctx->two, ctx);
|
||||
ec_mulm (t1, l2, ctx->two, ctx);
|
||||
ec_subm (x3, x3, t1, ctx);
|
||||
|
||||
/* L3 = 8Y^4 */
|
||||
/* T2: taken from above. */
|
||||
ec_powm (t2, t2, ctx->two, ctx);
|
||||
ec_mulm (l3, t2, ctx->eight, ctx);
|
||||
|
||||
/* Y3 = L1(L2 - X3) - L3 */
|
||||
ec_subm (y3, l2, x3, ctx);
|
||||
ec_mulm (y3, y3, l1, ctx);
|
||||
ec_subm (y3, y3, l3, ctx);
|
||||
}
|
||||
|
||||
#undef x3
|
||||
#undef y3
|
||||
#undef z3
|
||||
#undef t1
|
||||
#undef t2
|
||||
#undef t3
|
||||
#undef l1
|
||||
#undef l2
|
||||
#undef l3
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* RESULT = P1 + P2 */
|
||||
void
|
||||
_gcry_mpi_ec_add_points (mpi_point_t *result,
|
||||
mpi_point_t *p1, mpi_point_t *p2,
|
||||
mpi_ec_t ctx)
|
||||
{
|
||||
#define x1 (p1->x )
|
||||
#define y1 (p1->y )
|
||||
#define z1 (p1->z )
|
||||
#define x2 (p2->x )
|
||||
#define y2 (p2->y )
|
||||
#define z2 (p2->z )
|
||||
#define x3 (result->x)
|
||||
#define y3 (result->y)
|
||||
#define z3 (result->z)
|
||||
#define l1 (ctx->scratch[0])
|
||||
#define l2 (ctx->scratch[1])
|
||||
#define l3 (ctx->scratch[2])
|
||||
#define l4 (ctx->scratch[3])
|
||||
#define l5 (ctx->scratch[4])
|
||||
#define l6 (ctx->scratch[5])
|
||||
#define l7 (ctx->scratch[6])
|
||||
#define l8 (ctx->scratch[7])
|
||||
#define l9 (ctx->scratch[8])
|
||||
#define t1 (ctx->scratch[9])
|
||||
#define t2 (ctx->scratch[10])
|
||||
|
||||
if ( (!mpi_cmp (x1, x2)) && (!mpi_cmp (y1, y2)) && (!mpi_cmp (z1, z2)) )
|
||||
{
|
||||
/* Same point; need to call the duplicate function. */
|
||||
_gcry_mpi_ec_dup_point (result, p1, ctx);
|
||||
}
|
||||
else if (!mpi_cmp_ui (z1, 0))
|
||||
{
|
||||
/* P1 is at infinity. */
|
||||
mpi_set (x3, p2->x);
|
||||
mpi_set (y3, p2->y);
|
||||
mpi_set (z3, p2->z);
|
||||
}
|
||||
else if (!mpi_cmp_ui (z2, 0))
|
||||
{
|
||||
/* P2 is at infinity. */
|
||||
mpi_set (x3, p1->x);
|
||||
mpi_set (y3, p1->y);
|
||||
mpi_set (z3, p1->z);
|
||||
}
|
||||
else
|
||||
{
|
||||
int z1_is_one = !mpi_cmp_ui (z1, 1);
|
||||
int z2_is_one = !mpi_cmp_ui (z2, 1);
|
||||
|
||||
/* l1 = x1 z2^2 */
|
||||
/* l2 = x2 z1^2 */
|
||||
if (z2_is_one)
|
||||
mpi_set (l1, x1);
|
||||
else
|
||||
{
|
||||
ec_powm (l1, z2, ctx->two, ctx);
|
||||
ec_mulm (l1, l1, x1, ctx);
|
||||
}
|
||||
if (z1_is_one)
|
||||
mpi_set (l2, x1);
|
||||
else
|
||||
{
|
||||
ec_powm (l2, z1, ctx->two, ctx);
|
||||
ec_mulm (l2, l2, x2, ctx);
|
||||
}
|
||||
/* l3 = l1 - l2 */
|
||||
ec_subm (l3, l1, l2, ctx);
|
||||
/* l4 = y1 z2^3 */
|
||||
ec_powm (l4, z2, ctx->three, ctx);
|
||||
ec_mulm (l4, l4, y1, ctx);
|
||||
/* l5 = y2 z1^3 */
|
||||
ec_powm (l5, z1, ctx->three, ctx);
|
||||
ec_mulm (l5, l5, y2, ctx);
|
||||
/* l6 = l4 - l5 */
|
||||
ec_subm (l6, l4, l5, ctx);
|
||||
|
||||
if (!mpi_cmp_ui (l3, 0))
|
||||
{
|
||||
if (!mpi_cmp_ui (l6, 0))
|
||||
{
|
||||
/* P1 and P2 are the same - use duplicate function. */
|
||||
_gcry_mpi_ec_dup_point (result, p1, ctx);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* P1 is the inverse of P2. */
|
||||
mpi_set_ui (x3, 1);
|
||||
mpi_set_ui (y3, 1);
|
||||
mpi_set_ui (z3, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* l7 = l1 + l2 */
|
||||
ec_addm (l7, l1, l2, ctx);
|
||||
/* l8 = l4 + l5 */
|
||||
ec_addm (l8, l4, l5, ctx);
|
||||
/* z3 = z1 z2 l3 */
|
||||
ec_mulm (z3, z1, z2, ctx);
|
||||
ec_mulm (z3, z3, l3, ctx);
|
||||
/* x3 = l6^2 - l7 l3^2 */
|
||||
ec_powm (t1, l6, ctx->two, ctx);
|
||||
ec_powm (t2, l3, ctx->two, ctx);
|
||||
ec_mulm (t2, t2, l7, ctx);
|
||||
ec_subm (x3, t1, t2, ctx);
|
||||
/* l9 = l7 l3^2 - 2 x3 */
|
||||
ec_mulm (t1, x3, ctx->two, ctx);
|
||||
ec_subm (l9, t2, t1, ctx);
|
||||
/* y3 = (l9 l6 - l8 l3^3)/2 */
|
||||
ec_mulm (l9, l9, l6, ctx);
|
||||
ec_powm (t1, l3, ctx->three, ctx); /* fixme: Use saved value*/
|
||||
ec_mulm (t1, t1, l8, ctx);
|
||||
ec_subm (y3, l9, t1, ctx);
|
||||
ec_mulm (y3, y3, ctx->two_inv_p, ctx);
|
||||
}
|
||||
}
|
||||
|
||||
#undef x1
|
||||
#undef y1
|
||||
#undef z1
|
||||
#undef x2
|
||||
#undef y2
|
||||
#undef z2
|
||||
#undef x3
|
||||
#undef y3
|
||||
#undef z3
|
||||
#undef l1
|
||||
#undef l2
|
||||
#undef l3
|
||||
#undef l4
|
||||
#undef l5
|
||||
#undef l6
|
||||
#undef l7
|
||||
#undef l8
|
||||
#undef l9
|
||||
#undef t1
|
||||
#undef t2
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Scalar point multiplication - the main function for ECC. If takes
|
||||
an integer SCALAR and a POINT as well as the usual context CTX.
|
||||
RESULT will be set to the resulting point. */
|
||||
void
|
||||
_gcry_mpi_ec_mul_point (mpi_point_t *result,
|
||||
gcry_mpi_t scalar, mpi_point_t *point,
|
||||
mpi_ec_t ctx)
|
||||
{
|
||||
#if 0
|
||||
/* Simple left to right binary method. GECC Algorithm 3.27 */
|
||||
unsigned int nbits;
|
||||
int i;
|
||||
|
||||
nbits = mpi_get_nbits (scalar);
|
||||
mpi_set_ui (result->x, 1);
|
||||
mpi_set_ui (result->y, 1);
|
||||
mpi_set_ui (result->z, 0);
|
||||
|
||||
for (i=nbits-1; i >= 0; i--)
|
||||
{
|
||||
_gcry_mpi_ec_dup_point (result, result, ctx);
|
||||
if (mpi_test_bit (scalar, i) == 1)
|
||||
_gcry_mpi_ec_add_points (result, result, point, ctx);
|
||||
}
|
||||
|
||||
#else
|
||||
gcry_mpi_t x1, y1, z1, k, h, yy;
|
||||
unsigned int i, loops;
|
||||
mpi_point_t p1, p2, p1inv;
|
||||
|
||||
x1 = mpi_alloc_like (ctx->p);
|
||||
y1 = mpi_alloc_like (ctx->p);
|
||||
h = mpi_alloc_like (ctx->p);
|
||||
k = mpi_copy (scalar);
|
||||
yy = mpi_copy (point->y);
|
||||
|
||||
if ( mpi_is_neg (k) )
|
||||
{
|
||||
k->sign = 0;
|
||||
ec_invm (yy, yy, ctx);
|
||||
}
|
||||
|
||||
if (!mpi_cmp_ui (point->z, 1))
|
||||
{
|
||||
mpi_set (x1, point->x);
|
||||
mpi_set (y1, yy);
|
||||
}
|
||||
else
|
||||
{
|
||||
gcry_mpi_t z2, z3;
|
||||
|
||||
z2 = mpi_alloc_like (ctx->p);
|
||||
z3 = mpi_alloc_like (ctx->p);
|
||||
ec_mulm (z2, point->z, point->z, ctx);
|
||||
ec_mulm (z3, point->z, z2, ctx);
|
||||
ec_invm (z2, z2, ctx);
|
||||
ec_mulm (x1, point->x, z2, ctx);
|
||||
ec_invm (z3, z3, ctx);
|
||||
ec_mulm (y1, yy, z3, ctx);
|
||||
mpi_free (z2);
|
||||
mpi_free (z3);
|
||||
}
|
||||
z1 = mpi_copy (ctx->one);
|
||||
|
||||
mpi_mul (h, k, ctx->three); /* h = 3k */
|
||||
loops = mpi_get_nbits (h);
|
||||
|
||||
mpi_set (result->x, point->x);
|
||||
mpi_set (result->y, yy); mpi_free (yy); yy = NULL;
|
||||
mpi_set (result->z, point->z);
|
||||
|
||||
p1.x = x1; x1 = NULL;
|
||||
p1.y = y1; y1 = NULL;
|
||||
p1.z = z1; z1 = NULL;
|
||||
point_init (&p2);
|
||||
point_init (&p1inv);
|
||||
|
||||
for (i=loops-2; i > 0; i--)
|
||||
{
|
||||
_gcry_mpi_ec_dup_point (result, result, ctx);
|
||||
if (mpi_test_bit (h, i) == 1 && mpi_test_bit (k, i) == 0)
|
||||
{
|
||||
point_set (&p2, result);
|
||||
_gcry_mpi_ec_add_points (result, &p2, &p1, ctx);
|
||||
}
|
||||
if (mpi_test_bit (h, i) == 0 && mpi_test_bit (k, i) == 1)
|
||||
{
|
||||
point_set (&p2, result);
|
||||
/* Invert point: y = p - y mod p */
|
||||
point_set (&p1inv, &p1);
|
||||
ec_subm (p1inv.y, ctx->p, p1inv.y, ctx);
|
||||
_gcry_mpi_ec_add_points (result, &p2, &p1inv, ctx);
|
||||
}
|
||||
}
|
||||
|
||||
point_free (&p1);
|
||||
point_free (&p2);
|
||||
point_free (&p1inv);
|
||||
mpi_free (h);
|
||||
mpi_free (k);
|
||||
#endif
|
||||
}
|
||||
29
grub-core/lib/libgcrypt/mpi/generic/Manifest
Normal file
29
grub-core/lib/libgcrypt/mpi/generic/Manifest
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
# Manifest - checksums
|
||||
# Copyright 2003 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of Libgcrypt.
|
||||
#
|
||||
# Libgcrypt is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser general Public License as
|
||||
# published by the Free Software Foundation; either version 2.1 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# Libgcrypt is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
|
||||
mpih-add1.c iQCVAwUAP+Lj2DEAnp832S/7AQKn/AQAwQLWggl6zNQ5EZ+lE+jKV8W3FsogW3/6tp9T5rrSR5JnlWyoHQ9/Pu4knOcLjS6nIfVOiAEifu3nuIysQr9jDSSSJA2LylSUBSXKLKDamPsOCwXOLxiZODslJT3CCGAUtLvXJrWDbTZQrkEuwnLnjQFDzuA7iY9JLrG9kAoXD6Q==WoWm
|
||||
mpih-mul1.c iQCVAwUAP+LkCTEAnp832S/7AQKFVQP+MhBNjcY73JtnsHZfnaVZq3TiKwN151cWV51nDc1RnTaMhSIFeuNlj3vNML2W0Gn8n+GnyiWE2XXdQEaik6BL02eekUn9aq7I/rdpnTHuOjQPK1uwjuNl8RuJ9YrERBAxq4oB71f+iwMab8dsMSUlVC+NdeAocRqLLgnR/efkdLc==2Tkb
|
||||
mpih-mul2.c iQCVAwUAP+LkMjEAnp832S/7AQLPeAQAqmRzxFe/mDqTdZr/pTXT8RVyB1vKB0Ei2THV05BxmI4OPv39uysfFpLMt/INsX7AGqdOlj4jOZ/qNaFXR1ceMrlSXvo8u/epk6rCXFp82kM7Qs983LjoP//PrMCkYkXwblaVrgUGiBUCbuPMliWTK6qKkxxXtEfqZ7nVbEWdBx8==Kwhl
|
||||
mpih-mul3.c iQCVAwUAP+LkVDEAnp832S/7AQL91gP/Qd5iZWxRiN5DdEIVHAedoNvl23NPrT2UUdXvnSK49DpplTxkLiMBj0WqCayG/YIET2NpMRCeLvAZNcSt6lOm0bSZDYo1Hv/N+UoqD3V1McjY16REBv/nnPaMWMZcx7rl5yKTVZiX2PgV6oQOL7Yfrt5ZIOlrHBRs9S2/zcCaVz0==9BQe
|
||||
mpih-lshift.c iQCVAwUAP+LlATEAnp832S/7AQIACAQAhMrpx0SRXE/LN1NkjMO9n74nMrvmzYJyru0gw2O4BYrUPvD/LWGju2FZaggKV0IBjmi0cDoCrNeK9EGjKOO1lfgODbX2IZ1LUhr9jDuMj0QRqj6T9YkAFYTNUk4GfpwIf7T6Ybo7c78Jx93PidCJt7d39eMMEalooC7LZ4IU3NM==nZ4k
|
||||
mpih-rshift.c iQCVAwUAP+LlIjEAnp832S/7AQKiuAP/eYC2ZScd+taBx/kNzRvGjA0eAXvORMkMLV6Ot+OXVzVUi04eoP2yXdxSNFKwUj12p8GWXkdoMG3aOGBKg2a7bY5Q5RUho3hUWb9UsVYVUfXLf7IOTt/3a6MLh2CmV5dFPWJmSlbCyQRcn6n/fLDeJ3A2bWTS/BhqGfpOXUIU1ws==jCf8
|
||||
mpih-sub1.c iQCVAwUAP+LlZzEAnp832S/7AQIEPgP/dLHTDRbPrYJhsLp9SjGstU1M8/IC5XytcDtO3NQeu4mx6vaXjpujtsTvKIbX4QL5IahNntVVKv1xFLEm2yFg7L2ns0uD/mfwGgOhCG1j2o/SaTAWP5KxP7ae5UDcZl2w6NWvEuMj9t32zmziAZjP8W73A37FUspeRDYiL9sQzkI==QQzk
|
||||
udiv-w-sdiv.c iQCVAwUAP+Lk0TEAnp832S/7AQICXAQAsxe1SQD4+xZaZTqBC0V9Cyuo0mrdccnRFzthOtm0ARwKFXU2cuLW/ZBOkmeWOVmOFhBp22/I8dEGYnMA3gcfmOMCpNu9i9zk/XHfptdunA1MnOe3GsoWgfHL0rhpAyPhp/X043ICB41NElnnuxADuQQlD4Z1fca5ygYxMr2crJg==EI/6
|
||||
mpi-asm-defs.h iQCVAwUAP+LkgDEAnp832S/7AQK0FgQAxJZ7xvXhoZa33GWe23LRb3asrno/loZSyAIXrntqtVH8M3pEsCY0OyW4ry4hX2RnxpuhRCM/PdRNLG3xXyMSVIhkHU8WVRLqzF2LLjEkyU3cAmHnnTQ9aO/XpUWtJGTZ8q2bv7ZsAEi4aPl0p6KhPXcPgM9vQ2XcyOPn3Dl0d6Q==xpjI
|
||||
$names$ iQCVAwUAP+LmNDEAnp832S/7AQJa+gP+KQNJpbNOgc+s2UX+Ya2gDaOFcAROImIllhg3ej8EaBF8xxdHmWT1zaKwTwi3moEEleykMR104YAGWyQeMbFYiuPPBW+ohrT6KxRBVJpIA9auOOqqJMyglZyoR3Hv7gduVYUW1h/DebnqiKXKEfzQDFqYuT0ayuteoOR4B5NICbE==nLSh
|
||||
11
grub-core/lib/libgcrypt/mpi/generic/distfiles
Normal file
11
grub-core/lib/libgcrypt/mpi/generic/distfiles
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
Manifest
|
||||
mpih-add1.c
|
||||
mpih-mul1.c
|
||||
mpih-mul2.c
|
||||
mpih-mul3.c
|
||||
mpih-lshift.c
|
||||
mpih-rshift.c
|
||||
mpih-sub1.c
|
||||
udiv-w-sdiv.c
|
||||
mpi-asm-defs.h
|
||||
|
||||
10
grub-core/lib/libgcrypt/mpi/generic/mpi-asm-defs.h
Normal file
10
grub-core/lib/libgcrypt/mpi/generic/mpi-asm-defs.h
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
/* This file defines some basic constants for the MPI machinery. We
|
||||
* need to define the types on a per-CPU basis, so it is done with
|
||||
* this file here. */
|
||||
#define BYTES_PER_MPI_LIMB (SIZEOF_UNSIGNED_LONG)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
65
grub-core/lib/libgcrypt/mpi/generic/mpih-add1.c
Normal file
65
grub-core/lib/libgcrypt/mpi/generic/mpih-add1.c
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
/* mpihelp-add_1.c - MPI helper functions
|
||||
* Copyright (C) 1994, 1996, 1997, 1998,
|
||||
* 2000, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "mpi-internal.h"
|
||||
#include "longlong.h"
|
||||
|
||||
mpi_limb_t
|
||||
_gcry_mpih_add_n (mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
|
||||
mpi_ptr_t s2_ptr, mpi_size_t size)
|
||||
{
|
||||
mpi_limb_t x, y, cy;
|
||||
mpi_size_t j;
|
||||
|
||||
/* The loop counter and index J goes from -SIZE to -1. This way
|
||||
the loop becomes faster. */
|
||||
j = -size;
|
||||
|
||||
/* Offset the base pointers to compensate for the negative indices. */
|
||||
s1_ptr -= j;
|
||||
s2_ptr -= j;
|
||||
res_ptr -= j;
|
||||
|
||||
cy = 0;
|
||||
do
|
||||
{
|
||||
y = s2_ptr[j];
|
||||
x = s1_ptr[j];
|
||||
y += cy; /* add previous carry to one addend */
|
||||
cy = y < cy; /* get out carry from that addition */
|
||||
y += x; /* add other addend */
|
||||
cy += y < x; /* get out carry from that add, combine */
|
||||
res_ptr[j] = y;
|
||||
}
|
||||
while ( ++j );
|
||||
|
||||
return cy;
|
||||
}
|
||||
|
||||
68
grub-core/lib/libgcrypt/mpi/generic/mpih-lshift.c
Normal file
68
grub-core/lib/libgcrypt/mpi/generic/mpih-lshift.c
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
/* mpi-lshift.c - MPI helper functions
|
||||
* Copyright (C) 1994, 1996, 1998, 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "mpi-internal.h"
|
||||
|
||||
/* Shift U (pointed to by UP and USIZE digits long) CNT bits to the left
|
||||
* and store the USIZE least significant digits of the result at WP.
|
||||
* Return the bits shifted out from the most significant digit.
|
||||
*
|
||||
* Argument constraints:
|
||||
* 1. 0 < CNT < BITS_PER_MP_LIMB
|
||||
* 2. If the result is to be written over the input, WP must be >= UP.
|
||||
*/
|
||||
|
||||
mpi_limb_t
|
||||
_gcry_mpih_lshift( mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize,
|
||||
unsigned int cnt)
|
||||
{
|
||||
mpi_limb_t high_limb, low_limb;
|
||||
unsigned sh_1, sh_2;
|
||||
mpi_size_t i;
|
||||
mpi_limb_t retval;
|
||||
|
||||
sh_1 = cnt;
|
||||
wp += 1;
|
||||
sh_2 = BITS_PER_MPI_LIMB - sh_1;
|
||||
i = usize - 1;
|
||||
low_limb = up[i];
|
||||
retval = low_limb >> sh_2;
|
||||
high_limb = low_limb;
|
||||
while ( --i >= 0 )
|
||||
{
|
||||
low_limb = up[i];
|
||||
wp[i] = (high_limb << sh_1) | (low_limb >> sh_2);
|
||||
high_limb = low_limb;
|
||||
}
|
||||
wp[i] = high_limb << sh_1;
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
62
grub-core/lib/libgcrypt/mpi/generic/mpih-mul1.c
Normal file
62
grub-core/lib/libgcrypt/mpi/generic/mpih-mul1.c
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
/* mpihelp-mul_1.c - MPI helper functions
|
||||
* Copyright (C) 1994, 1996, 1997, 1998, 2001,
|
||||
* 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "mpi-internal.h"
|
||||
#include "longlong.h"
|
||||
|
||||
mpi_limb_t
|
||||
_gcry_mpih_mul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size,
|
||||
mpi_limb_t s2_limb)
|
||||
{
|
||||
mpi_limb_t cy_limb;
|
||||
mpi_size_t j;
|
||||
mpi_limb_t prod_high, prod_low;
|
||||
|
||||
/* The loop counter and index J goes from -S1_SIZE to -1. This way
|
||||
* the loop becomes faster. */
|
||||
j = -s1_size;
|
||||
|
||||
/* Offset the base pointers to compensate for the negative indices. */
|
||||
s1_ptr -= j;
|
||||
res_ptr -= j;
|
||||
|
||||
cy_limb = 0;
|
||||
do
|
||||
{
|
||||
umul_ppmm( prod_high, prod_low, s1_ptr[j], s2_limb );
|
||||
prod_low += cy_limb;
|
||||
cy_limb = (prod_low < cy_limb?1:0) + prod_high;
|
||||
res_ptr[j] = prod_low;
|
||||
}
|
||||
while( ++j );
|
||||
|
||||
return cy_limb;
|
||||
}
|
||||
|
||||
68
grub-core/lib/libgcrypt/mpi/generic/mpih-mul2.c
Normal file
68
grub-core/lib/libgcrypt/mpi/generic/mpih-mul2.c
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
/* mpih-mul2.c - MPI helper functions
|
||||
* Copyright (C) 1994, 1996, 1997, 1998, 2001,
|
||||
* 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "mpi-internal.h"
|
||||
#include "longlong.h"
|
||||
|
||||
|
||||
mpi_limb_t
|
||||
_gcry_mpih_addmul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
|
||||
mpi_size_t s1_size, mpi_limb_t s2_limb)
|
||||
{
|
||||
mpi_limb_t cy_limb;
|
||||
mpi_size_t j;
|
||||
mpi_limb_t prod_high, prod_low;
|
||||
mpi_limb_t x;
|
||||
|
||||
/* The loop counter and index J goes from -SIZE to -1. This way
|
||||
* the loop becomes faster. */
|
||||
j = -s1_size;
|
||||
res_ptr -= j;
|
||||
s1_ptr -= j;
|
||||
|
||||
cy_limb = 0;
|
||||
do
|
||||
{
|
||||
umul_ppmm( prod_high, prod_low, s1_ptr[j], s2_limb );
|
||||
|
||||
prod_low += cy_limb;
|
||||
cy_limb = (prod_low < cy_limb?1:0) + prod_high;
|
||||
|
||||
x = res_ptr[j];
|
||||
prod_low = x + prod_low;
|
||||
cy_limb += prod_low < x?1:0;
|
||||
res_ptr[j] = prod_low;
|
||||
}
|
||||
while ( ++j );
|
||||
|
||||
return cy_limb;
|
||||
}
|
||||
|
||||
|
||||
68
grub-core/lib/libgcrypt/mpi/generic/mpih-mul3.c
Normal file
68
grub-core/lib/libgcrypt/mpi/generic/mpih-mul3.c
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
/* mpih-mul3.c - MPI helper functions
|
||||
* Copyright (C) 1994, 1996, 1997, 1998, 2001,
|
||||
* 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "mpi-internal.h"
|
||||
#include "longlong.h"
|
||||
|
||||
|
||||
mpi_limb_t
|
||||
_gcry_mpih_submul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
|
||||
mpi_size_t s1_size, mpi_limb_t s2_limb)
|
||||
{
|
||||
mpi_limb_t cy_limb;
|
||||
mpi_size_t j;
|
||||
mpi_limb_t prod_high, prod_low;
|
||||
mpi_limb_t x;
|
||||
|
||||
/* The loop counter and index J goes from -SIZE to -1. This way
|
||||
* the loop becomes faster. */
|
||||
j = -s1_size;
|
||||
res_ptr -= j;
|
||||
s1_ptr -= j;
|
||||
|
||||
cy_limb = 0;
|
||||
do
|
||||
{
|
||||
umul_ppmm( prod_high, prod_low, s1_ptr[j], s2_limb);
|
||||
|
||||
prod_low += cy_limb;
|
||||
cy_limb = (prod_low < cy_limb?1:0) + prod_high;
|
||||
|
||||
x = res_ptr[j];
|
||||
prod_low = x - prod_low;
|
||||
cy_limb += prod_low > x?1:0;
|
||||
res_ptr[j] = prod_low;
|
||||
}
|
||||
while( ++j );
|
||||
|
||||
return cy_limb;
|
||||
}
|
||||
|
||||
|
||||
67
grub-core/lib/libgcrypt/mpi/generic/mpih-rshift.c
Normal file
67
grub-core/lib/libgcrypt/mpi/generic/mpih-rshift.c
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
/* mpih-rshift.c - MPI helper functions
|
||||
* Copyright (C) 1994, 1996, 1998, 1999,
|
||||
* 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "mpi-internal.h"
|
||||
|
||||
|
||||
/* Shift U (pointed to by UP and USIZE limbs long) CNT bits to the right
|
||||
* and store the USIZE least significant limbs of the result at WP.
|
||||
* The bits shifted out to the right are returned.
|
||||
*
|
||||
* Argument constraints:
|
||||
* 1. 0 < CNT < BITS_PER_MP_LIMB
|
||||
* 2. If the result is to be written over the input, WP must be <= UP.
|
||||
*/
|
||||
|
||||
mpi_limb_t
|
||||
_gcry_mpih_rshift( mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize, unsigned cnt)
|
||||
{
|
||||
mpi_limb_t high_limb, low_limb;
|
||||
unsigned sh_1, sh_2;
|
||||
mpi_size_t i;
|
||||
mpi_limb_t retval;
|
||||
|
||||
sh_1 = cnt;
|
||||
wp -= 1;
|
||||
sh_2 = BITS_PER_MPI_LIMB - sh_1;
|
||||
high_limb = up[0];
|
||||
retval = high_limb << sh_2;
|
||||
low_limb = high_limb;
|
||||
for (i=1; i < usize; i++)
|
||||
{
|
||||
high_limb = up[i];
|
||||
wp[i] = (low_limb >> sh_1) | (high_limb << sh_2);
|
||||
low_limb = high_limb;
|
||||
}
|
||||
wp[i] = low_limb >> sh_1;
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
66
grub-core/lib/libgcrypt/mpi/generic/mpih-sub1.c
Normal file
66
grub-core/lib/libgcrypt/mpi/generic/mpih-sub1.c
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
/* mpihelp-add_2.c - MPI helper functions
|
||||
* Copyright (C) 1994, 1996, 1997, 1998, 2001,
|
||||
* 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "mpi-internal.h"
|
||||
#include "longlong.h"
|
||||
|
||||
mpi_limb_t
|
||||
_gcry_mpih_sub_n( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
|
||||
mpi_ptr_t s2_ptr, mpi_size_t size)
|
||||
{
|
||||
mpi_limb_t x, y, cy;
|
||||
mpi_size_t j;
|
||||
|
||||
/* The loop counter and index J goes from -SIZE to -1. This way
|
||||
the loop becomes faster. */
|
||||
j = -size;
|
||||
|
||||
/* Offset the base pointers to compensate for the negative indices. */
|
||||
s1_ptr -= j;
|
||||
s2_ptr -= j;
|
||||
res_ptr -= j;
|
||||
|
||||
cy = 0;
|
||||
do
|
||||
{
|
||||
y = s2_ptr[j];
|
||||
x = s1_ptr[j];
|
||||
y += cy; /* add previous carry to subtrahend */
|
||||
cy = y < cy; /* get out carry from that addition */
|
||||
y = x - y; /* main subtract */
|
||||
cy += y > x; /* get out carry from the subtract, combine */
|
||||
res_ptr[j] = y;
|
||||
}
|
||||
while( ++j );
|
||||
|
||||
return cy;
|
||||
}
|
||||
|
||||
|
||||
133
grub-core/lib/libgcrypt/mpi/generic/udiv-w-sdiv.c
Normal file
133
grub-core/lib/libgcrypt/mpi/generic/udiv-w-sdiv.c
Normal file
|
|
@ -0,0 +1,133 @@
|
|||
/* mpih-w-sdiv -- implement udiv_qrnnd on machines with only signed
|
||||
* division.
|
||||
* Copyright (C) 1992, 1994, 1996, 1998, 2002 Free Software Foundation, Inc.
|
||||
* Contributed by Peter L. Montgomery.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "mpi-internal.h"
|
||||
#include "longlong.h"
|
||||
|
||||
|
||||
#if 0 /* not yet ported to MPI */
|
||||
|
||||
mpi_limb_t
|
||||
mpihelp_udiv_w_sdiv( mpi_limp_t *rp,
|
||||
mpi_limp_t *a1,
|
||||
mpi_limp_t *a0,
|
||||
mpi_limp_t *d )
|
||||
{
|
||||
mp_limb_t q, r;
|
||||
mp_limb_t c0, c1, b1;
|
||||
|
||||
if ((mpi_limb_signed_t) d >= 0)
|
||||
{
|
||||
if (a1 < d - a1 - (a0 >> (BITS_PER_MP_LIMB - 1)))
|
||||
{
|
||||
/* dividend, divisor, and quotient are nonnegative */
|
||||
sdiv_qrnnd (q, r, a1, a0, d);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d */
|
||||
sub_ddmmss (c1, c0, a1, a0, d >> 1, d << (BITS_PER_MP_LIMB - 1));
|
||||
/* Divide (c1*2^32 + c0) by d */
|
||||
sdiv_qrnnd (q, r, c1, c0, d);
|
||||
/* Add 2^31 to quotient */
|
||||
q += (mp_limb_t) 1 << (BITS_PER_MP_LIMB - 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
b1 = d >> 1; /* d/2, between 2^30 and 2^31 - 1 */
|
||||
c1 = a1 >> 1; /* A/2 */
|
||||
c0 = (a1 << (BITS_PER_MP_LIMB - 1)) + (a0 >> 1);
|
||||
|
||||
if (a1 < b1) /* A < 2^32*b1, so A/2 < 2^31*b1 */
|
||||
{
|
||||
sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
|
||||
|
||||
r = 2*r + (a0 & 1); /* Remainder from A/(2*b1) */
|
||||
if ((d & 1) != 0)
|
||||
{
|
||||
if (r >= q)
|
||||
r = r - q;
|
||||
else if (q - r <= d)
|
||||
{
|
||||
r = r - q + d;
|
||||
q--;
|
||||
}
|
||||
else
|
||||
{
|
||||
r = r - q + 2*d;
|
||||
q -= 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (c1 < b1) /* So 2^31 <= (A/2)/b1 < 2^32 */
|
||||
{
|
||||
c1 = (b1 - 1) - c1;
|
||||
c0 = ~c0; /* logical NOT */
|
||||
|
||||
sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
|
||||
|
||||
q = ~q; /* (A/2)/b1 */
|
||||
r = (b1 - 1) - r;
|
||||
|
||||
r = 2*r + (a0 & 1); /* A/(2*b1) */
|
||||
|
||||
if ((d & 1) != 0)
|
||||
{
|
||||
if (r >= q)
|
||||
r = r - q;
|
||||
else if (q - r <= d)
|
||||
{
|
||||
r = r - q + d;
|
||||
q--;
|
||||
}
|
||||
else
|
||||
{
|
||||
r = r - q + 2*d;
|
||||
q -= 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
else /* Implies c1 = b1 */
|
||||
{ /* Hence a1 = d - 1 = 2*b1 - 1 */
|
||||
if (a0 >= -d)
|
||||
{
|
||||
q = -1;
|
||||
r = a0 + d;
|
||||
}
|
||||
else
|
||||
{
|
||||
q = -2;
|
||||
r = a0 + 2*d;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*rp = r;
|
||||
return q;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
84
grub-core/lib/libgcrypt/mpi/hppa/README
Normal file
84
grub-core/lib/libgcrypt/mpi/hppa/README
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
This directory contains mpn functions for various HP PA-RISC chips. Code
|
||||
that runs faster on the PA7100 and later implementations, is in the pa7100
|
||||
directory.
|
||||
|
||||
RELEVANT OPTIMIZATION ISSUES
|
||||
|
||||
Load and Store timing
|
||||
|
||||
On the PA7000 no memory instructions can issue the two cycles after a store.
|
||||
For the PA7100, this is reduced to one cycle.
|
||||
|
||||
The PA7100 has a lookup-free cache, so it helps to schedule loads and the
|
||||
dependent instruction really far from each other.
|
||||
|
||||
STATUS
|
||||
|
||||
1. mpn_mul_1 could be improved to 6.5 cycles/limb on the PA7100, using the
|
||||
instructions bwlow (but some sw pipelining is needed to avoid the
|
||||
xmpyu-fstds delay):
|
||||
|
||||
fldds s1_ptr
|
||||
|
||||
xmpyu
|
||||
fstds N(%r30)
|
||||
xmpyu
|
||||
fstds N(%r30)
|
||||
|
||||
ldws N(%r30)
|
||||
ldws N(%r30)
|
||||
ldws N(%r30)
|
||||
ldws N(%r30)
|
||||
|
||||
addc
|
||||
stws res_ptr
|
||||
addc
|
||||
stws res_ptr
|
||||
|
||||
addib Loop
|
||||
|
||||
2. mpn_addmul_1 could be improved from the current 10 to 7.5 cycles/limb
|
||||
(asymptotically) on the PA7100, using the instructions below. With proper
|
||||
sw pipelining and the unrolling level below, the speed becomes 8
|
||||
cycles/limb.
|
||||
|
||||
fldds s1_ptr
|
||||
fldds s1_ptr
|
||||
|
||||
xmpyu
|
||||
fstds N(%r30)
|
||||
xmpyu
|
||||
fstds N(%r30)
|
||||
xmpyu
|
||||
fstds N(%r30)
|
||||
xmpyu
|
||||
fstds N(%r30)
|
||||
|
||||
ldws N(%r30)
|
||||
ldws N(%r30)
|
||||
ldws N(%r30)
|
||||
ldws N(%r30)
|
||||
ldws N(%r30)
|
||||
ldws N(%r30)
|
||||
ldws N(%r30)
|
||||
ldws N(%r30)
|
||||
addc
|
||||
addc
|
||||
addc
|
||||
addc
|
||||
addc %r0,%r0,cy-limb
|
||||
|
||||
ldws res_ptr
|
||||
ldws res_ptr
|
||||
ldws res_ptr
|
||||
ldws res_ptr
|
||||
add
|
||||
stws res_ptr
|
||||
addc
|
||||
stws res_ptr
|
||||
addc
|
||||
stws res_ptr
|
||||
addc
|
||||
stws res_ptr
|
||||
|
||||
addib
|
||||
7
grub-core/lib/libgcrypt/mpi/hppa/distfiles
Normal file
7
grub-core/lib/libgcrypt/mpi/hppa/distfiles
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
README
|
||||
udiv-qrnnd.S
|
||||
mpih-add1.S
|
||||
mpih-sub1.S
|
||||
mpih-lshift.S
|
||||
mpih-rshift.S
|
||||
|
||||
70
grub-core/lib/libgcrypt/mpi/hppa/mpih-add1.S
Normal file
70
grub-core/lib/libgcrypt/mpi/hppa/mpih-add1.S
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
/* hppa add_n -- Add two limb vectors of the same length > 0 and store
|
||||
* sum in a third limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1998,
|
||||
* 2001, 2002 Fee Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_add_n( mpi_ptr_t res_ptr, (gr26)
|
||||
* mpi_ptr_t s1_ptr, (gr25)
|
||||
* mpi_ptr_t s2_ptr, (gr24)
|
||||
* mpi_size_t size) (gr23)
|
||||
*
|
||||
* One might want to unroll this as for other processors, but it turns
|
||||
* out that the data cache contention after a store makes such
|
||||
* unrolling useless. We can't come under 5 cycles/limb anyway.
|
||||
*/
|
||||
|
||||
.code
|
||||
.export _gcry_mpih_add_n
|
||||
.label _gcry_mpih_add_n
|
||||
.proc
|
||||
.callinfo frame=0,no_calls
|
||||
.entry
|
||||
|
||||
ldws,ma 4(0,%r25),%r20
|
||||
ldws,ma 4(0,%r24),%r19
|
||||
|
||||
addib,= -1,%r23,L$end ; check for (SIZE == 1)
|
||||
add %r20,%r19,%r28 ; add first limbs ignoring cy
|
||||
|
||||
.label L$loop
|
||||
ldws,ma 4(0,%r25),%r20
|
||||
ldws,ma 4(0,%r24),%r19
|
||||
stws,ma %r28,4(0,%r26)
|
||||
addib,<> -1,%r23,L$loop
|
||||
addc %r20,%r19,%r28
|
||||
|
||||
.label L$end
|
||||
stws %r28,0(0,%r26)
|
||||
bv 0(%r2)
|
||||
addc %r0,%r0,%r28
|
||||
|
||||
.exit
|
||||
.procend
|
||||
77
grub-core/lib/libgcrypt/mpi/hppa/mpih-lshift.S
Normal file
77
grub-core/lib/libgcrypt/mpi/hppa/mpih-lshift.S
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
/* hppa lshift
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1998
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_lshift( mpi_ptr_t wp, (gr26)
|
||||
* mpi_ptr_t up, (gr25)
|
||||
* mpi_size_t usize, (gr24)
|
||||
* unsigned cnt) (gr23)
|
||||
*/
|
||||
|
||||
.code
|
||||
.export _gcry_mpih_lshift
|
||||
.label _gcry_mpih_lshift
|
||||
.proc
|
||||
.callinfo frame=64,no_calls
|
||||
.entry
|
||||
|
||||
sh2add %r24,%r25,%r25
|
||||
sh2add %r24,%r26,%r26
|
||||
ldws,mb -4(0,%r25),%r22
|
||||
subi 32,%r23,%r1
|
||||
mtsar %r1
|
||||
addib,= -1,%r24,L$0004
|
||||
vshd %r0,%r22,%r28 ; compute carry out limb
|
||||
ldws,mb -4(0,%r25),%r29
|
||||
addib,= -1,%r24,L$0002
|
||||
vshd %r22,%r29,%r20
|
||||
|
||||
.label L$loop
|
||||
ldws,mb -4(0,%r25),%r22
|
||||
stws,mb %r20,-4(0,%r26)
|
||||
addib,= -1,%r24,L$0003
|
||||
vshd %r29,%r22,%r20
|
||||
ldws,mb -4(0,%r25),%r29
|
||||
stws,mb %r20,-4(0,%r26)
|
||||
addib,<> -1,%r24,L$loop
|
||||
vshd %r22,%r29,%r20
|
||||
|
||||
.label L$0002
|
||||
stws,mb %r20,-4(0,%r26)
|
||||
vshd %r29,%r0,%r20
|
||||
bv 0(%r2)
|
||||
stw %r20,-4(0,%r26)
|
||||
.label L$0003
|
||||
stws,mb %r20,-4(0,%r26)
|
||||
.label L$0004
|
||||
vshd %r22,%r0,%r20
|
||||
bv 0(%r2)
|
||||
stw %r20,-4(0,%r26)
|
||||
|
||||
.exit
|
||||
.procend
|
||||
|
||||
|
||||
|
||||
73
grub-core/lib/libgcrypt/mpi/hppa/mpih-rshift.S
Normal file
73
grub-core/lib/libgcrypt/mpi/hppa/mpih-rshift.S
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
/* hppa rshift
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_rshift( mpi_ptr_t wp, (gr26)
|
||||
* mpi_ptr_t up, (gr25)
|
||||
* mpi_size_t usize, (gr24)
|
||||
* unsigned cnt) (gr23)
|
||||
*/
|
||||
|
||||
.code
|
||||
.export _gcry_mpih_rshift
|
||||
.label _gcry_mpih_rshift
|
||||
.proc
|
||||
.callinfo frame=64,no_calls
|
||||
.entry
|
||||
|
||||
ldws,ma 4(0,%r25),%r22
|
||||
mtsar %r23
|
||||
addib,= -1,%r24,L$r004
|
||||
vshd %r22,%r0,%r28 ; compute carry out limb
|
||||
ldws,ma 4(0,%r25),%r29
|
||||
addib,= -1,%r24,L$r002
|
||||
vshd %r29,%r22,%r20
|
||||
|
||||
.label L$roop
|
||||
ldws,ma 4(0,%r25),%r22
|
||||
stws,ma %r20,4(0,%r26)
|
||||
addib,= -1,%r24,L$r003
|
||||
vshd %r22,%r29,%r20
|
||||
ldws,ma 4(0,%r25),%r29
|
||||
stws,ma %r20,4(0,%r26)
|
||||
addib,<> -1,%r24,L$roop
|
||||
vshd %r29,%r22,%r20
|
||||
|
||||
.label L$r002
|
||||
stws,ma %r20,4(0,%r26)
|
||||
vshd %r0,%r29,%r20
|
||||
bv 0(%r2)
|
||||
stw %r20,0(0,%r26)
|
||||
.label L$r003
|
||||
stws,ma %r20,4(0,%r26)
|
||||
.label L$r004
|
||||
vshd %r0,%r22,%r20
|
||||
bv 0(%r2)
|
||||
stw %r20,0(0,%r26)
|
||||
|
||||
.exit
|
||||
.procend
|
||||
|
||||
78
grub-core/lib/libgcrypt/mpi/hppa/mpih-sub1.S
Normal file
78
grub-core/lib/libgcrypt/mpi/hppa/mpih-sub1.S
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
/* hppa sub_n -- Sub two limb vectors of the same length > 0 and store
|
||||
* sum in a third limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_sub_n( mpi_ptr_t res_ptr, (gr26)
|
||||
* mpi_ptr_t s1_ptr, (gr25)
|
||||
* mpi_ptr_t s2_ptr, (gr24)
|
||||
* mpi_size_t size) (gr23)
|
||||
*
|
||||
* One might want to unroll this as for other processors, but it turns
|
||||
* out that the data cache contention after a store makes such
|
||||
* unrolling useless. We can't come under 5 cycles/limb anyway.
|
||||
*/
|
||||
|
||||
|
||||
.code
|
||||
.export _gcry_mpih_sub_n
|
||||
.label _gcry_mpih_sub_n
|
||||
.proc
|
||||
.callinfo frame=0,no_calls
|
||||
.entry
|
||||
|
||||
ldws,ma 4(0,%r25),%r20
|
||||
ldws,ma 4(0,%r24),%r19
|
||||
|
||||
addib,= -1,%r23,L$end ; check for (SIZE == 1)
|
||||
sub %r20,%r19,%r28 ; subtract first limbs ignoring cy
|
||||
|
||||
.label L$loop
|
||||
ldws,ma 4(0,%r25),%r20
|
||||
ldws,ma 4(0,%r24),%r19
|
||||
stws,ma %r28,4(0,%r26)
|
||||
addib,<> -1,%r23,L$loop
|
||||
subb %r20,%r19,%r28
|
||||
|
||||
.label L$end
|
||||
stws %r28,0(0,%r26)
|
||||
addc %r0,%r0,%r28
|
||||
bv 0(%r2)
|
||||
subi 1,%r28,%r28
|
||||
|
||||
.exit
|
||||
.procend
|
||||
|
||||
|
||||
|
||||
297
grub-core/lib/libgcrypt/mpi/hppa/udiv-qrnnd.S
Normal file
297
grub-core/lib/libgcrypt/mpi/hppa/udiv-qrnnd.S
Normal file
|
|
@ -0,0 +1,297 @@
|
|||
/* HP-PA __udiv_qrnnd division support, used from longlong.h.
|
||||
* This version runs fast on pre-PA7000 CPUs.
|
||||
*
|
||||
* Copyright (C) 1993, 1994, 1998, 2001,
|
||||
* 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/* INPUT PARAMETERS
|
||||
* rem_ptr gr26
|
||||
* n1 gr25
|
||||
* n0 gr24
|
||||
* d gr23
|
||||
*
|
||||
* The code size is a bit excessive. We could merge the last two ds;addc
|
||||
* sequences by simply moving the "bb,< Odd" instruction down. The only
|
||||
* trouble is the FFFFFFFF code that would need some hacking.
|
||||
*/
|
||||
|
||||
.code
|
||||
.export __udiv_qrnnd
|
||||
.label __udiv_qrnnd
|
||||
.proc
|
||||
.callinfo frame=0,no_calls
|
||||
.entry
|
||||
|
||||
comb,< %r23,0,L$largedivisor
|
||||
sub %r0,%r23,%r1 ; clear cy as side-effect
|
||||
ds %r0,%r1,%r0
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r23,%r25
|
||||
addc %r24,%r24,%r28
|
||||
ds %r25,%r23,%r25
|
||||
comclr,>= %r25,%r0,%r0
|
||||
addl %r25,%r23,%r25
|
||||
stws %r25,0(0,%r26)
|
||||
bv 0(%r2)
|
||||
addc %r28,%r28,%r28
|
||||
|
||||
.label L$largedivisor
|
||||
extru %r24,31,1,%r19 ; r19 = n0 & 1
|
||||
bb,< %r23,31,L$odd
|
||||
extru %r23,30,31,%r22 ; r22 = d >> 1
|
||||
shd %r25,%r24,1,%r24 ; r24 = new n0
|
||||
extru %r25,30,31,%r25 ; r25 = new n1
|
||||
sub %r0,%r22,%r21
|
||||
ds %r0,%r21,%r0
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
comclr,>= %r25,%r0,%r0
|
||||
addl %r25,%r22,%r25
|
||||
sh1addl %r25,%r19,%r25
|
||||
stws %r25,0(0,%r26)
|
||||
bv 0(%r2)
|
||||
addc %r24,%r24,%r28
|
||||
|
||||
.label L$odd
|
||||
addib,sv,n 1,%r22,L$FF.. ; r22 = (d / 2 + 1)
|
||||
shd %r25,%r24,1,%r24 ; r24 = new n0
|
||||
extru %r25,30,31,%r25 ; r25 = new n1
|
||||
sub %r0,%r22,%r21
|
||||
ds %r0,%r21,%r0
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r24
|
||||
ds %r25,%r22,%r25
|
||||
addc %r24,%r24,%r28
|
||||
comclr,>= %r25,%r0,%r0
|
||||
addl %r25,%r22,%r25
|
||||
sh1addl %r25,%r19,%r25
|
||||
; We have computed (n1,,n0) / (d + 1), q' = r28, r' = r25
|
||||
add,nuv %r28,%r25,%r25
|
||||
addl %r25,%r1,%r25
|
||||
addc %r0,%r28,%r28
|
||||
sub,<< %r25,%r23,%r0
|
||||
addl %r25,%r1,%r25
|
||||
stws %r25,0(0,%r26)
|
||||
bv 0(%r2)
|
||||
addc %r0,%r28,%r28
|
||||
|
||||
; This is just a special case of the code above.
|
||||
; We come here when d == 0xFFFFFFFF
|
||||
.label L$FF..
|
||||
add,uv %r25,%r24,%r24
|
||||
sub,<< %r24,%r23,%r0
|
||||
ldo 1(%r24),%r24
|
||||
stws %r24,0(0,%r26)
|
||||
bv 0(%r2)
|
||||
addc %r0,%r25,%r28
|
||||
|
||||
.exit
|
||||
.procend
|
||||
28
grub-core/lib/libgcrypt/mpi/i386/Manifest
Normal file
28
grub-core/lib/libgcrypt/mpi/i386/Manifest
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
# Manifest - checksums
|
||||
# Copyright 2003 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of Libgcrypt.
|
||||
#
|
||||
# Libgcrypt is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser general Public License as
|
||||
# published by the Free Software Foundation; either version 2.1 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# Libgcrypt is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
|
||||
mpih-add1.S
|
||||
mpih-mul1.S
|
||||
mpih-mul2.S
|
||||
mpih-mul3.S
|
||||
mpih-lshift.S
|
||||
mpih-rshift.S
|
||||
mpih-sub1.S
|
||||
syntax.h
|
||||
$names$ iQCVAwUAP+LmOTEAnp832S/7AQJZmgQA1+GIl7rXiEY00y5xD2kG5Lm2QD6c9aBME8hTl812OEcj0ul/QSpdv8E2NEKooifr4SiLVhEVfLNaLqAgN3cIsttn3rRX3/pMC5JwSKHDJPsUbpN9tzb5dr2YC9GG9m8xngAQrN11IQPnGfvFLJK+oDnEMIAeHDpOnX9NeQPDAQA==bnOy
|
||||
10
grub-core/lib/libgcrypt/mpi/i386/distfiles
Normal file
10
grub-core/lib/libgcrypt/mpi/i386/distfiles
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
Manifest
|
||||
mpih-add1.S
|
||||
mpih-mul1.S
|
||||
mpih-mul2.S
|
||||
mpih-mul3.S
|
||||
mpih-lshift.S
|
||||
mpih-rshift.S
|
||||
mpih-sub1.S
|
||||
syntax.h
|
||||
|
||||
116
grub-core/lib/libgcrypt/mpi/i386/mpih-add1.S
Normal file
116
grub-core/lib/libgcrypt/mpi/i386/mpih-add1.S
Normal file
|
|
@ -0,0 +1,116 @@
|
|||
/* i80386 add_n -- Add two limb vectors of the same length > 0 and store
|
||||
* sum in a third limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1995, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_add_n( mpi_ptr_t res_ptr, (sp + 4)
|
||||
* mpi_ptr_t s1_ptr, (sp + 8)
|
||||
* mpi_ptr_t s2_ptr, (sp + 12)
|
||||
* mpi_size_t size) (sp + 16)
|
||||
*/
|
||||
|
||||
.text
|
||||
ALIGN (3)
|
||||
.globl C_SYMBOL_NAME(_gcry_mpih_add_n)
|
||||
C_SYMBOL_NAME(_gcry_mpih_add_n:)
|
||||
pushl %edi
|
||||
pushl %esi
|
||||
|
||||
movl 12(%esp),%edi /* res_ptr */
|
||||
movl 16(%esp),%esi /* s1_ptr */
|
||||
movl 20(%esp),%edx /* s2_ptr */
|
||||
movl 24(%esp),%ecx /* size */
|
||||
|
||||
movl %ecx,%eax
|
||||
shrl $3,%ecx /* compute count for unrolled loop */
|
||||
negl %eax
|
||||
andl $7,%eax /* get index where to start loop */
|
||||
jz Loop /* necessary special case for 0 */
|
||||
incl %ecx /* adjust loop count */
|
||||
shll $2,%eax /* adjustment for pointers... */
|
||||
subl %eax,%edi /* ... since they are offset ... */
|
||||
subl %eax,%esi /* ... by a constant when we ... */
|
||||
subl %eax,%edx /* ... enter the loop */
|
||||
shrl $2,%eax /* restore previous value */
|
||||
#ifdef PIC
|
||||
/* Calculate start address in loop for PIC. Due to limitations in some
|
||||
assemblers, Loop-L0-3 cannot be put into the leal */
|
||||
call L0
|
||||
L0: leal (%eax,%eax,8),%eax
|
||||
addl (%esp),%eax
|
||||
addl $(Loop-L0-3),%eax
|
||||
addl $4,%esp
|
||||
#else
|
||||
/* Calculate start address in loop for non-PIC. */
|
||||
leal (Loop - 3)(%eax,%eax,8),%eax
|
||||
#endif
|
||||
jmp *%eax /* jump into loop */
|
||||
ALIGN (3)
|
||||
Loop: movl (%esi),%eax
|
||||
adcl (%edx),%eax
|
||||
movl %eax,(%edi)
|
||||
movl 4(%esi),%eax
|
||||
adcl 4(%edx),%eax
|
||||
movl %eax,4(%edi)
|
||||
movl 8(%esi),%eax
|
||||
adcl 8(%edx),%eax
|
||||
movl %eax,8(%edi)
|
||||
movl 12(%esi),%eax
|
||||
adcl 12(%edx),%eax
|
||||
movl %eax,12(%edi)
|
||||
movl 16(%esi),%eax
|
||||
adcl 16(%edx),%eax
|
||||
movl %eax,16(%edi)
|
||||
movl 20(%esi),%eax
|
||||
adcl 20(%edx),%eax
|
||||
movl %eax,20(%edi)
|
||||
movl 24(%esi),%eax
|
||||
adcl 24(%edx),%eax
|
||||
movl %eax,24(%edi)
|
||||
movl 28(%esi),%eax
|
||||
adcl 28(%edx),%eax
|
||||
movl %eax,28(%edi)
|
||||
leal 32(%edi),%edi
|
||||
leal 32(%esi),%esi
|
||||
leal 32(%edx),%edx
|
||||
decl %ecx
|
||||
jnz Loop
|
||||
|
||||
sbbl %eax,%eax
|
||||
negl %eax
|
||||
|
||||
popl %esi
|
||||
popl %edi
|
||||
ret
|
||||
|
||||
94
grub-core/lib/libgcrypt/mpi/i386/mpih-lshift.S
Normal file
94
grub-core/lib/libgcrypt/mpi/i386/mpih-lshift.S
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
/* i80386 lshift
|
||||
* Copyright (C) 1992, 1994, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_lshift( mpi_ptr_t wp, (sp + 4)
|
||||
* mpi_ptr_t up, (sp + 8)
|
||||
* mpi_size_t usize, (sp + 12)
|
||||
* unsigned cnt) (sp + 16)
|
||||
*/
|
||||
|
||||
.text
|
||||
ALIGN (3)
|
||||
.globl C_SYMBOL_NAME(_gcry_mpih_lshift)
|
||||
C_SYMBOL_NAME(_gcry_mpih_lshift:)
|
||||
pushl %edi
|
||||
pushl %esi
|
||||
pushl %ebx
|
||||
|
||||
movl 16(%esp),%edi /* res_ptr */
|
||||
movl 20(%esp),%esi /* s_ptr */
|
||||
movl 24(%esp),%edx /* size */
|
||||
movl 28(%esp),%ecx /* cnt */
|
||||
|
||||
subl $4,%esi /* adjust s_ptr */
|
||||
|
||||
movl (%esi,%edx,4),%ebx /* read most significant limb */
|
||||
xorl %eax,%eax
|
||||
shldl %cl,%ebx,%eax /* compute carry limb */
|
||||
decl %edx
|
||||
jz Lend
|
||||
pushl %eax /* push carry limb onto stack */
|
||||
testb $1,%dl
|
||||
jnz L1 /* enter loop in the middle */
|
||||
movl %ebx,%eax
|
||||
|
||||
ALIGN (3)
|
||||
Loop: movl (%esi,%edx,4),%ebx /* load next lower limb */
|
||||
shldl %cl,%ebx,%eax /* compute result limb */
|
||||
movl %eax,(%edi,%edx,4) /* store it */
|
||||
decl %edx
|
||||
L1: movl (%esi,%edx,4),%eax
|
||||
shldl %cl,%eax,%ebx
|
||||
movl %ebx,(%edi,%edx,4)
|
||||
decl %edx
|
||||
jnz Loop
|
||||
|
||||
shll %cl,%eax /* compute least significant limb */
|
||||
movl %eax,(%edi) /* store it */
|
||||
|
||||
popl %eax /* pop carry limb */
|
||||
|
||||
popl %ebx
|
||||
popl %esi
|
||||
popl %edi
|
||||
ret
|
||||
|
||||
Lend: shll %cl,%ebx /* compute least significant limb */
|
||||
movl %ebx,(%edi) /* store it */
|
||||
|
||||
popl %ebx
|
||||
popl %esi
|
||||
popl %edi
|
||||
ret
|
||||
|
||||
84
grub-core/lib/libgcrypt/mpi/i386/mpih-mul1.S
Normal file
84
grub-core/lib/libgcrypt/mpi/i386/mpih-mul1.S
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
/* i80386 mul_1 -- Multiply a limb vector with a limb and store
|
||||
* the result in a second limb vector.
|
||||
* Copyright (C) 1992, 1994, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_mul_1( mpi_ptr_t res_ptr, (sp + 4)
|
||||
* mpi_ptr_t s1_ptr, (sp + 8)
|
||||
* mpi_size_t s1_size, (sp + 12)
|
||||
* mpi_limb_t s2_limb) (sp + 16)
|
||||
*/
|
||||
|
||||
#define res_ptr edi
|
||||
#define s1_ptr esi
|
||||
#define size ecx
|
||||
#define s2_limb ebp
|
||||
|
||||
TEXT
|
||||
ALIGN (3)
|
||||
GLOBL C_SYMBOL_NAME(_gcry_mpih_mul_1)
|
||||
C_SYMBOL_NAME(_gcry_mpih_mul_1:)
|
||||
|
||||
INSN1(push,l ,R(edi))
|
||||
INSN1(push,l ,R(esi))
|
||||
INSN1(push,l ,R(ebx))
|
||||
INSN1(push,l ,R(ebp))
|
||||
|
||||
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,20))
|
||||
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,24))
|
||||
INSN2(mov,l ,R(size),MEM_DISP(esp,28))
|
||||
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,32))
|
||||
|
||||
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
|
||||
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
|
||||
INSN1(neg,l ,R(size))
|
||||
INSN2(xor,l ,R(ebx),R(ebx))
|
||||
ALIGN (3)
|
||||
Loop:
|
||||
INSN2(mov,l ,R(eax),MEM_INDEX(s1_ptr,size,4))
|
||||
INSN1(mul,l ,R(s2_limb))
|
||||
INSN2(add,l ,R(eax),R(ebx))
|
||||
INSN2(mov,l ,MEM_INDEX(res_ptr,size,4),R(eax))
|
||||
INSN2(adc,l ,R(edx),$0)
|
||||
INSN2(mov,l ,R(ebx),R(edx))
|
||||
|
||||
INSN1(inc,l ,R(size))
|
||||
INSN1(jnz, ,Loop)
|
||||
INSN2(mov,l ,R(eax),R(ebx))
|
||||
|
||||
INSN1(pop,l ,R(ebp))
|
||||
INSN1(pop,l ,R(ebx))
|
||||
INSN1(pop,l ,R(esi))
|
||||
INSN1(pop,l ,R(edi))
|
||||
ret
|
||||
|
||||
86
grub-core/lib/libgcrypt/mpi/i386/mpih-mul2.S
Normal file
86
grub-core/lib/libgcrypt/mpi/i386/mpih-mul2.S
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
/* i80386 addmul_1 -- Multiply a limb vector with a limb and add
|
||||
* the result to a second limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_addmul_1( mpi_ptr_t res_ptr, (sp + 4)
|
||||
* mpi_ptr_t s1_ptr, (sp + 8)
|
||||
* mpi_size_t s1_size, (sp + 12)
|
||||
* mpi_limb_t s2_limb) (sp + 16)
|
||||
*/
|
||||
|
||||
#define res_ptr edi
|
||||
#define s1_ptr esi
|
||||
#define size ecx
|
||||
#define s2_limb ebp
|
||||
|
||||
TEXT
|
||||
ALIGN (3)
|
||||
GLOBL C_SYMBOL_NAME(_gcry_mpih_addmul_1)
|
||||
C_SYMBOL_NAME(_gcry_mpih_addmul_1:)
|
||||
|
||||
INSN1(push,l ,R(edi))
|
||||
INSN1(push,l ,R(esi))
|
||||
INSN1(push,l ,R(ebx))
|
||||
INSN1(push,l ,R(ebp))
|
||||
|
||||
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,20))
|
||||
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,24))
|
||||
INSN2(mov,l ,R(size),MEM_DISP(esp,28))
|
||||
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,32))
|
||||
|
||||
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
|
||||
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
|
||||
INSN1(neg,l ,R(size))
|
||||
INSN2(xor,l ,R(ebx),R(ebx))
|
||||
ALIGN (3)
|
||||
Loop:
|
||||
INSN2(mov,l ,R(eax),MEM_INDEX(s1_ptr,size,4))
|
||||
INSN1(mul,l ,R(s2_limb))
|
||||
INSN2(add,l ,R(eax),R(ebx))
|
||||
INSN2(adc,l ,R(edx),$0)
|
||||
INSN2(add,l ,MEM_INDEX(res_ptr,size,4),R(eax))
|
||||
INSN2(adc,l ,R(edx),$0)
|
||||
INSN2(mov,l ,R(ebx),R(edx))
|
||||
|
||||
INSN1(inc,l ,R(size))
|
||||
INSN1(jnz, ,Loop)
|
||||
INSN2(mov,l ,R(eax),R(ebx))
|
||||
|
||||
INSN1(pop,l ,R(ebp))
|
||||
INSN1(pop,l ,R(ebx))
|
||||
INSN1(pop,l ,R(esi))
|
||||
INSN1(pop,l ,R(edi))
|
||||
ret
|
||||
|
||||
86
grub-core/lib/libgcrypt/mpi/i386/mpih-mul3.S
Normal file
86
grub-core/lib/libgcrypt/mpi/i386/mpih-mul3.S
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
/* i80386 submul_1 -- Multiply a limb vector with a limb and add
|
||||
* the result to a second limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_submul_1( mpi_ptr_t res_ptr, (sp + 4)
|
||||
* mpi_ptr_t s1_ptr, (sp + 8)
|
||||
* mpi_size_t s1_size, (sp + 12)
|
||||
* mpi_limb_t s2_limb) (sp + 16)
|
||||
*/
|
||||
|
||||
#define res_ptr edi
|
||||
#define s1_ptr esi
|
||||
#define size ecx
|
||||
#define s2_limb ebp
|
||||
|
||||
TEXT
|
||||
ALIGN (3)
|
||||
GLOBL C_SYMBOL_NAME(_gcry_mpih_submul_1)
|
||||
C_SYMBOL_NAME(_gcry_mpih_submul_1:)
|
||||
|
||||
INSN1(push,l ,R(edi))
|
||||
INSN1(push,l ,R(esi))
|
||||
INSN1(push,l ,R(ebx))
|
||||
INSN1(push,l ,R(ebp))
|
||||
|
||||
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,20))
|
||||
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,24))
|
||||
INSN2(mov,l ,R(size),MEM_DISP(esp,28))
|
||||
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,32))
|
||||
|
||||
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
|
||||
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
|
||||
INSN1(neg,l ,R(size))
|
||||
INSN2(xor,l ,R(ebx),R(ebx))
|
||||
ALIGN (3)
|
||||
Loop:
|
||||
INSN2(mov,l ,R(eax),MEM_INDEX(s1_ptr,size,4))
|
||||
INSN1(mul,l ,R(s2_limb))
|
||||
INSN2(add,l ,R(eax),R(ebx))
|
||||
INSN2(adc,l ,R(edx),$0)
|
||||
INSN2(sub,l ,MEM_INDEX(res_ptr,size,4),R(eax))
|
||||
INSN2(adc,l ,R(edx),$0)
|
||||
INSN2(mov,l ,R(ebx),R(edx))
|
||||
|
||||
INSN1(inc,l ,R(size))
|
||||
INSN1(jnz, ,Loop)
|
||||
INSN2(mov,l ,R(eax),R(ebx))
|
||||
|
||||
INSN1(pop,l ,R(ebp))
|
||||
INSN1(pop,l ,R(ebx))
|
||||
INSN1(pop,l ,R(esi))
|
||||
INSN1(pop,l ,R(edi))
|
||||
ret
|
||||
|
||||
97
grub-core/lib/libgcrypt/mpi/i386/mpih-rshift.S
Normal file
97
grub-core/lib/libgcrypt/mpi/i386/mpih-rshift.S
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
/* i80386 rshift
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_rshift( mpi_ptr_t wp, (sp + 4)
|
||||
* mpi_ptr_t up, (sp + 8)
|
||||
* mpi_size_t usize, (sp + 12)
|
||||
* unsigned cnt) (sp + 16)
|
||||
*/
|
||||
|
||||
.text
|
||||
ALIGN (3)
|
||||
.globl C_SYMBOL_NAME(_gcry_mpih_rshift)
|
||||
C_SYMBOL_NAME(_gcry_mpih_rshift:)
|
||||
pushl %edi
|
||||
pushl %esi
|
||||
pushl %ebx
|
||||
|
||||
movl 16(%esp),%edi /* wp */
|
||||
movl 20(%esp),%esi /* up */
|
||||
movl 24(%esp),%edx /* usize */
|
||||
movl 28(%esp),%ecx /* cnt */
|
||||
|
||||
leal -4(%edi,%edx,4),%edi
|
||||
leal (%esi,%edx,4),%esi
|
||||
negl %edx
|
||||
|
||||
movl (%esi,%edx,4),%ebx /* read least significant limb */
|
||||
xorl %eax,%eax
|
||||
shrdl %cl,%ebx,%eax /* compute carry limb */
|
||||
incl %edx
|
||||
jz Lend2
|
||||
pushl %eax /* push carry limb onto stack */
|
||||
testb $1,%dl
|
||||
jnz L2 /* enter loop in the middle */
|
||||
movl %ebx,%eax
|
||||
|
||||
ALIGN (3)
|
||||
Loop2: movl (%esi,%edx,4),%ebx /* load next higher limb */
|
||||
shrdl %cl,%ebx,%eax /* compute result limb */
|
||||
movl %eax,(%edi,%edx,4) /* store it */
|
||||
incl %edx
|
||||
L2: movl (%esi,%edx,4),%eax
|
||||
shrdl %cl,%eax,%ebx
|
||||
movl %ebx,(%edi,%edx,4)
|
||||
incl %edx
|
||||
jnz Loop2
|
||||
|
||||
shrl %cl,%eax /* compute most significant limb */
|
||||
movl %eax,(%edi) /* store it */
|
||||
|
||||
popl %eax /* pop carry limb */
|
||||
|
||||
popl %ebx
|
||||
popl %esi
|
||||
popl %edi
|
||||
ret
|
||||
|
||||
Lend2: shrl %cl,%ebx /* compute most significant limb */
|
||||
movl %ebx,(%edi) /* store it */
|
||||
|
||||
popl %ebx
|
||||
popl %esi
|
||||
popl %edi
|
||||
ret
|
||||
|
||||
117
grub-core/lib/libgcrypt/mpi/i386/mpih-sub1.S
Normal file
117
grub-core/lib/libgcrypt/mpi/i386/mpih-sub1.S
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
/* i80386 sub_n -- Sub two limb vectors of the same length > 0 and store
|
||||
* sum in a third limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1995, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_sub_n( mpi_ptr_t res_ptr, (sp + 4)
|
||||
* mpi_ptr_t s1_ptr, (sp + 8)
|
||||
* mpi_ptr_t s2_ptr, (sp + 12)
|
||||
* mpi_size_t size) (sp + 16)
|
||||
*/
|
||||
|
||||
|
||||
.text
|
||||
ALIGN (3)
|
||||
.globl C_SYMBOL_NAME(_gcry_mpih_sub_n)
|
||||
C_SYMBOL_NAME(_gcry_mpih_sub_n:)
|
||||
pushl %edi
|
||||
pushl %esi
|
||||
|
||||
movl 12(%esp),%edi /* res_ptr */
|
||||
movl 16(%esp),%esi /* s1_ptr */
|
||||
movl 20(%esp),%edx /* s2_ptr */
|
||||
movl 24(%esp),%ecx /* size */
|
||||
|
||||
movl %ecx,%eax
|
||||
shrl $3,%ecx /* compute count for unrolled loop */
|
||||
negl %eax
|
||||
andl $7,%eax /* get index where to start loop */
|
||||
jz Loop /* necessary special case for 0 */
|
||||
incl %ecx /* adjust loop count */
|
||||
shll $2,%eax /* adjustment for pointers... */
|
||||
subl %eax,%edi /* ... since they are offset ... */
|
||||
subl %eax,%esi /* ... by a constant when we ... */
|
||||
subl %eax,%edx /* ... enter the loop */
|
||||
shrl $2,%eax /* restore previous value */
|
||||
#ifdef PIC
|
||||
/* Calculate start address in loop for PIC. Due to limitations in some
|
||||
assemblers, Loop-L0-3 cannot be put into the leal */
|
||||
call L0
|
||||
L0: leal (%eax,%eax,8),%eax
|
||||
addl (%esp),%eax
|
||||
addl $(Loop-L0-3),%eax
|
||||
addl $4,%esp
|
||||
#else
|
||||
/* Calculate start address in loop for non-PIC. */
|
||||
leal (Loop - 3)(%eax,%eax,8),%eax
|
||||
#endif
|
||||
jmp *%eax /* jump into loop */
|
||||
ALIGN (3)
|
||||
Loop: movl (%esi),%eax
|
||||
sbbl (%edx),%eax
|
||||
movl %eax,(%edi)
|
||||
movl 4(%esi),%eax
|
||||
sbbl 4(%edx),%eax
|
||||
movl %eax,4(%edi)
|
||||
movl 8(%esi),%eax
|
||||
sbbl 8(%edx),%eax
|
||||
movl %eax,8(%edi)
|
||||
movl 12(%esi),%eax
|
||||
sbbl 12(%edx),%eax
|
||||
movl %eax,12(%edi)
|
||||
movl 16(%esi),%eax
|
||||
sbbl 16(%edx),%eax
|
||||
movl %eax,16(%edi)
|
||||
movl 20(%esi),%eax
|
||||
sbbl 20(%edx),%eax
|
||||
movl %eax,20(%edi)
|
||||
movl 24(%esi),%eax
|
||||
sbbl 24(%edx),%eax
|
||||
movl %eax,24(%edi)
|
||||
movl 28(%esi),%eax
|
||||
sbbl 28(%edx),%eax
|
||||
movl %eax,28(%edi)
|
||||
leal 32(%edi),%edi
|
||||
leal 32(%esi),%esi
|
||||
leal 32(%edx),%edx
|
||||
decl %ecx
|
||||
jnz Loop
|
||||
|
||||
sbbl %eax,%eax
|
||||
negl %eax
|
||||
|
||||
popl %esi
|
||||
popl %edi
|
||||
ret
|
||||
|
||||
68
grub-core/lib/libgcrypt/mpi/i386/syntax.h
Normal file
68
grub-core/lib/libgcrypt/mpi/i386/syntax.h
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
/* syntax.h -- Definitions for x86 syntax variations.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1995, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
#undef ALIGN
|
||||
|
||||
#if defined (BSD_SYNTAX) || defined (ELF_SYNTAX)
|
||||
#define R(r) %r
|
||||
#define MEM(base)(base)
|
||||
#define MEM_DISP(base,displacement)displacement(R(base))
|
||||
#define MEM_INDEX(base,index,size)(R(base),R(index),size)
|
||||
#ifdef __STDC__
|
||||
#define INSN1(mnemonic,size_suffix,dst)mnemonic##size_suffix dst
|
||||
#define INSN2(mnemonic,size_suffix,dst,src)mnemonic##size_suffix src,dst
|
||||
#else
|
||||
#define INSN1(mnemonic,size_suffix,dst)mnemonic/**/size_suffix dst
|
||||
#define INSN2(mnemonic,size_suffix,dst,src)mnemonic/**/size_suffix src,dst
|
||||
#endif
|
||||
#define TEXT .text
|
||||
#if defined (BSD_SYNTAX)
|
||||
#define ALIGN(log) .align log
|
||||
#endif
|
||||
#if defined (ELF_SYNTAX)
|
||||
#define ALIGN(log) .align 1<<(log)
|
||||
#endif
|
||||
#define GLOBL .globl
|
||||
#endif
|
||||
|
||||
#ifdef INTEL_SYNTAX
|
||||
#define R(r) r
|
||||
#define MEM(base)[base]
|
||||
#define MEM_DISP(base,displacement)[base+(displacement)]
|
||||
#define MEM_INDEX(base,index,size)[base+index*size]
|
||||
#define INSN1(mnemonic,size_suffix,dst)mnemonic dst
|
||||
#define INSN2(mnemonic,size_suffix,dst,src)mnemonic dst,src
|
||||
#define TEXT .text
|
||||
#define ALIGN(log) .align log
|
||||
#define GLOBL .globl
|
||||
#endif
|
||||
|
||||
#ifdef X86_BROKEN_ALIGN
|
||||
#undef ALIGN
|
||||
#define ALIGN(log) .align log,0x90
|
||||
#endif
|
||||
27
grub-core/lib/libgcrypt/mpi/i586/Manifest
Normal file
27
grub-core/lib/libgcrypt/mpi/i586/Manifest
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
# Manifest - checksums
|
||||
# Copyright 2003 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of Libgcrypt.
|
||||
#
|
||||
# Libgcrypt is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser general Public License as
|
||||
# published by the Free Software Foundation; either version 2.1 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# Libgcrypt is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
|
||||
mpih-add1.S
|
||||
mpih-mul1.S
|
||||
mpih-mul2.S
|
||||
mpih-mul3.S
|
||||
mpih-lshift.S
|
||||
mpih-rshift.S
|
||||
mpih-sub1.S
|
||||
$names$ iQCVAwUAP+LmQDEAnp832S/7AQKCmgQAhG+E7X0KB4qdVf3sMb6Qr+Iv5Jlehzoub/5vxTRgePKzRuOHidCnTzSSoyzA++UcHrOjHQQDMsXnO6PqpS1d/TKkxjnGN7rE8mvMYlFAT8RsawTozSfh14mCzI0HTDbaKL9Z8pcMJtadB3XqAuqWJNO8kyECJFwurt3DRWXSWS8==Rug5
|
||||
26
grub-core/lib/libgcrypt/mpi/i586/README
Normal file
26
grub-core/lib/libgcrypt/mpi/i586/README
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
This directory contains mpn functions optimized for Intel Pentium
|
||||
processors.
|
||||
|
||||
RELEVANT OPTIMIZATION ISSUES
|
||||
|
||||
1. Pentium doesn't allocate cache lines on writes, unlike most other modern
|
||||
processors. Since the functions in the mpn class do array writes, we have to
|
||||
handle allocating the destination cache lines by reading a word from it in the
|
||||
loops, to achieve the best performance.
|
||||
|
||||
2. Pairing of memory operations requires that the two issued operations refer
|
||||
to different cache banks. The simplest way to insure this is to read/write
|
||||
two words from the same object. If we make operations on different objects,
|
||||
they might or might not be to the same cache bank.
|
||||
|
||||
STATUS
|
||||
|
||||
1. mpn_lshift and mpn_rshift run at about 6 cycles/limb, but the Pentium
|
||||
documentation indicates that they should take only 43/8 = 5.375 cycles/limb,
|
||||
or 5 cycles/limb asymptotically.
|
||||
|
||||
2. mpn_add_n and mpn_sub_n run at asymptotically 2 cycles/limb. Due to loop
|
||||
overhead and other delays (cache refill?), they run at or near 2.5 cycles/limb.
|
||||
|
||||
3. mpn_mul_1, mpn_addmul_1, mpn_submul_1 all run 1 cycle faster than they
|
||||
should...
|
||||
10
grub-core/lib/libgcrypt/mpi/i586/distfiles
Normal file
10
grub-core/lib/libgcrypt/mpi/i586/distfiles
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
Manifest
|
||||
mpih-add1.S
|
||||
mpih-mul1.S
|
||||
mpih-mul2.S
|
||||
mpih-mul3.S
|
||||
mpih-lshift.S
|
||||
mpih-rshift.S
|
||||
mpih-sub1.S
|
||||
README
|
||||
|
||||
135
grub-core/lib/libgcrypt/mpi/i586/mpih-add1.S
Normal file
135
grub-core/lib/libgcrypt/mpi/i586/mpih-add1.S
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
/* i80586 add_n -- Add two limb vectors of the same length > 0 and store
|
||||
* sum in a third limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1995, 1996, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_add_n( mpi_ptr_t res_ptr, (sp + 4)
|
||||
* mpi_ptr_t s1_ptr, (sp + 8)
|
||||
* mpi_ptr_t s2_ptr, (sp + 12)
|
||||
* mpi_size_t size) (sp + 16)
|
||||
*/
|
||||
|
||||
.text
|
||||
ALIGN (3)
|
||||
.globl C_SYMBOL_NAME(_gcry_mpih_add_n)
|
||||
C_SYMBOL_NAME(_gcry_mpih_add_n:)
|
||||
pushl %edi
|
||||
pushl %esi
|
||||
pushl %ebx
|
||||
pushl %ebp
|
||||
|
||||
movl 20(%esp),%edi /* res_ptr */
|
||||
movl 24(%esp),%esi /* s1_ptr */
|
||||
movl 28(%esp),%ebp /* s2_ptr */
|
||||
movl 32(%esp),%ecx /* size */
|
||||
|
||||
movl (%ebp),%ebx
|
||||
|
||||
decl %ecx
|
||||
movl %ecx,%edx
|
||||
shrl $3,%ecx
|
||||
andl $7,%edx
|
||||
testl %ecx,%ecx /* zero carry flag */
|
||||
jz Lend
|
||||
pushl %edx
|
||||
|
||||
ALIGN (3)
|
||||
Loop: movl 28(%edi),%eax /* fetch destination cache line */
|
||||
leal 32(%edi),%edi
|
||||
|
||||
L1: movl (%esi),%eax
|
||||
movl 4(%esi),%edx
|
||||
adcl %ebx,%eax
|
||||
movl 4(%ebp),%ebx
|
||||
adcl %ebx,%edx
|
||||
movl 8(%ebp),%ebx
|
||||
movl %eax,-32(%edi)
|
||||
movl %edx,-28(%edi)
|
||||
|
||||
L2: movl 8(%esi),%eax
|
||||
movl 12(%esi),%edx
|
||||
adcl %ebx,%eax
|
||||
movl 12(%ebp),%ebx
|
||||
adcl %ebx,%edx
|
||||
movl 16(%ebp),%ebx
|
||||
movl %eax,-24(%edi)
|
||||
movl %edx,-20(%edi)
|
||||
|
||||
L3: movl 16(%esi),%eax
|
||||
movl 20(%esi),%edx
|
||||
adcl %ebx,%eax
|
||||
movl 20(%ebp),%ebx
|
||||
adcl %ebx,%edx
|
||||
movl 24(%ebp),%ebx
|
||||
movl %eax,-16(%edi)
|
||||
movl %edx,-12(%edi)
|
||||
|
||||
L4: movl 24(%esi),%eax
|
||||
movl 28(%esi),%edx
|
||||
adcl %ebx,%eax
|
||||
movl 28(%ebp),%ebx
|
||||
adcl %ebx,%edx
|
||||
movl 32(%ebp),%ebx
|
||||
movl %eax,-8(%edi)
|
||||
movl %edx,-4(%edi)
|
||||
|
||||
leal 32(%esi),%esi
|
||||
leal 32(%ebp),%ebp
|
||||
decl %ecx
|
||||
jnz Loop
|
||||
|
||||
popl %edx
|
||||
Lend:
|
||||
decl %edx /* test %edx w/o clobbering carry */
|
||||
js Lend2
|
||||
incl %edx
|
||||
Loop2:
|
||||
leal 4(%edi),%edi
|
||||
movl (%esi),%eax
|
||||
adcl %ebx,%eax
|
||||
movl 4(%ebp),%ebx
|
||||
movl %eax,-4(%edi)
|
||||
leal 4(%esi),%esi
|
||||
leal 4(%ebp),%ebp
|
||||
decl %edx
|
||||
jnz Loop2
|
||||
Lend2:
|
||||
movl (%esi),%eax
|
||||
adcl %ebx,%eax
|
||||
movl %eax,(%edi)
|
||||
|
||||
sbbl %eax,%eax
|
||||
negl %eax
|
||||
|
||||
popl %ebp
|
||||
popl %ebx
|
||||
popl %esi
|
||||
popl %edi
|
||||
ret
|
||||
|
||||
|
||||
229
grub-core/lib/libgcrypt/mpi/i586/mpih-lshift.S
Normal file
229
grub-core/lib/libgcrypt/mpi/i586/mpih-lshift.S
Normal file
|
|
@ -0,0 +1,229 @@
|
|||
/* i80586 lshift
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_lshift( mpi_ptr_t wp, (sp + 4)
|
||||
* mpi_ptr_t up, (sp + 8)
|
||||
* mpi_size_t usize, (sp + 12)
|
||||
* unsigned cnt) (sp + 16)
|
||||
*/
|
||||
|
||||
.text
|
||||
ALIGN (3)
|
||||
.globl C_SYMBOL_NAME(_gcry_mpih_lshift)
|
||||
C_SYMBOL_NAME(_gcry_mpih_lshift:)
|
||||
|
||||
pushl %edi
|
||||
pushl %esi
|
||||
pushl %ebx
|
||||
pushl %ebp
|
||||
|
||||
movl 20(%esp),%edi /* res_ptr */
|
||||
movl 24(%esp),%esi /* s_ptr */
|
||||
movl 28(%esp),%ebp /* size */
|
||||
movl 32(%esp),%ecx /* cnt */
|
||||
|
||||
/* We can use faster code for shift-by-1 under certain conditions. */
|
||||
cmp $1,%ecx
|
||||
jne Lnormal
|
||||
leal 4(%esi),%eax
|
||||
cmpl %edi,%eax
|
||||
jnc Lspecial /* jump if s_ptr + 1 >= res_ptr */
|
||||
leal (%esi,%ebp,4),%eax
|
||||
cmpl %eax,%edi
|
||||
jnc Lspecial /* jump if res_ptr >= s_ptr + size */
|
||||
|
||||
Lnormal:
|
||||
leal -4(%edi,%ebp,4),%edi
|
||||
leal -4(%esi,%ebp,4),%esi
|
||||
|
||||
movl (%esi),%edx
|
||||
subl $4,%esi
|
||||
xorl %eax,%eax
|
||||
shldl %cl,%edx,%eax /* compute carry limb */
|
||||
pushl %eax /* push carry limb onto stack */
|
||||
|
||||
decl %ebp
|
||||
pushl %ebp
|
||||
shrl $3,%ebp
|
||||
jz Lend
|
||||
|
||||
movl (%edi),%eax /* fetch destination cache line */
|
||||
|
||||
ALIGN (2)
|
||||
Loop: movl -28(%edi),%eax /* fetch destination cache line */
|
||||
movl %edx,%ebx
|
||||
|
||||
movl (%esi),%eax
|
||||
movl -4(%esi),%edx
|
||||
shldl %cl,%eax,%ebx
|
||||
shldl %cl,%edx,%eax
|
||||
movl %ebx,(%edi)
|
||||
movl %eax,-4(%edi)
|
||||
|
||||
movl -8(%esi),%ebx
|
||||
movl -12(%esi),%eax
|
||||
shldl %cl,%ebx,%edx
|
||||
shldl %cl,%eax,%ebx
|
||||
movl %edx,-8(%edi)
|
||||
movl %ebx,-12(%edi)
|
||||
|
||||
movl -16(%esi),%edx
|
||||
movl -20(%esi),%ebx
|
||||
shldl %cl,%edx,%eax
|
||||
shldl %cl,%ebx,%edx
|
||||
movl %eax,-16(%edi)
|
||||
movl %edx,-20(%edi)
|
||||
|
||||
movl -24(%esi),%eax
|
||||
movl -28(%esi),%edx
|
||||
shldl %cl,%eax,%ebx
|
||||
shldl %cl,%edx,%eax
|
||||
movl %ebx,-24(%edi)
|
||||
movl %eax,-28(%edi)
|
||||
|
||||
subl $32,%esi
|
||||
subl $32,%edi
|
||||
decl %ebp
|
||||
jnz Loop
|
||||
|
||||
Lend: popl %ebp
|
||||
andl $7,%ebp
|
||||
jz Lend2
|
||||
Loop2: movl (%esi),%eax
|
||||
shldl %cl,%eax,%edx
|
||||
movl %edx,(%edi)
|
||||
movl %eax,%edx
|
||||
subl $4,%esi
|
||||
subl $4,%edi
|
||||
decl %ebp
|
||||
jnz Loop2
|
||||
|
||||
Lend2: shll %cl,%edx /* compute least significant limb */
|
||||
movl %edx,(%edi) /* store it */
|
||||
|
||||
popl %eax /* pop carry limb */
|
||||
|
||||
popl %ebp
|
||||
popl %ebx
|
||||
popl %esi
|
||||
popl %edi
|
||||
ret
|
||||
|
||||
/* We loop from least significant end of the arrays, which is only
|
||||
permissable if the source and destination don't overlap, since the
|
||||
function is documented to work for overlapping source and destination.
|
||||
*/
|
||||
|
||||
Lspecial:
|
||||
movl (%esi),%edx
|
||||
addl $4,%esi
|
||||
|
||||
decl %ebp
|
||||
pushl %ebp
|
||||
shrl $3,%ebp
|
||||
|
||||
addl %edx,%edx
|
||||
incl %ebp
|
||||
decl %ebp
|
||||
jz LLend
|
||||
|
||||
movl (%edi),%eax /* fetch destination cache line */
|
||||
|
||||
ALIGN (2)
|
||||
LLoop: movl 28(%edi),%eax /* fetch destination cache line */
|
||||
movl %edx,%ebx
|
||||
|
||||
movl (%esi),%eax
|
||||
movl 4(%esi),%edx
|
||||
adcl %eax,%eax
|
||||
movl %ebx,(%edi)
|
||||
adcl %edx,%edx
|
||||
movl %eax,4(%edi)
|
||||
|
||||
movl 8(%esi),%ebx
|
||||
movl 12(%esi),%eax
|
||||
adcl %ebx,%ebx
|
||||
movl %edx,8(%edi)
|
||||
adcl %eax,%eax
|
||||
movl %ebx,12(%edi)
|
||||
|
||||
movl 16(%esi),%edx
|
||||
movl 20(%esi),%ebx
|
||||
adcl %edx,%edx
|
||||
movl %eax,16(%edi)
|
||||
adcl %ebx,%ebx
|
||||
movl %edx,20(%edi)
|
||||
|
||||
movl 24(%esi),%eax
|
||||
movl 28(%esi),%edx
|
||||
adcl %eax,%eax
|
||||
movl %ebx,24(%edi)
|
||||
adcl %edx,%edx
|
||||
movl %eax,28(%edi)
|
||||
|
||||
leal 32(%esi),%esi /* use leal not to clobber carry */
|
||||
leal 32(%edi),%edi
|
||||
decl %ebp
|
||||
jnz LLoop
|
||||
|
||||
LLend: popl %ebp
|
||||
sbbl %eax,%eax /* save carry in %eax */
|
||||
andl $7,%ebp
|
||||
jz LLend2
|
||||
addl %eax,%eax /* restore carry from eax */
|
||||
LLoop2: movl %edx,%ebx
|
||||
movl (%esi),%edx
|
||||
adcl %edx,%edx
|
||||
movl %ebx,(%edi)
|
||||
|
||||
leal 4(%esi),%esi /* use leal not to clobber carry */
|
||||
leal 4(%edi),%edi
|
||||
decl %ebp
|
||||
jnz LLoop2
|
||||
|
||||
jmp LL1
|
||||
LLend2: addl %eax,%eax /* restore carry from eax */
|
||||
LL1: movl %edx,(%edi) /* store last limb */
|
||||
|
||||
sbbl %eax,%eax
|
||||
negl %eax
|
||||
|
||||
popl %ebp
|
||||
popl %ebx
|
||||
popl %esi
|
||||
popl %edi
|
||||
ret
|
||||
|
||||
|
||||
89
grub-core/lib/libgcrypt/mpi/i586/mpih-mul1.S
Normal file
89
grub-core/lib/libgcrypt/mpi/i586/mpih-mul1.S
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
/* i80586 mul_1 -- Multiply a limb vector with a limb and store
|
||||
* the result in a second limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1996, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_mul_1( mpi_ptr_t res_ptr, (sp + 4)
|
||||
* mpi_ptr_t s1_ptr, (sp + 8)
|
||||
* mpi_size_t s1_size, (sp + 12)
|
||||
* mpi_limb_t s2_limb) (sp + 16)
|
||||
*/
|
||||
|
||||
#define res_ptr edi
|
||||
#define s1_ptr esi
|
||||
#define size ecx
|
||||
#define s2_limb ebp
|
||||
|
||||
TEXT
|
||||
ALIGN (3)
|
||||
GLOBL C_SYMBOL_NAME(_gcry_mpih_mul_1)
|
||||
C_SYMBOL_NAME(_gcry_mpih_mul_1:)
|
||||
|
||||
INSN1(push,l ,R(edi))
|
||||
INSN1(push,l ,R(esi))
|
||||
INSN1(push,l ,R(ebx))
|
||||
INSN1(push,l ,R(ebp))
|
||||
|
||||
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,20))
|
||||
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,24))
|
||||
INSN2(mov,l ,R(size),MEM_DISP(esp,28))
|
||||
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,32))
|
||||
|
||||
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
|
||||
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
|
||||
INSN1(neg,l ,R(size))
|
||||
INSN2(xor,l ,R(ebx),R(ebx))
|
||||
ALIGN (3)
|
||||
|
||||
Loop: INSN2(adc,l ,R(ebx),$0)
|
||||
INSN2(mov,l ,R(eax),MEM_INDEX(s1_ptr,size,4))
|
||||
|
||||
INSN1(mul,l ,R(s2_limb))
|
||||
|
||||
INSN2(add,l ,R(ebx),R(eax))
|
||||
|
||||
INSN2(mov,l ,MEM_INDEX(res_ptr,size,4),R(ebx))
|
||||
INSN1(inc,l ,R(size))
|
||||
|
||||
INSN2(mov,l ,R(ebx),R(edx))
|
||||
INSN1(jnz, ,Loop)
|
||||
|
||||
INSN2(adc,l ,R(ebx),$0)
|
||||
INSN2(mov,l ,R(eax),R(ebx))
|
||||
INSN1(pop,l ,R(ebp))
|
||||
INSN1(pop,l ,R(ebx))
|
||||
INSN1(pop,l ,R(esi))
|
||||
INSN1(pop,l ,R(edi))
|
||||
ret
|
||||
|
||||
93
grub-core/lib/libgcrypt/mpi/i586/mpih-mul2.S
Normal file
93
grub-core/lib/libgcrypt/mpi/i586/mpih-mul2.S
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
/* i80586 addmul_1 -- Multiply a limb vector with a limb and add
|
||||
* the result to a second limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_addmul_1( mpi_ptr_t res_ptr, (sp + 4)
|
||||
* mpi_ptr_t s1_ptr, (sp + 8)
|
||||
* mpi_size_t s1_size, (sp + 12)
|
||||
* mpi_limb_t s2_limb) (sp + 16)
|
||||
*/
|
||||
|
||||
#define res_ptr edi
|
||||
#define s1_ptr esi
|
||||
#define size ecx
|
||||
#define s2_limb ebp
|
||||
|
||||
TEXT
|
||||
ALIGN (3)
|
||||
GLOBL C_SYMBOL_NAME(_gcry_mpih_addmul_1)
|
||||
C_SYMBOL_NAME(_gcry_mpih_addmul_1:)
|
||||
|
||||
INSN1(push,l ,R(edi))
|
||||
INSN1(push,l ,R(esi))
|
||||
INSN1(push,l ,R(ebx))
|
||||
INSN1(push,l ,R(ebp))
|
||||
|
||||
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,20))
|
||||
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,24))
|
||||
INSN2(mov,l ,R(size),MEM_DISP(esp,28))
|
||||
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,32))
|
||||
|
||||
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
|
||||
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
|
||||
INSN1(neg,l ,R(size))
|
||||
INSN2(xor,l ,R(ebx),R(ebx))
|
||||
ALIGN (3)
|
||||
|
||||
Loop: INSN2(adc,l ,R(ebx),$0)
|
||||
INSN2(mov,l ,R(eax),MEM_INDEX(s1_ptr,size,4))
|
||||
|
||||
INSN1(mul,l ,R(s2_limb))
|
||||
|
||||
INSN2(add,l ,R(eax),R(ebx))
|
||||
INSN2(mov,l ,R(ebx),MEM_INDEX(res_ptr,size,4))
|
||||
|
||||
INSN2(adc,l ,R(edx),$0)
|
||||
INSN2(add,l ,R(ebx),R(eax))
|
||||
|
||||
INSN2(mov,l ,MEM_INDEX(res_ptr,size,4),R(ebx))
|
||||
INSN1(inc,l ,R(size))
|
||||
|
||||
INSN2(mov,l ,R(ebx),R(edx))
|
||||
INSN1(jnz, ,Loop)
|
||||
|
||||
INSN2(adc,l ,R(ebx),$0)
|
||||
INSN2(mov,l ,R(eax),R(ebx))
|
||||
INSN1(pop,l ,R(ebp))
|
||||
INSN1(pop,l ,R(ebx))
|
||||
INSN1(pop,l ,R(esi))
|
||||
INSN1(pop,l ,R(edi))
|
||||
ret
|
||||
|
||||
93
grub-core/lib/libgcrypt/mpi/i586/mpih-mul3.S
Normal file
93
grub-core/lib/libgcrypt/mpi/i586/mpih-mul3.S
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
/* i80586 submul_1 -- Multiply a limb vector with a limb and add
|
||||
* the result to a second limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_submul_1( mpi_ptr_t res_ptr, (sp + 4)
|
||||
* mpi_ptr_t s1_ptr, (sp + 8)
|
||||
* mpi_size_t s1_size, (sp + 12)
|
||||
* mpi_limb_t s2_limb) (sp + 16)
|
||||
*/
|
||||
|
||||
#define res_ptr edi
|
||||
#define s1_ptr esi
|
||||
#define size ecx
|
||||
#define s2_limb ebp
|
||||
|
||||
TEXT
|
||||
ALIGN (3)
|
||||
GLOBL C_SYMBOL_NAME(_gcry_mpih_submul_1)
|
||||
C_SYMBOL_NAME(_gcry_mpih_submul_1:)
|
||||
|
||||
INSN1(push,l ,R(edi))
|
||||
INSN1(push,l ,R(esi))
|
||||
INSN1(push,l ,R(ebx))
|
||||
INSN1(push,l ,R(ebp))
|
||||
|
||||
INSN2(mov,l ,R(res_ptr),MEM_DISP(esp,20))
|
||||
INSN2(mov,l ,R(s1_ptr),MEM_DISP(esp,24))
|
||||
INSN2(mov,l ,R(size),MEM_DISP(esp,28))
|
||||
INSN2(mov,l ,R(s2_limb),MEM_DISP(esp,32))
|
||||
|
||||
INSN2(lea,l ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
|
||||
INSN2(lea,l ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
|
||||
INSN1(neg,l ,R(size))
|
||||
INSN2(xor,l ,R(ebx),R(ebx))
|
||||
ALIGN (3)
|
||||
|
||||
Loop: INSN2(adc,l ,R(ebx),$0)
|
||||
INSN2(mov,l ,R(eax),MEM_INDEX(s1_ptr,size,4))
|
||||
|
||||
INSN1(mul,l ,R(s2_limb))
|
||||
|
||||
INSN2(add,l ,R(eax),R(ebx))
|
||||
INSN2(mov,l ,R(ebx),MEM_INDEX(res_ptr,size,4))
|
||||
|
||||
INSN2(adc,l ,R(edx),$0)
|
||||
INSN2(sub,l ,R(ebx),R(eax))
|
||||
|
||||
INSN2(mov,l ,MEM_INDEX(res_ptr,size,4),R(ebx))
|
||||
INSN1(inc,l ,R(size))
|
||||
|
||||
INSN2(mov,l ,R(ebx),R(edx))
|
||||
INSN1(jnz, ,Loop)
|
||||
|
||||
INSN2(adc,l ,R(ebx),$0)
|
||||
INSN2(mov,l ,R(eax),R(ebx))
|
||||
INSN1(pop,l ,R(ebp))
|
||||
INSN1(pop,l ,R(ebx))
|
||||
INSN1(pop,l ,R(esi))
|
||||
INSN1(pop,l ,R(edi))
|
||||
ret
|
||||
|
||||
228
grub-core/lib/libgcrypt/mpi/i586/mpih-rshift.S
Normal file
228
grub-core/lib/libgcrypt/mpi/i586/mpih-rshift.S
Normal file
|
|
@ -0,0 +1,228 @@
|
|||
/* i80586 rshift
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_rshift( mpi_ptr_t wp, (sp + 4)
|
||||
* mpi_ptr_t up, (sp + 8)
|
||||
* mpi_size_t usize, (sp + 12)
|
||||
* unsigned cnt) (sp + 16)
|
||||
*/
|
||||
|
||||
.text
|
||||
ALIGN (3)
|
||||
.globl C_SYMBOL_NAME(_gcry_mpih_rshift)
|
||||
C_SYMBOL_NAME(_gcry_mpih_rshift:)
|
||||
pushl %edi
|
||||
pushl %esi
|
||||
pushl %ebx
|
||||
pushl %ebp
|
||||
|
||||
movl 20(%esp),%edi /* res_ptr */
|
||||
movl 24(%esp),%esi /* s_ptr */
|
||||
movl 28(%esp),%ebp /* size */
|
||||
movl 32(%esp),%ecx /* cnt */
|
||||
|
||||
/* We can use faster code for shift-by-1 under certain conditions. */
|
||||
cmp $1,%ecx
|
||||
jne Rnormal
|
||||
leal 4(%edi),%eax
|
||||
cmpl %esi,%eax
|
||||
jnc Rspecial /* jump if res_ptr + 1 >= s_ptr */
|
||||
leal (%edi,%ebp,4),%eax
|
||||
cmpl %eax,%esi
|
||||
jnc Rspecial /* jump if s_ptr >= res_ptr + size */
|
||||
|
||||
Rnormal:
|
||||
movl (%esi),%edx
|
||||
addl $4,%esi
|
||||
xorl %eax,%eax
|
||||
shrdl %cl,%edx,%eax /* compute carry limb */
|
||||
pushl %eax /* push carry limb onto stack */
|
||||
|
||||
decl %ebp
|
||||
pushl %ebp
|
||||
shrl $3,%ebp
|
||||
jz Rend
|
||||
|
||||
movl (%edi),%eax /* fetch destination cache line */
|
||||
|
||||
ALIGN (2)
|
||||
Roop: movl 28(%edi),%eax /* fetch destination cache line */
|
||||
movl %edx,%ebx
|
||||
|
||||
movl (%esi),%eax
|
||||
movl 4(%esi),%edx
|
||||
shrdl %cl,%eax,%ebx
|
||||
shrdl %cl,%edx,%eax
|
||||
movl %ebx,(%edi)
|
||||
movl %eax,4(%edi)
|
||||
|
||||
movl 8(%esi),%ebx
|
||||
movl 12(%esi),%eax
|
||||
shrdl %cl,%ebx,%edx
|
||||
shrdl %cl,%eax,%ebx
|
||||
movl %edx,8(%edi)
|
||||
movl %ebx,12(%edi)
|
||||
|
||||
movl 16(%esi),%edx
|
||||
movl 20(%esi),%ebx
|
||||
shrdl %cl,%edx,%eax
|
||||
shrdl %cl,%ebx,%edx
|
||||
movl %eax,16(%edi)
|
||||
movl %edx,20(%edi)
|
||||
|
||||
movl 24(%esi),%eax
|
||||
movl 28(%esi),%edx
|
||||
shrdl %cl,%eax,%ebx
|
||||
shrdl %cl,%edx,%eax
|
||||
movl %ebx,24(%edi)
|
||||
movl %eax,28(%edi)
|
||||
|
||||
addl $32,%esi
|
||||
addl $32,%edi
|
||||
decl %ebp
|
||||
jnz Roop
|
||||
|
||||
Rend: popl %ebp
|
||||
andl $7,%ebp
|
||||
jz Rend2
|
||||
Roop2: movl (%esi),%eax
|
||||
shrdl %cl,%eax,%edx /* compute result limb */
|
||||
movl %edx,(%edi)
|
||||
movl %eax,%edx
|
||||
addl $4,%esi
|
||||
addl $4,%edi
|
||||
decl %ebp
|
||||
jnz Roop2
|
||||
|
||||
Rend2: shrl %cl,%edx /* compute most significant limb */
|
||||
movl %edx,(%edi) /* store it */
|
||||
|
||||
popl %eax /* pop carry limb */
|
||||
|
||||
popl %ebp
|
||||
popl %ebx
|
||||
popl %esi
|
||||
popl %edi
|
||||
ret
|
||||
|
||||
/* We loop from least significant end of the arrays, which is only
|
||||
permissable if the source and destination don't overlap, since the
|
||||
function is documented to work for overlapping source and destination.
|
||||
*/
|
||||
|
||||
Rspecial:
|
||||
leal -4(%edi,%ebp,4),%edi
|
||||
leal -4(%esi,%ebp,4),%esi
|
||||
|
||||
movl (%esi),%edx
|
||||
subl $4,%esi
|
||||
|
||||
decl %ebp
|
||||
pushl %ebp
|
||||
shrl $3,%ebp
|
||||
|
||||
shrl $1,%edx
|
||||
incl %ebp
|
||||
decl %ebp
|
||||
jz RLend
|
||||
|
||||
movl (%edi),%eax /* fetch destination cache line */
|
||||
|
||||
ALIGN (2)
|
||||
RLoop: movl -28(%edi),%eax /* fetch destination cache line */
|
||||
movl %edx,%ebx
|
||||
|
||||
movl (%esi),%eax
|
||||
movl -4(%esi),%edx
|
||||
rcrl $1,%eax
|
||||
movl %ebx,(%edi)
|
||||
rcrl $1,%edx
|
||||
movl %eax,-4(%edi)
|
||||
|
||||
movl -8(%esi),%ebx
|
||||
movl -12(%esi),%eax
|
||||
rcrl $1,%ebx
|
||||
movl %edx,-8(%edi)
|
||||
rcrl $1,%eax
|
||||
movl %ebx,-12(%edi)
|
||||
|
||||
movl -16(%esi),%edx
|
||||
movl -20(%esi),%ebx
|
||||
rcrl $1,%edx
|
||||
movl %eax,-16(%edi)
|
||||
rcrl $1,%ebx
|
||||
movl %edx,-20(%edi)
|
||||
|
||||
movl -24(%esi),%eax
|
||||
movl -28(%esi),%edx
|
||||
rcrl $1,%eax
|
||||
movl %ebx,-24(%edi)
|
||||
rcrl $1,%edx
|
||||
movl %eax,-28(%edi)
|
||||
|
||||
leal -32(%esi),%esi /* use leal not to clobber carry */
|
||||
leal -32(%edi),%edi
|
||||
decl %ebp
|
||||
jnz RLoop
|
||||
|
||||
RLend: popl %ebp
|
||||
sbbl %eax,%eax /* save carry in %eax */
|
||||
andl $7,%ebp
|
||||
jz RLend2
|
||||
addl %eax,%eax /* restore carry from eax */
|
||||
RLoop2: movl %edx,%ebx
|
||||
movl (%esi),%edx
|
||||
rcrl $1,%edx
|
||||
movl %ebx,(%edi)
|
||||
|
||||
leal -4(%esi),%esi /* use leal not to clobber carry */
|
||||
leal -4(%edi),%edi
|
||||
decl %ebp
|
||||
jnz RLoop2
|
||||
|
||||
jmp RL1
|
||||
RLend2: addl %eax,%eax /* restore carry from eax */
|
||||
RL1: movl %edx,(%edi) /* store last limb */
|
||||
|
||||
movl $0,%eax
|
||||
rcrl $1,%eax
|
||||
|
||||
popl %ebp
|
||||
popl %ebx
|
||||
popl %esi
|
||||
popl %edi
|
||||
ret
|
||||
|
||||
142
grub-core/lib/libgcrypt/mpi/i586/mpih-sub1.S
Normal file
142
grub-core/lib/libgcrypt/mpi/i586/mpih-sub1.S
Normal file
|
|
@ -0,0 +1,142 @@
|
|||
/* i80586 sub_n -- Sub two limb vectors of the same length > 0 and store
|
||||
* sum in a third limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1995, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_sub_n( mpi_ptr_t res_ptr, (sp + 4)
|
||||
* mpi_ptr_t s1_ptr, (sp + 8)
|
||||
* mpi_ptr_t s2_ptr, (sp + 12)
|
||||
* mpi_size_t size) (sp + 16)
|
||||
*/
|
||||
|
||||
|
||||
.text
|
||||
ALIGN (3)
|
||||
.globl C_SYMBOL_NAME(_gcry_mpih_sub_n)
|
||||
C_SYMBOL_NAME(_gcry_mpih_sub_n:)
|
||||
|
||||
pushl %edi
|
||||
pushl %esi
|
||||
pushl %ebx
|
||||
pushl %ebp
|
||||
|
||||
movl 20(%esp),%edi /* res_ptr */
|
||||
movl 24(%esp),%esi /* s1_ptr */
|
||||
movl 28(%esp),%ebp /* s2_ptr */
|
||||
movl 32(%esp),%ecx /* size */
|
||||
|
||||
movl (%ebp),%ebx
|
||||
|
||||
decl %ecx
|
||||
movl %ecx,%edx
|
||||
shrl $3,%ecx
|
||||
andl $7,%edx
|
||||
testl %ecx,%ecx /* zero carry flag */
|
||||
jz Lend
|
||||
pushl %edx
|
||||
|
||||
ALIGN (3)
|
||||
Loop: movl 28(%edi),%eax /* fetch destination cache line */
|
||||
leal 32(%edi),%edi
|
||||
|
||||
L1: movl (%esi),%eax
|
||||
movl 4(%esi),%edx
|
||||
sbbl %ebx,%eax
|
||||
movl 4(%ebp),%ebx
|
||||
sbbl %ebx,%edx
|
||||
movl 8(%ebp),%ebx
|
||||
movl %eax,-32(%edi)
|
||||
movl %edx,-28(%edi)
|
||||
|
||||
L2: movl 8(%esi),%eax
|
||||
movl 12(%esi),%edx
|
||||
sbbl %ebx,%eax
|
||||
movl 12(%ebp),%ebx
|
||||
sbbl %ebx,%edx
|
||||
movl 16(%ebp),%ebx
|
||||
movl %eax,-24(%edi)
|
||||
movl %edx,-20(%edi)
|
||||
|
||||
L3: movl 16(%esi),%eax
|
||||
movl 20(%esi),%edx
|
||||
sbbl %ebx,%eax
|
||||
movl 20(%ebp),%ebx
|
||||
sbbl %ebx,%edx
|
||||
movl 24(%ebp),%ebx
|
||||
movl %eax,-16(%edi)
|
||||
movl %edx,-12(%edi)
|
||||
|
||||
L4: movl 24(%esi),%eax
|
||||
movl 28(%esi),%edx
|
||||
sbbl %ebx,%eax
|
||||
movl 28(%ebp),%ebx
|
||||
sbbl %ebx,%edx
|
||||
movl 32(%ebp),%ebx
|
||||
movl %eax,-8(%edi)
|
||||
movl %edx,-4(%edi)
|
||||
|
||||
leal 32(%esi),%esi
|
||||
leal 32(%ebp),%ebp
|
||||
decl %ecx
|
||||
jnz Loop
|
||||
|
||||
popl %edx
|
||||
Lend:
|
||||
decl %edx /* test %edx w/o clobbering carry */
|
||||
js Lend2
|
||||
incl %edx
|
||||
Loop2:
|
||||
leal 4(%edi),%edi
|
||||
movl (%esi),%eax
|
||||
sbbl %ebx,%eax
|
||||
movl 4(%ebp),%ebx
|
||||
movl %eax,-4(%edi)
|
||||
leal 4(%esi),%esi
|
||||
leal 4(%ebp),%ebp
|
||||
decl %edx
|
||||
jnz Loop2
|
||||
Lend2:
|
||||
movl (%esi),%eax
|
||||
sbbl %ebx,%eax
|
||||
movl %eax,(%edi)
|
||||
|
||||
sbbl %eax,%eax
|
||||
negl %eax
|
||||
|
||||
popl %ebp
|
||||
popl %ebx
|
||||
popl %esi
|
||||
popl %edi
|
||||
ret
|
||||
|
||||
1578
grub-core/lib/libgcrypt/mpi/longlong.h
Normal file
1578
grub-core/lib/libgcrypt/mpi/longlong.h
Normal file
File diff suppressed because it is too large
Load diff
25
grub-core/lib/libgcrypt/mpi/m68k/Manifest
Normal file
25
grub-core/lib/libgcrypt/mpi/m68k/Manifest
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
# Manifest - checksums
|
||||
# Copyright 2003 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of Libgcrypt.
|
||||
#
|
||||
# Libgcrypt is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser general Public License as
|
||||
# published by the Free Software Foundation; either version 2.1 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# Libgcrypt is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
|
||||
syntax.h
|
||||
mpih-lshift.S
|
||||
mpih-rshift.S
|
||||
mpih-add1.S
|
||||
mpih-sub1.S
|
||||
$names$ iQCVAwUAP+LmTDEAnp832S/7AQJHUAP/dxfq2U0pDc5ZLoEizoqgjjcnHIyb9EjMG3YjvgK6jQ62yoAOCuo/jFYlJS+Mdve6bgfdTzYMrnKV7BG2SEcwb263pVnIntS7ZhKQPiMCbFgXWR2VjN3+a1v8yjQDZtgqEgm8OlQ+u7jKBY13Oryiuq5nPNxsXZqJpelG6Zkdg9M==PIee
|
||||
9
grub-core/lib/libgcrypt/mpi/m68k/distfiles
Normal file
9
grub-core/lib/libgcrypt/mpi/m68k/distfiles
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
Manifest
|
||||
syntax.h
|
||||
mpih-lshift.S
|
||||
mpih-rshift.S
|
||||
mpih-add1.S
|
||||
mpih-sub1.S
|
||||
|
||||
|
||||
|
||||
23
grub-core/lib/libgcrypt/mpi/m68k/mc68020/Manifest
Normal file
23
grub-core/lib/libgcrypt/mpi/m68k/mc68020/Manifest
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
# Manifest - checksums
|
||||
# Copyright 2003 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of Libgcrypt.
|
||||
#
|
||||
# Libgcrypt is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser general Public License as
|
||||
# published by the Free Software Foundation; either version 2.1 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# Libgcrypt is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
|
||||
mpih-mul1.S
|
||||
mpih-mul2.S
|
||||
mpih-mul3.S
|
||||
$names$ iQCVAwUAP+LmRTEAnp832S/7AQK3rwP/TyGBbii5HCrjDiLCVJHiDNeOdENx6AicRXnu4vuJmMmPZ0y+i7MPusDaeTbIUA0w6RaJx+Ep41nIvthmNDnFePY5Mw0pIUJcpI7AJR4vYqpwNQA6nlEdn/m1jg6sPLKZXUXNUkhroEzcHzoU+12BPS+nvSXlwSksg6rXEGOJ+Ms==XCXP
|
||||
4
grub-core/lib/libgcrypt/mpi/m68k/mc68020/distfiles
Normal file
4
grub-core/lib/libgcrypt/mpi/m68k/mc68020/distfiles
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
Manifest
|
||||
mpih-mul1.S
|
||||
mpih-mul2.S
|
||||
mpih-mul3.S
|
||||
104
grub-core/lib/libgcrypt/mpi/m68k/mc68020/mpih-mul1.S
Normal file
104
grub-core/lib/libgcrypt/mpi/m68k/mc68020/mpih-mul1.S
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
/* mc68020 __mpn_mul_1 -- Multiply a limb vector with a limb and store
|
||||
* the result in a second limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1996, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_mul_1( mpi_ptr_t res_ptr, (sp + 4)
|
||||
* mpi_ptr_t s1_ptr, (sp + 8)
|
||||
* mpi_size_t s1_size, (sp + 12)
|
||||
* mpi_limb_t s2_limb) (sp + 16)
|
||||
*/
|
||||
|
||||
|
||||
TEXT
|
||||
ALIGN
|
||||
GLOBL C_SYMBOL_NAME(_gcry_mpih_mul_1)
|
||||
|
||||
C_SYMBOL_NAME(_gcry_mpih_mul_1:)
|
||||
PROLOG(_gcry_mpih_mul_1)
|
||||
|
||||
#define res_ptr a0
|
||||
#define s1_ptr a1
|
||||
#define s1_size d2
|
||||
#define s2_limb d4
|
||||
|
||||
/* Save used registers on the stack. */
|
||||
moveml R(d2)-R(d4),MEM_PREDEC(sp)
|
||||
#if 0
|
||||
movel R(d2),MEM_PREDEC(sp)
|
||||
movel R(d3),MEM_PREDEC(sp)
|
||||
movel R(d4),MEM_PREDEC(sp)
|
||||
#endif
|
||||
|
||||
/* Copy the arguments to registers. Better use movem? */
|
||||
movel MEM_DISP(sp,16),R(res_ptr)
|
||||
movel MEM_DISP(sp,20),R(s1_ptr)
|
||||
movel MEM_DISP(sp,24),R(s1_size)
|
||||
movel MEM_DISP(sp,28),R(s2_limb)
|
||||
|
||||
eorw #1,R(s1_size)
|
||||
clrl R(d1)
|
||||
lsrl #1,R(s1_size)
|
||||
bcc L(L1)
|
||||
subql #1,R(s1_size)
|
||||
subl R(d0),R(d0) /* (d0,cy) <= (0,0) */
|
||||
|
||||
L(Loop:)
|
||||
movel MEM_POSTINC(s1_ptr),R(d3)
|
||||
mulul R(s2_limb),R(d1):R(d3)
|
||||
addxl R(d0),R(d3)
|
||||
movel R(d3),MEM_POSTINC(res_ptr)
|
||||
L(L1:) movel MEM_POSTINC(s1_ptr),R(d3)
|
||||
mulul R(s2_limb),R(d0):R(d3)
|
||||
addxl R(d1),R(d3)
|
||||
movel R(d3),MEM_POSTINC(res_ptr)
|
||||
|
||||
dbf R(s1_size),L(Loop)
|
||||
clrl R(d3)
|
||||
addxl R(d3),R(d0)
|
||||
subl #0x10000,R(s1_size)
|
||||
bcc L(Loop)
|
||||
|
||||
/* Restore used registers from stack frame. */
|
||||
moveml MEM_POSTINC(sp),R(d2)-R(d4)
|
||||
#if 0
|
||||
movel MEM_POSTINC(sp),R(d4)
|
||||
movel MEM_POSTINC(sp),R(d3)
|
||||
movel MEM_POSTINC(sp),R(d2)
|
||||
#endif
|
||||
rts
|
||||
EPILOG(_gcry_mpih_mul_1)
|
||||
|
||||
|
||||
94
grub-core/lib/libgcrypt/mpi/m68k/mc68020/mpih-mul2.S
Normal file
94
grub-core/lib/libgcrypt/mpi/m68k/mc68020/mpih-mul2.S
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
/* mc68020 __mpn_addmul_1 -- Multiply a limb vector with a limb and add
|
||||
* the result to a second limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1996, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_addmul_1( mpi_ptr_t res_ptr, (sp + 4)
|
||||
* mpi_ptr_t s1_ptr, (sp + 8)
|
||||
* mpi_size_t s1_size, (sp + 12)
|
||||
* mpi_limb_t s2_limb) (sp + 16)
|
||||
*/
|
||||
|
||||
|
||||
TEXT
|
||||
ALIGN
|
||||
GLOBL C_SYMBOL_NAME(_gcry_mpih_addmul_1)
|
||||
|
||||
C_SYMBOL_NAME(_gcry_mpih_addmul_1:)
|
||||
PROLOG(_gcry_mpih_addmul_1)
|
||||
|
||||
#define res_ptr a0
|
||||
#define s1_ptr a1
|
||||
#define s1_size d2
|
||||
#define s2_limb d4
|
||||
|
||||
/* Save used registers on the stack. */
|
||||
moveml R(d2)-R(d5),MEM_PREDEC(sp)
|
||||
|
||||
/* Copy the arguments to registers. Better use movem? */
|
||||
movel MEM_DISP(sp,20),R(res_ptr)
|
||||
movel MEM_DISP(sp,24),R(s1_ptr)
|
||||
movel MEM_DISP(sp,28),R(s1_size)
|
||||
movel MEM_DISP(sp,32),R(s2_limb)
|
||||
|
||||
eorw #1,R(s1_size)
|
||||
clrl R(d1)
|
||||
clrl R(d5)
|
||||
lsrl #1,R(s1_size)
|
||||
bcc L(L1)
|
||||
subql #1,R(s1_size)
|
||||
subl R(d0),R(d0) /* (d0,cy) <= (0,0) */
|
||||
|
||||
L(Loop:)
|
||||
movel MEM_POSTINC(s1_ptr),R(d3)
|
||||
mulul R(s2_limb),R(d1):R(d3)
|
||||
addxl R(d0),R(d3)
|
||||
addxl R(d5),R(d1)
|
||||
addl R(d3),MEM_POSTINC(res_ptr)
|
||||
L(L1:) movel MEM_POSTINC(s1_ptr),R(d3)
|
||||
mulul R(s2_limb),R(d0):R(d3)
|
||||
addxl R(d1),R(d3)
|
||||
addxl R(d5),R(d0)
|
||||
addl R(d3),MEM_POSTINC(res_ptr)
|
||||
|
||||
dbf R(s1_size),L(Loop)
|
||||
addxl R(d5),R(d0)
|
||||
subl #0x10000,R(s1_size)
|
||||
bcc L(Loop)
|
||||
|
||||
/* Restore used registers from stack frame. */
|
||||
moveml MEM_POSTINC(sp),R(d2)-R(d5)
|
||||
|
||||
rts
|
||||
EPILOG(_gcry_mpih_addmul_1)
|
||||
|
||||
97
grub-core/lib/libgcrypt/mpi/m68k/mc68020/mpih-mul3.S
Normal file
97
grub-core/lib/libgcrypt/mpi/m68k/mc68020/mpih-mul3.S
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
/* mc68020 __mpn_submul_1 -- Multiply a limb vector with a limb and subtract
|
||||
* the result from a second limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1996, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_submul_1( mpi_ptr_t res_ptr, (sp + 4)
|
||||
* mpi_ptr_t s1_ptr, (sp + 8)
|
||||
* mpi_size_t s1_size, (sp + 12)
|
||||
* mpi_limb_t s2_limb) (sp + 16)
|
||||
*/
|
||||
|
||||
|
||||
TEXT
|
||||
ALIGN
|
||||
GLOBL C_SYMBOL_NAME(_gcry_mpih_submul_1)
|
||||
|
||||
C_SYMBOL_NAME(_gcry_mpih_submul_1:)
|
||||
PROLOG(_gcry_mpih_submul_1)
|
||||
|
||||
#define res_ptr a0
|
||||
#define s1_ptr a1
|
||||
#define s1_size d2
|
||||
#define s2_limb d4
|
||||
|
||||
/* Save used registers on the stack. */
|
||||
moveml R(d2)-R(d5),MEM_PREDEC(sp)
|
||||
|
||||
/* Copy the arguments to registers. Better use movem? */
|
||||
movel MEM_DISP(sp,20),R(res_ptr)
|
||||
movel MEM_DISP(sp,24),R(s1_ptr)
|
||||
movel MEM_DISP(sp,28),R(s1_size)
|
||||
movel MEM_DISP(sp,32),R(s2_limb)
|
||||
|
||||
eorw #1,R(s1_size)
|
||||
clrl R(d1)
|
||||
clrl R(d5)
|
||||
lsrl #1,R(s1_size)
|
||||
bcc L(L1)
|
||||
subql #1,R(s1_size)
|
||||
subl R(d0),R(d0) /* (d0,cy) <= (0,0) */
|
||||
|
||||
L(Loop:)
|
||||
movel MEM_POSTINC(s1_ptr),R(d3)
|
||||
mulul R(s2_limb),R(d1):R(d3)
|
||||
addxl R(d0),R(d3)
|
||||
addxl R(d5),R(d1)
|
||||
subl R(d3),MEM_POSTINC(res_ptr)
|
||||
L(L1:) movel MEM_POSTINC(s1_ptr),R(d3)
|
||||
mulul R(s2_limb),R(d0):R(d3)
|
||||
addxl R(d1),R(d3)
|
||||
addxl R(d5),R(d0)
|
||||
subl R(d3),MEM_POSTINC(res_ptr)
|
||||
|
||||
dbf R(s1_size),L(Loop)
|
||||
addxl R(d5),R(d0)
|
||||
subl #0x10000,R(s1_size)
|
||||
bcc L(Loop)
|
||||
|
||||
/* Restore used registers from stack frame. */
|
||||
moveml MEM_POSTINC(sp),R(d2)-R(d5)
|
||||
|
||||
rts
|
||||
EPILOG(_gcry_mpih_submul_1)
|
||||
|
||||
|
||||
92
grub-core/lib/libgcrypt/mpi/m68k/mpih-add1.S
Normal file
92
grub-core/lib/libgcrypt/mpi/m68k/mpih-add1.S
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
/* mc68020 __mpn_add_n -- Add two limb vectors of the same length > 0 and store
|
||||
* sum in a third limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994,1996, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_add_n( mpi_ptr_t res_ptr, (sp + 4)
|
||||
* mpi_ptr_t s1_ptr, (sp + 8)
|
||||
* mpi_ptr_t s2_ptr, (sp + 16)
|
||||
* mpi_size_t size) (sp + 12)
|
||||
*/
|
||||
|
||||
|
||||
TEXT
|
||||
ALIGN
|
||||
GLOBL C_SYMBOL_NAME(_gcry_mpih_add_n)
|
||||
|
||||
C_SYMBOL_NAME(_gcry_mpih_add_n:)
|
||||
PROLOG(_gcry_mpih_add_n)
|
||||
/* Save used registers on the stack. */
|
||||
movel R(d2),MEM_PREDEC(sp)
|
||||
movel R(a2),MEM_PREDEC(sp)
|
||||
|
||||
/* Copy the arguments to registers. Better use movem? */
|
||||
movel MEM_DISP(sp,12),R(a2)
|
||||
movel MEM_DISP(sp,16),R(a0)
|
||||
movel MEM_DISP(sp,20),R(a1)
|
||||
movel MEM_DISP(sp,24),R(d2)
|
||||
|
||||
eorw #1,R(d2)
|
||||
lsrl #1,R(d2)
|
||||
bcc L(L1)
|
||||
subql #1,R(d2) /* clears cy as side effect */
|
||||
|
||||
L(Loop:)
|
||||
movel MEM_POSTINC(a0),R(d0)
|
||||
movel MEM_POSTINC(a1),R(d1)
|
||||
addxl R(d1),R(d0)
|
||||
movel R(d0),MEM_POSTINC(a2)
|
||||
L(L1:) movel MEM_POSTINC(a0),R(d0)
|
||||
movel MEM_POSTINC(a1),R(d1)
|
||||
addxl R(d1),R(d0)
|
||||
movel R(d0),MEM_POSTINC(a2)
|
||||
|
||||
dbf R(d2),L(Loop) /* loop until 16 lsb of %4 == -1 */
|
||||
subxl R(d0),R(d0) /* d0 <= -cy; save cy as 0 or -1 in d0 */
|
||||
subl #0x10000,R(d2)
|
||||
bcs L(L2)
|
||||
addl R(d0),R(d0) /* restore cy */
|
||||
bra L(Loop)
|
||||
|
||||
L(L2:)
|
||||
negl R(d0)
|
||||
|
||||
/* Restore used registers from stack frame. */
|
||||
movel MEM_POSTINC(sp),R(a2)
|
||||
movel MEM_POSTINC(sp),R(d2)
|
||||
|
||||
rts
|
||||
EPILOG(_gcry_mpih_add_n)
|
||||
|
||||
|
||||
164
grub-core/lib/libgcrypt/mpi/m68k/mpih-lshift.S
Normal file
164
grub-core/lib/libgcrypt/mpi/m68k/mpih-lshift.S
Normal file
|
|
@ -0,0 +1,164 @@
|
|||
/* mc68020 lshift -- Shift left a low-level natural-number integer.
|
||||
*
|
||||
* Copyright (C) 1996, 1998, 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_lshift( mpi_ptr_t wp, (sp + 4)
|
||||
* mpi_ptr_t up, (sp + 8)
|
||||
* mpi_size_t usize, (sp + 12)
|
||||
* unsigned cnt) (sp + 16)
|
||||
*/
|
||||
|
||||
#define res_ptr a1
|
||||
#define s_ptr a0
|
||||
#define s_size d6
|
||||
#define cnt d4
|
||||
|
||||
TEXT
|
||||
ALIGN
|
||||
GLOBL C_SYMBOL_NAME(_gcry_mpih_lshift)
|
||||
|
||||
C_SYMBOL_NAME(_gcry_mpih_lshift:)
|
||||
PROLOG(_gcry_mpih_lshift)
|
||||
|
||||
/* Save used registers on the stack. */
|
||||
moveml R(d2)-R(d6)/R(a2),MEM_PREDEC(sp)
|
||||
|
||||
/* Copy the arguments to registers. */
|
||||
movel MEM_DISP(sp,28),R(res_ptr)
|
||||
movel MEM_DISP(sp,32),R(s_ptr)
|
||||
movel MEM_DISP(sp,36),R(s_size)
|
||||
movel MEM_DISP(sp,40),R(cnt)
|
||||
|
||||
moveql #1,R(d5)
|
||||
cmpl R(d5),R(cnt)
|
||||
bne L(Lnormal)
|
||||
cmpl R(s_ptr),R(res_ptr)
|
||||
bls L(Lspecial) /* jump if s_ptr >= res_ptr */
|
||||
#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
|
||||
lea MEM_INDX1(s_ptr,s_size,l,4),R(a2)
|
||||
#else /* not mc68020 */
|
||||
movel R(s_size),R(d0)
|
||||
asll #2,R(d0)
|
||||
lea MEM_INDX(s_ptr,d0,l),R(a2)
|
||||
#endif
|
||||
cmpl R(res_ptr),R(a2)
|
||||
bls L(Lspecial) /* jump if res_ptr >= s_ptr + s_size */
|
||||
|
||||
L(Lnormal:)
|
||||
moveql #32,R(d5)
|
||||
subl R(cnt),R(d5)
|
||||
|
||||
#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
|
||||
lea MEM_INDX1(s_ptr,s_size,l,4),R(s_ptr)
|
||||
lea MEM_INDX1(res_ptr,s_size,l,4),R(res_ptr)
|
||||
#else /* not mc68000 */
|
||||
movel R(s_size),R(d0)
|
||||
asll #2,R(d0)
|
||||
addl R(s_size),R(s_ptr)
|
||||
addl R(s_size),R(res_ptr)
|
||||
#endif
|
||||
movel MEM_PREDEC(s_ptr),R(d2)
|
||||
movel R(d2),R(d0)
|
||||
lsrl R(d5),R(d0) /* compute carry limb */
|
||||
|
||||
lsll R(cnt),R(d2)
|
||||
movel R(d2),R(d1)
|
||||
subql #1,R(s_size)
|
||||
beq L(Lend)
|
||||
lsrl #1,R(s_size)
|
||||
bcs L(L1)
|
||||
subql #1,R(s_size)
|
||||
|
||||
L(Loop:)
|
||||
movel MEM_PREDEC(s_ptr),R(d2)
|
||||
movel R(d2),R(d3)
|
||||
lsrl R(d5),R(d3)
|
||||
orl R(d3),R(d1)
|
||||
movel R(d1),MEM_PREDEC(res_ptr)
|
||||
lsll R(cnt),R(d2)
|
||||
L(L1:)
|
||||
movel MEM_PREDEC(s_ptr),R(d1)
|
||||
movel R(d1),R(d3)
|
||||
lsrl R(d5),R(d3)
|
||||
orl R(d3),R(d2)
|
||||
movel R(d2),MEM_PREDEC(res_ptr)
|
||||
lsll R(cnt),R(d1)
|
||||
|
||||
dbf R(s_size),L(Loop)
|
||||
subl #0x10000,R(s_size)
|
||||
bcc L(Loop)
|
||||
|
||||
L(Lend:)
|
||||
movel R(d1),MEM_PREDEC(res_ptr) /* store least significant limb */
|
||||
|
||||
/* Restore used registers from stack frame. */
|
||||
moveml MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
|
||||
rts
|
||||
|
||||
/* We loop from least significant end of the arrays, which is only
|
||||
permissable if the source and destination don't overlap, since the
|
||||
function is documented to work for overlapping source and destination. */
|
||||
|
||||
L(Lspecial:)
|
||||
clrl R(d0) /* initialize carry */
|
||||
eorw #1,R(s_size)
|
||||
lsrl #1,R(s_size)
|
||||
bcc L(LL1)
|
||||
subql #1,R(s_size)
|
||||
|
||||
L(LLoop:)
|
||||
movel MEM_POSTINC(s_ptr),R(d2)
|
||||
addxl R(d2),R(d2)
|
||||
movel R(d2),MEM_POSTINC(res_ptr)
|
||||
L(LL1:)
|
||||
movel MEM_POSTINC(s_ptr),R(d2)
|
||||
addxl R(d2),R(d2)
|
||||
movel R(d2),MEM_POSTINC(res_ptr)
|
||||
|
||||
dbf R(s_size),L(LLoop)
|
||||
addxl R(d0),R(d0) /* save cy in lsb */
|
||||
subl #0x10000,R(s_size)
|
||||
bcs L(LLend)
|
||||
lsrl #1,R(d0) /* restore cy */
|
||||
bra L(LLoop)
|
||||
|
||||
L(LLend:)
|
||||
/* Restore used registers from stack frame. */
|
||||
moveml MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
|
||||
rts
|
||||
EPILOG(_gcry_mpih_lshift)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
162
grub-core/lib/libgcrypt/mpi/m68k/mpih-rshift.S
Normal file
162
grub-core/lib/libgcrypt/mpi/m68k/mpih-rshift.S
Normal file
|
|
@ -0,0 +1,162 @@
|
|||
/* mc68020 rshift -- Shift right a low-level natural-number integer.
|
||||
*
|
||||
* Copyright (C) 1996, 1998, 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_rshift( mpi_ptr_t wp, (sp + 4)
|
||||
* mpi_ptr_t up, (sp + 8)
|
||||
* mpi_size_t usize, (sp + 12)
|
||||
* unsigned cnt) (sp + 16)
|
||||
*/
|
||||
|
||||
#define res_ptr a1
|
||||
#define s_ptr a0
|
||||
#define s_size d6
|
||||
#define cnt d4
|
||||
|
||||
TEXT
|
||||
ALIGN
|
||||
GLOBL C_SYMBOL_NAME(_gcry_mpih_rshift)
|
||||
|
||||
C_SYMBOL_NAME(_gcry_mpih_rshift:)
|
||||
PROLOG(_gcry_mpih_rshift)
|
||||
/* Save used registers on the stack. */
|
||||
moveml R(d2)-R(d6)/R(a2),MEM_PREDEC(sp)
|
||||
|
||||
/* Copy the arguments to registers. */
|
||||
movel MEM_DISP(sp,28),R(res_ptr)
|
||||
movel MEM_DISP(sp,32),R(s_ptr)
|
||||
movel MEM_DISP(sp,36),R(s_size)
|
||||
movel MEM_DISP(sp,40),R(cnt)
|
||||
|
||||
moveql #1,R(d5)
|
||||
cmpl R(d5),R(cnt)
|
||||
bne L(Rnormal)
|
||||
cmpl R(res_ptr),R(s_ptr)
|
||||
bls L(Rspecial) /* jump if res_ptr >= s_ptr */
|
||||
#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
|
||||
lea MEM_INDX1(res_ptr,s_size,l,4),R(a2)
|
||||
#else /* not mc68020 */
|
||||
movel R(s_size),R(d0)
|
||||
asll #2,R(d0)
|
||||
lea MEM_INDX(res_ptr,d0,l),R(a2)
|
||||
#endif
|
||||
cmpl R(s_ptr),R(a2)
|
||||
bls L(Rspecial) /* jump if s_ptr >= res_ptr + s_size */
|
||||
|
||||
L(Rnormal:)
|
||||
moveql #32,R(d5)
|
||||
subl R(cnt),R(d5)
|
||||
movel MEM_POSTINC(s_ptr),R(d2)
|
||||
movel R(d2),R(d0)
|
||||
lsll R(d5),R(d0) /* compute carry limb */
|
||||
|
||||
lsrl R(cnt),R(d2)
|
||||
movel R(d2),R(d1)
|
||||
subql #1,R(s_size)
|
||||
beq L(Rend)
|
||||
lsrl #1,R(s_size)
|
||||
bcs L(R1)
|
||||
subql #1,R(s_size)
|
||||
|
||||
L(Roop:)
|
||||
movel MEM_POSTINC(s_ptr),R(d2)
|
||||
movel R(d2),R(d3)
|
||||
lsll R(d5),R(d3)
|
||||
orl R(d3),R(d1)
|
||||
movel R(d1),MEM_POSTINC(res_ptr)
|
||||
lsrl R(cnt),R(d2)
|
||||
L(R1:)
|
||||
movel MEM_POSTINC(s_ptr),R(d1)
|
||||
movel R(d1),R(d3)
|
||||
lsll R(d5),R(d3)
|
||||
orl R(d3),R(d2)
|
||||
movel R(d2),MEM_POSTINC(res_ptr)
|
||||
lsrl R(cnt),R(d1)
|
||||
|
||||
dbf R(s_size),L(Roop)
|
||||
subl #0x10000,R(s_size)
|
||||
bcc L(Roop)
|
||||
|
||||
L(Rend:)
|
||||
movel R(d1),MEM(res_ptr) /* store most significant limb */
|
||||
|
||||
/* Restore used registers from stack frame. */
|
||||
moveml MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
|
||||
rts
|
||||
|
||||
/* We loop from most significant end of the arrays, which is only
|
||||
permissable if the source and destination don't overlap, since the
|
||||
function is documented to work for overlapping source and destination. */
|
||||
|
||||
L(Rspecial:)
|
||||
#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
|
||||
lea MEM_INDX1(s_ptr,s_size,l,4),R(s_ptr)
|
||||
lea MEM_INDX1(res_ptr,s_size,l,4),R(res_ptr)
|
||||
#else /* not mc68000 */
|
||||
movel R(s_size),R(d0)
|
||||
asll #2,R(d0)
|
||||
addl R(s_size),R(s_ptr)
|
||||
addl R(s_size),R(res_ptr)
|
||||
#endif
|
||||
|
||||
clrl R(d0) /* initialize carry */
|
||||
eorw #1,R(s_size)
|
||||
lsrl #1,R(s_size)
|
||||
bcc L(LR1)
|
||||
subql #1,R(s_size)
|
||||
|
||||
L(LRoop:)
|
||||
movel MEM_PREDEC(s_ptr),R(d2)
|
||||
roxrl #1,R(d2)
|
||||
movel R(d2),MEM_PREDEC(res_ptr)
|
||||
L(LR1:)
|
||||
movel MEM_PREDEC(s_ptr),R(d2)
|
||||
roxrl #1,R(d2)
|
||||
movel R(d2),MEM_PREDEC(res_ptr)
|
||||
|
||||
dbf R(s_size),L(LRoop)
|
||||
roxrl #1,R(d0) /* save cy in msb */
|
||||
subl #0x10000,R(s_size)
|
||||
bcs L(LRend)
|
||||
addl R(d0),R(d0) /* restore cy */
|
||||
bra L(LRoop)
|
||||
|
||||
L(LRend:)
|
||||
/* Restore used registers from stack frame. */
|
||||
moveml MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
|
||||
rts
|
||||
EPILOG(_gcry_mpih_rshift)
|
||||
|
||||
|
||||
|
||||
|
||||
91
grub-core/lib/libgcrypt/mpi/m68k/mpih-sub1.S
Normal file
91
grub-core/lib/libgcrypt/mpi/m68k/mpih-sub1.S
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
/* mc68020 __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
|
||||
* store difference in a third limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1996, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
#include "sysdep.h"
|
||||
#include "asm-syntax.h"
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_sub_n( mpi_ptr_t res_ptr, (sp + 4)
|
||||
* mpi_ptr_t s1_ptr, (sp + 8)
|
||||
* mpi_ptr_t s2_ptr, (sp + 16)
|
||||
* mpi_size_t size) (sp + 12)
|
||||
*/
|
||||
|
||||
|
||||
TEXT
|
||||
ALIGN
|
||||
GLOBL C_SYMBOL_NAME(_gcry_mpih_sub_n)
|
||||
|
||||
C_SYMBOL_NAME(_gcry_mpih_sub_n:)
|
||||
PROLOG(_gcry_mpih_sub_n)
|
||||
/* Save used registers on the stack. */
|
||||
movel R(d2),MEM_PREDEC(sp)
|
||||
movel R(a2),MEM_PREDEC(sp)
|
||||
|
||||
/* Copy the arguments to registers. Better use movem? */
|
||||
movel MEM_DISP(sp,12),R(a2)
|
||||
movel MEM_DISP(sp,16),R(a0)
|
||||
movel MEM_DISP(sp,20),R(a1)
|
||||
movel MEM_DISP(sp,24),R(d2)
|
||||
|
||||
eorw #1,R(d2)
|
||||
lsrl #1,R(d2)
|
||||
bcc L(L1)
|
||||
subql #1,R(d2) /* clears cy as side effect */
|
||||
|
||||
L(Loop:)
|
||||
movel MEM_POSTINC(a0),R(d0)
|
||||
movel MEM_POSTINC(a1),R(d1)
|
||||
subxl R(d1),R(d0)
|
||||
movel R(d0),MEM_POSTINC(a2)
|
||||
L(L1:) movel MEM_POSTINC(a0),R(d0)
|
||||
movel MEM_POSTINC(a1),R(d1)
|
||||
subxl R(d1),R(d0)
|
||||
movel R(d0),MEM_POSTINC(a2)
|
||||
|
||||
dbf R(d2),L(Loop) /* loop until 16 lsb of %4 == -1 */
|
||||
subxl R(d0),R(d0) /* d0 <= -cy; save cy as 0 or -1 in d0 */
|
||||
subl #0x10000,R(d2)
|
||||
bcs L(L2)
|
||||
addl R(d0),R(d0) /* restore cy */
|
||||
bra L(Loop)
|
||||
|
||||
L(L2:)
|
||||
negl R(d0)
|
||||
|
||||
/* Restore used registers from stack frame. */
|
||||
movel MEM_POSTINC(sp),R(a2)
|
||||
movel MEM_POSTINC(sp),R(d2)
|
||||
|
||||
rts
|
||||
EPILOG(_gcry_mpih_sub_n)
|
||||
|
||||
|
||||
185
grub-core/lib/libgcrypt/mpi/m68k/syntax.h
Normal file
185
grub-core/lib/libgcrypt/mpi/m68k/syntax.h
Normal file
|
|
@ -0,0 +1,185 @@
|
|||
/* asm.h -- Definitions for 68k syntax variations.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1996, 1998,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
|
||||
#undef ALIGN
|
||||
|
||||
#ifdef MIT_SYNTAX
|
||||
#define PROLOG(name)
|
||||
#define EPILOG(name)
|
||||
#define R(r)r
|
||||
#define MEM(base)base@
|
||||
#define MEM_DISP(base,displacement)base@(displacement)
|
||||
#define MEM_INDX(base,idx,size_suffix)base@(idx:size_suffix)
|
||||
#define MEM_INDX1(base,idx,size_suffix,scale)base@(idx:size_suffix:scale)
|
||||
#define MEM_PREDEC(memory_base)memory_base@-
|
||||
#define MEM_POSTINC(memory_base)memory_base@+
|
||||
#define L(label) label
|
||||
#define TEXT .text
|
||||
#define ALIGN .even
|
||||
#define GLOBL .globl
|
||||
#define moveql moveq
|
||||
/* Use variable sized opcodes. */
|
||||
#define bcc jcc
|
||||
#define bcs jcs
|
||||
#define bls jls
|
||||
#define beq jeq
|
||||
#define bne jne
|
||||
#define bra jra
|
||||
#endif
|
||||
|
||||
#ifdef SONY_SYNTAX
|
||||
#define PROLOG(name)
|
||||
#define EPILOG(name)
|
||||
#define R(r)r
|
||||
#define MEM(base)(base)
|
||||
#define MEM_DISP(base,displacement)(displacement,base)
|
||||
#define MEM_INDX(base,idx,size_suffix)(base,idx.size_suffix)
|
||||
#define MEM_INDX1(base,idx,size_suffix,scale)(base,idx.size_suffix*scale)
|
||||
#define MEM_PREDEC(memory_base)-(memory_base)
|
||||
#define MEM_POSTINC(memory_base)(memory_base)+
|
||||
#define L(label) label
|
||||
#define TEXT .text
|
||||
#define ALIGN .even
|
||||
#define GLOBL .globl
|
||||
#endif
|
||||
|
||||
#ifdef MOTOROLA_SYNTAX
|
||||
#define PROLOG(name)
|
||||
#define EPILOG(name)
|
||||
#define R(r)r
|
||||
#define MEM(base)(base)
|
||||
#define MEM_DISP(base,displacement)(displacement,base)
|
||||
#define MEM_INDX(base,idx,size_suffix)(base,idx.size_suffix)
|
||||
#define MEM_INDX1(base,idx,size_suffix,scale)(base,idx.size_suffix*scale)
|
||||
#define MEM_PREDEC(memory_base)-(memory_base)
|
||||
#define MEM_POSTINC(memory_base)(memory_base)+
|
||||
#define L(label) label
|
||||
#define TEXT
|
||||
#define ALIGN
|
||||
#define GLOBL XDEF
|
||||
#define lea LEA
|
||||
#define movel MOVE.L
|
||||
#define moveml MOVEM.L
|
||||
#define moveql MOVEQ.L
|
||||
#define cmpl CMP.L
|
||||
#define orl OR.L
|
||||
#define clrl CLR.L
|
||||
#define eorw EOR.W
|
||||
#define lsrl LSR.L
|
||||
#define lsll LSL.L
|
||||
#define roxrl ROXR.L
|
||||
#define roxll ROXL.L
|
||||
#define addl ADD.L
|
||||
#define addxl ADDX.L
|
||||
#define addql ADDQ.L
|
||||
#define subl SUB.L
|
||||
#define subxl SUBX.L
|
||||
#define subql SUBQ.L
|
||||
#define negl NEG.L
|
||||
#define mulul MULU.L
|
||||
#define bcc BCC
|
||||
#define bcs BCS
|
||||
#define bls BLS
|
||||
#define beq BEQ
|
||||
#define bne BNE
|
||||
#define bra BRA
|
||||
#define dbf DBF
|
||||
#define rts RTS
|
||||
#define d0 D0
|
||||
#define d1 D1
|
||||
#define d2 D2
|
||||
#define d3 D3
|
||||
#define d4 D4
|
||||
#define d5 D5
|
||||
#define d6 D6
|
||||
#define d7 D7
|
||||
#define a0 A0
|
||||
#define a1 A1
|
||||
#define a2 A2
|
||||
#define a3 A3
|
||||
#define a4 A4
|
||||
#define a5 A5
|
||||
#define a6 A6
|
||||
#define a7 A7
|
||||
#define sp SP
|
||||
#endif
|
||||
|
||||
#ifdef ELF_SYNTAX
|
||||
#define PROLOG(name) .type name,@function
|
||||
#define EPILOG(name) .size name,.-name
|
||||
#define MEM(base)(R(base))
|
||||
#define MEM_DISP(base,displacement)(displacement,R(base))
|
||||
#define MEM_PREDEC(memory_base)-(R(memory_base))
|
||||
#define MEM_POSTINC(memory_base)(R(memory_base))+
|
||||
#ifdef __STDC__
|
||||
#define R_(r)%##r
|
||||
#define R(r)R_(r)
|
||||
#define MEM_INDX_(base,idx,size_suffix)(R(base),R(idx##.##size_suffix))
|
||||
#define MEM_INDX(base,idx,size_suffix)MEM_INDX_(base,idx,size_suffix)
|
||||
#define MEM_INDX1_(base,idx,size_suffix,scale)(R(base),R(idx##.##size_suffix*scale))
|
||||
#define MEM_INDX1(base,idx,size_suffix,scale)MEM_INDX1_(base,idx,size_suffix,scale)
|
||||
#define L(label) .##label
|
||||
#else
|
||||
#define R(r)%/**/r
|
||||
#define MEM_INDX(base,idx,size_suffix)(R(base),R(idx).size_suffix)
|
||||
#define MEM_INDX1(base,idx,size_suffix,scale)(R(base),R(idx).size_suffix*scale)
|
||||
#define L(label) ./**/label
|
||||
#endif
|
||||
#define TEXT .text
|
||||
#define ALIGN .align 2
|
||||
#define GLOBL .globl
|
||||
#define bcc jbcc
|
||||
#define bcs jbcs
|
||||
#define bls jbls
|
||||
#define beq jbeq
|
||||
#define bne jbne
|
||||
#define bra jbra
|
||||
#endif
|
||||
|
||||
#if defined (SONY_SYNTAX) || defined (ELF_SYNTAX)
|
||||
#define movel move.l
|
||||
#define moveml movem.l
|
||||
#define moveql moveq.l
|
||||
#define cmpl cmp.l
|
||||
#define orl or.l
|
||||
#define clrl clr.l
|
||||
#define eorw eor.w
|
||||
#define lsrl lsr.l
|
||||
#define lsll lsl.l
|
||||
#define roxrl roxr.l
|
||||
#define roxll roxl.l
|
||||
#define addl add.l
|
||||
#define addxl addx.l
|
||||
#define addql addq.l
|
||||
#define subl sub.l
|
||||
#define subxl subx.l
|
||||
#define subql subq.l
|
||||
#define negl neg.l
|
||||
#define mulul mulu.l
|
||||
#endif
|
||||
28
grub-core/lib/libgcrypt/mpi/mips3/Manifest
Normal file
28
grub-core/lib/libgcrypt/mpi/mips3/Manifest
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
# Manifest - checksums
|
||||
# Copyright 2003 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of Libgcrypt.
|
||||
#
|
||||
# Libgcrypt is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser general Public License as
|
||||
# published by the Free Software Foundation; either version 2.1 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# Libgcrypt is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
|
||||
mpih-add1.S
|
||||
mpih-sub1.S
|
||||
mpih-mul1.S
|
||||
mpih-mul2.S
|
||||
mpih-mul3.S
|
||||
mpih-lshift.S
|
||||
mpih-rshift.S
|
||||
mpi-asm-defs.h
|
||||
$names$ iQCVAwUAP+LmUTEAnp832S/7AQLm/gP/RHR2aLMwHPxsq0mGO5H0kneVn8a9l9yDNEZBefkYcOJMb7MZGKxbGspyENiU04Mc2TFnA1wS9gjNHlRWtUYxxn/wyuV6BIRgfstXt2nXGgEQrK07GIz8ETFcYqcxu7JKiICIuXZgnIgdwBJswbBV1zaMUDXeg5B8vkkEeRWj8hQ==IQVO
|
||||
23
grub-core/lib/libgcrypt/mpi/mips3/README
Normal file
23
grub-core/lib/libgcrypt/mpi/mips3/README
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
This directory contains mpn functions optimized for MIPS3. Example of
|
||||
processors that implement MIPS3 are R4000, R4400, R4600, R4700, and R8000.
|
||||
|
||||
RELEVANT OPTIMIZATION ISSUES
|
||||
|
||||
1. On the R4000 and R4400, branches, both the plain and the "likely" ones,
|
||||
take 3 cycles to execute. (The fastest possible loop will take 4 cycles,
|
||||
because of the delay insn.)
|
||||
|
||||
On the R4600, branches takes a single cycle
|
||||
|
||||
On the R8000, branches often take no noticable cycles, as they are
|
||||
executed in a separate function unit..
|
||||
|
||||
2. The R4000 and R4400 have a load latency of 4 cycles.
|
||||
|
||||
3. On the R4000 and R4400, multiplies take a data-dependent number of
|
||||
cycles, contrary to the SGI documentation. There seem to be 3 or 4
|
||||
possible latencies.
|
||||
|
||||
STATUS
|
||||
|
||||
Good...
|
||||
11
grub-core/lib/libgcrypt/mpi/mips3/distfiles
Normal file
11
grub-core/lib/libgcrypt/mpi/mips3/distfiles
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
Manifest
|
||||
README
|
||||
mpih-add1.S
|
||||
mpih-sub1.S
|
||||
mpih-mul1.S
|
||||
mpih-mul2.S
|
||||
mpih-mul3.S
|
||||
mpih-lshift.S
|
||||
mpih-rshift.S
|
||||
mpi-asm-defs.h
|
||||
|
||||
10
grub-core/lib/libgcrypt/mpi/mips3/mpi-asm-defs.h
Normal file
10
grub-core/lib/libgcrypt/mpi/mips3/mpi-asm-defs.h
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
/* This file defines some basic constants for the MPI machinery. We
|
||||
* need to define the types on a per-CPU basis, so it is done with
|
||||
* this file here. */
|
||||
#define BYTES_PER_MPI_LIMB 8
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
124
grub-core/lib/libgcrypt/mpi/mips3/mpih-add1.S
Normal file
124
grub-core/lib/libgcrypt/mpi/mips3/mpih-add1.S
Normal file
|
|
@ -0,0 +1,124 @@
|
|||
/* mips3 add_n -- Add two limb vectors of the same length > 0 and store
|
||||
* sum in a third limb vector.
|
||||
*
|
||||
* Copyright (C) 1995, 1998, 2000
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_add_n( mpi_ptr_t res_ptr, ($4)
|
||||
* mpi_ptr_t s1_ptr, ($5)
|
||||
* mpi_ptr_t s2_ptr, ($6)
|
||||
* mpi_size_t size) ($7)
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 2
|
||||
.globl _gcry_mpih_add_n
|
||||
.ent _gcry_mpih_add_n
|
||||
_gcry_mpih_add_n:
|
||||
.set noreorder
|
||||
.set nomacro
|
||||
|
||||
ld $10,0($5)
|
||||
ld $11,0($6)
|
||||
|
||||
daddiu $7,$7,-1
|
||||
and $9,$7,4-1 # number of limbs in first loop
|
||||
beq $9,$0,.L0 # if multiple of 4 limbs, skip first loop
|
||||
move $2,$0
|
||||
|
||||
dsubu $7,$7,$9
|
||||
|
||||
.Loop0: daddiu $9,$9,-1
|
||||
ld $12,8($5)
|
||||
daddu $11,$11,$2
|
||||
ld $13,8($6)
|
||||
sltu $8,$11,$2
|
||||
daddu $11,$10,$11
|
||||
sltu $2,$11,$10
|
||||
sd $11,0($4)
|
||||
or $2,$2,$8
|
||||
|
||||
daddiu $5,$5,8
|
||||
daddiu $6,$6,8
|
||||
move $10,$12
|
||||
move $11,$13
|
||||
bne $9,$0,.Loop0
|
||||
daddiu $4,$4,8
|
||||
|
||||
.L0: beq $7,$0,.Lend
|
||||
nop
|
||||
|
||||
.Loop: daddiu $7,$7,-4
|
||||
|
||||
ld $12,8($5)
|
||||
daddu $11,$11,$2
|
||||
ld $13,8($6)
|
||||
sltu $8,$11,$2
|
||||
daddu $11,$10,$11
|
||||
sltu $2,$11,$10
|
||||
sd $11,0($4)
|
||||
or $2,$2,$8
|
||||
|
||||
ld $10,16($5)
|
||||
daddu $13,$13,$2
|
||||
ld $11,16($6)
|
||||
sltu $8,$13,$2
|
||||
daddu $13,$12,$13
|
||||
sltu $2,$13,$12
|
||||
sd $13,8($4)
|
||||
or $2,$2,$8
|
||||
|
||||
ld $12,24($5)
|
||||
daddu $11,$11,$2
|
||||
ld $13,24($6)
|
||||
sltu $8,$11,$2
|
||||
daddu $11,$10,$11
|
||||
sltu $2,$11,$10
|
||||
sd $11,16($4)
|
||||
or $2,$2,$8
|
||||
|
||||
ld $10,32($5)
|
||||
daddu $13,$13,$2
|
||||
ld $11,32($6)
|
||||
sltu $8,$13,$2
|
||||
daddu $13,$12,$13
|
||||
sltu $2,$13,$12
|
||||
sd $13,24($4)
|
||||
or $2,$2,$8
|
||||
|
||||
daddiu $5,$5,32
|
||||
daddiu $6,$6,32
|
||||
|
||||
bne $7,$0,.Loop
|
||||
daddiu $4,$4,32
|
||||
|
||||
.Lend: daddu $11,$11,$2
|
||||
sltu $8,$11,$2
|
||||
daddu $11,$10,$11
|
||||
sltu $2,$11,$10
|
||||
sd $11,0($4)
|
||||
j $31
|
||||
or $2,$2,$8
|
||||
|
||||
.end _gcry_mpih_add_n
|
||||
|
||||
97
grub-core/lib/libgcrypt/mpi/mips3/mpih-lshift.S
Normal file
97
grub-core/lib/libgcrypt/mpi/mips3/mpih-lshift.S
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
/* mips3 lshift
|
||||
*
|
||||
* Copyright (C) 1995, 1998, 2000,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_lshift( mpi_ptr_t wp, ($4)
|
||||
* mpi_ptr_t up, ($5)
|
||||
* mpi_size_t usize, ($6)
|
||||
* unsigned cnt) ($7)
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 2
|
||||
.globl _gcry_mpih_lshift
|
||||
.ent _gcry_mpih_lshift
|
||||
_gcry_mpih_lshift:
|
||||
.set noreorder
|
||||
.set nomacro
|
||||
|
||||
dsll $2,$6,3
|
||||
daddu $5,$5,$2 # make r5 point at end of src
|
||||
ld $10,-8($5) # load first limb
|
||||
dsubu $13,$0,$7
|
||||
daddu $4,$4,$2 # make r4 point at end of res
|
||||
daddiu $6,$6,-1
|
||||
and $9,$6,4-1 # number of limbs in first loop
|
||||
beq $9,$0,.L0 # if multiple of 4 limbs, skip first loop
|
||||
dsrl $2,$10,$13 # compute function result
|
||||
|
||||
dsubu $6,$6,$9
|
||||
|
||||
.Loop0: ld $3,-16($5)
|
||||
daddiu $4,$4,-8
|
||||
daddiu $5,$5,-8
|
||||
daddiu $9,$9,-1
|
||||
dsll $11,$10,$7
|
||||
dsrl $12,$3,$13
|
||||
move $10,$3
|
||||
or $8,$11,$12
|
||||
bne $9,$0,.Loop0
|
||||
sd $8,0($4)
|
||||
|
||||
.L0: beq $6,$0,.Lend
|
||||
nop
|
||||
|
||||
.Loop: ld $3,-16($5)
|
||||
daddiu $4,$4,-32
|
||||
daddiu $6,$6,-4
|
||||
dsll $11,$10,$7
|
||||
dsrl $12,$3,$13
|
||||
|
||||
ld $10,-24($5)
|
||||
dsll $14,$3,$7
|
||||
or $8,$11,$12
|
||||
sd $8,24($4)
|
||||
dsrl $9,$10,$13
|
||||
|
||||
ld $3,-32($5)
|
||||
dsll $11,$10,$7
|
||||
or $8,$14,$9
|
||||
sd $8,16($4)
|
||||
dsrl $12,$3,$13
|
||||
|
||||
ld $10,-40($5)
|
||||
dsll $14,$3,$7
|
||||
or $8,$11,$12
|
||||
sd $8,8($4)
|
||||
dsrl $9,$10,$13
|
||||
|
||||
daddiu $5,$5,-32
|
||||
or $8,$14,$9
|
||||
bgtz $6,.Loop
|
||||
sd $8,0($4)
|
||||
|
||||
.Lend: dsll $8,$10,$7
|
||||
j $31
|
||||
sd $8,-8($4)
|
||||
.end _gcry_mpih_lshift
|
||||
89
grub-core/lib/libgcrypt/mpi/mips3/mpih-mul1.S
Normal file
89
grub-core/lib/libgcrypt/mpi/mips3/mpih-mul1.S
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
/* mips3 mpih-mul1.S -- Multiply a limb vector with a limb and store
|
||||
* the result in a second limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1995, 1998, 2000
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_mul_1( mpi_ptr_t res_ptr, (r4)
|
||||
* mpi_ptr_t s1_ptr, (r5)
|
||||
* mpi_size_t s1_size, (r6)
|
||||
* mpi_limb_t s2_limb) (r7)
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 4
|
||||
.globl _gcry_mpih_mul_1
|
||||
.ent _gcry_mpih_mul_1
|
||||
_gcry_mpih_mul_1:
|
||||
.set noreorder
|
||||
.set nomacro
|
||||
|
||||
/* # warm up phase 0 */
|
||||
ld $8,0($5)
|
||||
|
||||
/* # warm up phase 1 */
|
||||
daddiu $5,$5,8
|
||||
dmultu $8,$7
|
||||
|
||||
daddiu $6,$6,-1
|
||||
beq $6,$0,$LC0
|
||||
move $2,$0 # zero cy2
|
||||
|
||||
daddiu $6,$6,-1
|
||||
beq $6,$0,$LC1
|
||||
ld $8,0($5) # load new s1 limb as early as possible
|
||||
|
||||
Loop: mflo $10
|
||||
mfhi $9
|
||||
daddiu $5,$5,8
|
||||
daddu $10,$10,$2 # add old carry limb to low product limb
|
||||
dmultu $8,$7
|
||||
ld $8,0($5) # load new s1 limb as early as possible
|
||||
daddiu $6,$6,-1 # decrement loop counter
|
||||
sltu $2,$10,$2 # carry from previous addition -> $2
|
||||
sd $10,0($4)
|
||||
daddiu $4,$4,8
|
||||
bne $6,$0,Loop
|
||||
daddu $2,$9,$2 # add high product limb and carry from addition
|
||||
|
||||
/* # cool down phase 1 */
|
||||
$LC1: mflo $10
|
||||
mfhi $9
|
||||
daddu $10,$10,$2
|
||||
sltu $2,$10,$2
|
||||
dmultu $8,$7
|
||||
sd $10,0($4)
|
||||
daddiu $4,$4,8
|
||||
daddu $2,$9,$2 # add high product limb and carry from addition
|
||||
|
||||
/* # cool down phase 0 */
|
||||
$LC0: mflo $10
|
||||
mfhi $9
|
||||
daddu $10,$10,$2
|
||||
sltu $2,$10,$2
|
||||
sd $10,0($4)
|
||||
j $31
|
||||
daddu $2,$9,$2 # add high product limb and carry from addition
|
||||
|
||||
.end _gcry_mpih_mul_1
|
||||
|
||||
101
grub-core/lib/libgcrypt/mpi/mips3/mpih-mul2.S
Normal file
101
grub-core/lib/libgcrypt/mpi/mips3/mpih-mul2.S
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
/* MIPS3 addmul_1 -- Multiply a limb vector with a single limb and
|
||||
* add the product to a second limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1995, 1998, 2000
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_addmul_1( mpi_ptr_t res_ptr, (r4)
|
||||
* mpi_ptr_t s1_ptr, (r5)
|
||||
* mpi_size_t s1_size, (r6)
|
||||
* mpi_limb_t s2_limb) (r7)
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 4
|
||||
.globl _gcry_mpih_addmul_1
|
||||
.ent _gcry_mpih_addmul_1
|
||||
_gcry_mpih_addmul_1:
|
||||
.set noreorder
|
||||
.set nomacro
|
||||
|
||||
/* # warm up phase 0 */
|
||||
ld $8,0($5)
|
||||
|
||||
/* # warm up phase 1 */
|
||||
daddiu $5,$5,8
|
||||
dmultu $8,$7
|
||||
|
||||
daddiu $6,$6,-1
|
||||
beq $6,$0,$LC0
|
||||
move $2,$0 # zero cy2
|
||||
|
||||
daddiu $6,$6,-1
|
||||
beq $6,$0,$LC1
|
||||
ld $8,0($5) # load new s1 limb as early as possible
|
||||
|
||||
Loop: ld $10,0($4)
|
||||
mflo $3
|
||||
mfhi $9
|
||||
daddiu $5,$5,8
|
||||
daddu $3,$3,$2 # add old carry limb to low product limb
|
||||
dmultu $8,$7
|
||||
ld $8,0($5) # load new s1 limb as early as possible
|
||||
daddiu $6,$6,-1 # decrement loop counter
|
||||
sltu $2,$3,$2 # carry from previous addition -> $2
|
||||
daddu $3,$10,$3
|
||||
sltu $10,$3,$10
|
||||
daddu $2,$2,$10
|
||||
sd $3,0($4)
|
||||
daddiu $4,$4,8
|
||||
bne $6,$0,Loop
|
||||
daddu $2,$9,$2 # add high product limb and carry from addition
|
||||
|
||||
/* # cool down phase 1 */
|
||||
$LC1: ld $10,0($4)
|
||||
mflo $3
|
||||
mfhi $9
|
||||
daddu $3,$3,$2
|
||||
sltu $2,$3,$2
|
||||
dmultu $8,$7
|
||||
daddu $3,$10,$3
|
||||
sltu $10,$3,$10
|
||||
daddu $2,$2,$10
|
||||
sd $3,0($4)
|
||||
daddiu $4,$4,8
|
||||
daddu $2,$9,$2 # add high product limb and carry from addition
|
||||
|
||||
/* # cool down phase 0 */
|
||||
$LC0: ld $10,0($4)
|
||||
mflo $3
|
||||
mfhi $9
|
||||
daddu $3,$3,$2
|
||||
sltu $2,$3,$2
|
||||
daddu $3,$10,$3
|
||||
sltu $10,$3,$10
|
||||
daddu $2,$2,$10
|
||||
sd $3,0($4)
|
||||
j $31
|
||||
daddu $2,$9,$2 # add high product limb and carry from addition
|
||||
|
||||
.end _gcry_mpih_addmul_1
|
||||
|
||||
101
grub-core/lib/libgcrypt/mpi/mips3/mpih-mul3.S
Normal file
101
grub-core/lib/libgcrypt/mpi/mips3/mpih-mul3.S
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
/* MIPS3 submul_1 -- Multiply a limb vector with a single limb and
|
||||
* subtract the product from a second limb vector.
|
||||
*
|
||||
* Copyright (C) 1992, 1994, 1995, 1998, 2000
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_submul_1( mpi_ptr_t res_ptr, (r4)
|
||||
* mpi_ptr_t s1_ptr, (r5)
|
||||
* mpi_size_t s1_size, (r6)
|
||||
* mpi_limb_t s2_limb) (r7)
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 4
|
||||
.globl _gcry_mpih_submul_1
|
||||
.ent _gcry_mpih_submul_1
|
||||
_gcry_mpih_submul_1:
|
||||
.set noreorder
|
||||
.set nomacro
|
||||
|
||||
/* # warm up phase 0 */
|
||||
ld $8,0($5)
|
||||
|
||||
/* # warm up phase 1 */
|
||||
daddiu $5,$5,8
|
||||
dmultu $8,$7
|
||||
|
||||
daddiu $6,$6,-1
|
||||
beq $6,$0,$LC0
|
||||
move $2,$0 # zero cy2
|
||||
|
||||
daddiu $6,$6,-1
|
||||
beq $6,$0,$LC1
|
||||
ld $8,0($5) # load new s1 limb as early as possible
|
||||
|
||||
Loop: ld $10,0($4)
|
||||
mflo $3
|
||||
mfhi $9
|
||||
daddiu $5,$5,8
|
||||
daddu $3,$3,$2 # add old carry limb to low product limb
|
||||
dmultu $8,$7
|
||||
ld $8,0($5) # load new s1 limb as early as possible
|
||||
daddiu $6,$6,-1 # decrement loop counter
|
||||
sltu $2,$3,$2 # carry from previous addition -> $2
|
||||
dsubu $3,$10,$3
|
||||
sgtu $10,$3,$10
|
||||
daddu $2,$2,$10
|
||||
sd $3,0($4)
|
||||
daddiu $4,$4,8
|
||||
bne $6,$0,Loop
|
||||
daddu $2,$9,$2 # add high product limb and carry from addition
|
||||
|
||||
/* # cool down phase 1 */
|
||||
$LC1: ld $10,0($4)
|
||||
mflo $3
|
||||
mfhi $9
|
||||
daddu $3,$3,$2
|
||||
sltu $2,$3,$2
|
||||
dmultu $8,$7
|
||||
dsubu $3,$10,$3
|
||||
sgtu $10,$3,$10
|
||||
daddu $2,$2,$10
|
||||
sd $3,0($4)
|
||||
daddiu $4,$4,8
|
||||
daddu $2,$9,$2 # add high product limb and carry from addition
|
||||
|
||||
/* # cool down phase 0 */
|
||||
$LC0: ld $10,0($4)
|
||||
mflo $3
|
||||
mfhi $9
|
||||
daddu $3,$3,$2
|
||||
sltu $2,$3,$2
|
||||
dsubu $3,$10,$3
|
||||
sgtu $10,$3,$10
|
||||
daddu $2,$2,$10
|
||||
sd $3,0($4)
|
||||
j $31
|
||||
daddu $2,$9,$2 # add high product limb and carry from addition
|
||||
|
||||
.end _gcry_mpih_submul_1
|
||||
|
||||
95
grub-core/lib/libgcrypt/mpi/mips3/mpih-rshift.S
Normal file
95
grub-core/lib/libgcrypt/mpi/mips3/mpih-rshift.S
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
/* mips3 rshift
|
||||
*
|
||||
* Copyright (C) 1995, 1998, 2000
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_rshift( mpi_ptr_t wp, ($4)
|
||||
* mpi_ptr_t up, ($5)
|
||||
* mpi_size_t usize, ($6)
|
||||
* unsigned cnt) ($7)
|
||||
*/
|
||||
|
||||
.text
|
||||
.align 2
|
||||
.globl _gcry_mpih_rshift
|
||||
.ent _gcry_mpih_rshift
|
||||
_gcry_mpih_rshift:
|
||||
.set noreorder
|
||||
.set nomacro
|
||||
|
||||
ld $10,0($5) # load first limb
|
||||
dsubu $13,$0,$7
|
||||
daddiu $6,$6,-1
|
||||
and $9,$6,4-1 # number of limbs in first loop
|
||||
beq $9,$0,.L0 # if multiple of 4 limbs, skip first loop
|
||||
dsll $2,$10,$13 # compute function result
|
||||
|
||||
dsubu $6,$6,$9
|
||||
|
||||
.Loop0: ld $3,8($5)
|
||||
daddiu $4,$4,8
|
||||
daddiu $5,$5,8
|
||||
daddiu $9,$9,-1
|
||||
dsrl $11,$10,$7
|
||||
dsll $12,$3,$13
|
||||
move $10,$3
|
||||
or $8,$11,$12
|
||||
bne $9,$0,.Loop0
|
||||
sd $8,-8($4)
|
||||
|
||||
.L0: beq $6,$0,.Lend
|
||||
nop
|
||||
|
||||
.Loop: ld $3,8($5)
|
||||
daddiu $4,$4,32
|
||||
daddiu $6,$6,-4
|
||||
dsrl $11,$10,$7
|
||||
dsll $12,$3,$13
|
||||
|
||||
ld $10,16($5)
|
||||
dsrl $14,$3,$7
|
||||
or $8,$11,$12
|
||||
sd $8,-32($4)
|
||||
dsll $9,$10,$13
|
||||
|
||||
ld $3,24($5)
|
||||
dsrl $11,$10,$7
|
||||
or $8,$14,$9
|
||||
sd $8,-24($4)
|
||||
dsll $12,$3,$13
|
||||
|
||||
ld $10,32($5)
|
||||
dsrl $14,$3,$7
|
||||
or $8,$11,$12
|
||||
sd $8,-16($4)
|
||||
dsll $9,$10,$13
|
||||
|
||||
daddiu $5,$5,32
|
||||
or $8,$14,$9
|
||||
bgtz $6,.Loop
|
||||
sd $8,-8($4)
|
||||
|
||||
.Lend: dsrl $8,$10,$7
|
||||
j $31
|
||||
sd $8,0($4)
|
||||
.end _gcry_mpih_rshift
|
||||
|
||||
125
grub-core/lib/libgcrypt/mpi/mips3/mpih-sub1.S
Normal file
125
grub-core/lib/libgcrypt/mpi/mips3/mpih-sub1.S
Normal file
|
|
@ -0,0 +1,125 @@
|
|||
/* mips3 sub_n -- Subtract two limb vectors of the same length > 0 and
|
||||
* store difference in a third limb vector.
|
||||
*
|
||||
* Copyright (C) 1995, 1998, 1999, 2000,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
|
||||
/*******************
|
||||
* mpi_limb_t
|
||||
* _gcry_mpih_sub_n( mpi_ptr_t res_ptr, (r4)
|
||||
* mpi_ptr_t s1_ptr, (r5)
|
||||
* mpi_ptr_t s2_ptr, (r6)
|
||||
* mpi_size_t size) (r7)
|
||||
*/
|
||||
|
||||
|
||||
.text
|
||||
.align 2
|
||||
.globl _gcry_mpih_sub_n
|
||||
.ent _gcry_mpih_sub_n
|
||||
_gcry_mpih_sub_n:
|
||||
.set noreorder
|
||||
.set nomacro
|
||||
|
||||
ld $10,0($5)
|
||||
ld $11,0($6)
|
||||
|
||||
daddiu $7,$7,-1
|
||||
and $9,$7,4-1 # number of limbs in first loop
|
||||
beq $9,$0,.L0 # if multiple of 4 limbs, skip first loop
|
||||
move $2,$0
|
||||
|
||||
dsubu $7,$7,$9
|
||||
|
||||
.Loop0: daddiu $9,$9,-1
|
||||
ld $12,8($5)
|
||||
daddu $11,$11,$2
|
||||
ld $13,8($6)
|
||||
sltu $8,$11,$2
|
||||
dsubu $11,$10,$11
|
||||
sltu $2,$10,$11
|
||||
sd $11,0($4)
|
||||
or $2,$2,$8
|
||||
|
||||
daddiu $5,$5,8
|
||||
daddiu $6,$6,8
|
||||
move $10,$12
|
||||
move $11,$13
|
||||
bne $9,$0,.Loop0
|
||||
daddiu $4,$4,8
|
||||
|
||||
.L0: beq $7,$0,.Lend
|
||||
nop
|
||||
|
||||
.Loop: daddiu $7,$7,-4
|
||||
|
||||
ld $12,8($5)
|
||||
daddu $11,$11,$2
|
||||
ld $13,8($6)
|
||||
sltu $8,$11,$2
|
||||
dsubu $11,$10,$11
|
||||
sltu $2,$10,$11
|
||||
sd $11,0($4)
|
||||
or $2,$2,$8
|
||||
|
||||
ld $10,16($5)
|
||||
daddu $13,$13,$2
|
||||
ld $11,16($6)
|
||||
sltu $8,$13,$2
|
||||
dsubu $13,$12,$13
|
||||
sltu $2,$12,$13
|
||||
sd $13,8($4)
|
||||
or $2,$2,$8
|
||||
|
||||
ld $12,24($5)
|
||||
daddu $11,$11,$2
|
||||
ld $13,24($6)
|
||||
sltu $8,$11,$2
|
||||
dsubu $11,$10,$11
|
||||
sltu $2,$10,$11
|
||||
sd $11,16($4)
|
||||
or $2,$2,$8
|
||||
|
||||
ld $10,32($5)
|
||||
daddu $13,$13,$2
|
||||
ld $11,32($6)
|
||||
sltu $8,$13,$2
|
||||
dsubu $13,$12,$13
|
||||
sltu $2,$12,$13
|
||||
sd $13,24($4)
|
||||
or $2,$2,$8
|
||||
|
||||
daddiu $5,$5,32
|
||||
daddiu $6,$6,32
|
||||
|
||||
bne $7,$0,.Loop
|
||||
daddiu $4,$4,32
|
||||
|
||||
.Lend: daddu $11,$11,$2
|
||||
sltu $8,$11,$2
|
||||
dsubu $11,$10,$11
|
||||
sltu $2,$10,$11
|
||||
sd $11,0($4)
|
||||
j $31
|
||||
or $2,$2,$8
|
||||
|
||||
.end _gcry_mpih_sub_n
|
||||
|
||||
235
grub-core/lib/libgcrypt/mpi/mpi-add.c
Normal file
235
grub-core/lib/libgcrypt/mpi/mpi-add.c
Normal file
|
|
@ -0,0 +1,235 @@
|
|||
/* mpi-add.c - MPI functions
|
||||
* Copyright (C) 1994, 1996, 1998, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "mpi-internal.h"
|
||||
|
||||
|
||||
/****************
|
||||
* Add the unsigned integer V to the mpi-integer U and store the
|
||||
* result in W. U and V may be the same.
|
||||
*/
|
||||
void
|
||||
gcry_mpi_add_ui(gcry_mpi_t w, gcry_mpi_t u, unsigned long v )
|
||||
{
|
||||
mpi_ptr_t wp, up;
|
||||
mpi_size_t usize, wsize;
|
||||
int usign, wsign;
|
||||
|
||||
usize = u->nlimbs;
|
||||
usign = u->sign;
|
||||
wsign = 0;
|
||||
|
||||
/* If not space for W (and possible carry), increase space. */
|
||||
wsize = usize + 1;
|
||||
if( w->alloced < wsize )
|
||||
mpi_resize(w, wsize);
|
||||
|
||||
/* These must be after realloc (U may be the same as W). */
|
||||
up = u->d;
|
||||
wp = w->d;
|
||||
|
||||
if( !usize ) { /* simple */
|
||||
wp[0] = v;
|
||||
wsize = v? 1:0;
|
||||
}
|
||||
else if( !usign ) { /* mpi is not negative */
|
||||
mpi_limb_t cy;
|
||||
cy = _gcry_mpih_add_1(wp, up, usize, v);
|
||||
wp[usize] = cy;
|
||||
wsize = usize + cy;
|
||||
}
|
||||
else { /* The signs are different. Need exact comparison to determine
|
||||
* which operand to subtract from which. */
|
||||
if( usize == 1 && up[0] < v ) {
|
||||
wp[0] = v - up[0];
|
||||
wsize = 1;
|
||||
}
|
||||
else {
|
||||
_gcry_mpih_sub_1(wp, up, usize, v);
|
||||
/* Size can decrease with at most one limb. */
|
||||
wsize = usize - (wp[usize-1]==0);
|
||||
wsign = 1;
|
||||
}
|
||||
}
|
||||
|
||||
w->nlimbs = wsize;
|
||||
w->sign = wsign;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gcry_mpi_add(gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v)
|
||||
{
|
||||
mpi_ptr_t wp, up, vp;
|
||||
mpi_size_t usize, vsize, wsize;
|
||||
int usign, vsign, wsign;
|
||||
|
||||
if( u->nlimbs < v->nlimbs ) { /* Swap U and V. */
|
||||
usize = v->nlimbs;
|
||||
usign = v->sign;
|
||||
vsize = u->nlimbs;
|
||||
vsign = u->sign;
|
||||
wsize = usize + 1;
|
||||
RESIZE_IF_NEEDED(w, wsize);
|
||||
/* These must be after realloc (u or v may be the same as w). */
|
||||
up = v->d;
|
||||
vp = u->d;
|
||||
}
|
||||
else {
|
||||
usize = u->nlimbs;
|
||||
usign = u->sign;
|
||||
vsize = v->nlimbs;
|
||||
vsign = v->sign;
|
||||
wsize = usize + 1;
|
||||
RESIZE_IF_NEEDED(w, wsize);
|
||||
/* These must be after realloc (u or v may be the same as w). */
|
||||
up = u->d;
|
||||
vp = v->d;
|
||||
}
|
||||
wp = w->d;
|
||||
wsign = 0;
|
||||
|
||||
if( !vsize ) { /* simple */
|
||||
MPN_COPY(wp, up, usize );
|
||||
wsize = usize;
|
||||
wsign = usign;
|
||||
}
|
||||
else if( usign != vsign ) { /* different sign */
|
||||
/* This test is right since USIZE >= VSIZE */
|
||||
if( usize != vsize ) {
|
||||
_gcry_mpih_sub(wp, up, usize, vp, vsize);
|
||||
wsize = usize;
|
||||
MPN_NORMALIZE(wp, wsize);
|
||||
wsign = usign;
|
||||
}
|
||||
else if( _gcry_mpih_cmp(up, vp, usize) < 0 ) {
|
||||
_gcry_mpih_sub_n(wp, vp, up, usize);
|
||||
wsize = usize;
|
||||
MPN_NORMALIZE(wp, wsize);
|
||||
if( !usign )
|
||||
wsign = 1;
|
||||
}
|
||||
else {
|
||||
_gcry_mpih_sub_n(wp, up, vp, usize);
|
||||
wsize = usize;
|
||||
MPN_NORMALIZE(wp, wsize);
|
||||
if( usign )
|
||||
wsign = 1;
|
||||
}
|
||||
}
|
||||
else { /* U and V have same sign. Add them. */
|
||||
mpi_limb_t cy = _gcry_mpih_add(wp, up, usize, vp, vsize);
|
||||
wp[usize] = cy;
|
||||
wsize = usize + cy;
|
||||
if( usign )
|
||||
wsign = 1;
|
||||
}
|
||||
|
||||
w->nlimbs = wsize;
|
||||
w->sign = wsign;
|
||||
}
|
||||
|
||||
|
||||
/****************
|
||||
* Subtract the unsigned integer V from the mpi-integer U and store the
|
||||
* result in W.
|
||||
*/
|
||||
void
|
||||
gcry_mpi_sub_ui(gcry_mpi_t w, gcry_mpi_t u, unsigned long v )
|
||||
{
|
||||
mpi_ptr_t wp, up;
|
||||
mpi_size_t usize, wsize;
|
||||
int usign, wsign;
|
||||
|
||||
usize = u->nlimbs;
|
||||
usign = u->sign;
|
||||
wsign = 0;
|
||||
|
||||
/* If not space for W (and possible carry), increase space. */
|
||||
wsize = usize + 1;
|
||||
if( w->alloced < wsize )
|
||||
mpi_resize(w, wsize);
|
||||
|
||||
/* These must be after realloc (U may be the same as W). */
|
||||
up = u->d;
|
||||
wp = w->d;
|
||||
|
||||
if( !usize ) { /* simple */
|
||||
wp[0] = v;
|
||||
wsize = v? 1:0;
|
||||
wsign = 1;
|
||||
}
|
||||
else if( usign ) { /* mpi and v are negative */
|
||||
mpi_limb_t cy;
|
||||
cy = _gcry_mpih_add_1(wp, up, usize, v);
|
||||
wp[usize] = cy;
|
||||
wsize = usize + cy;
|
||||
}
|
||||
else { /* The signs are different. Need exact comparison to determine
|
||||
* which operand to subtract from which. */
|
||||
if( usize == 1 && up[0] < v ) {
|
||||
wp[0] = v - up[0];
|
||||
wsize = 1;
|
||||
wsign = 1;
|
||||
}
|
||||
else {
|
||||
_gcry_mpih_sub_1(wp, up, usize, v);
|
||||
/* Size can decrease with at most one limb. */
|
||||
wsize = usize - (wp[usize-1]==0);
|
||||
}
|
||||
}
|
||||
|
||||
w->nlimbs = wsize;
|
||||
w->sign = wsign;
|
||||
}
|
||||
|
||||
void
|
||||
gcry_mpi_sub(gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v)
|
||||
{
|
||||
gcry_mpi_t vv = mpi_copy (v);
|
||||
vv->sign = ! vv->sign;
|
||||
gcry_mpi_add (w, u, vv);
|
||||
mpi_free (vv);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gcry_mpi_addm( gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, gcry_mpi_t m)
|
||||
{
|
||||
gcry_mpi_add(w, u, v);
|
||||
_gcry_mpi_fdiv_r( w, w, m );
|
||||
}
|
||||
|
||||
void
|
||||
gcry_mpi_subm( gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, gcry_mpi_t m)
|
||||
{
|
||||
gcry_mpi_sub(w, u, v);
|
||||
_gcry_mpi_fdiv_r( w, w, m );
|
||||
}
|
||||
364
grub-core/lib/libgcrypt/mpi/mpi-bit.c
Normal file
364
grub-core/lib/libgcrypt/mpi/mpi-bit.c
Normal file
|
|
@ -0,0 +1,364 @@
|
|||
/* mpi-bit.c - MPI bit level functions
|
||||
* Copyright (C) 1998, 1999, 2001, 2002, 2006 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "mpi-internal.h"
|
||||
#include "longlong.h"
|
||||
|
||||
|
||||
#ifdef MPI_INTERNAL_NEED_CLZ_TAB
|
||||
#ifdef __STDC__
|
||||
const
|
||||
#endif
|
||||
unsigned char
|
||||
_gcry_clz_tab[] =
|
||||
{
|
||||
0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
|
||||
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
||||
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
|
||||
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
|
||||
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
|
||||
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
#define A_LIMB_1 ((mpi_limb_t)1)
|
||||
|
||||
|
||||
/****************
|
||||
* Sometimes we have MSL (most significant limbs) which are 0;
|
||||
* this is for some reasons not good, so this function removes them.
|
||||
*/
|
||||
void
|
||||
_gcry_mpi_normalize( gcry_mpi_t a )
|
||||
{
|
||||
if( mpi_is_opaque(a) )
|
||||
return;
|
||||
|
||||
for( ; a->nlimbs && !a->d[a->nlimbs-1]; a->nlimbs-- )
|
||||
;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/****************
|
||||
* Return the number of bits in A.
|
||||
*/
|
||||
unsigned int
|
||||
gcry_mpi_get_nbits( gcry_mpi_t a )
|
||||
{
|
||||
unsigned n;
|
||||
|
||||
if( mpi_is_opaque(a) ) {
|
||||
return a->sign; /* which holds the number of bits */
|
||||
}
|
||||
|
||||
_gcry_mpi_normalize( a );
|
||||
if( a->nlimbs ) {
|
||||
mpi_limb_t alimb = a->d[a->nlimbs-1];
|
||||
if( alimb )
|
||||
count_leading_zeros( n, alimb );
|
||||
else
|
||||
n = BITS_PER_MPI_LIMB;
|
||||
n = BITS_PER_MPI_LIMB - n + (a->nlimbs-1) * BITS_PER_MPI_LIMB;
|
||||
}
|
||||
else
|
||||
n = 0;
|
||||
return n;
|
||||
}
|
||||
|
||||
|
||||
/****************
|
||||
* Test whether bit N is set.
|
||||
*/
|
||||
int
|
||||
gcry_mpi_test_bit( gcry_mpi_t a, unsigned int n )
|
||||
{
|
||||
unsigned int limbno, bitno;
|
||||
mpi_limb_t limb;
|
||||
|
||||
limbno = n / BITS_PER_MPI_LIMB;
|
||||
bitno = n % BITS_PER_MPI_LIMB;
|
||||
|
||||
if( limbno >= a->nlimbs )
|
||||
return 0; /* too far left: this is a 0 */
|
||||
limb = a->d[limbno];
|
||||
return (limb & (A_LIMB_1 << bitno))? 1: 0;
|
||||
}
|
||||
|
||||
|
||||
/****************
|
||||
* Set bit N of A.
|
||||
*/
|
||||
void
|
||||
gcry_mpi_set_bit( gcry_mpi_t a, unsigned int n )
|
||||
{
|
||||
unsigned int limbno, bitno;
|
||||
|
||||
limbno = n / BITS_PER_MPI_LIMB;
|
||||
bitno = n % BITS_PER_MPI_LIMB;
|
||||
|
||||
if ( limbno >= a->nlimbs )
|
||||
{
|
||||
mpi_resize (a, limbno+1 );
|
||||
a->nlimbs = limbno+1;
|
||||
}
|
||||
a->d[limbno] |= (A_LIMB_1<<bitno);
|
||||
}
|
||||
|
||||
/****************
|
||||
* Set bit N of A. and clear all bits above
|
||||
*/
|
||||
void
|
||||
gcry_mpi_set_highbit( gcry_mpi_t a, unsigned int n )
|
||||
{
|
||||
unsigned int limbno, bitno;
|
||||
|
||||
limbno = n / BITS_PER_MPI_LIMB;
|
||||
bitno = n % BITS_PER_MPI_LIMB;
|
||||
|
||||
if ( limbno >= a->nlimbs )
|
||||
{
|
||||
mpi_resize (a, limbno+1 );
|
||||
a->nlimbs = limbno+1;
|
||||
}
|
||||
a->d[limbno] |= (A_LIMB_1<<bitno);
|
||||
for ( bitno++; bitno < BITS_PER_MPI_LIMB; bitno++ )
|
||||
a->d[limbno] &= ~(A_LIMB_1 << bitno);
|
||||
a->nlimbs = limbno+1;
|
||||
}
|
||||
|
||||
/****************
|
||||
* clear bit N of A and all bits above
|
||||
*/
|
||||
void
|
||||
gcry_mpi_clear_highbit( gcry_mpi_t a, unsigned int n )
|
||||
{
|
||||
unsigned int limbno, bitno;
|
||||
|
||||
limbno = n / BITS_PER_MPI_LIMB;
|
||||
bitno = n % BITS_PER_MPI_LIMB;
|
||||
|
||||
if( limbno >= a->nlimbs )
|
||||
return; /* not allocated, therefore no need to clear bits
|
||||
:-) */
|
||||
|
||||
for( ; bitno < BITS_PER_MPI_LIMB; bitno++ )
|
||||
a->d[limbno] &= ~(A_LIMB_1 << bitno);
|
||||
a->nlimbs = limbno+1;
|
||||
}
|
||||
|
||||
/****************
|
||||
* Clear bit N of A.
|
||||
*/
|
||||
void
|
||||
gcry_mpi_clear_bit( gcry_mpi_t a, unsigned int n )
|
||||
{
|
||||
unsigned int limbno, bitno;
|
||||
|
||||
limbno = n / BITS_PER_MPI_LIMB;
|
||||
bitno = n % BITS_PER_MPI_LIMB;
|
||||
|
||||
if( limbno >= a->nlimbs )
|
||||
return; /* don't need to clear this bit, it's to far to left */
|
||||
a->d[limbno] &= ~(A_LIMB_1 << bitno);
|
||||
}
|
||||
|
||||
|
||||
/****************
|
||||
* Shift A by COUNT limbs to the right
|
||||
* This is used only within the MPI library
|
||||
*/
|
||||
void
|
||||
_gcry_mpi_rshift_limbs( gcry_mpi_t a, unsigned int count )
|
||||
{
|
||||
mpi_ptr_t ap = a->d;
|
||||
mpi_size_t n = a->nlimbs;
|
||||
unsigned int i;
|
||||
|
||||
if( count >= n ) {
|
||||
a->nlimbs = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
for( i = 0; i < n - count; i++ )
|
||||
ap[i] = ap[i+count];
|
||||
ap[i] = 0;
|
||||
a->nlimbs -= count;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Shift A by N bits to the right.
|
||||
*/
|
||||
void
|
||||
gcry_mpi_rshift ( gcry_mpi_t x, gcry_mpi_t a, unsigned int n )
|
||||
{
|
||||
mpi_size_t xsize;
|
||||
unsigned int i;
|
||||
unsigned int nlimbs = (n/BITS_PER_MPI_LIMB);
|
||||
unsigned int nbits = (n%BITS_PER_MPI_LIMB);
|
||||
|
||||
if ( x == a )
|
||||
{
|
||||
/* In-place operation. */
|
||||
if ( nlimbs >= x->nlimbs )
|
||||
{
|
||||
x->nlimbs = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if (nlimbs)
|
||||
{
|
||||
for (i=0; i < x->nlimbs - nlimbs; i++ )
|
||||
x->d[i] = x->d[i+nlimbs];
|
||||
x->d[i] = 0;
|
||||
x->nlimbs -= nlimbs;
|
||||
|
||||
}
|
||||
if ( x->nlimbs && nbits )
|
||||
_gcry_mpih_rshift ( x->d, x->d, x->nlimbs, nbits );
|
||||
}
|
||||
else if ( nlimbs )
|
||||
{
|
||||
/* Copy and shift by more or equal bits than in a limb. */
|
||||
xsize = a->nlimbs;
|
||||
x->sign = a->sign;
|
||||
RESIZE_IF_NEEDED (x, xsize);
|
||||
x->nlimbs = xsize;
|
||||
for (i=0; i < a->nlimbs; i++ )
|
||||
x->d[i] = a->d[i];
|
||||
x->nlimbs = i;
|
||||
|
||||
if ( nlimbs >= x->nlimbs )
|
||||
{
|
||||
x->nlimbs = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if (nlimbs)
|
||||
{
|
||||
for (i=0; i < x->nlimbs - nlimbs; i++ )
|
||||
x->d[i] = x->d[i+nlimbs];
|
||||
x->d[i] = 0;
|
||||
x->nlimbs -= nlimbs;
|
||||
}
|
||||
|
||||
if ( x->nlimbs && nbits )
|
||||
_gcry_mpih_rshift ( x->d, x->d, x->nlimbs, nbits );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Copy and shift by less than bits in a limb. */
|
||||
xsize = a->nlimbs;
|
||||
x->sign = a->sign;
|
||||
RESIZE_IF_NEEDED (x, xsize);
|
||||
x->nlimbs = xsize;
|
||||
|
||||
if ( xsize )
|
||||
{
|
||||
if (nbits )
|
||||
_gcry_mpih_rshift (x->d, a->d, x->nlimbs, nbits );
|
||||
else
|
||||
{
|
||||
/* The rshift helper function is not specified for
|
||||
NBITS==0, thus we do a plain copy here. */
|
||||
for (i=0; i < x->nlimbs; i++ )
|
||||
x->d[i] = a->d[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
MPN_NORMALIZE (x->d, x->nlimbs);
|
||||
}
|
||||
|
||||
|
||||
/****************
|
||||
* Shift A by COUNT limbs to the left
|
||||
* This is used only within the MPI library
|
||||
*/
|
||||
void
|
||||
_gcry_mpi_lshift_limbs (gcry_mpi_t a, unsigned int count)
|
||||
{
|
||||
mpi_ptr_t ap;
|
||||
int n = a->nlimbs;
|
||||
int i;
|
||||
|
||||
if (!count || !n)
|
||||
return;
|
||||
|
||||
RESIZE_IF_NEEDED (a, n+count);
|
||||
|
||||
ap = a->d;
|
||||
for (i = n-1; i >= 0; i--)
|
||||
ap[i+count] = ap[i];
|
||||
for (i=0; i < count; i++ )
|
||||
ap[i] = 0;
|
||||
a->nlimbs += count;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Shift A by N bits to the left.
|
||||
*/
|
||||
void
|
||||
gcry_mpi_lshift ( gcry_mpi_t x, gcry_mpi_t a, unsigned int n )
|
||||
{
|
||||
unsigned int nlimbs = (n/BITS_PER_MPI_LIMB);
|
||||
unsigned int nbits = (n%BITS_PER_MPI_LIMB);
|
||||
|
||||
if (x == a && !n)
|
||||
return; /* In-place shift with an amount of zero. */
|
||||
|
||||
if ( x != a )
|
||||
{
|
||||
/* Copy A to X. */
|
||||
unsigned int alimbs = a->nlimbs;
|
||||
int asign = a->sign;
|
||||
mpi_ptr_t xp, ap;
|
||||
|
||||
RESIZE_IF_NEEDED (x, alimbs+nlimbs+1);
|
||||
xp = x->d;
|
||||
ap = a->d;
|
||||
MPN_COPY (xp, ap, alimbs);
|
||||
x->nlimbs = alimbs;
|
||||
x->flags = a->flags;
|
||||
x->sign = asign;
|
||||
}
|
||||
|
||||
if (nlimbs && !nbits)
|
||||
{
|
||||
/* Shift a full number of limbs. */
|
||||
_gcry_mpi_lshift_limbs (x, nlimbs);
|
||||
}
|
||||
else if (n)
|
||||
{
|
||||
/* We use a very dump approach: Shift left by the number of
|
||||
limbs plus one and than fix it up by an rshift. */
|
||||
_gcry_mpi_lshift_limbs (x, nlimbs+1);
|
||||
gcry_mpi_rshift (x, x, BITS_PER_MPI_LIMB - nbits);
|
||||
}
|
||||
|
||||
MPN_NORMALIZE (x->d, x->nlimbs);
|
||||
}
|
||||
107
grub-core/lib/libgcrypt/mpi/mpi-cmp.c
Normal file
107
grub-core/lib/libgcrypt/mpi/mpi-cmp.c
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
/* mpi-cmp.c - MPI functions
|
||||
* Copyright (C) 1998, 1999, 2001, 2002, 2005 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "mpi-internal.h"
|
||||
|
||||
int
|
||||
gcry_mpi_cmp_ui (gcry_mpi_t u, unsigned long v)
|
||||
{
|
||||
mpi_limb_t limb = v;
|
||||
|
||||
_gcry_mpi_normalize (u);
|
||||
|
||||
/* Handle the case that U contains no limb. */
|
||||
if (u->nlimbs == 0)
|
||||
return -(limb != 0);
|
||||
|
||||
/* Handle the case that U is negative. */
|
||||
if (u->sign)
|
||||
return -1;
|
||||
|
||||
if (u->nlimbs == 1)
|
||||
{
|
||||
/* Handle the case that U contains exactly one limb. */
|
||||
|
||||
if (u->d[0] > limb)
|
||||
return 1;
|
||||
if (u->d[0] < limb)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
/* Handle the case that U contains more than one limb. */
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
gcry_mpi_cmp (gcry_mpi_t u, gcry_mpi_t v)
|
||||
{
|
||||
mpi_size_t usize;
|
||||
mpi_size_t vsize;
|
||||
int cmp;
|
||||
|
||||
if (mpi_is_opaque (u) || mpi_is_opaque (v))
|
||||
{
|
||||
if (mpi_is_opaque (u) && !mpi_is_opaque (v))
|
||||
return -1;
|
||||
if (!mpi_is_opaque (u) && mpi_is_opaque (v))
|
||||
return 1;
|
||||
if (!u->sign && !v->sign)
|
||||
return 0; /* Empty buffers are identical. */
|
||||
if (u->sign < v->sign)
|
||||
return -1;
|
||||
if (u->sign > v->sign)
|
||||
return 1;
|
||||
return memcmp (u->d, v->d, (u->sign+7)/8);
|
||||
}
|
||||
else
|
||||
{
|
||||
_gcry_mpi_normalize (u);
|
||||
_gcry_mpi_normalize (v);
|
||||
|
||||
usize = u->nlimbs;
|
||||
vsize = v->nlimbs;
|
||||
|
||||
/* Compare sign bits. */
|
||||
|
||||
if (!u->sign && v->sign)
|
||||
return 1;
|
||||
if (u->sign && !v->sign)
|
||||
return -1;
|
||||
|
||||
/* U and V are either both positive or both negative. */
|
||||
|
||||
if (usize != vsize && !u->sign && !v->sign)
|
||||
return usize - vsize;
|
||||
if (usize != vsize && u->sign && v->sign)
|
||||
return vsize + usize;
|
||||
if (!usize )
|
||||
return 0;
|
||||
if (!(cmp = _gcry_mpih_cmp (u->d, v->d, usize)))
|
||||
return 0;
|
||||
if ((cmp < 0?1:0) == (u->sign?1:0))
|
||||
return 1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
355
grub-core/lib/libgcrypt/mpi/mpi-div.c
Normal file
355
grub-core/lib/libgcrypt/mpi/mpi-div.c
Normal file
|
|
@ -0,0 +1,355 @@
|
|||
/* mpi-div.c - MPI functions
|
||||
* Copyright (C) 1994, 1996, 1998, 2001, 2002,
|
||||
* 2003 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "mpi-internal.h"
|
||||
#include "longlong.h"
|
||||
#include "g10lib.h"
|
||||
|
||||
|
||||
void
|
||||
_gcry_mpi_fdiv_r( gcry_mpi_t rem, gcry_mpi_t dividend, gcry_mpi_t divisor )
|
||||
{
|
||||
int divisor_sign = divisor->sign;
|
||||
gcry_mpi_t temp_divisor = NULL;
|
||||
|
||||
/* We need the original value of the divisor after the remainder has been
|
||||
* preliminary calculated. We have to copy it to temporary space if it's
|
||||
* the same variable as REM. */
|
||||
if( rem == divisor ) {
|
||||
temp_divisor = mpi_copy( divisor );
|
||||
divisor = temp_divisor;
|
||||
}
|
||||
|
||||
_gcry_mpi_tdiv_r( rem, dividend, divisor );
|
||||
|
||||
if( ((divisor_sign?1:0) ^ (dividend->sign?1:0)) && rem->nlimbs )
|
||||
gcry_mpi_add( rem, rem, divisor);
|
||||
|
||||
if( temp_divisor )
|
||||
mpi_free(temp_divisor);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/****************
|
||||
* Division rounding the quotient towards -infinity.
|
||||
* The remainder gets the same sign as the denominator.
|
||||
* rem is optional
|
||||
*/
|
||||
|
||||
ulong
|
||||
_gcry_mpi_fdiv_r_ui( gcry_mpi_t rem, gcry_mpi_t dividend, ulong divisor )
|
||||
{
|
||||
mpi_limb_t rlimb;
|
||||
|
||||
rlimb = _gcry_mpih_mod_1( dividend->d, dividend->nlimbs, divisor );
|
||||
if( rlimb && dividend->sign )
|
||||
rlimb = divisor - rlimb;
|
||||
|
||||
if( rem ) {
|
||||
rem->d[0] = rlimb;
|
||||
rem->nlimbs = rlimb? 1:0;
|
||||
}
|
||||
return rlimb;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_gcry_mpi_fdiv_q( gcry_mpi_t quot, gcry_mpi_t dividend, gcry_mpi_t divisor )
|
||||
{
|
||||
gcry_mpi_t tmp = mpi_alloc( mpi_get_nlimbs(quot) );
|
||||
_gcry_mpi_fdiv_qr( quot, tmp, dividend, divisor);
|
||||
mpi_free(tmp);
|
||||
}
|
||||
|
||||
void
|
||||
_gcry_mpi_fdiv_qr( gcry_mpi_t quot, gcry_mpi_t rem, gcry_mpi_t dividend, gcry_mpi_t divisor )
|
||||
{
|
||||
int divisor_sign = divisor->sign;
|
||||
gcry_mpi_t temp_divisor = NULL;
|
||||
|
||||
if( quot == divisor || rem == divisor ) {
|
||||
temp_divisor = mpi_copy( divisor );
|
||||
divisor = temp_divisor;
|
||||
}
|
||||
|
||||
_gcry_mpi_tdiv_qr( quot, rem, dividend, divisor );
|
||||
|
||||
if( (divisor_sign ^ dividend->sign) && rem->nlimbs ) {
|
||||
gcry_mpi_sub_ui( quot, quot, 1 );
|
||||
gcry_mpi_add( rem, rem, divisor);
|
||||
}
|
||||
|
||||
if( temp_divisor )
|
||||
mpi_free(temp_divisor);
|
||||
}
|
||||
|
||||
|
||||
/* If den == quot, den needs temporary storage.
|
||||
* If den == rem, den needs temporary storage.
|
||||
* If num == quot, num needs temporary storage.
|
||||
* If den has temporary storage, it can be normalized while being copied,
|
||||
* i.e no extra storage should be allocated.
|
||||
*/
|
||||
|
||||
void
|
||||
_gcry_mpi_tdiv_r( gcry_mpi_t rem, gcry_mpi_t num, gcry_mpi_t den)
|
||||
{
|
||||
_gcry_mpi_tdiv_qr(NULL, rem, num, den );
|
||||
}
|
||||
|
||||
void
|
||||
_gcry_mpi_tdiv_qr( gcry_mpi_t quot, gcry_mpi_t rem, gcry_mpi_t num, gcry_mpi_t den)
|
||||
{
|
||||
mpi_ptr_t np, dp;
|
||||
mpi_ptr_t qp, rp;
|
||||
mpi_size_t nsize = num->nlimbs;
|
||||
mpi_size_t dsize = den->nlimbs;
|
||||
mpi_size_t qsize, rsize;
|
||||
mpi_size_t sign_remainder = num->sign;
|
||||
mpi_size_t sign_quotient = num->sign ^ den->sign;
|
||||
unsigned normalization_steps;
|
||||
mpi_limb_t q_limb;
|
||||
mpi_ptr_t marker[5];
|
||||
unsigned int marker_nlimbs[5];
|
||||
int markidx=0;
|
||||
|
||||
/* Ensure space is enough for quotient and remainder.
|
||||
* We need space for an extra limb in the remainder, because it's
|
||||
* up-shifted (normalized) below. */
|
||||
rsize = nsize + 1;
|
||||
mpi_resize( rem, rsize);
|
||||
|
||||
qsize = rsize - dsize; /* qsize cannot be bigger than this. */
|
||||
if( qsize <= 0 ) {
|
||||
if( num != rem ) {
|
||||
rem->nlimbs = num->nlimbs;
|
||||
rem->sign = num->sign;
|
||||
MPN_COPY(rem->d, num->d, nsize);
|
||||
}
|
||||
if( quot ) {
|
||||
/* This needs to follow the assignment to rem, in case the
|
||||
* numerator and quotient are the same. */
|
||||
quot->nlimbs = 0;
|
||||
quot->sign = 0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if( quot )
|
||||
mpi_resize( quot, qsize);
|
||||
|
||||
/* Read pointers here, when reallocation is finished. */
|
||||
np = num->d;
|
||||
dp = den->d;
|
||||
rp = rem->d;
|
||||
|
||||
/* Optimize division by a single-limb divisor. */
|
||||
if( dsize == 1 ) {
|
||||
mpi_limb_t rlimb;
|
||||
if( quot ) {
|
||||
qp = quot->d;
|
||||
rlimb = _gcry_mpih_divmod_1( qp, np, nsize, dp[0] );
|
||||
qsize -= qp[qsize - 1] == 0;
|
||||
quot->nlimbs = qsize;
|
||||
quot->sign = sign_quotient;
|
||||
}
|
||||
else
|
||||
rlimb = _gcry_mpih_mod_1( np, nsize, dp[0] );
|
||||
rp[0] = rlimb;
|
||||
rsize = rlimb != 0?1:0;
|
||||
rem->nlimbs = rsize;
|
||||
rem->sign = sign_remainder;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if( quot ) {
|
||||
qp = quot->d;
|
||||
/* Make sure QP and NP point to different objects. Otherwise the
|
||||
* numerator would be gradually overwritten by the quotient limbs. */
|
||||
if(qp == np) { /* Copy NP object to temporary space. */
|
||||
marker_nlimbs[markidx] = nsize;
|
||||
np = marker[markidx++] = mpi_alloc_limb_space(nsize,
|
||||
mpi_is_secure(quot));
|
||||
MPN_COPY(np, qp, nsize);
|
||||
}
|
||||
}
|
||||
else /* Put quotient at top of remainder. */
|
||||
qp = rp + dsize;
|
||||
|
||||
count_leading_zeros( normalization_steps, dp[dsize - 1] );
|
||||
|
||||
/* Normalize the denominator, i.e. make its most significant bit set by
|
||||
* shifting it NORMALIZATION_STEPS bits to the left. Also shift the
|
||||
* numerator the same number of steps (to keep the quotient the same!).
|
||||
*/
|
||||
if( normalization_steps ) {
|
||||
mpi_ptr_t tp;
|
||||
mpi_limb_t nlimb;
|
||||
|
||||
/* Shift up the denominator setting the most significant bit of
|
||||
* the most significant word. Use temporary storage not to clobber
|
||||
* the original contents of the denominator. */
|
||||
marker_nlimbs[markidx] = dsize;
|
||||
tp = marker[markidx++] = mpi_alloc_limb_space(dsize,mpi_is_secure(den));
|
||||
_gcry_mpih_lshift( tp, dp, dsize, normalization_steps );
|
||||
dp = tp;
|
||||
|
||||
/* Shift up the numerator, possibly introducing a new most
|
||||
* significant word. Move the shifted numerator in the remainder
|
||||
* meanwhile. */
|
||||
nlimb = _gcry_mpih_lshift(rp, np, nsize, normalization_steps);
|
||||
if( nlimb ) {
|
||||
rp[nsize] = nlimb;
|
||||
rsize = nsize + 1;
|
||||
}
|
||||
else
|
||||
rsize = nsize;
|
||||
}
|
||||
else {
|
||||
/* The denominator is already normalized, as required. Copy it to
|
||||
* temporary space if it overlaps with the quotient or remainder. */
|
||||
if( dp == rp || (quot && (dp == qp))) {
|
||||
mpi_ptr_t tp;
|
||||
|
||||
marker_nlimbs[markidx] = dsize;
|
||||
tp = marker[markidx++] = mpi_alloc_limb_space(dsize,
|
||||
mpi_is_secure(den));
|
||||
MPN_COPY( tp, dp, dsize );
|
||||
dp = tp;
|
||||
}
|
||||
|
||||
/* Move the numerator to the remainder. */
|
||||
if( rp != np )
|
||||
MPN_COPY(rp, np, nsize);
|
||||
|
||||
rsize = nsize;
|
||||
}
|
||||
|
||||
q_limb = _gcry_mpih_divrem( qp, 0, rp, rsize, dp, dsize );
|
||||
|
||||
if( quot ) {
|
||||
qsize = rsize - dsize;
|
||||
if(q_limb) {
|
||||
qp[qsize] = q_limb;
|
||||
qsize += 1;
|
||||
}
|
||||
|
||||
quot->nlimbs = qsize;
|
||||
quot->sign = sign_quotient;
|
||||
}
|
||||
|
||||
rsize = dsize;
|
||||
MPN_NORMALIZE (rp, rsize);
|
||||
|
||||
if( normalization_steps && rsize ) {
|
||||
_gcry_mpih_rshift(rp, rp, rsize, normalization_steps);
|
||||
rsize -= rp[rsize - 1] == 0?1:0;
|
||||
}
|
||||
|
||||
rem->nlimbs = rsize;
|
||||
rem->sign = sign_remainder;
|
||||
while( markidx )
|
||||
{
|
||||
markidx--;
|
||||
_gcry_mpi_free_limb_space (marker[markidx], marker_nlimbs[markidx]);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
_gcry_mpi_tdiv_q_2exp( gcry_mpi_t w, gcry_mpi_t u, unsigned int count )
|
||||
{
|
||||
mpi_size_t usize, wsize;
|
||||
mpi_size_t limb_cnt;
|
||||
|
||||
usize = u->nlimbs;
|
||||
limb_cnt = count / BITS_PER_MPI_LIMB;
|
||||
wsize = usize - limb_cnt;
|
||||
if( limb_cnt >= usize )
|
||||
w->nlimbs = 0;
|
||||
else {
|
||||
mpi_ptr_t wp;
|
||||
mpi_ptr_t up;
|
||||
|
||||
RESIZE_IF_NEEDED( w, wsize );
|
||||
wp = w->d;
|
||||
up = u->d;
|
||||
|
||||
count %= BITS_PER_MPI_LIMB;
|
||||
if( count ) {
|
||||
_gcry_mpih_rshift( wp, up + limb_cnt, wsize, count );
|
||||
wsize -= !wp[wsize - 1];
|
||||
}
|
||||
else {
|
||||
MPN_COPY_INCR( wp, up + limb_cnt, wsize);
|
||||
}
|
||||
|
||||
w->nlimbs = wsize;
|
||||
}
|
||||
}
|
||||
|
||||
/****************
|
||||
* Check whether dividend is divisible by divisor
|
||||
* (note: divisor must fit into a limb)
|
||||
*/
|
||||
int
|
||||
_gcry_mpi_divisible_ui(gcry_mpi_t dividend, ulong divisor )
|
||||
{
|
||||
return !_gcry_mpih_mod_1( dividend->d, dividend->nlimbs, divisor );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gcry_mpi_div (gcry_mpi_t quot, gcry_mpi_t rem, gcry_mpi_t dividend, gcry_mpi_t divisor, int round)
|
||||
{
|
||||
if (!round)
|
||||
{
|
||||
if (!rem)
|
||||
{
|
||||
gcry_mpi_t tmp = mpi_alloc (mpi_get_nlimbs(quot));
|
||||
_gcry_mpi_tdiv_qr (quot, tmp, dividend, divisor);
|
||||
mpi_free (tmp);
|
||||
}
|
||||
else
|
||||
_gcry_mpi_tdiv_qr (quot, rem, dividend, divisor);
|
||||
}
|
||||
else if (round < 0)
|
||||
{
|
||||
if (!rem)
|
||||
_gcry_mpi_fdiv_q (quot, dividend, divisor);
|
||||
else if (!quot)
|
||||
_gcry_mpi_fdiv_r (rem, dividend, divisor);
|
||||
else
|
||||
_gcry_mpi_fdiv_qr (quot, rem, dividend, divisor);
|
||||
}
|
||||
else
|
||||
log_bug ("mpi rounding to ceiling not yet implemented\n");
|
||||
}
|
||||
51
grub-core/lib/libgcrypt/mpi/mpi-gcd.c
Normal file
51
grub-core/lib/libgcrypt/mpi/mpi-gcd.c
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
/* mpi-gcd.c - MPI functions
|
||||
* Copyright (C) 1998, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "mpi-internal.h"
|
||||
|
||||
/****************
|
||||
* Find the greatest common divisor G of A and B.
|
||||
* Return: true if this 1, false in all other cases
|
||||
*/
|
||||
int
|
||||
gcry_mpi_gcd( gcry_mpi_t g, gcry_mpi_t xa, gcry_mpi_t xb )
|
||||
{
|
||||
gcry_mpi_t a, b;
|
||||
|
||||
a = mpi_copy(xa);
|
||||
b = mpi_copy(xb);
|
||||
|
||||
/* TAOCP Vol II, 4.5.2, Algorithm A */
|
||||
a->sign = 0;
|
||||
b->sign = 0;
|
||||
while( gcry_mpi_cmp_ui( b, 0 ) ) {
|
||||
_gcry_mpi_fdiv_r( g, a, b ); /* g used as temorary variable */
|
||||
mpi_set(a,b);
|
||||
mpi_set(b,g);
|
||||
}
|
||||
mpi_set(g, a);
|
||||
|
||||
mpi_free(a);
|
||||
mpi_free(b);
|
||||
return !gcry_mpi_cmp_ui( g, 1);
|
||||
}
|
||||
35
grub-core/lib/libgcrypt/mpi/mpi-inline.c
Normal file
35
grub-core/lib/libgcrypt/mpi/mpi-inline.c
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
/* mpi-inline.c
|
||||
* Copyright (C) 1999, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/* put the inline functions as real functions into the lib */
|
||||
#define G10_MPI_INLINE_DECL
|
||||
|
||||
#include "mpi-internal.h"
|
||||
|
||||
/* always include the header because it is only
|
||||
* included by mpi-internal if __GCC__ is defined but we
|
||||
* need it here in all cases and the above definition of
|
||||
* of the macro allows us to do so
|
||||
*/
|
||||
#include "mpi-inline.h"
|
||||
154
grub-core/lib/libgcrypt/mpi/mpi-inline.h
Normal file
154
grub-core/lib/libgcrypt/mpi/mpi-inline.h
Normal file
|
|
@ -0,0 +1,154 @@
|
|||
/* mpi-inline.h - Internal to the Multi Precision Integers
|
||||
* Copyright (C) 1994, 1996, 1998, 1999,
|
||||
* 2001, 2002 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
#ifndef G10_MPI_INLINE_H
|
||||
#define G10_MPI_INLINE_H
|
||||
|
||||
#ifndef G10_MPI_INLINE_DECL
|
||||
#define G10_MPI_INLINE_DECL extern __inline__
|
||||
#endif
|
||||
|
||||
G10_MPI_INLINE_DECL mpi_limb_t
|
||||
_gcry_mpih_add_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
|
||||
mpi_size_t s1_size, mpi_limb_t s2_limb)
|
||||
{
|
||||
mpi_limb_t x;
|
||||
|
||||
x = *s1_ptr++;
|
||||
s2_limb += x;
|
||||
*res_ptr++ = s2_limb;
|
||||
if( s2_limb < x ) { /* sum is less than the left operand: handle carry */
|
||||
while( --s1_size ) {
|
||||
x = *s1_ptr++ + 1; /* add carry */
|
||||
*res_ptr++ = x; /* and store */
|
||||
if( x ) /* not 0 (no overflow): we can stop */
|
||||
goto leave;
|
||||
}
|
||||
return 1; /* return carry (size of s1 to small) */
|
||||
}
|
||||
|
||||
leave:
|
||||
if( res_ptr != s1_ptr ) { /* not the same variable */
|
||||
mpi_size_t i; /* copy the rest */
|
||||
for( i=0; i < s1_size-1; i++ )
|
||||
res_ptr[i] = s1_ptr[i];
|
||||
}
|
||||
return 0; /* no carry */
|
||||
}
|
||||
|
||||
|
||||
|
||||
G10_MPI_INLINE_DECL mpi_limb_t
|
||||
_gcry_mpih_add(mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size,
|
||||
mpi_ptr_t s2_ptr, mpi_size_t s2_size)
|
||||
{
|
||||
mpi_limb_t cy = 0;
|
||||
|
||||
if( s2_size )
|
||||
cy = _gcry_mpih_add_n( res_ptr, s1_ptr, s2_ptr, s2_size );
|
||||
|
||||
if( s1_size - s2_size )
|
||||
cy = _gcry_mpih_add_1( res_ptr + s2_size, s1_ptr + s2_size,
|
||||
s1_size - s2_size, cy);
|
||||
return cy;
|
||||
}
|
||||
|
||||
|
||||
G10_MPI_INLINE_DECL mpi_limb_t
|
||||
_gcry_mpih_sub_1(mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
|
||||
mpi_size_t s1_size, mpi_limb_t s2_limb )
|
||||
{
|
||||
mpi_limb_t x;
|
||||
|
||||
x = *s1_ptr++;
|
||||
s2_limb = x - s2_limb;
|
||||
*res_ptr++ = s2_limb;
|
||||
if( s2_limb > x ) {
|
||||
while( --s1_size ) {
|
||||
x = *s1_ptr++;
|
||||
*res_ptr++ = x - 1;
|
||||
if( x )
|
||||
goto leave;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
leave:
|
||||
if( res_ptr != s1_ptr ) {
|
||||
mpi_size_t i;
|
||||
for( i=0; i < s1_size-1; i++ )
|
||||
res_ptr[i] = s1_ptr[i];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
G10_MPI_INLINE_DECL mpi_limb_t
|
||||
_gcry_mpih_sub( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size,
|
||||
mpi_ptr_t s2_ptr, mpi_size_t s2_size)
|
||||
{
|
||||
mpi_limb_t cy = 0;
|
||||
|
||||
if( s2_size )
|
||||
cy = _gcry_mpih_sub_n(res_ptr, s1_ptr, s2_ptr, s2_size);
|
||||
|
||||
if( s1_size - s2_size )
|
||||
cy = _gcry_mpih_sub_1(res_ptr + s2_size, s1_ptr + s2_size,
|
||||
s1_size - s2_size, cy);
|
||||
return cy;
|
||||
}
|
||||
|
||||
/****************
|
||||
* Compare OP1_PTR/OP1_SIZE with OP2_PTR/OP2_SIZE.
|
||||
* There are no restrictions on the relative sizes of
|
||||
* the two arguments.
|
||||
* Return 1 if OP1 > OP2, 0 if they are equal, and -1 if OP1 < OP2.
|
||||
*/
|
||||
G10_MPI_INLINE_DECL int
|
||||
_gcry_mpih_cmp( mpi_ptr_t op1_ptr, mpi_ptr_t op2_ptr, mpi_size_t size )
|
||||
{
|
||||
mpi_size_t i;
|
||||
mpi_limb_t op1_word, op2_word;
|
||||
|
||||
for( i = size - 1; i >= 0 ; i--) {
|
||||
op1_word = op1_ptr[i];
|
||||
op2_word = op2_ptr[i];
|
||||
if( op1_word != op2_word )
|
||||
goto diff;
|
||||
}
|
||||
return 0;
|
||||
|
||||
diff:
|
||||
/* This can *not* be simplified to
|
||||
* op2_word - op2_word
|
||||
* since that expression might give signed overflow. */
|
||||
return (op1_word > op2_word) ? 1 : -1;
|
||||
}
|
||||
|
||||
|
||||
#endif /*G10_MPI_INLINE_H*/
|
||||
277
grub-core/lib/libgcrypt/mpi/mpi-internal.h
Normal file
277
grub-core/lib/libgcrypt/mpi/mpi-internal.h
Normal file
|
|
@ -0,0 +1,277 @@
|
|||
/* mpi-internal.h - Internal to the Multi Precision Integers
|
||||
* Copyright (C) 1994, 1996, 1998, 2000, 2002,
|
||||
* 2003 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
#ifndef G10_MPI_INTERNAL_H
|
||||
#define G10_MPI_INTERNAL_H
|
||||
|
||||
#include "mpi-asm-defs.h"
|
||||
|
||||
#ifndef BITS_PER_MPI_LIMB
|
||||
#if BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_INT
|
||||
typedef unsigned int mpi_limb_t;
|
||||
typedef signed int mpi_limb_signed_t;
|
||||
#elif BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_LONG
|
||||
typedef unsigned long int mpi_limb_t;
|
||||
typedef signed long int mpi_limb_signed_t;
|
||||
#elif BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_LONG_LONG
|
||||
typedef unsigned long long int mpi_limb_t;
|
||||
typedef signed long long int mpi_limb_signed_t;
|
||||
#elif BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_SHORT
|
||||
typedef unsigned short int mpi_limb_t;
|
||||
typedef signed short int mpi_limb_signed_t;
|
||||
#else
|
||||
#error BYTES_PER_MPI_LIMB does not match any C type
|
||||
#endif
|
||||
#define BITS_PER_MPI_LIMB (8*BYTES_PER_MPI_LIMB)
|
||||
#endif /*BITS_PER_MPI_LIMB*/
|
||||
|
||||
#include "mpi.h"
|
||||
|
||||
/* If KARATSUBA_THRESHOLD is not already defined, define it to a
|
||||
* value which is good on most machines. */
|
||||
|
||||
/* tested 4, 16, 32 and 64, where 16 gave the best performance when
|
||||
* checking a 768 and a 1024 bit ElGamal signature.
|
||||
* (wk 22.12.97) */
|
||||
#ifndef KARATSUBA_THRESHOLD
|
||||
#define KARATSUBA_THRESHOLD 16
|
||||
#endif
|
||||
|
||||
/* The code can't handle KARATSUBA_THRESHOLD smaller than 2. */
|
||||
#if KARATSUBA_THRESHOLD < 2
|
||||
#undef KARATSUBA_THRESHOLD
|
||||
#define KARATSUBA_THRESHOLD 2
|
||||
#endif
|
||||
|
||||
|
||||
typedef mpi_limb_t *mpi_ptr_t; /* pointer to a limb */
|
||||
typedef int mpi_size_t; /* (must be a signed type) */
|
||||
|
||||
#define ABS(x) (x >= 0 ? x : -x)
|
||||
#define MIN(l,o) ((l) < (o) ? (l) : (o))
|
||||
#define MAX(h,i) ((h) > (i) ? (h) : (i))
|
||||
#define RESIZE_IF_NEEDED(a,b) \
|
||||
do { \
|
||||
if( (a)->alloced < (b) ) \
|
||||
mpi_resize((a), (b)); \
|
||||
} while(0)
|
||||
|
||||
/* Copy N limbs from S to D. */
|
||||
#define MPN_COPY( d, s, n) \
|
||||
do { \
|
||||
mpi_size_t _i; \
|
||||
for( _i = 0; _i < (n); _i++ ) \
|
||||
(d)[_i] = (s)[_i]; \
|
||||
} while(0)
|
||||
|
||||
#define MPN_COPY_INCR( d, s, n) \
|
||||
do { \
|
||||
mpi_size_t _i; \
|
||||
for( _i = 0; _i < (n); _i++ ) \
|
||||
(d)[_i] = (d)[_i]; \
|
||||
} while (0)
|
||||
|
||||
#define MPN_COPY_DECR( d, s, n ) \
|
||||
do { \
|
||||
mpi_size_t _i; \
|
||||
for( _i = (n)-1; _i >= 0; _i--) \
|
||||
(d)[_i] = (s)[_i]; \
|
||||
} while(0)
|
||||
|
||||
/* Zero N limbs at D */
|
||||
#define MPN_ZERO(d, n) \
|
||||
do { \
|
||||
int _i; \
|
||||
for( _i = 0; _i < (n); _i++ ) \
|
||||
(d)[_i] = 0; \
|
||||
} while (0)
|
||||
|
||||
#define MPN_NORMALIZE(d, n) \
|
||||
do { \
|
||||
while( (n) > 0 ) { \
|
||||
if( (d)[(n)-1] ) \
|
||||
break; \
|
||||
(n)--; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define MPN_NORMALIZE_NOT_ZERO(d, n) \
|
||||
do { \
|
||||
for(;;) { \
|
||||
if( (d)[(n)-1] ) \
|
||||
break; \
|
||||
(n)--; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define MPN_MUL_N_RECURSE(prodp, up, vp, size, tspace) \
|
||||
do { \
|
||||
if( (size) < KARATSUBA_THRESHOLD ) \
|
||||
mul_n_basecase (prodp, up, vp, size); \
|
||||
else \
|
||||
mul_n (prodp, up, vp, size, tspace); \
|
||||
} while (0);
|
||||
|
||||
|
||||
/* Divide the two-limb number in (NH,,NL) by D, with DI being the largest
|
||||
* limb not larger than (2**(2*BITS_PER_MP_LIMB))/D - (2**BITS_PER_MP_LIMB).
|
||||
* If this would yield overflow, DI should be the largest possible number
|
||||
* (i.e., only ones). For correct operation, the most significant bit of D
|
||||
* has to be set. Put the quotient in Q and the remainder in R.
|
||||
*/
|
||||
#define UDIV_QRNND_PREINV(q, r, nh, nl, d, di) \
|
||||
do { \
|
||||
mpi_limb_t _q, _ql, _r; \
|
||||
mpi_limb_t _xh, _xl; \
|
||||
umul_ppmm (_q, _ql, (nh), (di)); \
|
||||
_q += (nh); /* DI is 2**BITS_PER_MPI_LIMB too small */ \
|
||||
umul_ppmm (_xh, _xl, _q, (d)); \
|
||||
sub_ddmmss (_xh, _r, (nh), (nl), _xh, _xl); \
|
||||
if( _xh ) { \
|
||||
sub_ddmmss (_xh, _r, _xh, _r, 0, (d)); \
|
||||
_q++; \
|
||||
if( _xh) { \
|
||||
sub_ddmmss (_xh, _r, _xh, _r, 0, (d)); \
|
||||
_q++; \
|
||||
} \
|
||||
} \
|
||||
if( _r >= (d) ) { \
|
||||
_r -= (d); \
|
||||
_q++; \
|
||||
} \
|
||||
(r) = _r; \
|
||||
(q) = _q; \
|
||||
} while (0)
|
||||
|
||||
|
||||
/*-- mpiutil.c --*/
|
||||
#define mpi_alloc_limb_space(n,f) _gcry_mpi_alloc_limb_space((n),(f))
|
||||
mpi_ptr_t _gcry_mpi_alloc_limb_space( unsigned nlimbs, int sec );
|
||||
void _gcry_mpi_free_limb_space( mpi_ptr_t a, unsigned int nlimbs );
|
||||
void _gcry_mpi_assign_limb_space( gcry_mpi_t a, mpi_ptr_t ap, unsigned nlimbs );
|
||||
|
||||
/*-- mpi-bit.c --*/
|
||||
#define mpi_rshift_limbs(a,n) _gcry_mpi_rshift_limbs ((a), (n))
|
||||
#define mpi_lshift_limbs(a,n) _gcry_mpi_lshift_limbs ((a), (n))
|
||||
|
||||
void _gcry_mpi_rshift_limbs( gcry_mpi_t a, unsigned int count );
|
||||
void _gcry_mpi_lshift_limbs( gcry_mpi_t a, unsigned int count );
|
||||
|
||||
|
||||
/*-- mpih-add.c --*/
|
||||
mpi_limb_t _gcry_mpih_add_1(mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
|
||||
mpi_size_t s1_size, mpi_limb_t s2_limb );
|
||||
mpi_limb_t _gcry_mpih_add_n( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
|
||||
mpi_ptr_t s2_ptr, mpi_size_t size);
|
||||
mpi_limb_t _gcry_mpih_add(mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size,
|
||||
mpi_ptr_t s2_ptr, mpi_size_t s2_size);
|
||||
|
||||
/*-- mpih-sub.c --*/
|
||||
mpi_limb_t _gcry_mpih_sub_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
|
||||
mpi_size_t s1_size, mpi_limb_t s2_limb );
|
||||
mpi_limb_t _gcry_mpih_sub_n( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
|
||||
mpi_ptr_t s2_ptr, mpi_size_t size);
|
||||
mpi_limb_t _gcry_mpih_sub(mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size,
|
||||
mpi_ptr_t s2_ptr, mpi_size_t s2_size);
|
||||
|
||||
/*-- mpih-cmp.c --*/
|
||||
int _gcry_mpih_cmp( mpi_ptr_t op1_ptr, mpi_ptr_t op2_ptr, mpi_size_t size );
|
||||
|
||||
/*-- mpih-mul.c --*/
|
||||
|
||||
struct karatsuba_ctx {
|
||||
struct karatsuba_ctx *next;
|
||||
mpi_ptr_t tspace;
|
||||
unsigned int tspace_nlimbs;
|
||||
mpi_size_t tspace_size;
|
||||
mpi_ptr_t tp;
|
||||
unsigned int tp_nlimbs;
|
||||
mpi_size_t tp_size;
|
||||
};
|
||||
|
||||
void _gcry_mpih_release_karatsuba_ctx( struct karatsuba_ctx *ctx );
|
||||
|
||||
mpi_limb_t _gcry_mpih_addmul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
|
||||
mpi_size_t s1_size, mpi_limb_t s2_limb);
|
||||
mpi_limb_t _gcry_mpih_submul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
|
||||
mpi_size_t s1_size, mpi_limb_t s2_limb);
|
||||
void _gcry_mpih_mul_n( mpi_ptr_t prodp, mpi_ptr_t up, mpi_ptr_t vp,
|
||||
mpi_size_t size);
|
||||
mpi_limb_t _gcry_mpih_mul( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t usize,
|
||||
mpi_ptr_t vp, mpi_size_t vsize);
|
||||
void _gcry_mpih_sqr_n_basecase( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t size );
|
||||
void _gcry_mpih_sqr_n( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t size,
|
||||
mpi_ptr_t tspace);
|
||||
|
||||
void _gcry_mpih_mul_karatsuba_case( mpi_ptr_t prodp,
|
||||
mpi_ptr_t up, mpi_size_t usize,
|
||||
mpi_ptr_t vp, mpi_size_t vsize,
|
||||
struct karatsuba_ctx *ctx );
|
||||
|
||||
|
||||
/*-- mpih-mul_1.c (or xxx/cpu/ *.S) --*/
|
||||
mpi_limb_t _gcry_mpih_mul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
|
||||
mpi_size_t s1_size, mpi_limb_t s2_limb);
|
||||
|
||||
/*-- mpih-div.c --*/
|
||||
mpi_limb_t _gcry_mpih_mod_1(mpi_ptr_t dividend_ptr, mpi_size_t dividend_size,
|
||||
mpi_limb_t divisor_limb);
|
||||
mpi_limb_t _gcry_mpih_divrem( mpi_ptr_t qp, mpi_size_t qextra_limbs,
|
||||
mpi_ptr_t np, mpi_size_t nsize,
|
||||
mpi_ptr_t dp, mpi_size_t dsize);
|
||||
mpi_limb_t _gcry_mpih_divmod_1( mpi_ptr_t quot_ptr,
|
||||
mpi_ptr_t dividend_ptr, mpi_size_t dividend_size,
|
||||
mpi_limb_t divisor_limb);
|
||||
|
||||
/*-- mpih-shift.c --*/
|
||||
mpi_limb_t _gcry_mpih_lshift( mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize,
|
||||
unsigned cnt);
|
||||
mpi_limb_t _gcry_mpih_rshift( mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize,
|
||||
unsigned cnt);
|
||||
|
||||
|
||||
/* Define stuff for longlong.h. */
|
||||
#define W_TYPE_SIZE BITS_PER_MPI_LIMB
|
||||
typedef mpi_limb_t UWtype;
|
||||
typedef unsigned int UHWtype;
|
||||
#if defined (__GNUC__)
|
||||
typedef unsigned int UQItype __attribute__ ((mode (QI)));
|
||||
typedef int SItype __attribute__ ((mode (SI)));
|
||||
typedef unsigned int USItype __attribute__ ((mode (SI)));
|
||||
typedef int DItype __attribute__ ((mode (DI)));
|
||||
typedef unsigned int UDItype __attribute__ ((mode (DI)));
|
||||
#else
|
||||
typedef unsigned char UQItype;
|
||||
typedef long SItype;
|
||||
typedef unsigned long USItype;
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#include "mpi-inline.h"
|
||||
#endif
|
||||
|
||||
#endif /*G10_MPI_INTERNAL_H*/
|
||||
267
grub-core/lib/libgcrypt/mpi/mpi-inv.c
Normal file
267
grub-core/lib/libgcrypt/mpi/mpi-inv.c
Normal file
|
|
@ -0,0 +1,267 @@
|
|||
/* mpi-inv.c - MPI functions
|
||||
* Copyright (C) 1998, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "mpi-internal.h"
|
||||
#include "g10lib.h"
|
||||
|
||||
/****************
|
||||
* Calculate the multiplicative inverse X of A mod N
|
||||
* That is: Find the solution x for
|
||||
* 1 = (a*x) mod n
|
||||
*/
|
||||
int
|
||||
gcry_mpi_invm( gcry_mpi_t x, gcry_mpi_t a, gcry_mpi_t n )
|
||||
{
|
||||
#if 0
|
||||
gcry_mpi_t u, v, u1, u2, u3, v1, v2, v3, q, t1, t2, t3;
|
||||
gcry_mpi_t ta, tb, tc;
|
||||
|
||||
u = mpi_copy(a);
|
||||
v = mpi_copy(n);
|
||||
u1 = mpi_alloc_set_ui(1);
|
||||
u2 = mpi_alloc_set_ui(0);
|
||||
u3 = mpi_copy(u);
|
||||
v1 = mpi_alloc_set_ui(0);
|
||||
v2 = mpi_alloc_set_ui(1);
|
||||
v3 = mpi_copy(v);
|
||||
q = mpi_alloc( mpi_get_nlimbs(u)+1 );
|
||||
t1 = mpi_alloc( mpi_get_nlimbs(u)+1 );
|
||||
t2 = mpi_alloc( mpi_get_nlimbs(u)+1 );
|
||||
t3 = mpi_alloc( mpi_get_nlimbs(u)+1 );
|
||||
while( mpi_cmp_ui( v3, 0 ) ) {
|
||||
mpi_fdiv_q( q, u3, v3 );
|
||||
mpi_mul(t1, v1, q); mpi_mul(t2, v2, q); mpi_mul(t3, v3, q);
|
||||
mpi_sub(t1, u1, t1); mpi_sub(t2, u2, t2); mpi_sub(t3, u3, t3);
|
||||
mpi_set(u1, v1); mpi_set(u2, v2); mpi_set(u3, v3);
|
||||
mpi_set(v1, t1); mpi_set(v2, t2); mpi_set(v3, t3);
|
||||
}
|
||||
/* log_debug("result:\n");
|
||||
log_mpidump("q =", q );
|
||||
log_mpidump("u1=", u1);
|
||||
log_mpidump("u2=", u2);
|
||||
log_mpidump("u3=", u3);
|
||||
log_mpidump("v1=", v1);
|
||||
log_mpidump("v2=", v2); */
|
||||
mpi_set(x, u1);
|
||||
|
||||
mpi_free(u1);
|
||||
mpi_free(u2);
|
||||
mpi_free(u3);
|
||||
mpi_free(v1);
|
||||
mpi_free(v2);
|
||||
mpi_free(v3);
|
||||
mpi_free(q);
|
||||
mpi_free(t1);
|
||||
mpi_free(t2);
|
||||
mpi_free(t3);
|
||||
mpi_free(u);
|
||||
mpi_free(v);
|
||||
#elif 0
|
||||
/* Extended Euclid's algorithm (See TAOCP Vol II, 4.5.2, Alg X)
|
||||
* modified according to Michael Penk's solution for Exercise 35 */
|
||||
|
||||
/* FIXME: we can simplify this in most cases (see Knuth) */
|
||||
gcry_mpi_t u, v, u1, u2, u3, v1, v2, v3, t1, t2, t3;
|
||||
unsigned k;
|
||||
int sign;
|
||||
|
||||
u = mpi_copy(a);
|
||||
v = mpi_copy(n);
|
||||
for(k=0; !mpi_test_bit(u,0) && !mpi_test_bit(v,0); k++ ) {
|
||||
mpi_rshift(u, u, 1);
|
||||
mpi_rshift(v, v, 1);
|
||||
}
|
||||
|
||||
|
||||
u1 = mpi_alloc_set_ui(1);
|
||||
u2 = mpi_alloc_set_ui(0);
|
||||
u3 = mpi_copy(u);
|
||||
v1 = mpi_copy(v); /* !-- used as const 1 */
|
||||
v2 = mpi_alloc( mpi_get_nlimbs(u) ); mpi_sub( v2, u1, u );
|
||||
v3 = mpi_copy(v);
|
||||
if( mpi_test_bit(u, 0) ) { /* u is odd */
|
||||
t1 = mpi_alloc_set_ui(0);
|
||||
t2 = mpi_alloc_set_ui(1); t2->sign = 1;
|
||||
t3 = mpi_copy(v); t3->sign = !t3->sign;
|
||||
goto Y4;
|
||||
}
|
||||
else {
|
||||
t1 = mpi_alloc_set_ui(1);
|
||||
t2 = mpi_alloc_set_ui(0);
|
||||
t3 = mpi_copy(u);
|
||||
}
|
||||
do {
|
||||
do {
|
||||
if( mpi_test_bit(t1, 0) || mpi_test_bit(t2, 0) ) { /* one is odd */
|
||||
mpi_add(t1, t1, v);
|
||||
mpi_sub(t2, t2, u);
|
||||
}
|
||||
mpi_rshift(t1, t1, 1);
|
||||
mpi_rshift(t2, t2, 1);
|
||||
mpi_rshift(t3, t3, 1);
|
||||
Y4:
|
||||
;
|
||||
} while( !mpi_test_bit( t3, 0 ) ); /* while t3 is even */
|
||||
|
||||
if( !t3->sign ) {
|
||||
mpi_set(u1, t1);
|
||||
mpi_set(u2, t2);
|
||||
mpi_set(u3, t3);
|
||||
}
|
||||
else {
|
||||
mpi_sub(v1, v, t1);
|
||||
sign = u->sign; u->sign = !u->sign;
|
||||
mpi_sub(v2, u, t2);
|
||||
u->sign = sign;
|
||||
sign = t3->sign; t3->sign = !t3->sign;
|
||||
mpi_set(v3, t3);
|
||||
t3->sign = sign;
|
||||
}
|
||||
mpi_sub(t1, u1, v1);
|
||||
mpi_sub(t2, u2, v2);
|
||||
mpi_sub(t3, u3, v3);
|
||||
if( t1->sign ) {
|
||||
mpi_add(t1, t1, v);
|
||||
mpi_sub(t2, t2, u);
|
||||
}
|
||||
} while( mpi_cmp_ui( t3, 0 ) ); /* while t3 != 0 */
|
||||
/* mpi_lshift( u3, k ); */
|
||||
mpi_set(x, u1);
|
||||
|
||||
mpi_free(u1);
|
||||
mpi_free(u2);
|
||||
mpi_free(u3);
|
||||
mpi_free(v1);
|
||||
mpi_free(v2);
|
||||
mpi_free(v3);
|
||||
mpi_free(t1);
|
||||
mpi_free(t2);
|
||||
mpi_free(t3);
|
||||
#else
|
||||
/* Extended Euclid's algorithm (See TAOCP Vol II, 4.5.2, Alg X)
|
||||
* modified according to Michael Penk's solution for Exercise 35
|
||||
* with further enhancement */
|
||||
gcry_mpi_t u, v, u1, u2=NULL, u3, v1, v2=NULL, v3, t1, t2=NULL, t3;
|
||||
unsigned k;
|
||||
int sign;
|
||||
int odd ;
|
||||
|
||||
u = mpi_copy(a);
|
||||
v = mpi_copy(n);
|
||||
|
||||
for(k=0; !mpi_test_bit(u,0) && !mpi_test_bit(v,0); k++ ) {
|
||||
mpi_rshift(u, u, 1);
|
||||
mpi_rshift(v, v, 1);
|
||||
}
|
||||
odd = mpi_test_bit(v,0);
|
||||
|
||||
u1 = mpi_alloc_set_ui(1);
|
||||
if( !odd )
|
||||
u2 = mpi_alloc_set_ui(0);
|
||||
u3 = mpi_copy(u);
|
||||
v1 = mpi_copy(v);
|
||||
if( !odd ) {
|
||||
v2 = mpi_alloc( mpi_get_nlimbs(u) );
|
||||
mpi_sub( v2, u1, u ); /* U is used as const 1 */
|
||||
}
|
||||
v3 = mpi_copy(v);
|
||||
if( mpi_test_bit(u, 0) ) { /* u is odd */
|
||||
t1 = mpi_alloc_set_ui(0);
|
||||
if( !odd ) {
|
||||
t2 = mpi_alloc_set_ui(1); t2->sign = 1;
|
||||
}
|
||||
t3 = mpi_copy(v); t3->sign = !t3->sign;
|
||||
goto Y4;
|
||||
}
|
||||
else {
|
||||
t1 = mpi_alloc_set_ui(1);
|
||||
if( !odd )
|
||||
t2 = mpi_alloc_set_ui(0);
|
||||
t3 = mpi_copy(u);
|
||||
}
|
||||
do {
|
||||
do {
|
||||
if( !odd ) {
|
||||
if( mpi_test_bit(t1, 0) || mpi_test_bit(t2, 0) ) { /* one is odd */
|
||||
mpi_add(t1, t1, v);
|
||||
mpi_sub(t2, t2, u);
|
||||
}
|
||||
mpi_rshift(t1, t1, 1);
|
||||
mpi_rshift(t2, t2, 1);
|
||||
mpi_rshift(t3, t3, 1);
|
||||
}
|
||||
else {
|
||||
if( mpi_test_bit(t1, 0) )
|
||||
mpi_add(t1, t1, v);
|
||||
mpi_rshift(t1, t1, 1);
|
||||
mpi_rshift(t3, t3, 1);
|
||||
}
|
||||
Y4:
|
||||
;
|
||||
} while( !mpi_test_bit( t3, 0 ) ); /* while t3 is even */
|
||||
|
||||
if( !t3->sign ) {
|
||||
mpi_set(u1, t1);
|
||||
if( !odd )
|
||||
mpi_set(u2, t2);
|
||||
mpi_set(u3, t3);
|
||||
}
|
||||
else {
|
||||
mpi_sub(v1, v, t1);
|
||||
sign = u->sign; u->sign = !u->sign;
|
||||
if( !odd )
|
||||
mpi_sub(v2, u, t2);
|
||||
u->sign = sign;
|
||||
sign = t3->sign; t3->sign = !t3->sign;
|
||||
mpi_set(v3, t3);
|
||||
t3->sign = sign;
|
||||
}
|
||||
mpi_sub(t1, u1, v1);
|
||||
if( !odd )
|
||||
mpi_sub(t2, u2, v2);
|
||||
mpi_sub(t3, u3, v3);
|
||||
if( t1->sign ) {
|
||||
mpi_add(t1, t1, v);
|
||||
if( !odd )
|
||||
mpi_sub(t2, t2, u);
|
||||
}
|
||||
} while( mpi_cmp_ui( t3, 0 ) ); /* while t3 != 0 */
|
||||
/* mpi_lshift( u3, k ); */
|
||||
mpi_set(x, u1);
|
||||
|
||||
mpi_free(u1);
|
||||
mpi_free(v1);
|
||||
mpi_free(t1);
|
||||
if( !odd ) {
|
||||
mpi_free(u2);
|
||||
mpi_free(v2);
|
||||
mpi_free(t2);
|
||||
}
|
||||
mpi_free(u3);
|
||||
mpi_free(v3);
|
||||
mpi_free(t3);
|
||||
|
||||
mpi_free(u);
|
||||
mpi_free(v);
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
184
grub-core/lib/libgcrypt/mpi/mpi-mod.c
Normal file
184
grub-core/lib/libgcrypt/mpi/mpi-mod.c
Normal file
|
|
@ -0,0 +1,184 @@
|
|||
/* mpi-mod.c - Modular reduction
|
||||
Copyright (C) 1998, 1999, 2001, 2002, 2003,
|
||||
2007 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of Libgcrypt.
|
||||
|
||||
Libgcrypt is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as
|
||||
published by the Free Software Foundation; either version 2.1 of
|
||||
the License, or (at your option) any later version.
|
||||
|
||||
Libgcrypt is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||||
USA. */
|
||||
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "mpi-internal.h"
|
||||
#include "longlong.h"
|
||||
#include "g10lib.h"
|
||||
|
||||
|
||||
/* Context used with Barrett reduction. */
|
||||
struct barrett_ctx_s
|
||||
{
|
||||
gcry_mpi_t m; /* The modulus - may not be modified. */
|
||||
int m_copied; /* If true, M needs to be released. */
|
||||
int k;
|
||||
gcry_mpi_t y;
|
||||
gcry_mpi_t r1; /* Helper MPI. */
|
||||
gcry_mpi_t r2; /* Helper MPI. */
|
||||
gcry_mpi_t r3; /* Helper MPI allocated on demand. */
|
||||
};
|
||||
|
||||
|
||||
|
||||
void
|
||||
_gcry_mpi_mod (gcry_mpi_t rem, gcry_mpi_t dividend, gcry_mpi_t divisor)
|
||||
{
|
||||
_gcry_mpi_fdiv_r (rem, dividend, divisor);
|
||||
rem->sign = 0;
|
||||
}
|
||||
|
||||
|
||||
/* This function returns a new context for Barrett based operations on
|
||||
the modulus M. This context needs to be released using
|
||||
_gcry_mpi_barrett_free. If COPY is true M will be transferred to
|
||||
the context and the user may change M. If COPY is false, M may not
|
||||
be changed until gcry_mpi_barrett_free has been called. */
|
||||
mpi_barrett_t
|
||||
_gcry_mpi_barrett_init (gcry_mpi_t m, int copy)
|
||||
{
|
||||
mpi_barrett_t ctx;
|
||||
gcry_mpi_t tmp;
|
||||
|
||||
mpi_normalize (m);
|
||||
ctx = gcry_xcalloc (1, sizeof *ctx);
|
||||
|
||||
if (copy)
|
||||
{
|
||||
ctx->m = mpi_copy (m);
|
||||
ctx->m_copied = 1;
|
||||
}
|
||||
else
|
||||
ctx->m = m;
|
||||
|
||||
ctx->k = mpi_get_nlimbs (m);
|
||||
tmp = mpi_alloc (ctx->k + 1);
|
||||
|
||||
/* Barrett precalculation: y = floor(b^(2k) / m). */
|
||||
mpi_set_ui (tmp, 1);
|
||||
mpi_lshift_limbs (tmp, 2 * ctx->k);
|
||||
mpi_fdiv_q (tmp, tmp, m);
|
||||
|
||||
ctx->y = tmp;
|
||||
ctx->r1 = mpi_alloc ( 2 * ctx->k + 1 );
|
||||
ctx->r2 = mpi_alloc ( 2 * ctx->k + 1 );
|
||||
|
||||
return ctx;
|
||||
}
|
||||
|
||||
void
|
||||
_gcry_mpi_barrett_free (mpi_barrett_t ctx)
|
||||
{
|
||||
if (ctx)
|
||||
{
|
||||
mpi_free (ctx->y);
|
||||
mpi_free (ctx->r1);
|
||||
mpi_free (ctx->r2);
|
||||
if (ctx->r3)
|
||||
mpi_free (ctx->r3);
|
||||
if (ctx->m_copied)
|
||||
mpi_free (ctx->m);
|
||||
gcry_free (ctx);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* R = X mod M
|
||||
|
||||
Using Barrett reduction. Before using this function
|
||||
_gcry_mpi_barrett_init must have been called to do the
|
||||
precalculations. CTX is the context created by this precalculation
|
||||
and also conveys M. If the Barret reduction could no be done a
|
||||
starightforward reduction method is used.
|
||||
|
||||
We assume that these conditions are met:
|
||||
Input: x =(x_2k-1 ...x_0)_b
|
||||
m =(m_k-1 ....m_0)_b with m_k-1 != 0
|
||||
Output: r = x mod m
|
||||
*/
|
||||
void
|
||||
_gcry_mpi_mod_barrett (gcry_mpi_t r, gcry_mpi_t x, mpi_barrett_t ctx)
|
||||
{
|
||||
gcry_mpi_t m = ctx->m;
|
||||
int k = ctx->k;
|
||||
gcry_mpi_t y = ctx->y;
|
||||
gcry_mpi_t r1 = ctx->r1;
|
||||
gcry_mpi_t r2 = ctx->r2;
|
||||
|
||||
mpi_normalize (x);
|
||||
if (mpi_get_nlimbs (x) > 2*k )
|
||||
{
|
||||
mpi_mod (r, x, m);
|
||||
return;
|
||||
}
|
||||
|
||||
/* 1. q1 = floor( x / b^k-1)
|
||||
* q2 = q1 * y
|
||||
* q3 = floor( q2 / b^k+1 )
|
||||
* Actually, we don't need qx, we can work direct on r2
|
||||
*/
|
||||
mpi_set ( r2, x );
|
||||
mpi_rshift_limbs ( r2, k-1 );
|
||||
mpi_mul ( r2, r2, y );
|
||||
mpi_rshift_limbs ( r2, k+1 );
|
||||
|
||||
/* 2. r1 = x mod b^k+1
|
||||
* r2 = q3 * m mod b^k+1
|
||||
* r = r1 - r2
|
||||
* 3. if r < 0 then r = r + b^k+1
|
||||
*/
|
||||
mpi_set ( r1, x );
|
||||
if ( r1->nlimbs > k+1 ) /* Quick modulo operation. */
|
||||
r1->nlimbs = k+1;
|
||||
mpi_mul ( r2, r2, m );
|
||||
if ( r2->nlimbs > k+1 ) /* Quick modulo operation. */
|
||||
r2->nlimbs = k+1;
|
||||
mpi_sub ( r, r1, r2 );
|
||||
|
||||
if ( mpi_is_neg( r ) )
|
||||
{
|
||||
if (!ctx->r3)
|
||||
{
|
||||
ctx->r3 = mpi_alloc ( k + 2 );
|
||||
mpi_set_ui (ctx->r3, 1);
|
||||
mpi_lshift_limbs (ctx->r3, k + 1 );
|
||||
}
|
||||
mpi_add ( r, r, ctx->r3 );
|
||||
}
|
||||
|
||||
/* 4. while r >= m do r = r - m */
|
||||
while ( mpi_cmp( r, m ) >= 0 )
|
||||
mpi_sub ( r, r, m );
|
||||
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_gcry_mpi_mul_barrett (gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v,
|
||||
mpi_barrett_t ctx)
|
||||
{
|
||||
gcry_mpi_mul (w, u, v);
|
||||
mpi_mod_barrett (w, w, ctx);
|
||||
}
|
||||
223
grub-core/lib/libgcrypt/mpi/mpi-mpow.c
Normal file
223
grub-core/lib/libgcrypt/mpi/mpi-mpow.c
Normal file
|
|
@ -0,0 +1,223 @@
|
|||
/* mpi-mpow.c - MPI functions
|
||||
* Copyright (C) 1998, 1999, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "mpi-internal.h"
|
||||
#include "longlong.h"
|
||||
#include "g10lib.h"
|
||||
|
||||
|
||||
/* Barrett is slower than the classical way. It can be tweaked by
|
||||
* using partial multiplications
|
||||
*/
|
||||
/*#define USE_BARRETT*/
|
||||
|
||||
|
||||
|
||||
#ifdef USE_BARRETT
|
||||
static void barrett_mulm( gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, gcry_mpi_t m, gcry_mpi_t y, int k, gcry_mpi_t r1, gcry_mpi_t r2 );
|
||||
static gcry_mpi_t init_barrett( gcry_mpi_t m, int *k, gcry_mpi_t *r1, gcry_mpi_t *r2 );
|
||||
static int calc_barrett( gcry_mpi_t r, gcry_mpi_t x, gcry_mpi_t m, gcry_mpi_t y, int k, gcry_mpi_t r1, gcry_mpi_t r2 );
|
||||
#else
|
||||
#define barrett_mulm( w, u, v, m, y, k, r1, r2 ) gcry_mpi_mulm( (w), (u), (v), (m) )
|
||||
#endif
|
||||
|
||||
|
||||
static int
|
||||
build_index( gcry_mpi_t *exparray, int k, int i, int t )
|
||||
{
|
||||
int j, bitno;
|
||||
int idx = 0;
|
||||
|
||||
bitno = t-i;
|
||||
for(j=k-1; j >= 0; j-- ) {
|
||||
idx <<= 1;
|
||||
if( mpi_test_bit( exparray[j], bitno ) )
|
||||
idx |= 1;
|
||||
}
|
||||
/*log_debug("t=%d i=%d idx=%d\n", t, i, idx );*/
|
||||
return idx;
|
||||
}
|
||||
|
||||
/****************
|
||||
* RES = (BASE[0] ^ EXP[0]) * (BASE[1] ^ EXP[1]) * ... * mod M
|
||||
*/
|
||||
void
|
||||
_gcry_mpi_mulpowm( gcry_mpi_t res, gcry_mpi_t *basearray, gcry_mpi_t *exparray, gcry_mpi_t m)
|
||||
{
|
||||
int k; /* number of elements */
|
||||
int t; /* bit size of largest exponent */
|
||||
int i, j, idx;
|
||||
gcry_mpi_t *G; /* table with precomputed values of size 2^k */
|
||||
gcry_mpi_t tmp;
|
||||
#ifdef USE_BARRETT
|
||||
gcry_mpi_t barrett_y, barrett_r1, barrett_r2;
|
||||
int barrett_k;
|
||||
#endif
|
||||
|
||||
for(k=0; basearray[k]; k++ )
|
||||
;
|
||||
gcry_assert(k);
|
||||
for(t=0, i=0; (tmp=exparray[i]); i++ ) {
|
||||
/*log_mpidump("exp: ", tmp );*/
|
||||
j = mpi_get_nbits(tmp);
|
||||
if( j > t )
|
||||
t = j;
|
||||
}
|
||||
/*log_mpidump("mod: ", m );*/
|
||||
gcry_assert (i==k);
|
||||
gcry_assert (t);
|
||||
gcry_assert (k < 10);
|
||||
|
||||
G = gcry_xcalloc( (1<<k) , sizeof *G );
|
||||
#ifdef USE_BARRETT
|
||||
barrett_y = init_barrett( m, &barrett_k, &barrett_r1, &barrett_r2 );
|
||||
#endif
|
||||
/* and calculate */
|
||||
tmp = mpi_alloc( mpi_get_nlimbs(m)+1 );
|
||||
mpi_set_ui( res, 1 );
|
||||
for(i = 1; i <= t; i++ ) {
|
||||
barrett_mulm(tmp, res, res, m, barrett_y, barrett_k,
|
||||
barrett_r1, barrett_r2 );
|
||||
idx = build_index( exparray, k, i, t );
|
||||
gcry_assert (idx >= 0 && idx < (1<<k));
|
||||
if( !G[idx] ) {
|
||||
if( !idx )
|
||||
G[0] = mpi_alloc_set_ui( 1 );
|
||||
else {
|
||||
for(j=0; j < k; j++ ) {
|
||||
if( (idx & (1<<j) ) ) {
|
||||
if( !G[idx] )
|
||||
G[idx] = mpi_copy( basearray[j] );
|
||||
else
|
||||
barrett_mulm( G[idx], G[idx], basearray[j],
|
||||
m, barrett_y, barrett_k, barrett_r1, barrett_r2 );
|
||||
}
|
||||
}
|
||||
if( !G[idx] )
|
||||
G[idx] = mpi_alloc(0);
|
||||
}
|
||||
}
|
||||
barrett_mulm(res, tmp, G[idx], m, barrett_y, barrett_k, barrett_r1, barrett_r2 );
|
||||
}
|
||||
|
||||
/* cleanup */
|
||||
mpi_free(tmp);
|
||||
#ifdef USE_BARRETT
|
||||
mpi_free(barrett_y);
|
||||
mpi_free(barrett_r1);
|
||||
mpi_free(barrett_r2);
|
||||
#endif
|
||||
for(i=0; i < (1<<k); i++ )
|
||||
mpi_free(G[i]);
|
||||
gcry_free(G);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef USE_BARRETT
|
||||
static void
|
||||
barrett_mulm( gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, gcry_mpi_t m, gcry_mpi_t y, int k, gcry_mpi_t r1, gcry_mpi_t r2 )
|
||||
{
|
||||
mpi_mul(w, u, v);
|
||||
if( calc_barrett( w, w, m, y, k, r1, r2 ) )
|
||||
mpi_fdiv_r( w, w, m );
|
||||
}
|
||||
|
||||
/****************
|
||||
* Barrett precalculation: y = floor(b^(2k) / m)
|
||||
*/
|
||||
static gcry_mpi_t
|
||||
init_barrett( gcry_mpi_t m, int *k, gcry_mpi_t *r1, gcry_mpi_t *r2 )
|
||||
{
|
||||
gcry_mpi_t tmp;
|
||||
|
||||
mpi_normalize( m );
|
||||
*k = mpi_get_nlimbs( m );
|
||||
tmp = mpi_alloc( *k + 1 );
|
||||
mpi_set_ui( tmp, 1 );
|
||||
mpi_lshift_limbs( tmp, 2 * *k );
|
||||
mpi_fdiv_q( tmp, tmp, m );
|
||||
*r1 = mpi_alloc( 2* *k + 1 );
|
||||
*r2 = mpi_alloc( 2* *k + 1 );
|
||||
return tmp;
|
||||
}
|
||||
|
||||
/****************
|
||||
* Barrett reduction: We assume that these conditions are met:
|
||||
* Given x =(x_2k-1 ...x_0)_b
|
||||
* m =(m_k-1 ....m_0)_b with m_k-1 != 0
|
||||
* Output r = x mod m
|
||||
* Before using this function init_barret must be used to calucalte y and k.
|
||||
* Returns: false = no error
|
||||
* true = can't perform barret reduction
|
||||
*/
|
||||
static int
|
||||
calc_barrett( gcry_mpi_t r, gcry_mpi_t x, gcry_mpi_t m, gcry_mpi_t y, int k, gcry_mpi_t r1, gcry_mpi_t r2 )
|
||||
{
|
||||
int xx = k > 3 ? k-3:0;
|
||||
|
||||
mpi_normalize( x );
|
||||
if( mpi_get_nlimbs(x) > 2*k )
|
||||
return 1; /* can't do it */
|
||||
|
||||
/* 1. q1 = floor( x / b^k-1)
|
||||
* q2 = q1 * y
|
||||
* q3 = floor( q2 / b^k+1 )
|
||||
* Actually, we don't need qx, we can work direct on r2
|
||||
*/
|
||||
mpi_set( r2, x );
|
||||
mpi_rshift_limbs( r2, k-1 );
|
||||
mpi_mul( r2, r2, y );
|
||||
mpi_rshift_limbs( r2, k+1 );
|
||||
|
||||
/* 2. r1 = x mod b^k+1
|
||||
* r2 = q3 * m mod b^k+1
|
||||
* r = r1 - r2
|
||||
* 3. if r < 0 then r = r + b^k+1
|
||||
*/
|
||||
mpi_set( r1, x );
|
||||
if( r1->nlimbs > k+1 ) /* quick modulo operation */
|
||||
r1->nlimbs = k+1;
|
||||
mpi_mul( r2, r2, m );
|
||||
if( r2->nlimbs > k+1 ) /* quick modulo operation */
|
||||
r2->nlimbs = k+1;
|
||||
mpi_sub( r, r1, r2 );
|
||||
|
||||
if( mpi_is_neg( r ) ) {
|
||||
gcry_mpi_t tmp;
|
||||
|
||||
tmp = mpi_alloc( k + 2 );
|
||||
mpi_set_ui( tmp, 1 );
|
||||
mpi_lshift_limbs( tmp, k+1 );
|
||||
mpi_add( r, r, tmp );
|
||||
mpi_free(tmp);
|
||||
}
|
||||
|
||||
/* 4. while r >= m do r = r - m */
|
||||
while( mpi_cmp( r, m ) >= 0 )
|
||||
mpi_sub( r, r, m );
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* USE_BARRETT */
|
||||
212
grub-core/lib/libgcrypt/mpi/mpi-mul.c
Normal file
212
grub-core/lib/libgcrypt/mpi/mpi-mul.c
Normal file
|
|
@ -0,0 +1,212 @@
|
|||
/* mpi-mul.c - MPI functions
|
||||
* Copyright (C) 1994, 1996, 1998, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "mpi-internal.h"
|
||||
|
||||
|
||||
void
|
||||
gcry_mpi_mul_ui( gcry_mpi_t prod, gcry_mpi_t mult, unsigned long small_mult )
|
||||
{
|
||||
mpi_size_t size, prod_size;
|
||||
mpi_ptr_t prod_ptr;
|
||||
mpi_limb_t cy;
|
||||
int sign;
|
||||
|
||||
size = mult->nlimbs;
|
||||
sign = mult->sign;
|
||||
|
||||
if( !size || !small_mult ) {
|
||||
prod->nlimbs = 0;
|
||||
prod->sign = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
prod_size = size + 1;
|
||||
if( prod->alloced < prod_size )
|
||||
mpi_resize( prod, prod_size );
|
||||
prod_ptr = prod->d;
|
||||
|
||||
cy = _gcry_mpih_mul_1( prod_ptr, mult->d, size, (mpi_limb_t)small_mult );
|
||||
if( cy )
|
||||
prod_ptr[size++] = cy;
|
||||
prod->nlimbs = size;
|
||||
prod->sign = sign;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gcry_mpi_mul_2exp( gcry_mpi_t w, gcry_mpi_t u, unsigned long cnt)
|
||||
{
|
||||
mpi_size_t usize, wsize, limb_cnt;
|
||||
mpi_ptr_t wp;
|
||||
mpi_limb_t wlimb;
|
||||
int usign, wsign;
|
||||
|
||||
usize = u->nlimbs;
|
||||
usign = u->sign;
|
||||
|
||||
if( !usize ) {
|
||||
w->nlimbs = 0;
|
||||
w->sign = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
limb_cnt = cnt / BITS_PER_MPI_LIMB;
|
||||
wsize = usize + limb_cnt + 1;
|
||||
if( w->alloced < wsize )
|
||||
mpi_resize(w, wsize );
|
||||
wp = w->d;
|
||||
wsize = usize + limb_cnt;
|
||||
wsign = usign;
|
||||
|
||||
cnt %= BITS_PER_MPI_LIMB;
|
||||
if( cnt ) {
|
||||
wlimb = _gcry_mpih_lshift( wp + limb_cnt, u->d, usize, cnt );
|
||||
if( wlimb ) {
|
||||
wp[wsize] = wlimb;
|
||||
wsize++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
MPN_COPY_DECR( wp + limb_cnt, u->d, usize );
|
||||
}
|
||||
|
||||
/* Zero all whole limbs at low end. Do it here and not before calling
|
||||
* mpn_lshift, not to lose for U == W. */
|
||||
MPN_ZERO( wp, limb_cnt );
|
||||
|
||||
w->nlimbs = wsize;
|
||||
w->sign = wsign;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gcry_mpi_mul( gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v)
|
||||
{
|
||||
mpi_size_t usize, vsize, wsize;
|
||||
mpi_ptr_t up, vp, wp;
|
||||
mpi_limb_t cy;
|
||||
int usign, vsign, usecure, vsecure, sign_product;
|
||||
int assign_wp=0;
|
||||
mpi_ptr_t tmp_limb=NULL;
|
||||
unsigned int tmp_limb_nlimbs = 0;
|
||||
|
||||
if( u->nlimbs < v->nlimbs ) { /* Swap U and V. */
|
||||
usize = v->nlimbs;
|
||||
usign = v->sign;
|
||||
usecure = mpi_is_secure(v);
|
||||
up = v->d;
|
||||
vsize = u->nlimbs;
|
||||
vsign = u->sign;
|
||||
vsecure = mpi_is_secure(u);
|
||||
vp = u->d;
|
||||
}
|
||||
else {
|
||||
usize = u->nlimbs;
|
||||
usign = u->sign;
|
||||
usecure = mpi_is_secure(u);
|
||||
up = u->d;
|
||||
vsize = v->nlimbs;
|
||||
vsign = v->sign;
|
||||
vsecure = mpi_is_secure(v);
|
||||
vp = v->d;
|
||||
}
|
||||
sign_product = usign ^ vsign;
|
||||
wp = w->d;
|
||||
|
||||
/* Ensure W has space enough to store the result. */
|
||||
wsize = usize + vsize;
|
||||
if ( !mpi_is_secure (w) && (mpi_is_secure (u) || mpi_is_secure (v)) ) {
|
||||
/* w is not allocated in secure space but u or v is. To make sure
|
||||
* that no temporray results are stored in w, we temporary use
|
||||
* a newly allocated limb space for w */
|
||||
wp = mpi_alloc_limb_space( wsize, 1 );
|
||||
assign_wp = 2; /* mark it as 2 so that we can later copy it back to
|
||||
* mormal memory */
|
||||
}
|
||||
else if( w->alloced < wsize ) {
|
||||
if( wp == up || wp == vp ) {
|
||||
wp = mpi_alloc_limb_space( wsize, mpi_is_secure(w) );
|
||||
assign_wp = 1;
|
||||
}
|
||||
else {
|
||||
mpi_resize(w, wsize );
|
||||
wp = w->d;
|
||||
}
|
||||
}
|
||||
else { /* Make U and V not overlap with W. */
|
||||
if( wp == up ) {
|
||||
/* W and U are identical. Allocate temporary space for U. */
|
||||
tmp_limb_nlimbs = usize;
|
||||
up = tmp_limb = mpi_alloc_limb_space( usize, usecure );
|
||||
/* Is V identical too? Keep it identical with U. */
|
||||
if( wp == vp )
|
||||
vp = up;
|
||||
/* Copy to the temporary space. */
|
||||
MPN_COPY( up, wp, usize );
|
||||
}
|
||||
else if( wp == vp ) {
|
||||
/* W and V are identical. Allocate temporary space for V. */
|
||||
tmp_limb_nlimbs = vsize;
|
||||
vp = tmp_limb = mpi_alloc_limb_space( vsize, vsecure );
|
||||
/* Copy to the temporary space. */
|
||||
MPN_COPY( vp, wp, vsize );
|
||||
}
|
||||
}
|
||||
|
||||
if( !vsize )
|
||||
wsize = 0;
|
||||
else {
|
||||
cy = _gcry_mpih_mul( wp, up, usize, vp, vsize );
|
||||
wsize -= cy? 0:1;
|
||||
}
|
||||
|
||||
if( assign_wp ) {
|
||||
if (assign_wp == 2) {
|
||||
/* copy the temp wp from secure memory back to normal memory */
|
||||
mpi_ptr_t tmp_wp = mpi_alloc_limb_space (wsize, 0);
|
||||
MPN_COPY (tmp_wp, wp, wsize);
|
||||
_gcry_mpi_free_limb_space (wp, 0);
|
||||
wp = tmp_wp;
|
||||
}
|
||||
_gcry_mpi_assign_limb_space( w, wp, wsize );
|
||||
}
|
||||
w->nlimbs = wsize;
|
||||
w->sign = sign_product;
|
||||
if( tmp_limb )
|
||||
_gcry_mpi_free_limb_space (tmp_limb, tmp_limb_nlimbs);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gcry_mpi_mulm( gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, gcry_mpi_t m)
|
||||
{
|
||||
gcry_mpi_mul(w, u, v);
|
||||
_gcry_mpi_fdiv_r( w, w, m );
|
||||
}
|
||||
324
grub-core/lib/libgcrypt/mpi/mpi-pow.c
Normal file
324
grub-core/lib/libgcrypt/mpi/mpi-pow.c
Normal file
|
|
@ -0,0 +1,324 @@
|
|||
/* mpi-pow.c - MPI functions for exponentiation
|
||||
* Copyright (C) 1994, 1996, 1998, 2000, 2002
|
||||
* 2003 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Note: This code is heavily based on the GNU MP Library.
|
||||
* Actually it's the same code with only minor changes in the
|
||||
* way the data is stored; this is to support the abstraction
|
||||
* of an optional secure memory allocation which may be used
|
||||
* to avoid revealing of sensitive data due to paging etc.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "mpi-internal.h"
|
||||
#include "longlong.h"
|
||||
|
||||
|
||||
/****************
|
||||
* RES = BASE ^ EXPO mod MOD
|
||||
*/
|
||||
void
|
||||
gcry_mpi_powm (gcry_mpi_t res,
|
||||
gcry_mpi_t base, gcry_mpi_t expo, gcry_mpi_t mod)
|
||||
{
|
||||
/* Pointer to the limbs of the arguments, their size and signs. */
|
||||
mpi_ptr_t rp, ep, mp, bp;
|
||||
mpi_size_t esize, msize, bsize, rsize;
|
||||
int msign, bsign, rsign;
|
||||
/* Flags telling the secure allocation status of the arguments. */
|
||||
int esec, msec, bsec;
|
||||
/* Size of the result including space for temporary values. */
|
||||
mpi_size_t size;
|
||||
/* Helper. */
|
||||
int mod_shift_cnt;
|
||||
int negative_result;
|
||||
mpi_ptr_t mp_marker = NULL;
|
||||
mpi_ptr_t bp_marker = NULL;
|
||||
mpi_ptr_t ep_marker = NULL;
|
||||
mpi_ptr_t xp_marker = NULL;
|
||||
unsigned int mp_nlimbs = 0;
|
||||
unsigned int bp_nlimbs = 0;
|
||||
unsigned int ep_nlimbs = 0;
|
||||
unsigned int xp_nlimbs = 0;
|
||||
mpi_ptr_t tspace = NULL;
|
||||
mpi_size_t tsize = 0;
|
||||
|
||||
|
||||
esize = expo->nlimbs;
|
||||
msize = mod->nlimbs;
|
||||
size = 2 * msize;
|
||||
msign = mod->sign;
|
||||
|
||||
esec = mpi_is_secure(expo);
|
||||
msec = mpi_is_secure(mod);
|
||||
bsec = mpi_is_secure(base);
|
||||
|
||||
rp = res->d;
|
||||
ep = expo->d;
|
||||
|
||||
if (!msize)
|
||||
msize = 1 / msize; /* Provoke a signal. */
|
||||
|
||||
if (!esize)
|
||||
{
|
||||
/* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0 depending
|
||||
on if MOD equals 1. */
|
||||
rp[0] = 1;
|
||||
res->nlimbs = (msize == 1 && mod->d[0] == 1) ? 0 : 1;
|
||||
res->sign = 0;
|
||||
goto leave;
|
||||
}
|
||||
|
||||
/* Normalize MOD (i.e. make its most significant bit set) as
|
||||
required by mpn_divrem. This will make the intermediate values
|
||||
in the calculation slightly larger, but the correct result is
|
||||
obtained after a final reduction using the original MOD value. */
|
||||
mp_nlimbs = msec? msize:0;
|
||||
mp = mp_marker = mpi_alloc_limb_space(msize, msec);
|
||||
count_leading_zeros (mod_shift_cnt, mod->d[msize-1]);
|
||||
if (mod_shift_cnt)
|
||||
_gcry_mpih_lshift (mp, mod->d, msize, mod_shift_cnt);
|
||||
else
|
||||
MPN_COPY( mp, mod->d, msize );
|
||||
|
||||
bsize = base->nlimbs;
|
||||
bsign = base->sign;
|
||||
if (bsize > msize)
|
||||
{
|
||||
/* The base is larger than the module. Reduce it.
|
||||
|
||||
Allocate (BSIZE + 1) with space for remainder and quotient.
|
||||
(The quotient is (bsize - msize + 1) limbs.) */
|
||||
bp_nlimbs = bsec ? (bsize + 1):0;
|
||||
bp = bp_marker = mpi_alloc_limb_space( bsize + 1, bsec );
|
||||
MPN_COPY ( bp, base->d, bsize );
|
||||
/* We don't care about the quotient, store it above the
|
||||
* remainder, at BP + MSIZE. */
|
||||
_gcry_mpih_divrem( bp + msize, 0, bp, bsize, mp, msize );
|
||||
bsize = msize;
|
||||
/* Canonicalize the base, since we are going to multiply with it
|
||||
quite a few times. */
|
||||
MPN_NORMALIZE( bp, bsize );
|
||||
}
|
||||
else
|
||||
bp = base->d;
|
||||
|
||||
if (!bsize)
|
||||
{
|
||||
res->nlimbs = 0;
|
||||
res->sign = 0;
|
||||
goto leave;
|
||||
}
|
||||
|
||||
|
||||
/* Make BASE, EXPO and MOD not overlap with RES. */
|
||||
if ( rp == bp )
|
||||
{
|
||||
/* RES and BASE are identical. Allocate temp. space for BASE. */
|
||||
gcry_assert (!bp_marker);
|
||||
bp_nlimbs = bsec? bsize:0;
|
||||
bp = bp_marker = mpi_alloc_limb_space( bsize, bsec );
|
||||
MPN_COPY(bp, rp, bsize);
|
||||
}
|
||||
if ( rp == ep )
|
||||
{
|
||||
/* RES and EXPO are identical. Allocate temp. space for EXPO. */
|
||||
ep_nlimbs = esec? esize:0;
|
||||
ep = ep_marker = mpi_alloc_limb_space( esize, esec );
|
||||
MPN_COPY(ep, rp, esize);
|
||||
}
|
||||
if ( rp == mp )
|
||||
{
|
||||
/* RES and MOD are identical. Allocate temporary space for MOD.*/
|
||||
gcry_assert (!mp_marker);
|
||||
mp_nlimbs = msec?msize:0;
|
||||
mp = mp_marker = mpi_alloc_limb_space( msize, msec );
|
||||
MPN_COPY(mp, rp, msize);
|
||||
}
|
||||
|
||||
/* Copy base to the result. */
|
||||
if (res->alloced < size)
|
||||
{
|
||||
mpi_resize (res, size);
|
||||
rp = res->d;
|
||||
}
|
||||
MPN_COPY ( rp, bp, bsize );
|
||||
rsize = bsize;
|
||||
rsign = bsign;
|
||||
|
||||
/* Main processing. */
|
||||
{
|
||||
mpi_size_t i;
|
||||
mpi_ptr_t xp;
|
||||
int c;
|
||||
mpi_limb_t e;
|
||||
mpi_limb_t carry_limb;
|
||||
struct karatsuba_ctx karactx;
|
||||
|
||||
xp_nlimbs = msec? (2 * (msize + 1)):0;
|
||||
xp = xp_marker = mpi_alloc_limb_space( 2 * (msize + 1), msec );
|
||||
|
||||
memset( &karactx, 0, sizeof karactx );
|
||||
negative_result = (ep[0] & 1) && base->sign;
|
||||
|
||||
i = esize - 1;
|
||||
e = ep[i];
|
||||
count_leading_zeros (c, e);
|
||||
e = (e << c) << 1; /* Shift the expo bits to the left, lose msb. */
|
||||
c = BITS_PER_MPI_LIMB - 1 - c;
|
||||
|
||||
/* Main loop.
|
||||
|
||||
Make the result be pointed to alternately by XP and RP. This
|
||||
helps us avoid block copying, which would otherwise be
|
||||
necessary with the overlap restrictions of
|
||||
_gcry_mpih_divmod. With 50% probability the result after this
|
||||
loop will be in the area originally pointed by RP (==RES->d),
|
||||
and with 50% probability in the area originally pointed to by XP. */
|
||||
for (;;)
|
||||
{
|
||||
while (c)
|
||||
{
|
||||
mpi_ptr_t tp;
|
||||
mpi_size_t xsize;
|
||||
|
||||
/*mpih_mul_n(xp, rp, rp, rsize);*/
|
||||
if ( rsize < KARATSUBA_THRESHOLD )
|
||||
_gcry_mpih_sqr_n_basecase( xp, rp, rsize );
|
||||
else
|
||||
{
|
||||
if ( !tspace )
|
||||
{
|
||||
tsize = 2 * rsize;
|
||||
tspace = mpi_alloc_limb_space( tsize, 0 );
|
||||
}
|
||||
else if ( tsize < (2*rsize) )
|
||||
{
|
||||
_gcry_mpi_free_limb_space (tspace, 0);
|
||||
tsize = 2 * rsize;
|
||||
tspace = mpi_alloc_limb_space (tsize, 0 );
|
||||
}
|
||||
_gcry_mpih_sqr_n (xp, rp, rsize, tspace);
|
||||
}
|
||||
|
||||
xsize = 2 * rsize;
|
||||
if ( xsize > msize )
|
||||
{
|
||||
_gcry_mpih_divrem(xp + msize, 0, xp, xsize, mp, msize);
|
||||
xsize = msize;
|
||||
}
|
||||
|
||||
tp = rp; rp = xp; xp = tp;
|
||||
rsize = xsize;
|
||||
|
||||
if ( (mpi_limb_signed_t)e < 0 )
|
||||
{
|
||||
/*mpih_mul( xp, rp, rsize, bp, bsize );*/
|
||||
if( bsize < KARATSUBA_THRESHOLD )
|
||||
_gcry_mpih_mul ( xp, rp, rsize, bp, bsize );
|
||||
else
|
||||
_gcry_mpih_mul_karatsuba_case (xp, rp, rsize, bp, bsize,
|
||||
&karactx);
|
||||
|
||||
xsize = rsize + bsize;
|
||||
if ( xsize > msize )
|
||||
{
|
||||
_gcry_mpih_divrem(xp + msize, 0, xp, xsize, mp, msize);
|
||||
xsize = msize;
|
||||
}
|
||||
|
||||
tp = rp; rp = xp; xp = tp;
|
||||
rsize = xsize;
|
||||
}
|
||||
e <<= 1;
|
||||
c--;
|
||||
}
|
||||
|
||||
i--;
|
||||
if ( i < 0 )
|
||||
break;
|
||||
e = ep[i];
|
||||
c = BITS_PER_MPI_LIMB;
|
||||
}
|
||||
|
||||
/* We shifted MOD, the modulo reduction argument, left
|
||||
MOD_SHIFT_CNT steps. Adjust the result by reducing it with the
|
||||
original MOD.
|
||||
|
||||
Also make sure the result is put in RES->d (where it already
|
||||
might be, see above). */
|
||||
if ( mod_shift_cnt )
|
||||
{
|
||||
carry_limb = _gcry_mpih_lshift( res->d, rp, rsize, mod_shift_cnt);
|
||||
rp = res->d;
|
||||
if ( carry_limb )
|
||||
{
|
||||
rp[rsize] = carry_limb;
|
||||
rsize++;
|
||||
}
|
||||
}
|
||||
else if (res->d != rp)
|
||||
{
|
||||
MPN_COPY (res->d, rp, rsize);
|
||||
rp = res->d;
|
||||
}
|
||||
|
||||
if ( rsize >= msize )
|
||||
{
|
||||
_gcry_mpih_divrem(rp + msize, 0, rp, rsize, mp, msize);
|
||||
rsize = msize;
|
||||
}
|
||||
|
||||
/* Remove any leading zero words from the result. */
|
||||
if ( mod_shift_cnt )
|
||||
_gcry_mpih_rshift( rp, rp, rsize, mod_shift_cnt);
|
||||
MPN_NORMALIZE (rp, rsize);
|
||||
|
||||
_gcry_mpih_release_karatsuba_ctx (&karactx );
|
||||
}
|
||||
|
||||
/* Fixup for negative results. */
|
||||
if ( negative_result && rsize )
|
||||
{
|
||||
if ( mod_shift_cnt )
|
||||
_gcry_mpih_rshift( mp, mp, msize, mod_shift_cnt);
|
||||
_gcry_mpih_sub( rp, mp, msize, rp, rsize);
|
||||
rsize = msize;
|
||||
rsign = msign;
|
||||
MPN_NORMALIZE(rp, rsize);
|
||||
}
|
||||
gcry_assert (res->d == rp);
|
||||
res->nlimbs = rsize;
|
||||
res->sign = rsign;
|
||||
|
||||
leave:
|
||||
if (mp_marker)
|
||||
_gcry_mpi_free_limb_space( mp_marker, mp_nlimbs );
|
||||
if (bp_marker)
|
||||
_gcry_mpi_free_limb_space( bp_marker, bp_nlimbs );
|
||||
if (ep_marker)
|
||||
_gcry_mpi_free_limb_space( ep_marker, ep_nlimbs );
|
||||
if (xp_marker)
|
||||
_gcry_mpi_free_limb_space( xp_marker, xp_nlimbs );
|
||||
if (tspace)
|
||||
_gcry_mpi_free_limb_space( tspace, 0 );
|
||||
}
|
||||
130
grub-core/lib/libgcrypt/mpi/mpi-scan.c
Normal file
130
grub-core/lib/libgcrypt/mpi/mpi-scan.c
Normal file
|
|
@ -0,0 +1,130 @@
|
|||
/* mpi-scan.c - MPI functions
|
||||
* Copyright (C) 1998, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "mpi-internal.h"
|
||||
#include "longlong.h"
|
||||
|
||||
/****************
|
||||
* Scan through an mpi and return byte for byte. a -1 is returned to indicate
|
||||
* the end of the mpi. Scanning is done from the lsb to the msb, returned
|
||||
* values are in the range of 0 .. 255.
|
||||
*
|
||||
* FIXME: This code is VERY ugly!
|
||||
*/
|
||||
int
|
||||
_gcry_mpi_getbyte( gcry_mpi_t a, unsigned idx )
|
||||
{
|
||||
int i, j;
|
||||
unsigned n;
|
||||
mpi_ptr_t ap;
|
||||
mpi_limb_t limb;
|
||||
|
||||
ap = a->d;
|
||||
for(n=0,i=0; i < a->nlimbs; i++ ) {
|
||||
limb = ap[i];
|
||||
for( j=0; j < BYTES_PER_MPI_LIMB; j++, n++ )
|
||||
if( n == idx )
|
||||
return (limb >> j*8) & 0xff;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/****************
|
||||
* Put a value at position IDX into A. idx counts from lsb to msb
|
||||
*/
|
||||
void
|
||||
_gcry_mpi_putbyte( gcry_mpi_t a, unsigned idx, int xc )
|
||||
{
|
||||
int i, j;
|
||||
unsigned n;
|
||||
mpi_ptr_t ap;
|
||||
mpi_limb_t limb, c;
|
||||
|
||||
c = xc & 0xff;
|
||||
ap = a->d;
|
||||
for(n=0,i=0; i < a->alloced; i++ ) {
|
||||
limb = ap[i];
|
||||
for( j=0; j < BYTES_PER_MPI_LIMB; j++, n++ )
|
||||
if( n == idx ) {
|
||||
#if BYTES_PER_MPI_LIMB == 4
|
||||
if( j == 0 )
|
||||
limb = (limb & 0xffffff00) | c;
|
||||
else if( j == 1 )
|
||||
limb = (limb & 0xffff00ff) | (c<<8);
|
||||
else if( j == 2 )
|
||||
limb = (limb & 0xff00ffff) | (c<<16);
|
||||
else
|
||||
limb = (limb & 0x00ffffff) | (c<<24);
|
||||
#elif BYTES_PER_MPI_LIMB == 8
|
||||
if( j == 0 )
|
||||
limb = (limb & 0xffffffffffffff00) | c;
|
||||
else if( j == 1 )
|
||||
limb = (limb & 0xffffffffffff00ff) | (c<<8);
|
||||
else if( j == 2 )
|
||||
limb = (limb & 0xffffffffff00ffff) | (c<<16);
|
||||
else if( j == 3 )
|
||||
limb = (limb & 0xffffffff00ffffff) | (c<<24);
|
||||
else if( j == 4 )
|
||||
limb = (limb & 0xffffff00ffffffff) | (c<<32);
|
||||
else if( j == 5 )
|
||||
limb = (limb & 0xffff00ffffffffff) | (c<<40);
|
||||
else if( j == 6 )
|
||||
limb = (limb & 0xff00ffffffffffff) | (c<<48);
|
||||
else
|
||||
limb = (limb & 0x00ffffffffffffff) | (c<<56);
|
||||
#else
|
||||
#error please enhance this function, its ugly - i know.
|
||||
#endif
|
||||
if( a->nlimbs <= i )
|
||||
a->nlimbs = i+1;
|
||||
ap[i] = limb;
|
||||
return;
|
||||
}
|
||||
}
|
||||
abort(); /* index out of range */
|
||||
}
|
||||
|
||||
|
||||
/****************
|
||||
* Count the number of zerobits at the low end of A
|
||||
*/
|
||||
unsigned
|
||||
_gcry_mpi_trailing_zeros( gcry_mpi_t a )
|
||||
{
|
||||
unsigned n, count = 0;
|
||||
|
||||
for(n=0; n < a->nlimbs; n++ ) {
|
||||
if( a->d[n] ) {
|
||||
unsigned nn;
|
||||
mpi_limb_t alimb = a->d[n];
|
||||
|
||||
count_trailing_zeros( nn, alimb );
|
||||
count += nn;
|
||||
break;
|
||||
}
|
||||
count += BITS_PER_MPI_LIMB;
|
||||
}
|
||||
return count;
|
||||
|
||||
}
|
||||
750
grub-core/lib/libgcrypt/mpi/mpicoder.c
Normal file
750
grub-core/lib/libgcrypt/mpi/mpicoder.c
Normal file
|
|
@ -0,0 +1,750 @@
|
|||
/* mpicoder.c - Coder for the external representation of MPIs
|
||||
* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
|
||||
* 2008 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of Libgcrypt.
|
||||
*
|
||||
* Libgcrypt is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* Libgcrypt is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "mpi-internal.h"
|
||||
#include "g10lib.h"
|
||||
|
||||
#define MAX_EXTERN_MPI_BITS 16384
|
||||
|
||||
/* Helper used to scan PGP style MPIs. Returns NULL on failure. */
|
||||
static gcry_mpi_t
|
||||
mpi_read_from_buffer (const unsigned char *buffer, unsigned *ret_nread,
|
||||
int secure)
|
||||
{
|
||||
int i, j;
|
||||
unsigned int nbits, nbytes, nlimbs, nread=0;
|
||||
mpi_limb_t a;
|
||||
gcry_mpi_t val = MPI_NULL;
|
||||
|
||||
if ( *ret_nread < 2 )
|
||||
goto leave;
|
||||
nbits = buffer[0] << 8 | buffer[1];
|
||||
if ( nbits > MAX_EXTERN_MPI_BITS )
|
||||
{
|
||||
/* log_debug ("mpi too large (%u bits)\n", nbits); */
|
||||
goto leave;
|
||||
}
|
||||
buffer += 2;
|
||||
nread = 2;
|
||||
|
||||
nbytes = (nbits+7) / 8;
|
||||
nlimbs = (nbytes+BYTES_PER_MPI_LIMB-1) / BYTES_PER_MPI_LIMB;
|
||||
val = secure? mpi_alloc_secure (nlimbs) : mpi_alloc (nlimbs);
|
||||
i = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB;
|
||||
i %= BYTES_PER_MPI_LIMB;
|
||||
j= val->nlimbs = nlimbs;
|
||||
val->sign = 0;
|
||||
for ( ; j > 0; j-- )
|
||||
{
|
||||
a = 0;
|
||||
for (; i < BYTES_PER_MPI_LIMB; i++ )
|
||||
{
|
||||
if ( ++nread > *ret_nread )
|
||||
{
|
||||
/* log_debug ("mpi larger than buffer"); */
|
||||
mpi_free (val);
|
||||
val = NULL;
|
||||
goto leave;
|
||||
}
|
||||
a <<= 8;
|
||||
a |= *buffer++;
|
||||
}
|
||||
i = 0;
|
||||
val->d[j-1] = a;
|
||||
}
|
||||
|
||||
leave:
|
||||
*ret_nread = nread;
|
||||
return val;
|
||||
}
|
||||
|
||||
|
||||
/****************
|
||||
* Fill the mpi VAL from the hex string in STR.
|
||||
*/
|
||||
static int
|
||||
mpi_fromstr (gcry_mpi_t val, const char *str)
|
||||
{
|
||||
int sign = 0;
|
||||
int prepend_zero = 0;
|
||||
int i, j, c, c1, c2;
|
||||
unsigned int nbits, nbytes, nlimbs;
|
||||
mpi_limb_t a;
|
||||
|
||||
if ( *str == '-' )
|
||||
{
|
||||
sign = 1;
|
||||
str++;
|
||||
}
|
||||
|
||||
/* Skip optional hex prefix. */
|
||||
if ( *str == '0' && str[1] == 'x' )
|
||||
str += 2;
|
||||
|
||||
nbits = 4 * strlen (str);
|
||||
if ((nbits % 8))
|
||||
prepend_zero = 1;
|
||||
|
||||
nbytes = (nbits+7) / 8;
|
||||
nlimbs = (nbytes+BYTES_PER_MPI_LIMB-1) / BYTES_PER_MPI_LIMB;
|
||||
|
||||
if ( val->alloced < nlimbs )
|
||||
mpi_resize (val, nlimbs);
|
||||
|
||||
i = BYTES_PER_MPI_LIMB - (nbytes % BYTES_PER_MPI_LIMB);
|
||||
i %= BYTES_PER_MPI_LIMB;
|
||||
j = val->nlimbs = nlimbs;
|
||||
val->sign = sign;
|
||||
for (; j > 0; j--)
|
||||
{
|
||||
a = 0;
|
||||
for (; i < BYTES_PER_MPI_LIMB; i++)
|
||||
{
|
||||
if (prepend_zero)
|
||||
{
|
||||
c1 = '0';
|
||||
prepend_zero = 0;
|
||||
}
|
||||
else
|
||||
c1 = *str++;
|
||||
|
||||
if (!c1)
|
||||
{
|
||||
mpi_clear (val);
|
||||
return 1; /* Error. */
|
||||
}
|
||||
c2 = *str++;
|
||||
if (!c2)
|
||||
{
|
||||
mpi_clear (val);
|
||||
return 1; /* Error. */
|
||||
}
|
||||
if ( c1 >= '0' && c1 <= '9' )
|
||||
c = c1 - '0';
|
||||
else if ( c1 >= 'a' && c1 <= 'f' )
|
||||
c = c1 - 'a' + 10;
|
||||
else if ( c1 >= 'A' && c1 <= 'F' )
|
||||
c = c1 - 'A' + 10;
|
||||
else
|
||||
{
|
||||
mpi_clear (val);
|
||||
return 1; /* Error. */
|
||||
}
|
||||
c <<= 4;
|
||||
if ( c2 >= '0' && c2 <= '9' )
|
||||
c |= c2 - '0';
|
||||
else if( c2 >= 'a' && c2 <= 'f' )
|
||||
c |= c2 - 'a' + 10;
|
||||
else if( c2 >= 'A' && c2 <= 'F' )
|
||||
c |= c2 - 'A' + 10;
|
||||
else
|
||||
{
|
||||
mpi_clear(val);
|
||||
return 1; /* Error. */
|
||||
}
|
||||
a <<= 8;
|
||||
a |= c;
|
||||
}
|
||||
i = 0;
|
||||
val->d[j-1] = a;
|
||||
}
|
||||
|
||||
return 0; /* Okay. */
|
||||
}
|
||||
|
||||
|
||||
/* Dump the value of A in a format suitable for debugging to
|
||||
Libgcrypt's logging stream. Note that one leading space but no
|
||||
trailing space or linefeed will be printed. It is okay to pass
|
||||
NULL for A. */
|
||||
void
|
||||
gcry_mpi_dump (const gcry_mpi_t a)
|
||||
{
|
||||
int i;
|
||||
|
||||
log_printf (" ");
|
||||
if (!a)
|
||||
log_printf ("[MPI_NULL]");
|
||||
else
|
||||
{
|
||||
if (a->sign)
|
||||
log_printf ( "-");
|
||||
#if BYTES_PER_MPI_LIMB == 2
|
||||
# define X "4"
|
||||
#elif BYTES_PER_MPI_LIMB == 4
|
||||
# define X "8"
|
||||
#elif BYTES_PER_MPI_LIMB == 8
|
||||
# define X "16"
|
||||
#elif BYTES_PER_MPI_LIMB == 16
|
||||
# define X "32"
|
||||
#else
|
||||
# error please define the format here
|
||||
#endif
|
||||
for (i=a->nlimbs; i > 0 ; i-- )
|
||||
{
|
||||
log_printf (i != a->nlimbs? "%0" X "lX":"%lX", (ulong)a->d[i-1]);
|
||||
}
|
||||
#undef X
|
||||
if (!a->nlimbs)
|
||||
log_printf ("0");
|
||||
}
|
||||
}
|
||||
|
||||
/* Convience function used internally. */
|
||||
void
|
||||
_gcry_log_mpidump (const char *text, gcry_mpi_t a)
|
||||
{
|
||||
log_printf ("%s:", text);
|
||||
gcry_mpi_dump (a);
|
||||
log_printf ("\n");
|
||||
}
|
||||
|
||||
|
||||
/* Return an allocated buffer with the MPI (msb first). NBYTES
|
||||
receives the length of this buffer. Caller must free the return
|
||||
string. This function returns an allocated buffer with NBYTES set
|
||||
to zero if the value of A is zero. If sign is not NULL, it will be
|
||||
set to the sign of the A. On error NULL is returned and ERRNO set
|
||||
appropriately. */
|
||||
static unsigned char *
|
||||
do_get_buffer (gcry_mpi_t a, unsigned int *nbytes, int *sign, int force_secure)
|
||||
{
|
||||
unsigned char *p, *buffer;
|
||||
mpi_limb_t alimb;
|
||||
int i;
|
||||
size_t n;
|
||||
|
||||
if (sign)
|
||||
*sign = a->sign;
|
||||
|
||||
*nbytes = a->nlimbs * BYTES_PER_MPI_LIMB;
|
||||
n = *nbytes? *nbytes:1; /* Allocate at least one byte. */
|
||||
p = buffer = (force_secure || mpi_is_secure(a))? gcry_malloc_secure (n)
|
||||
: gcry_malloc (n);
|
||||
if (!buffer)
|
||||
return NULL;
|
||||
|
||||
for (i=a->nlimbs-1; i >= 0; i--)
|
||||
{
|
||||
alimb = a->d[i];
|
||||
#if BYTES_PER_MPI_LIMB == 4
|
||||
*p++ = alimb >> 24;
|
||||
*p++ = alimb >> 16;
|
||||
*p++ = alimb >> 8;
|
||||
*p++ = alimb ;
|
||||
#elif BYTES_PER_MPI_LIMB == 8
|
||||
*p++ = alimb >> 56;
|
||||
*p++ = alimb >> 48;
|
||||
*p++ = alimb >> 40;
|
||||
*p++ = alimb >> 32;
|
||||
*p++ = alimb >> 24;
|
||||
*p++ = alimb >> 16;
|
||||
*p++ = alimb >> 8;
|
||||
*p++ = alimb ;
|
||||
#else
|
||||
# error please implement for this limb size.
|
||||
#endif
|
||||
}
|
||||
|
||||
/* This is sub-optimal but we need to do the shift operation because
|
||||
the caller has to free the returned buffer. */
|
||||
for (p=buffer; !*p && *nbytes; p++, --*nbytes)
|
||||
;
|
||||
if (p != buffer)
|
||||
memmove (buffer,p, *nbytes);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
||||
byte *
|
||||
_gcry_mpi_get_buffer (gcry_mpi_t a, unsigned int *nbytes, int *sign)
|
||||
{
|
||||
return do_get_buffer (a, nbytes, sign, 0);
|
||||
}
|
||||
|
||||
byte *
|
||||
_gcry_mpi_get_secure_buffer (gcry_mpi_t a, unsigned *nbytes, int *sign)
|
||||
{
|
||||
return do_get_buffer (a, nbytes, sign, 1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Use the NBYTES at BUFFER_ARG to update A. Set the sign of a to
|
||||
* SIGN.
|
||||
*/
|
||||
void
|
||||
_gcry_mpi_set_buffer (gcry_mpi_t a, const void *buffer_arg,
|
||||
unsigned int nbytes, int sign)
|
||||
{
|
||||
const unsigned char *buffer = (const unsigned char*)buffer_arg;
|
||||
const unsigned char *p;
|
||||
mpi_limb_t alimb;
|
||||
int nlimbs;
|
||||
int i;
|
||||
|
||||
nlimbs = (nbytes + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB;
|
||||
RESIZE_IF_NEEDED(a, nlimbs);
|
||||
a->sign = sign;
|
||||
|
||||
for (i=0, p = buffer+nbytes-1; p >= buffer+BYTES_PER_MPI_LIMB; )
|
||||
{
|
||||
#if BYTES_PER_MPI_LIMB == 4
|
||||
alimb = *p-- ;
|
||||
alimb |= *p-- << 8 ;
|
||||
alimb |= *p-- << 16 ;
|
||||
alimb |= *p-- << 24 ;
|
||||
#elif BYTES_PER_MPI_LIMB == 8
|
||||
alimb = (mpi_limb_t)*p-- ;
|
||||
alimb |= (mpi_limb_t)*p-- << 8 ;
|
||||
alimb |= (mpi_limb_t)*p-- << 16 ;
|
||||
alimb |= (mpi_limb_t)*p-- << 24 ;
|
||||
alimb |= (mpi_limb_t)*p-- << 32 ;
|
||||
alimb |= (mpi_limb_t)*p-- << 40 ;
|
||||
alimb |= (mpi_limb_t)*p-- << 48 ;
|
||||
alimb |= (mpi_limb_t)*p-- << 56 ;
|
||||
#else
|
||||
# error please implement for this limb size.
|
||||
#endif
|
||||
a->d[i++] = alimb;
|
||||
}
|
||||
if ( p >= buffer )
|
||||
{
|
||||
#if BYTES_PER_MPI_LIMB == 4
|
||||
alimb = *p--;
|
||||
if (p >= buffer)
|
||||
alimb |= *p-- << 8;
|
||||
if (p >= buffer)
|
||||
alimb |= *p-- << 16;
|
||||
if (p >= buffer)
|
||||
alimb |= *p-- << 24;
|
||||
#elif BYTES_PER_MPI_LIMB == 8
|
||||
alimb = (mpi_limb_t)*p--;
|
||||
if (p >= buffer)
|
||||
alimb |= (mpi_limb_t)*p-- << 8;
|
||||
if (p >= buffer)
|
||||
alimb |= (mpi_limb_t)*p-- << 16;
|
||||
if (p >= buffer)
|
||||
alimb |= (mpi_limb_t)*p-- << 24;
|
||||
if (p >= buffer)
|
||||
alimb |= (mpi_limb_t)*p-- << 32;
|
||||
if (p >= buffer)
|
||||
alimb |= (mpi_limb_t)*p-- << 40;
|
||||
if (p >= buffer)
|
||||
alimb |= (mpi_limb_t)*p-- << 48;
|
||||
if (p >= buffer)
|
||||
alimb |= (mpi_limb_t)*p-- << 56;
|
||||
#else
|
||||
# error please implement for this limb size.
|
||||
#endif
|
||||
a->d[i++] = alimb;
|
||||
}
|
||||
a->nlimbs = i;
|
||||
gcry_assert (i == nlimbs);
|
||||
}
|
||||
|
||||
|
||||
/* Convert the external representation of an integer stored in BUFFER
|
||||
with a length of BUFLEN into a newly create MPI returned in
|
||||
RET_MPI. If NBYTES is not NULL, it will receive the number of
|
||||
bytes actually scanned after a successful operation. */
|
||||
gcry_error_t
|
||||
gcry_mpi_scan (struct gcry_mpi **ret_mpi, enum gcry_mpi_format format,
|
||||
const void *buffer_arg, size_t buflen, size_t *nscanned)
|
||||
{
|
||||
const unsigned char *buffer = (const unsigned char*)buffer_arg;
|
||||
struct gcry_mpi *a = NULL;
|
||||
unsigned int len;
|
||||
int secure = (buffer && gcry_is_secure (buffer));
|
||||
|
||||
if (format == GCRYMPI_FMT_SSH)
|
||||
len = 0;
|
||||
else
|
||||
len = buflen;
|
||||
|
||||
if (format == GCRYMPI_FMT_STD)
|
||||
{
|
||||
const unsigned char *s = buffer;
|
||||
|
||||
a = secure? mpi_alloc_secure ((len+BYTES_PER_MPI_LIMB-1)
|
||||
/BYTES_PER_MPI_LIMB)
|
||||
: mpi_alloc ((len+BYTES_PER_MPI_LIMB-1)/BYTES_PER_MPI_LIMB);
|
||||
if (len)
|
||||
{
|
||||
a->sign = !!(*s & 0x80);
|
||||
if (a->sign)
|
||||
{
|
||||
/* FIXME: we have to convert from 2compl to magnitude format */
|
||||
mpi_free (a);
|
||||
return gcry_error (GPG_ERR_INTERNAL);
|
||||
}
|
||||
else
|
||||
_gcry_mpi_set_buffer (a, s, len, 0);
|
||||
}
|
||||
if (ret_mpi)
|
||||
{
|
||||
mpi_normalize ( a );
|
||||
*ret_mpi = a;
|
||||
}
|
||||
else
|
||||
mpi_free(a);
|
||||
return 0;
|
||||
}
|
||||
else if (format == GCRYMPI_FMT_USG)
|
||||
{
|
||||
a = secure? mpi_alloc_secure ((len+BYTES_PER_MPI_LIMB-1)
|
||||
/BYTES_PER_MPI_LIMB)
|
||||
: mpi_alloc ((len+BYTES_PER_MPI_LIMB-1)/BYTES_PER_MPI_LIMB);
|
||||
|
||||
if (len)
|
||||
_gcry_mpi_set_buffer (a, buffer, len, 0);
|
||||
if (ret_mpi)
|
||||
{
|
||||
mpi_normalize ( a );
|
||||
*ret_mpi = a;
|
||||
}
|
||||
else
|
||||
mpi_free(a);
|
||||
return 0;
|
||||
}
|
||||
else if (format == GCRYMPI_FMT_PGP)
|
||||
{
|
||||
a = mpi_read_from_buffer (buffer, &len, secure);
|
||||
if (nscanned)
|
||||
*nscanned = len;
|
||||
if (ret_mpi && a)
|
||||
{
|
||||
mpi_normalize (a);
|
||||
*ret_mpi = a;
|
||||
}
|
||||
else if (a)
|
||||
{
|
||||
mpi_free(a);
|
||||
a = NULL;
|
||||
}
|
||||
return a? 0 : gcry_error (GPG_ERR_INV_OBJ);
|
||||
}
|
||||
else if (format == GCRYMPI_FMT_SSH)
|
||||
{
|
||||
const unsigned char *s = buffer;
|
||||
size_t n;
|
||||
|
||||
/* This test is not strictly necessary and an assert (!len)
|
||||
would be sufficient. We keep this test in case we later
|
||||
allow the BUFLEN argument to act as a sanitiy check. Same
|
||||
below. */
|
||||
if (len && len < 4)
|
||||
return gcry_error (GPG_ERR_TOO_SHORT);
|
||||
|
||||
n = (s[0] << 24 | s[1] << 16 | s[2] << 8 | s[3]);
|
||||
s += 4;
|
||||
if (len)
|
||||
len -= 4;
|
||||
if (len && n > len)
|
||||
return gcry_error (GPG_ERR_TOO_LARGE);
|
||||
|
||||
a = secure? mpi_alloc_secure ((n+BYTES_PER_MPI_LIMB-1)
|
||||
/BYTES_PER_MPI_LIMB)
|
||||
: mpi_alloc ((n+BYTES_PER_MPI_LIMB-1)/BYTES_PER_MPI_LIMB);
|
||||
if (n)
|
||||
{
|
||||
a->sign = !!(*s & 0x80);
|
||||
if (a->sign)
|
||||
{
|
||||
/* FIXME: we have to convert from 2compl to magnitude format */
|
||||
mpi_free(a);
|
||||
return gcry_error (GPG_ERR_INTERNAL);
|
||||
}
|
||||
else
|
||||
_gcry_mpi_set_buffer( a, s, n, 0 );
|
||||
}
|
||||
if (nscanned)
|
||||
*nscanned = n+4;
|
||||
if (ret_mpi)
|
||||
{
|
||||
mpi_normalize ( a );
|
||||
*ret_mpi = a;
|
||||
}
|
||||
else
|
||||
mpi_free(a);
|
||||
return 0;
|
||||
}
|
||||
else if (format == GCRYMPI_FMT_HEX)
|
||||
{
|
||||
/* We can only handle C strings for now. */
|
||||
if (buflen)
|
||||
return gcry_error (GPG_ERR_INV_ARG);
|
||||
|
||||
a = secure? mpi_alloc_secure (0) : mpi_alloc(0);
|
||||
if (mpi_fromstr (a, (const char *)buffer))
|
||||
{
|
||||
mpi_free (a);
|
||||
return gcry_error (GPG_ERR_INV_OBJ);
|
||||
}
|
||||
if (ret_mpi)
|
||||
{
|
||||
mpi_normalize ( a );
|
||||
*ret_mpi = a;
|
||||
}
|
||||
else
|
||||
mpi_free(a);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
return gcry_error (GPG_ERR_INV_ARG);
|
||||
}
|
||||
|
||||
|
||||
/* Convert the big integer A into the external representation
|
||||
described by FORMAT and store it in the provided BUFFER which has
|
||||
been allocated by the user with a size of BUFLEN bytes. NWRITTEN
|
||||
receives the actual length of the external representation unless it
|
||||
has been passed as NULL. BUFFER may be NULL to query the required
|
||||
length. */
|
||||
gcry_error_t
|
||||
gcry_mpi_print (enum gcry_mpi_format format,
|
||||
unsigned char *buffer, size_t buflen,
|
||||
size_t *nwritten, struct gcry_mpi *a)
|
||||
{
|
||||
unsigned int nbits = mpi_get_nbits (a);
|
||||
size_t len;
|
||||
size_t dummy_nwritten;
|
||||
|
||||
if (!nwritten)
|
||||
nwritten = &dummy_nwritten;
|
||||
|
||||
len = buflen;
|
||||
*nwritten = 0;
|
||||
if (format == GCRYMPI_FMT_STD)
|
||||
{
|
||||
unsigned char *tmp;
|
||||
int extra = 0;
|
||||
unsigned int n;
|
||||
|
||||
if (a->sign)
|
||||
return gcry_error (GPG_ERR_INTERNAL); /* Can't handle it yet. */
|
||||
|
||||
tmp = _gcry_mpi_get_buffer (a, &n, NULL);
|
||||
if (!tmp)
|
||||
return gpg_error_from_syserror ();
|
||||
if (n && (*tmp & 0x80))
|
||||
{
|
||||
n++;
|
||||
extra=1;
|
||||
}
|
||||
|
||||
if (buffer && n > len)
|
||||
{
|
||||
/* The provided buffer is too short. */
|
||||
gcry_free (tmp);
|
||||
return gcry_error (GPG_ERR_TOO_SHORT);
|
||||
}
|
||||
if (buffer)
|
||||
{
|
||||
unsigned char *s = buffer;
|
||||
|
||||
if (extra)
|
||||
*s++ = 0;
|
||||
memcpy (s, tmp, n-extra);
|
||||
}
|
||||
gcry_free(tmp);
|
||||
*nwritten = n;
|
||||
return 0;
|
||||
}
|
||||
else if (format == GCRYMPI_FMT_USG)
|
||||
{
|
||||
unsigned int n = (nbits + 7)/8;
|
||||
|
||||
/* Note: We ignore the sign for this format. */
|
||||
/* FIXME: for performance reasons we should put this into
|
||||
mpi_aprint because we can then use the buffer directly. */
|
||||
if (buffer && n > len)
|
||||
return gcry_error (GPG_ERR_TOO_SHORT);
|
||||
if (buffer)
|
||||
{
|
||||
unsigned char *tmp;
|
||||
|
||||
tmp = _gcry_mpi_get_buffer (a, &n, NULL);
|
||||
if (!tmp)
|
||||
return gpg_error_from_syserror ();
|
||||
memcpy (buffer, tmp, n);
|
||||
gcry_free (tmp);
|
||||
}
|
||||
*nwritten = n;
|
||||
return 0;
|
||||
}
|
||||
else if (format == GCRYMPI_FMT_PGP)
|
||||
{
|
||||
unsigned int n = (nbits + 7)/8;
|
||||
|
||||
/* The PGP format can only handle unsigned integers. */
|
||||
if( a->sign )
|
||||
return gcry_error (GPG_ERR_INV_ARG);
|
||||
|
||||
if (buffer && n+2 > len)
|
||||
return gcry_error (GPG_ERR_TOO_SHORT);
|
||||
|
||||
if (buffer)
|
||||
{
|
||||
unsigned char *tmp;
|
||||
unsigned char *s = buffer;
|
||||
|
||||
s[0] = nbits >> 8;
|
||||
s[1] = nbits;
|
||||
|
||||
tmp = _gcry_mpi_get_buffer (a, &n, NULL);
|
||||
if (!tmp)
|
||||
return gpg_error_from_syserror ();
|
||||
memcpy (s+2, tmp, n);
|
||||
gcry_free (tmp);
|
||||
}
|
||||
*nwritten = n+2;
|
||||
return 0;
|
||||
}
|
||||
else if (format == GCRYMPI_FMT_SSH)
|
||||
{
|
||||
unsigned char *tmp;
|
||||
int extra = 0;
|
||||
unsigned int n;
|
||||
|
||||
if (a->sign)
|
||||
return gcry_error (GPG_ERR_INTERNAL); /* Can't handle it yet. */
|
||||
|
||||
tmp = _gcry_mpi_get_buffer (a, &n, NULL);
|
||||
if (!tmp)
|
||||
return gpg_error_from_syserror ();
|
||||
if (n && (*tmp & 0x80))
|
||||
{
|
||||
n++;
|
||||
extra=1;
|
||||
}
|
||||
|
||||
if (buffer && n+4 > len)
|
||||
{
|
||||
gcry_free(tmp);
|
||||
return gcry_error (GPG_ERR_TOO_SHORT);
|
||||
}
|
||||
|
||||
if (buffer)
|
||||
{
|
||||
unsigned char *s = buffer;
|
||||
|
||||
*s++ = n >> 24;
|
||||
*s++ = n >> 16;
|
||||
*s++ = n >> 8;
|
||||
*s++ = n;
|
||||
if (extra)
|
||||
*s++ = 0;
|
||||
|
||||
memcpy (s, tmp, n-extra);
|
||||
}
|
||||
gcry_free (tmp);
|
||||
*nwritten = 4+n;
|
||||
return 0;
|
||||
}
|
||||
else if (format == GCRYMPI_FMT_HEX)
|
||||
{
|
||||
unsigned char *tmp;
|
||||
int i;
|
||||
int extra = 0;
|
||||
unsigned int n = 0;
|
||||
|
||||
tmp = _gcry_mpi_get_buffer (a, &n, NULL);
|
||||
if (!tmp)
|
||||
return gpg_error_from_syserror ();
|
||||
if (!n || (*tmp & 0x80))
|
||||
extra = 2;
|
||||
|
||||
if (buffer && 2*n + extra + !!a->sign + 1 > len)
|
||||
{
|
||||
gcry_free(tmp);
|
||||
return gcry_error (GPG_ERR_TOO_SHORT);
|
||||
}
|
||||
if (buffer)
|
||||
{
|
||||
unsigned char *s = buffer;
|
||||
|
||||
if (a->sign)
|
||||
*s++ = '-';
|
||||
if (extra)
|
||||
{
|
||||
*s++ = '0';
|
||||
*s++ = '0';
|
||||
}
|
||||
|
||||
for (i=0; i < n; i++)
|
||||
{
|
||||
unsigned int c = tmp[i];
|
||||
|
||||
*s++ = (c >> 4) < 10? '0'+(c>>4) : 'A'+(c>>4)-10 ;
|
||||
c &= 15;
|
||||
*s++ = c < 10? '0'+c : 'A'+c-10 ;
|
||||
}
|
||||
*s++ = 0;
|
||||
*nwritten = s - buffer;
|
||||
}
|
||||
else
|
||||
{
|
||||
*nwritten = 2*n + extra + !!a->sign + 1;
|
||||
}
|
||||
gcry_free (tmp);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
return gcry_error (GPG_ERR_INV_ARG);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Like gcry_mpi_print but this function allocates the buffer itself.
|
||||
* The caller has to supply the address of a pointer. NWRITTEN may be
|
||||
* NULL.
|
||||
*/
|
||||
gcry_error_t
|
||||
gcry_mpi_aprint (enum gcry_mpi_format format,
|
||||
unsigned char **buffer, size_t *nwritten,
|
||||
struct gcry_mpi *a)
|
||||
{
|
||||
size_t n;
|
||||
gcry_error_t rc;
|
||||
|
||||
*buffer = NULL;
|
||||
rc = gcry_mpi_print (format, NULL, 0, &n, a);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
*buffer = mpi_is_secure(a) ? gcry_malloc_secure (n) : gcry_malloc (n);
|
||||
if (!*buffer)
|
||||
return gpg_error_from_syserror ();
|
||||
rc = gcry_mpi_print( format, *buffer, n, &n, a );
|
||||
if (rc)
|
||||
{
|
||||
gcry_free(*buffer);
|
||||
*buffer = NULL;
|
||||
}
|
||||
else if (nwritten)
|
||||
*nwritten = n;
|
||||
return rc;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue