forked from miracl/MIRACL
-
Notifications
You must be signed in to change notification settings - Fork 0
/
doubig.txt
65 lines (48 loc) · 2.47 KB
/
doubig.txt
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
One of the basic design "features" of MIRACL is that all big number types are
of the same size, defined either at run time, or at compile time.
This means that all big types are of the same size, and in the vast majority
of cases this is just fine, and very efficient.
However there are some situations where, while most of the variable should be
of size n bits, some are naturally required to be of size 2*n bits. One
way around this is to make all big variables 2*n in size, but this can
be wastful of space.
Consider for example Elliptic curves over a quadratic extension, as suggested
by Galbraith, Lin and Scott, and as supported by functions in the module
mrecn2.c
While all of the field variables are of a size n, the group size is of size
2*n. In this case it makes sense for the vast majority of operations on field
elements, to be on elements of size n, while allowing the much simpler group
operations to be on variables of size 2*n.
Here is how to do it (for C programs only).
(1) Assign space for big variables from a block of memory
#ifndef MR_STATIC
char *mem = memalloc(_MIPP_ M);
#else
char mem[MR_BIG_RESERVE(M)];
memset(mem, 0, MR_BIG_RESERVE(M));
#endif
where M are the total number of big variables required. Recall that if
MR_STATIC is defined, bigs are assigned at compile time from the stack. If it
is not defined, bigs are assigned at run time from the heap. In either
case if a double sized variable is required...
(2) Assign space for big variable like this...
int j=0;
c=mirvar_mem(mip, mem, j); j+=2;
d=mirvar_mem(mip, mem, j); j+=2;
r=mirvar_mem(mip, mem, j); j+=2;
v1=mirvar_mem(mip, mem, j++);
v2=mirvar_mem(mip, mem, j++);
det=mirvar_mem(mip, mem, j); j+=2;
p=mirvar_mem(mip, mem, j++);
Observe how space for a double big is assigned to variables c,d,r and det, with
v1,v2 and p being assigned space for a regular big. Note that the final value j
here indicates the value that should be used for M above.
(3) Into mirdef.h, put
#define MR_DOUBLE_BIG
This tells MIRACL to assign double-width space to the internal work variables
w0-w7. All functions that just use these work variables will now work correctly
with the double-sized bigs.
Note that only simple arithmetic functions can be used with these double big
variables. But that should be OK, as group operations are usually very simple.
Note also that overflow checking is turned off when MR_DOUBLE_BIG is defined,
so use this feature with extreme caution!