BeeCrypt 4.2.1
mp.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2002, 2003 Bob Deblier
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 */
19
41#ifndef _MP_H
42#define _MP_H
43
44#include "beecrypt/api.h"
45#include "beecrypt/mpopt.h"
46
47#define MP_HWBITS (MP_WBITS >> 1)
48#define MP_WBYTES (MP_WBITS >> 3)
49#define MP_WNIBBLES (MP_WBITS >> 2)
50
51#if (MP_WBITS == 64)
52# define MP_WORDS_TO_BITS(x) ((x) << 6)
53# define MP_WORDS_TO_NIBBLES(x) ((x) << 4)
54# define MP_WORDS_TO_BYTES(x) ((x) << 3)
55# define MP_BITS_TO_WORDS(x) ((x) >> 6)
56# define MP_NIBBLES_TO_WORDS(x) ((x) >> 4)
57# define MP_BYTES_TO_WORDS(x) ((x) >> 3)
58#elif (MP_WBITS == 32)
59# define MP_WORDS_TO_BITS(x) ((x) << 5)
60# define MP_WORDS_TO_NIBBLES(x) ((x) << 3)
61# define MP_WORDS_TO_BYTES(x) ((x) << 2)
62# define MP_BITS_TO_WORDS(x) ((x) >> 5)
63# define MP_NIBBLES_TO_WORDS(x) ((x) >> 3)
64# define MP_BYTES_TO_WORDS(x) ((x) >> 2)
65#else
66# error
67#endif
68
69#define MP_MSBMASK (((mpw) 0x1) << (MP_WBITS-1))
70#define MP_LSBMASK ((mpw) 0x1)
71#define MP_ALLMASK ~((mpw) 0x0)
72
73#ifdef __cplusplus
74extern "C" {
75#endif
76
77#ifndef ASM_MPCOPY
78# define mpcopy(size, dst, src) memcpy(dst, src, MP_WORDS_TO_BYTES(size))
79#else
81void mpcopy(size_t size, mpw* dest, const mpw* src);
82#endif
83
84#ifndef ASM_MPMOVE
85# define mpmove(size, dst, src) memmove(dst, src, MP_WORDS_TO_BYTES(size))
86#else
88void mpmove(size_t size, mpw* dest, const mpw* src);
89#endif
90
97void mpzero(size_t size, mpw* data);
98
107void mpfill(size_t size, mpw* data, mpw fill);
108
117int mpodd (size_t size, const mpw* data);
118
127int mpeven(size_t size, const mpw* data);
128
137int mpz (size_t size, const mpw* data);
138
147int mpnz (size_t size, const mpw* data);
148
159int mpeq (size_t size, const mpw* xdata, const mpw* ydata);
160
171int mpne (size_t size, const mpw* xdata, const mpw* ydata);
172
184int mpgt (size_t size, const mpw* xdata, const mpw* ydata);
185
197int mplt (size_t size, const mpw* xdata, const mpw* ydata);
198
210int mpge (size_t size, const mpw* xdata, const mpw* ydata);
211
223int mple (size_t size, const mpw* xdata, const mpw* ydata);
224
234int mpcmp(size_t size, const mpw* xdata, const mpw* ydata);
235
247int mpeqx(size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata);
248
260int mpnex(size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata);
261
274int mpgtx(size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata);
275
288int mpltx(size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata);
289
302int mpgex(size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata);
303
316int mplex(size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata);
317
327int mpcmpx(size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata);
328
338int mpisone(size_t size, const mpw* data);
339
349int mpistwo(size_t size, const mpw* data);
350
360int mpleone(size_t size, const mpw* data);
361
372int mpeqmone(size_t size, const mpw* xdata, const mpw* ydata);
373
383int mpmsbset(size_t size, const mpw* data);
384
394int mplsbset(size_t size, const mpw* data);
395
403void mpsetmsb(size_t size, mpw* data);
404
412void mpsetlsb(size_t size, mpw* data);
413
421void mpclrmsb(size_t size, mpw* data);
422
430void mpclrlsb(size_t size, mpw* data);
431
440void mpand(size_t size, mpw* xdata, const mpw* ydata);
441
450void mpor(size_t size, mpw* xdata, const mpw* ydata);
451
460void mpxor(size_t size, mpw* xdata, const mpw* ydata);
461
468void mpnot(size_t size, mpw* data);
469
479void mpsetw(size_t size, mpw* xdata, mpw y);
480
490void mpsetws(size_t size, mpw* xdata, size_t y);
491
502void mpsetx(size_t xsize, mpw* xdata, size_t ysize, const mpw* ydata);
503
513int mpaddw(size_t size, mpw* xdata, mpw y);
514
524int mpadd (size_t size, mpw* xdata, const mpw* ydata);
525
536int mpaddx(size_t xsize, mpw* xdata, size_t ysize, const mpw* ydata);
537
547int mpsubw(size_t size, mpw* xdata, mpw y);
548
558int mpsub (size_t size, mpw* xdata, const mpw* ydata);
559
570int mpsubx(size_t xsize, mpw* xdata, size_t ysize, const mpw* ydata);
571
573int mpmultwo(size_t size, mpw* data);
574
581void mpneg(size_t size, mpw* data);
582
590size_t mpsize(size_t size, const mpw* data);
591
599size_t mpbits(size_t size, const mpw* data);
600
602size_t mpmszcnt(size_t size, const mpw* data);
603
605size_t mplszcnt(size_t size, const mpw* data);
606
608void mplshift(size_t size, mpw* data, size_t count);
609
611void mprshift(size_t size, mpw* data, size_t count);
612
614size_t mprshiftlsz(size_t size, mpw* data);
615
617size_t mpnorm(size_t size, mpw* data);
618
620void mpdivtwo (size_t size, mpw* data);
621
623void mpsdivtwo(size_t size, mpw* data);
624
640mpw mpsetmul (size_t size, mpw* result, const mpw* data, mpw y);
641
656mpw mpaddmul (size_t size, mpw* result, const mpw* data, mpw y);
657
663void mpaddsqrtrc(size_t size, mpw* result, const mpw* data);
664
669void mpmul(mpw* result, size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata);
670
675void mpsqr(mpw* result, size_t size, const mpw* data);
676
678void mpgcd_w(size_t size, const mpw* xdata, const mpw* ydata, mpw* result, mpw* wksp);
679
681int mpextgcd_w(size_t size, const mpw* xdata, const mpw* ydata, mpw* result, mpw* wksp);
682
684mpw mppndiv(mpw xhi, mpw xlo, mpw y);
685
687void mpmod (mpw* result, size_t xsize, const mpw* xdata, size_t ysize, const mpw*ydata, mpw* wksp);
688
690void mpndivmod(mpw* result, size_t xsize, const mpw* xdata, size_t ysize, const mpw* ydata, mpw* wksp);
691
692/*
693 * Output Routines
694 */
695
697void mpprint(size_t size, const mpw* data);
698
700void mpprintln(size_t size, const mpw* data);
701
703void mpfprint(FILE* f, size_t size, const mpw* data);
704
706void mpfprintln(FILE* f, size_t size, const mpw* data);
707
708/*
709 * Conversion Routines
710 */
711
713int i2osp(byte* osdata, size_t ossize, const mpw* idata, size_t isize);
714
716int os2ip(mpw* idata, size_t isize, const byte* osdata, size_t ossize);
717
719int hs2ip(mpw* idata, size_t isize, const char* hsdata, size_t hssize);
720
721#ifdef __cplusplus
722}
723#endif
724
725#endif
BeeCrypt API, portability headers.
#define BEECRYPTAPI
Definition api.h:52
uint64_t mpw
Definition api.h:87
int mpgex(size_t xsize, const mpw *xdata, size_t ysize, const mpw *ydata)
This function tests if the first of two multi-precision integers of different size is greater than or...
int mpistwo(size_t size, const mpw *data)
This function tests if the value of a multi-precision integer is equal to two.
size_t mpnorm(size_t size, mpw *data)
mpw mppndiv(mpw xhi, mpw xlo, mpw y)
int mpaddx(size_t xsize, mpw *xdata, size_t ysize, const mpw *ydata)
This function adds two multi-precision integers of different size. The performed operation in pseudoc...
int mpmsbset(size_t size, const mpw *data)
This function tests if the most significant bit of a multi-precision integer is set.
void mpfill(size_t size, mpw *data, mpw fill)
This function fills each word of a multi-precision integer with a given value.
void mpclrmsb(size_t size, mpw *data)
This function clears the most significant bit of a multi-precision integer.
size_t mprshiftlsz(size_t size, mpw *data)
int mpltx(size_t xsize, const mpw *xdata, size_t ysize, const mpw *ydata)
This function tests if the first of two multi-precision integers of different size is less than the s...
int os2ip(mpw *idata, size_t isize, const byte *osdata, size_t ossize)
int mpadd(size_t size, mpw *xdata, const mpw *ydata)
This function adds two multi-precision integers of equal size. The performed operation is in pseudoco...
size_t mpmszcnt(size_t size, const mpw *data)
int mpsub(size_t size, mpw *xdata, const mpw *ydata)
This function subtracts two multi-precision integers of equal size. The performed operation in pseudo...
size_t mplszcnt(size_t size, const mpw *data)
int mpsubw(size_t size, mpw *xdata, mpw y)
This function subtracts one word to a multi-precision integer. The performed operation in pseudocode:...
size_t mpsize(size_t size, const mpw *data)
This function returns the true size of a multi-precision integer, after stripping leading zero words.
void mpaddsqrtrc(size_t size, mpw *result, const mpw *data)
This function is used in the calculation of a multi-precision squaring.
void mpgcd_w(size_t size, const mpw *xdata, const mpw *ydata, mpw *result, mpw *wksp)
void mpneg(size_t size, mpw *data)
This function negates a multi-precision integer.
void mpxor(size_t size, mpw *xdata, const mpw *ydata)
This function computes the bit-wise XOR of two multi-precision integers. Modifies xdata.
void mpand(size_t size, mpw *xdata, const mpw *ydata)
This function computes the bit-wise AND of two multi-precision integers. Modifies xdata.
mpw mpsetmul(size_t size, mpw *result, const mpw *data, mpw y)
This function performs a multi-precision multiply-setup.
int mpodd(size_t size, const mpw *data)
This functions tests if a multi-precision integer is odd.
int mpeqmone(size_t size, const mpw *xdata, const mpw *ydata)
This function tests if multi-precision integer x is equal to y minus one.
int hs2ip(mpw *idata, size_t isize, const char *hsdata, size_t hssize)
void mpsqr(mpw *result, size_t size, const mpw *data)
This function computes a full multi-precision square.
int mplsbset(size_t size, const mpw *data)
This function tests if the leiast significant bit of a multi-precision integer is set.
int mpextgcd_w(size_t size, const mpw *xdata, const mpw *ydata, mpw *result, mpw *wksp)
void mpmod(mpw *result, size_t xsize, const mpw *xdata, size_t ysize, const mpw *ydata, mpw *wksp)
void mpsdivtwo(size_t size, mpw *data)
void mpdivtwo(size_t size, mpw *data)
void mpnot(size_t size, mpw *data)
This function flips all bits of a multi-precision integer.
void mpfprint(FILE *f, size_t size, const mpw *data)
void mpor(size_t size, mpw *xdata, const mpw *ydata)
This function computes the bit-wise OR of two multi-precision integers. Modifies xdata.
void mplshift(size_t size, mpw *data, size_t count)
void mpsetws(size_t size, mpw *xdata, size_t y)
This function sets the value of a multi-precision integer to the given word. The given value is copie...
int mpz(size_t size, const mpw *data)
This function tests if a multi-precision integer is zero.
void mpmul(mpw *result, size_t xsize, const mpw *xdata, size_t ysize, const mpw *ydata)
This function computes a full multi-precision product.
int mpeven(size_t size, const mpw *data)
This function tests if a multi-precision integer is even.
void mpsetmsb(size_t size, mpw *data)
This function sets the most significant bit of a multi-precision integer.
#define mpmove(size, dst, src)
Definition mp.h:85
int mpnex(size_t xsize, const mpw *xdata, size_t ysize, const mpw *ydata)
This function tests if two multi-precision integers of different size are equal.
size_t mpbits(size_t size, const mpw *data)
This function returns the number of significant bits in a multi-precision integer.
int mpcmpx(size_t xsize, const mpw *xdata, size_t ysize, const mpw *ydata)
This function performs a comparison of two multi-precision integers of the different size.
void mpprint(size_t size, const mpw *data)
void mpsetlsb(size_t size, mpw *data)
This function sets the least significant bit of a multi-precision integer.
int mpmultwo(size_t size, mpw *data)
void mprshift(size_t size, mpw *data, size_t count)
void mpfprintln(FILE *f, size_t size, const mpw *data)
int mpcmp(size_t size, const mpw *xdata, const mpw *ydata)
This function performs a comparison of two multi-precision integers of the same size.
int mpaddw(size_t size, mpw *xdata, mpw y)
This function adds one word to a multi-precision integer. The performed operation is in pseudocode: x...
void mpsetw(size_t size, mpw *xdata, mpw y)
This function sets the value of a multi-precision integer to the given word. The given value is copie...
int mplex(size_t xsize, const mpw *xdata, size_t ysize, const mpw *ydata)
This function tests if the first of two multi-precision integers of different size is less than or eq...
int mpnz(size_t size, const mpw *data)
This function tests if a multi-precision integer is not zero.
int mpge(size_t size, const mpw *xdata, const mpw *ydata)
This function tests if the first of two multi-precision integers of the same size is greater than or ...
int mpgtx(size_t xsize, const mpw *xdata, size_t ysize, const mpw *ydata)
This function tests if the first of two multi-precision integers of different size is greater than th...
void mpprintln(size_t size, const mpw *data)
int mpgt(size_t size, const mpw *xdata, const mpw *ydata)
This function tests if the first of two multi-precision integers of the same size is greater than the...
int mpne(size_t size, const mpw *xdata, const mpw *ydata)
This function tests if two multi-precision integers of the same size differ.
int mpsubx(size_t xsize, mpw *xdata, size_t ysize, const mpw *ydata)
This function subtracts two multi-precision integers of different size. The performed operation in ps...
int mpeq(size_t size, const mpw *xdata, const mpw *ydata)
This function tests if two multi-precision integers of the same size are equal.
int i2osp(byte *osdata, size_t ossize, const mpw *idata, size_t isize)
int mpisone(size_t size, const mpw *data)
This functions tests if the value of a multi-precision integer is equal to one.
void mpzero(size_t size, mpw *data)
This function zeroes a multi-precision integer of a given size.
int mpleone(size_t size, const mpw *data)
This function tests if the value of a multi-precision integer is less than or equal to one.
void mpndivmod(mpw *result, size_t xsize, const mpw *xdata, size_t ysize, const mpw *ydata, mpw *wksp)
int mplt(size_t size, const mpw *xdata, const mpw *ydata)
This function tests if the first of two multi-precision integers of the same size is less than the se...
int mpeqx(size_t xsize, const mpw *xdata, size_t ysize, const mpw *ydata)
This function tests if two multi-precision integers of different size are equal.
mpw mpaddmul(size_t size, mpw *result, const mpw *data, mpw y)
This function performs a mult-precision multiply-accumulate.
void mpsetx(size_t xsize, mpw *xdata, size_t ysize, const mpw *ydata)
This function set the value of the first multi-precision integer to the second, truncating the most s...
int mple(size_t size, const mpw *xdata, const mpw *ydata)
This function tests if the first of two multi-precision integers of the same size is less than or equ...
void mpclrlsb(size_t size, mpw *data)
This function clears the least significant bit of a multi-precision integer.
#define mpcopy(size, dst, src)
Definition mp.h:78
Multi-precision integer optimization definitions.