00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00041
#ifndef _MP_H
00042
#define _MP_H
00043
00044
#include "beecrypt.api.h"
00045
#include "mpopt.h"
00046
00047 #define MP_HWBITS (MP_WBITS >> 1)
00048 #define MP_WBYTES (MP_WBITS >> 3)
00049 #define MP_WNIBBLES (MP_WBITS >> 2)
00050
00051
#if (MP_WBITS == 64)
00052
# define MP_WORDS_TO_BITS(x) ((x) << 6)
00053
# define MP_WORDS_TO_NIBBLES(x) ((x) << 4)
00054
# define MP_WORDS_TO_BYTES(x) ((x) << 3)
00055
# define MP_BITS_TO_WORDS(x) ((x) >> 6)
00056
# define MP_NIBBLES_TO_WORDS(x) ((x) >> 4)
00057
# define MP_BYTES_TO_WORDS(x) ((x) >> 3)
00058
#elif (MP_WBITS == 32)
00059 # define MP_WORDS_TO_BITS(x) ((x) << 5)
00060 # define MP_WORDS_TO_NIBBLES(x) ((x) << 3)
00061 # define MP_WORDS_TO_BYTES(x) ((x) << 2)
00062 # define MP_BITS_TO_WORDS(x) ((x) >> 5)
00063 # define MP_NIBBLES_TO_WORDS(x) ((x) >> 3)
00064 # define MP_BYTES_TO_WORDS(x) ((x) >> 2)
00065
#else
00066
# error
00067
#endif
00068
00069 #define MP_MSBMASK (((mpw) 0x1) << (MP_WBITS-1))
00070 #define MP_LSBMASK ((mpw) 0x1)
00071 #define MP_ALLMASK ~((mpw) 0x0)
00072
00073
#ifdef __cplusplus
00074
extern "C" {
00075
#endif
00076
00077
#ifndef ASM_MPCOPY
00078 # define mpcopy(size, dst, src) memcpy(dst, src, MP_WORDS_TO_BYTES(size))
00079
#else
00080
BEECRYPTAPI
00081
void mpcopy(size_t size, mpw* dest,
const mpw* src);
00082
#endif
00083
00084
#ifndef ASM_MPMOVE
00085 # define mpmove(size, dst, src) memmove(dst, src, MP_WORDS_TO_BYTES(size))
00086
#else
00087
BEECRYPTAPI
00088
void mpmove(size_t size, mpw* dest,
const mpw* src);
00089
#endif
00090
00096
BEECRYPTAPI
00097
void mpzero(size_t size, mpw* data);
00098
00106
BEECRYPTAPI
00107
void mpfill(size_t size, mpw* data, mpw fill);
00108
00116
BEECRYPTAPI
00117
int mpodd (size_t size,
const mpw* data);
00118
00126
BEECRYPTAPI
00127
int mpeven(size_t size,
const mpw* data);
00128
00136
BEECRYPTAPI
00137
int mpz (size_t size,
const mpw* data);
00138
00146
BEECRYPTAPI
00147
int mpnz (size_t size,
const mpw* data);
00148
00158
BEECRYPTAPI
00159
int mpeq (size_t size,
const mpw* xdata,
const mpw* ydata);
00160
00170
BEECRYPTAPI
00171
int mpne (size_t size,
const mpw* xdata,
const mpw* ydata);
00172
00183
BEECRYPTAPI
00184
int mpgt (size_t size,
const mpw* xdata,
const mpw* ydata);
00185
00196
BEECRYPTAPI
00197
int mplt (size_t size,
const mpw* xdata,
const mpw* ydata);
00198
00209
BEECRYPTAPI
00210
int mpge (size_t size,
const mpw* xdata,
const mpw* ydata);
00211
00222
BEECRYPTAPI
00223
int mple (size_t size,
const mpw* xdata,
const mpw* ydata);
00224
00235
BEECRYPTAPI
00236
int mpeqx(size_t xsize,
const mpw* xdata, size_t ysize,
const mpw* ydata);
00237
00248
BEECRYPTAPI
00249
int mpnex(size_t xsize,
const mpw* xdata, size_t ysize,
const mpw* ydata);
00250
00262
BEECRYPTAPI
00263
int mpgtx(size_t xsize,
const mpw* xdata, size_t ysize,
const mpw* ydata);
00264
00276
BEECRYPTAPI
00277
int mpltx(size_t xsize,
const mpw* xdata, size_t ysize,
const mpw* ydata);
00278
00290
BEECRYPTAPI
00291
int mpgex(size_t xsize,
const mpw* xdata, size_t ysize,
const mpw* ydata);
00292
00304
BEECRYPTAPI
00305
int mplex(size_t xsize,
const mpw* xdata, size_t ysize,
const mpw* ydata);
00306
00315
BEECRYPTAPI
00316
int mpisone(size_t size,
const mpw* data);
00317
00326
BEECRYPTAPI
00327
int mpistwo(size_t size,
const mpw* data);
00328
00337
BEECRYPTAPI
00338
int mpleone(size_t size,
const mpw* data);
00339
00349
BEECRYPTAPI
00350
int mpeqmone(size_t size,
const mpw* xdata,
const mpw* ydata);
00351
00360
BEECRYPTAPI
00361
int mpmsbset(size_t size,
const mpw* data);
00362
00371
BEECRYPTAPI
00372
int mplsbset(size_t size,
const mpw* data);
00373
00380
BEECRYPTAPI
00381
void mpsetmsb(size_t size, mpw* data);
00382
00389
BEECRYPTAPI
00390
void mpsetlsb(size_t size, mpw* data);
00391
00398
BEECRYPTAPI
00399
void mpclrmsb(size_t size, mpw* data);
00400
00407
BEECRYPTAPI
00408
void mpclrlsb(size_t size, mpw* data);
00409
00410
BEECRYPTAPI
00411
void mpand(size_t, mpw*,
const mpw*);
00412
00413
BEECRYPTAPI
00414
void mpor(size_t, mpw*,
const mpw*);
00415
00416
BEECRYPTAPI
00417
void mpxor(size_t, mpw*,
const mpw*);
00418
00424
BEECRYPTAPI
00425
void mpnot(size_t size, mpw* data);
00426
00435
BEECRYPTAPI
00436
void mpsetw(size_t size, mpw* xdata, mpw y);
00437
00447
void mpsetx(size_t xsize, mpw* xdata, size_t ysize,
const mpw* ydata);
00448
00457
BEECRYPTAPI
00458
int mpaddw(size_t size, mpw* xdata, mpw y);
00459
00468
BEECRYPTAPI
00469
int mpadd (size_t size, mpw* xdata,
const mpw* ydata);
00470
00480
BEECRYPTAPI
00481
int mpaddx(size_t xsize, mpw* xdata, size_t ysize,
const mpw* ydata);
00482
00491
BEECRYPTAPI
00492
int mpsubw(size_t size, mpw* xdata, mpw y);
00493
00502
BEECRYPTAPI
00503
int mpsub (size_t size, mpw* xdata,
const mpw* ydata);
00504
00514
BEECRYPTAPI
00515
int mpsubx(size_t xsize, mpw* xdata, size_t ysize,
const mpw* ydata);
00516
00517
BEECRYPTAPI
00518
int mpmultwo(size_t size, mpw* data);
00519
00520
BEECRYPTAPI
00521
void mpneg(size_t size, mpw* data);
00522
00523
BEECRYPTAPI
00524 size_t
mpsize(size_t size,
const mpw* data);
00525
00526
BEECRYPTAPI
00527 size_t
mpbits(size_t size,
const mpw* data);
00528
00529
BEECRYPTAPI
00530 size_t
mpmszcnt(size_t size,
const mpw* data);
00531
00532
BEECRYPTAPI
00533 size_t
mplszcnt(size_t size,
const mpw* data);
00534
00535
BEECRYPTAPI
00536
void mplshift(size_t size, mpw* data, size_t count);
00537
00538
BEECRYPTAPI
00539
void mprshift(size_t size, mpw* data, size_t count);
00540
00541
BEECRYPTAPI
00542 size_t
mprshiftlsz(size_t size, mpw* data);
00543
00544
BEECRYPTAPI
00545 size_t
mpnorm(size_t size, mpw* data);
00546
00547
BEECRYPTAPI
00548
void mpdivtwo (size_t size, mpw* data);
00549
00550
BEECRYPTAPI
00551
void mpsdivtwo(size_t size, mpw* data);
00552
00567
BEECRYPTAPI
00568
mpw mpsetmul (size_t size, mpw* result,
const mpw* data, mpw y);
00569
00583
BEECRYPTAPI
00584
mpw mpaddmul (size_t size, mpw* result,
const mpw* data, mpw y);
00585
00590
BEECRYPTAPI
00591
void mpaddsqrtrc(size_t, mpw*,
const mpw*);
00592
00596
BEECRYPTAPI
00597
void mpmul(mpw*, size_t,
const mpw*, size_t,
const mpw*);
00601
BEECRYPTAPI
00602
void mpsqr(mpw*, size_t,
const mpw*);
00603
00604
BEECRYPTAPI
00605
void mpgcd_w(size_t,
const mpw*,
const mpw*, mpw*, mpw*);
00606
BEECRYPTAPI
00607
int mpextgcd_w(size_t,
const mpw*,
const mpw*, mpw*, mpw*);
00608
00609
BEECRYPTAPI
00610
mpw mppndiv(mpw, mpw, mpw);
00611
00612
BEECRYPTAPI
00613
void mpnmod(mpw*, size_t,
const mpw*, size_t,
const mpw*, mpw*);
00614
00615
BEECRYPTAPI
00616
void mpmod (mpw*, size_t,
const mpw*, size_t,
const mpw*, mpw*);
00617
00618
BEECRYPTAPI
00619
void mpndivmod(mpw*, size_t,
const mpw*, size_t,
const mpw*, mpw*);
00620
00621
00622
00623
00624
00625
BEECRYPTAPI
00626
void mpprint(size_t size,
const mpw* data);
00627
00628
BEECRYPTAPI
00629
void mpprintln(size_t size,
const mpw* data);
00630
00631
BEECRYPTAPI
00632
void mpfprint(FILE* f, size_t size,
const mpw* data);
00633
00634
BEECRYPTAPI
00635
void mpfprintln(FILE* f, size_t size,
const mpw* data);
00636
00637
00638
00639
00640
00641
BEECRYPTAPI
00642
int os2ip(mpw*, size_t,
const byte*, size_t);
00643
00644
BEECRYPTAPI
00645
int i2osp(byte*, size_t,
const mpw*, size_t);
00646
00647
BEECRYPTAPI
00648
int hs2ip(mpw*, size_t,
const char*, size_t);
00649
00650
#ifdef __cplusplus
00651
}
00652
#endif
00653
00654
#endif