aboutsummaryrefslogtreecommitdiffstats
path: root/include/mcl/bn256.h
blob: cb68d8cc1797f96bc27f8d52230752610d29f572 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#pragma once
/**
    @file
    @brief C interface of 256-bit optimal ate pairing over BN curves
    @author MITSUNARI Shigeo(@herumi)
    @license modified new BSD license
    http://opensource.org/licenses/BSD-3-Clause
*/
#include <stdint.h>
#include <stddef.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifdef BN256_DEFINE_STRUCT

typedef struct {
    uint64_t d[4];
} BN256_Fr; // sizeof(BN256_Fr) = 32

typedef struct {
    uint64_t d[4 * 3];
} BN256_G1; // sizeof(BN256_G1) = 96

typedef struct {
    uint64_t d[4 * 2 * 3];
} BN256_G2; // sizeof(BN256_G2) == 192

typedef struct {
    uint64_t d[4 * 12];
} BN256_GT; // sizeof(BN256_GT) == 384

#else

typedef struct BN256_Fr BN256_Fr;
typedef struct BN256_G1 BN256_G1;
typedef struct BN256_G2 BN256_G2;
typedef struct BN256_GT BN256_GT;

#endif

#ifdef _MSC_VER
#ifdef BN256_DLL_EXPORT
#define BN256_DLL_API __declspec(dllexport)
#else
#define BN256_DLL_API __declspec(dllimport)
#ifndef MCL_NO_AUTOLINK
    #pragma comment(lib, "bn256.lib")
#endif
#endif
#else
#define BN256_DLL_API
#endif

/*
    set errlog file name
    use stderr if name == "stderr"
    close if name == ""
    return 0 if success
*/
BN256_DLL_API int BN256_setErrFile(const char *name);

BN256_DLL_API int BN256_init(void);

////////////////////////////////////////////////
// set zero
BN256_DLL_API void BN256_Fr_clear(BN256_Fr *x);

// set x to y
BN256_DLL_API void BN256_Fr_setInt(BN256_Fr *y, int x);

BN256_DLL_API void BN256_Fr_copy(BN256_Fr *y, const BN256_Fr *x);

// return 0 if success
BN256_DLL_API int BN256_Fr_setStr(BN256_Fr *x, const char *s);

// return 1 if true and 0 otherwise
BN256_DLL_API int BN256_Fr_isValid(const BN256_Fr *x);
BN256_DLL_API int BN256_Fr_isSame(const BN256_Fr *x, const BN256_Fr *y);
BN256_DLL_API int BN256_Fr_isZero(const BN256_Fr *x);
BN256_DLL_API int BN256_Fr_isOne(const BN256_Fr *x);

BN256_DLL_API void BN256_Fr_setRand(BN256_Fr *x);

// hash(s) and set x
BN256_DLL_API void BN256_Fr_setMsg(BN256_Fr *x, const char *s);

// return 0 if success
BN256_DLL_API int BN256_Fr_getStr(char *buf, size_t maxBufSize, const BN256_Fr *x);

BN256_DLL_API void BN256_Fr_neg(BN256_Fr *y, const BN256_Fr *x);
BN256_DLL_API void BN256_Fr_inv(BN256_Fr *y, const BN256_Fr *x);
BN256_DLL_API void BN256_Fr_add(BN256_Fr *z, const BN256_Fr *x, const BN256_Fr *y);
BN256_DLL_API void BN256_Fr_sub(BN256_Fr *z, const BN256_Fr *x, const BN256_Fr *y);
BN256_DLL_API void BN256_Fr_mul(BN256_Fr *z, const BN256_Fr *x, const BN256_Fr *y);
BN256_DLL_API void BN256_Fr_div(BN256_Fr *z, const BN256_Fr *x, const BN256_Fr *y);

////////////////////////////////////////////////
// set zero
BN256_DLL_API void BN256_G1_clear(BN256_G1 *x);

BN256_DLL_API void BN256_G1_copy(BN256_G1 *y, const BN256_G1 *x);

// return 0 if success
BN256_DLL_API int BN256_G1_setStr(BN256_G1 *x, const char *s);

// return 1 if true and 0 otherwise
BN256_DLL_API int BN256_G1_isValid(const BN256_G1 *x);
BN256_DLL_API int BN256_G1_isSame(const BN256_G1 *x, const BN256_G1 *y);
BN256_DLL_API int BN256_G1_isZero(const BN256_G1 *x);

BN256_DLL_API int BN256_G1_hashAndMapTo(BN256_G1 *x, const char *s);

// return 0 if success
BN256_DLL_API int BN256_G1_getStr(char *buf, size_t maxBufSize, const BN256_G1 *x);

BN256_DLL_API void BN256_G1_neg(BN256_G1 *y, const BN256_G1 *x);
BN256_DLL_API void BN256_G1_dbl(BN256_G1 *y, const BN256_G1 *x);
BN256_DLL_API void BN256_G1_add(BN256_G1 *z, const BN256_G1 *x, const BN256_G1 *y);
BN256_DLL_API void BN256_G1_sub(BN256_G1 *z, const BN256_G1 *x, const BN256_G1 *y);
BN256_DLL_API void BN256_G1_mul(BN256_G1 *z, const BN256_G1 *x, const BN256_Fr *y);

////////////////////////////////////////////////
// set zero
BN256_DLL_API void BN256_G2_clear(BN256_G2 *x);

BN256_DLL_API void BN256_G2_copy(BN256_G2 *y, const BN256_G2 *x);

// return 0 if success
BN256_DLL_API int BN256_G2_setStr(BN256_G2 *x, const char *s);

// return 1 if true and 0 otherwise
BN256_DLL_API int BN256_G2_isValid(const BN256_G2 *x);
BN256_DLL_API int BN256_G2_isSame(const BN256_G2 *x, const BN256_G2 *y);
BN256_DLL_API int BN256_G2_isZero(const BN256_G2 *x);

BN256_DLL_API int BN256_G2_hashAndMapTo(BN256_G2 *x, const char *s);

// return 0 if success
BN256_DLL_API int BN256_G2_getStr(char *buf, size_t maxBufSize, const BN256_G2 *x);

BN256_DLL_API void BN256_G2_neg(BN256_G2 *y, const BN256_G2 *x);
BN256_DLL_API void BN256_G2_dbl(BN256_G2 *y, const BN256_G2 *x);
BN256_DLL_API void BN256_G2_add(BN256_G2 *z, const BN256_G2 *x, const BN256_G2 *y);
BN256_DLL_API void BN256_G2_sub(BN256_G2 *z, const BN256_G2 *x, const BN256_G2 *y);
BN256_DLL_API void BN256_G2_mul(BN256_G2 *z, const BN256_G2 *x, const BN256_Fr *y);

////////////////////////////////////////////////
// set zero
BN256_DLL_API void BN256_GT_clear(BN256_GT *x);

BN256_DLL_API void BN256_GT_copy(BN256_GT *y, const BN256_GT *x);

// return 0 if success
BN256_DLL_API int BN256_GT_setStr(BN256_GT *x, const char *s);

// return 1 if true and 0 otherwise
BN256_DLL_API int BN256_GT_isSame(const BN256_GT *x, const BN256_GT *y);
BN256_DLL_API int BN256_GT_isZero(const BN256_GT *x);
BN256_DLL_API int BN256_GT_isOne(const BN256_GT *x);

// return 0 if success
BN256_DLL_API int BN256_GT_getStr(char *buf, size_t maxBufSize, const BN256_GT *x);

BN256_DLL_API void BN256_GT_neg(BN256_GT *y, const BN256_GT *x);
BN256_DLL_API void BN256_GT_inv(BN256_GT *y, const BN256_GT *x);
BN256_DLL_API void BN256_GT_add(BN256_GT *z, const BN256_GT *x, const BN256_GT *y);
BN256_DLL_API void BN256_GT_sub(BN256_GT *z, const BN256_GT *x, const BN256_GT *y);
BN256_DLL_API void BN256_GT_mul(BN256_GT *z, const BN256_GT *x, const BN256_GT *y);
BN256_DLL_API void BN256_GT_div(BN256_GT *z, const BN256_GT *x, const BN256_GT *y);

BN256_DLL_API void BN256_GT_finalExp(BN256_GT *y, const BN256_GT *x);
BN256_DLL_API void BN256_GT_pow(BN256_GT *z, const BN256_GT *x, const BN256_Fr *y);

BN256_DLL_API void BN256_pairing(BN256_GT *z, const BN256_G1 *x, const BN256_G2 *y);
BN256_DLL_API void BN256_millerLoop(BN256_GT *z, const BN256_G1 *x, const BN256_G2 *y);

#ifdef __cplusplus
}
#endif