1
2
3
4 package p384
5
6 import (
7 "math/big"
8
9 "github.com/cloudflare/circl/internal/conv"
10 )
11
12 const sizeFp = 48
13
14 type fp384 [sizeFp]byte
15
16 func (e fp384) BigInt() *big.Int { return conv.BytesLe2BigInt(e[:]) }
17 func (e fp384) String() string { return conv.BytesLe2Hex(e[:]) }
18
19 func (e *fp384) SetBigInt(b *big.Int) {
20 if b.BitLen() > 384 || b.Sign() < 0 {
21 b = new(big.Int).Mod(b, p.BigInt())
22 }
23 conv.BigInt2BytesLe(e[:], b)
24 }
25
26 func montEncode(c, a *fp384) { fp384Mul(c, a, &r2) }
27 func montDecode(c, a *fp384) { fp384Mul(c, a, &fp384{1}) }
28 func fp384Sqr(c, a *fp384) { fp384Mul(c, a, a) }
29
30 func fp384Inv(z, x *fp384) {
31 t0, t1, t2, t3, t4 := &fp384{}, &fp384{}, &fp384{}, &fp384{}, &fp384{}
32
33 fp384Sqr(t4, x)
34
35 fp384Mul(t4, t4, x)
36
37 fp384Sqr(t0, t4)
38 fp384Mul(t0, t0, x)
39
40 fp384Sqr(t1, t0)
41 fp384Sqr(t1, t1)
42 fp384Sqr(t1, t1)
43 fp384Mul(t1, t1, t0)
44
45 fp384Sqr(t2, t1)
46 for i := 0; i < 5; i++ {
47 fp384Sqr(t2, t2)
48 }
49 fp384Mul(t2, t2, t1)
50
51 for i := 0; i < 3; i++ {
52 fp384Sqr(t2, t2)
53 }
54 fp384Mul(t2, t2, t0)
55
56 fp384Sqr(t1, t2)
57 for i := 0; i < 14; i++ {
58 fp384Sqr(t1, t1)
59 }
60 fp384Mul(t1, t1, t2)
61
62 fp384Sqr(t3, t1)
63 for i := 0; i < 29; i++ {
64 fp384Sqr(t3, t3)
65 }
66 fp384Mul(t3, t3, t1)
67
68 fp384Sqr(t1, t1)
69 fp384Sqr(t1, t1)
70
71 *t0 = *t1
72 fp384Mul(t0, t0, t4)
73
74 fp384Mul(t1, t1, x)
75
76 fp384Sqr(t4, t3)
77 for i := 0; i < 59; i++ {
78 fp384Sqr(t4, t4)
79 }
80 fp384Mul(t4, t4, t3)
81
82 fp384Sqr(t3, t4)
83 for i := 0; i < 119; i++ {
84 fp384Sqr(t3, t3)
85 }
86 fp384Mul(t3, t3, t4)
87
88 for i := 0; i < 15; i++ {
89 fp384Sqr(t3, t3)
90 }
91 fp384Mul(t3, t3, t2)
92
93 for i := 0; i < 33; i++ {
94 fp384Sqr(t3, t3)
95 }
96 fp384Mul(t3, t3, t0)
97
98 fp384Sqr(t4, t3)
99 for i := 0; i < 95; i++ {
100 fp384Sqr(t4, t4)
101 }
102 fp384Mul(z, t4, t1)
103 }
104
105
106 func fp384Cmov(x, y *fp384, b int)
107
108
109 func fp384Neg(c, a *fp384)
110
111
112 func fp384Add(c, a, b *fp384)
113
114
115 func fp384Sub(c, a, b *fp384)
116
117
118 func fp384Mul(c, a, b *fp384)
119
120 var (
121
122 p = fp384{
123 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
124 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
125 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
126 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
127 }
128
129 pp = fp384{
130 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
131 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff,
132 0xfa, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00,
133 0x0c, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
134 }
135
136 r2 = fp384{
137 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
138 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
139 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
140 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
141 }
142
143 bb = fp384{
144 0xcc, 0x2d, 0x41, 0x9d, 0x71, 0x88, 0x11, 0x08, 0xec, 0x32, 0x4c, 0x7a,
145 0xd8, 0xad, 0x29, 0xf7, 0x2e, 0x02, 0x20, 0x19, 0x9b, 0x20, 0xf2, 0x77,
146 0xe2, 0x8a, 0x93, 0x94, 0xee, 0x4b, 0x37, 0xe3, 0x94, 0x20, 0x02, 0x1f,
147 0xf4, 0x21, 0x2b, 0xb6, 0xf9, 0xbf, 0x4f, 0x60, 0x4b, 0x11, 0x08, 0xcd,
148 }
149 )
150
View as plain text