...
1 package internal
2
3 import (
4 "github.com/cloudflare/circl/sign/dilithium/internal/common"
5 )
6
7
8 type VecL [L]common.Poly
9
10
11 type VecK [K]common.Poly
12
13
14 func (v *VecL) Normalize() {
15 for i := 0; i < L; i++ {
16 v[i].Normalize()
17 }
18 }
19
20
21
22 func (v *VecL) NormalizeAssumingLe2Q() {
23 for i := 0; i < L; i++ {
24 v[i].NormalizeAssumingLe2Q()
25 }
26 }
27
28
29 func (v *VecL) Add(w, u *VecL) {
30 for i := 0; i < L; i++ {
31 v[i].Add(&w[i], &u[i])
32 }
33 }
34
35
36 func (v *VecL) NTT() {
37 for i := 0; i < L; i++ {
38 v[i].NTT()
39 }
40 }
41
42
43
44
45 func (v *VecL) Exceeds(bound uint32) bool {
46 for i := 0; i < L; i++ {
47 if v[i].Exceeds(bound) {
48 return true
49 }
50 }
51 return false
52 }
53
54
55
56
57 func (v *VecL) Power2Round(v0PlusQ, v1 *VecL) {
58 for i := 0; i < L; i++ {
59 v[i].Power2Round(&v0PlusQ[i], &v1[i])
60 }
61 }
62
63
64
65
66 func (v *VecL) Decompose(v0PlusQ, v1 *VecL) {
67 for i := 0; i < L; i++ {
68 PolyDecompose(&v[i], &v0PlusQ[i], &v1[i])
69 }
70 }
71
72
73 func (v *VecL) PackLeqEta(buf []byte) {
74 offset := 0
75 for i := 0; i < L; i++ {
76 PolyPackLeqEta(&v[i], buf[offset:])
77 offset += PolyLeqEtaSize
78 }
79 }
80
81
82 func (v *VecL) UnpackLeqEta(buf []byte) {
83 offset := 0
84 for i := 0; i < L; i++ {
85 PolyUnpackLeqEta(&v[i], buf[offset:])
86 offset += PolyLeqEtaSize
87 }
88 }
89
90
91 func (v *VecL) PackLeGamma1(buf []byte) {
92 offset := 0
93 for i := 0; i < L; i++ {
94 PolyPackLeGamma1(&v[i], buf[offset:])
95 offset += PolyLeGamma1Size
96 }
97 }
98
99
100 func (v *VecL) UnpackLeGamma1(buf []byte) {
101 offset := 0
102 for i := 0; i < L; i++ {
103 PolyUnpackLeGamma1(&v[i], buf[offset:])
104 offset += PolyLeGamma1Size
105 }
106 }
107
108
109 func (v *VecK) Normalize() {
110 for i := 0; i < K; i++ {
111 v[i].Normalize()
112 }
113 }
114
115
116
117 func (v *VecK) NormalizeAssumingLe2Q() {
118 for i := 0; i < K; i++ {
119 v[i].NormalizeAssumingLe2Q()
120 }
121 }
122
123
124 func (v *VecK) Add(w, u *VecK) {
125 for i := 0; i < K; i++ {
126 v[i].Add(&w[i], &u[i])
127 }
128 }
129
130
131
132
133 func (v *VecK) Exceeds(bound uint32) bool {
134 for i := 0; i < K; i++ {
135 if v[i].Exceeds(bound) {
136 return true
137 }
138 }
139 return false
140 }
141
142
143
144
145 func (v *VecK) Power2Round(v0PlusQ, v1 *VecK) {
146 for i := 0; i < K; i++ {
147 v[i].Power2Round(&v0PlusQ[i], &v1[i])
148 }
149 }
150
151
152
153
154 func (v *VecK) Decompose(v0PlusQ, v1 *VecK) {
155 for i := 0; i < K; i++ {
156 PolyDecompose(&v[i], &v0PlusQ[i], &v1[i])
157 }
158 }
159
160
161
162
163
164 func (v *VecK) MakeHint(v0, v1 *VecK) (pop uint32) {
165 for i := 0; i < K; i++ {
166 pop += PolyMakeHint(&v[i], &v0[i], &v1[i])
167 }
168 return
169 }
170
171
172
173
174 func (v *VecK) UseHint(q, hint *VecK) *VecK {
175 for i := 0; i < K; i++ {
176 PolyUseHint(&v[i], &q[i], &hint[i])
177 }
178 return v
179 }
180
181
182 func (v *VecK) PackT1(buf []byte) {
183 offset := 0
184 for i := 0; i < K; i++ {
185 v[i].PackT1(buf[offset:])
186 offset += common.PolyT1Size
187 }
188 }
189
190
191 func (v *VecK) UnpackT1(buf []byte) {
192 offset := 0
193 for i := 0; i < K; i++ {
194 v[i].UnpackT1(buf[offset:])
195 offset += common.PolyT1Size
196 }
197 }
198
199
200 func (v *VecK) PackT0(buf []byte) {
201 offset := 0
202 for i := 0; i < K; i++ {
203 v[i].PackT0(buf[offset:])
204 offset += common.PolyT0Size
205 }
206 }
207
208
209 func (v *VecK) UnpackT0(buf []byte) {
210 offset := 0
211 for i := 0; i < K; i++ {
212 v[i].UnpackT0(buf[offset:])
213 offset += common.PolyT0Size
214 }
215 }
216
217
218 func (v *VecK) PackLeqEta(buf []byte) {
219 offset := 0
220 for i := 0; i < K; i++ {
221 PolyPackLeqEta(&v[i], buf[offset:])
222 offset += PolyLeqEtaSize
223 }
224 }
225
226
227 func (v *VecK) UnpackLeqEta(buf []byte) {
228 offset := 0
229 for i := 0; i < K; i++ {
230 PolyUnpackLeqEta(&v[i], buf[offset:])
231 offset += PolyLeqEtaSize
232 }
233 }
234
235
236 func (v *VecK) NTT() {
237 for i := 0; i < K; i++ {
238 v[i].NTT()
239 }
240 }
241
242
243 func (v *VecK) PackW1(buf []byte) {
244 offset := 0
245 for i := 0; i < K; i++ {
246 PolyPackW1(&v[i], buf[offset:])
247 offset += PolyW1Size
248 }
249 }
250
251
252
253
254 func (v *VecK) Sub(a, b *VecK) {
255 for i := 0; i < K; i++ {
256 v[i].Sub(&a[i], &b[i])
257 }
258 }
259
260
261 func (v *VecK) MulBy2toD(w *VecK) {
262 for i := 0; i < K; i++ {
263 v[i].MulBy2toD(&w[i])
264 }
265 }
266
267
268 func (v *VecK) InvNTT() {
269 for i := 0; i < K; i++ {
270 v[i].InvNTT()
271 }
272 }
273
274
275 func (v *VecK) ReduceLe2Q() {
276 for i := 0; i < K; i++ {
277 v[i].ReduceLe2Q()
278 }
279 }
280
View as plain text