📄 miracl.h
字号:
#ifndef MIRACL_H
#define MIRACL_H
/*
* main MIRACL header - miracl.h.
*
* Copyright (c) 1988-2001 Shamus Software Ltd.
*/
#include "mirdef.h"
/* Some modifiable defaults... */
/* Use a smaller buffer if space is limited, don't be so wasteful */
#ifdef MR_STATIC
#define MR_DEFAULT_BUFFER_SIZE 256
#else
#define MR_DEFAULT_BUFFER_SIZE 1024
#endif
/* see mrecgf2m.c */
#define MR_KARATSUBA 2
#ifdef MR_FLASH
#define MR_SPACES 29
#else
#define MR_SPACES 28
#endif
/* size of bigs and elliptic curve points for memory allocation from stack or heap */
#define MR_ROUNDUP(a,b) ((a)-1)/(b)+1
#define MR_SL sizeof(long)
#ifdef MR_STATIC
#define MR_SIZE (((sizeof(struct bigtype)+(MR_STATIC+2)*sizeof(mr_utype))-1)/MR_SL+1)*MR_SL
#define MR_BIG_RESERVE(n) ((n)*MR_SIZE+MR_SL)
#ifdef MR_AFFINE_ONLY
#define MR_ESIZE (((sizeof(epoint)+MR_BIG_RESERVE(2))-1)/MR_SL+1)*MR_SL
#else
#define MR_ESIZE (((sizeof(epoint)+MR_BIG_RESERVE(3))-1)/MR_SL+1)*MR_SL
#endif
#define MR_ECP_RESERVE(n) ((n)*MR_ESIZE+MR_SL)
#endif
/* useful macro to convert size of big in words, to size of required structure */
#define mr_size(n) (((sizeof(struct bigtype)+((n)+2)*sizeof(mr_utype))-1)/MR_SL+1)*MR_SL
#define mr_big_reserve(n,m) ((n)*mr_size(m)+MR_SL)
#ifdef MR_AFFINE_ONLY
#define mr_esize(n) (((sizeof(epoint)+mr_big_reserve(2,(n)))-1)/MR_SL+1)*MR_SL
#else
#define mr_esize(n) (((sizeof(epoint)+mr_big_reserve(3,(n)))-1)/MR_SL+1)*MR_SL
#endif
#define mr_ecp_reserve(n,m) ((n)*mr_esize(m)+MR_SL)
/* if basic library is static, make sure and use static C++ */
#ifdef MR_STATIC
#ifndef BIGS
#define BIGS MR_STATIC
#endif
#ifndef ZZNS
#define ZZNS MR_STATIC
#endif
#ifndef GF2MS
#define GF2MS MR_STATIC
#endif
#endif
#ifdef __ia64__
#if MIRACL==64
#define MR_ITANIUM
#include <ia64intrin.h>
#endif
#endif
#ifdef MR_FP
#include <math.h>
#endif
#ifndef MR_NO_FILE_IO
#include <stdio.h>
#endif
/* error returns */
#define MR_ERR_BASE_TOO_BIG 1
#define MR_ERR_DIV_BY_ZERO 2
#define MR_ERR_OVERFLOW 3
#define MR_ERR_NEG_RESULT 4
#define MR_ERR_BAD_FORMAT 5
#define MR_ERR_BAD_BASE 6
#define MR_ERR_BAD_PARAMETERS 7
#define MR_ERR_OUT_OF_MEMORY 8
#define MR_ERR_NEG_ROOT 9
#define MR_ERR_NEG_POWER 10
#define MR_ERR_BAD_ROOT 11
#define MR_ERR_INT_OP 12
#define MR_ERR_FLASH_OVERFLOW 13
#define MR_ERR_TOO_BIG 14
#define MR_ERR_NEG_LOG 15
#define MR_ERR_DOUBLE_FAIL 16
#define MR_ERR_IO_OVERFLOW 17
#define MR_ERR_NO_MIRSYS 18
#define MR_ERR_BAD_MODULUS 19
#define MR_ERR_NO_MODULUS 20
#define MR_ERR_EXP_TOO_BIG 21
#define MR_ERR_NOT_SUPPORTED 22
#define MR_ERR_NOT_DOUBLE_LEN 23
#define MR_ERR_NOT_IRREDUC 24
#define MR_ERR_NO_ROUNDING 25
#define MR_ERR_NOT_BINARY 26
#define MR_ERR_NO_BASIS 27
#define MR_ERR_COMPOSITE_MODULUS 28
/* some useful definitions */
#define forever for(;;)
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#define OFF 0
#define ON 1
#define PLUS 1
#define MINUS (-1)
#define MR_MAXDEPTH 24
/* max routine stack depth */
/* big and flash variables consist of an encoded length, *
* and an array of mr_smalls containing the digits */
typedef int BOOL;
#define MR_BYTE unsigned char
#ifdef MR_BITSINCHAR
#if MR_BITSINCHAR == 8
#define MR_TOBYTE(x) ((MR_BYTE)(x))
#else
#define MR_TOBYTE(x) ((MR_BYTE)((x)&0xFF))
#endif
#else
#define MR_TOBYTE(x) ((MR_BYTE)(x))
#endif
#ifdef MR_FP
typedef mr_utype mr_small;
#ifdef mr_dltype
typedef mr_dltype mr_large;
#endif
#define MR_DIV(a,b) (modf((a)/(b),&dres),dres)
#ifdef MR_FP_ROUNDING
/* slightly dicey - for example the optimizer might remove the MAGIC ! */
#define MR_LROUND(a) ( ( (a) + MR_MAGIC ) - MR_MAGIC )
#else
#define MR_LROUND(a) (modfl((a),&ldres),ldres)
#endif
#define MR_REMAIN(a,b) ((a)-(b)*MR_DIV((a),(b)))
#else
typedef unsigned mr_utype mr_small;
#ifdef mr_dltype
typedef unsigned mr_dltype mr_large;
#endif
#define MR_DIV(a,b) ((a)/(b))
#define MR_REMAIN(a,b) ((a)%(b))
#define MR_LROUND(a) ((a))
#endif
struct bigtype
{
mr_unsign32 len;
mr_small *w;
};
typedef struct bigtype *big;
typedef big zzn;
typedef big flash;
#define MR_MSBIT ((mr_unsign32)1<<31)
#define MR_OBITS (MR_MSBIT-1)
#if MIRACL >= MR_IBITS
#define MR_TOOBIG (1<<(MR_IBITS-2))
#else
#define MR_TOOBIG (1<<(MIRACL-1))
#endif
#ifdef MR_FLASH
#define MR_EBITS (8*sizeof(double) - MR_FLASH)
/* no of Bits per double exponent */
#define MR_BTS 16
#define MR_MSK 0xFFFF
#endif
#define MR_HASH_BYTES 20
/* Marsaglia & Zaman Random number generator */
/* constants alternatives */
#define NK 37 /* 21 */
#define NJ 24 /* 6 */
#define NV 14 /* 8 */
#ifdef mr_dltype
#ifdef MR_LITTLE_ENDIAN
#define MR_BOT 0
#define MR_TOP 1
#endif
#ifdef MR_BIG_ENDIAN
#define MR_BOT 1
#define MR_TOP 0
#endif
union doubleword
{
mr_large d;
mr_small h[2];
};
#endif
/* chinese remainder theorem structures */
typedef struct {
big *C;
big *V;
big *M;
int NP;
} big_chinese;
typedef struct {
mr_utype *C;
mr_utype *V;
mr_utype *M;
int NP;
} small_chinese;
/* Cryptographically strong pseudo-random number generator */
typedef struct {
mr_unsign32 ira[NK]; /* random number... */
int rndptr; /* ...array & pointer */
mr_unsign32 borrow;
int pool_ptr;
char pool[MR_HASH_BYTES]; /* random pool */
} csprng;
/* secure hash Algorithm structure */
typedef struct {
mr_unsign32 length[2];
mr_unsign32 h[8];
mr_unsign32 w[80];
} sha256;
typedef sha256 sha;
#ifdef mr_unsign64
typedef struct {
mr_unsign64 length[2];
mr_unsign64 h[8];
mr_unsign64 w[80];
} sha512;
typedef sha512 sha384;
#endif
/* Symmetric Encryption algorithm structure */
#define MR_ECB 0
#define MR_CBC 1
#define MR_CFB1 2
#define MR_CFB2 3
#define MR_CFB4 5
#define MR_PCFB1 10
#define MR_PCFB2 11
#define MR_PCFB4 13
#define MR_OFB1 14
#define MR_OFB2 15
#define MR_OFB4 17
#define MR_OFB8 21
#define MR_OFB16 29
typedef struct {
int Nk,Nr;
int mode;
mr_unsign32 fkey[60];
mr_unsign32 rkey[60];
char f[16];
} aes;
/* Elliptic curve point status */
#define MR_EPOINT_GENERAL 0
#define MR_EPOINT_NORMALIZED 1
#define MR_EPOINT_INFINITY 2
#define MR_NOTSET 0
#define MR_PROJECTIVE 0
#define MR_AFFINE 1
#define MR_TWIST 8
/* Elliptic Curve epoint structure. Uses projective (X,Y,Z) co-ordinates */
typedef struct {
int marker;
big X;
big Y;
big Z;
} epoint;
/* Structure for Brickell method for finite *
field exponentiation with precomputation */
typedef struct {
big *table;
big n;
int base;
int store;
} brick;
/* Structure for Brickell method for elliptic *
curve exponentiation with precomputation */
typedef struct {
epoint **table;
big a,b,n;
int base;
int store;
} ebrick;
typedef struct {
epoint **table;
big a6,a2;
int m,a,b,c;
int base;
int store;
} ebrick2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -