-
Notifications
You must be signed in to change notification settings - Fork 0
/
dilithium_test.go
593 lines (560 loc) · 30.5 KB
/
dilithium_test.go
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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
// Copyright (C) 2020, ISARA Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// +build cgo
package iqrcrypto
import (
"crypto/rand"
"encoding/pem"
"log"
"testing"
)
var dilithiumPrivKey = `
-----BEGIN PRIVATE KEY-----
MIJEBQIBADAVBgkEAH8ADwEBCQAGCAQAfwAPBgkBBIJD5zCCQ+MCAQAEgj4YR05P
TAEAAADE8u7ZnzCBAyHLB5jkpMtAzHfnQ3AbNSUJZDpP9ISXY2jkS4Fr54+jyme5
13G1gSR2qlBiUUMw4Yx7BorTNqw5RT1Ae3++PLaBp4dLHcEm5S7VGACHFHsAz54S
AKQOEwCBHgsAJ9l6ADQ4AgCSp30AOylEAJQsSwBdnFwAu0tpAA76PgBjJyEAceUL
AJYydwCzO3sAdXYvAN1iAwAKvQkAcl58AHpKWwC3UxcAolg6ACEZAACx60IAYYIy
AKH0AwAzxWYAQB4XAPR4fwBUT0QABykAAAjqKAAyfzwAvFY8AEGOWwC66EAAwoVc
AAfoHAALx1wAxDteABZEUwAq+UwAPUJdAEmHCgD8/CQAIONJAOQgZADYx2IAJrNJ
AHYrLQBSIAAAwJxgAOnXCwBGfy0A0+8wAAyUJAADrQUAZ1ceAPtdDwCrJyoAEkoN
AHpCPQCs2zQATmpXAFsbOwAPIBYALz1OAEMiFABpTQ8AA/YsADDCPgAgoRsANiVn
AAOFUgD6EnsA9w4/ADcOSQDTAQsAy+E5APOyFQCVN30Abt04AN+3IQCL5wEAJa4j
AMl9ZwCIrQoAXgY9ACc+UwAR30sA5QUGAEuaHwDPMBQAoeRuALQ1fQD66XkAj5Ni
AOPrfQDtjQcAiPghAGQebAATlS4A2O8mAFX6HABKh2IAXo8nAHffSgBg1S4Aku8p
ADJ3bgCrI2wAxiQGAOspBwDjWSQAY5pVAEsbOwCIX2QAsPQoAHHxcwAsr3YAD2AW
ADTQTQALWQ8A19VJAEDJawBnBj8A7rNsAJB8bQAt4lwAnNk9AKbvegC5eXwAvaVQ
AKkACAD9JkAA2xEsAA3+aACnFCAAHLADABXQKAA0qSQADJB2AJ1hEAB6PFMA2Xpz
AJFlXgBj9w8Ai+9VAFUWBwBdCjIA2nxhAPlaGwD4KCYAM0N/ADTRWQCjyS8A5T4Y
AC95RACM4GMAQKQ3AIr8WAAn7w0AW34sACnbUAB5s1cAAeEvAASFDQB3TzsAKmJW
AG16DwB06hkAcGxeADjlfABrITwACE1iAFXTGQCqZHkA2icDAJTuKwDntAsAxp8B
AINqQADGpk8AcEQUANyeJAD1iy0AJTMsABbyQQBRzXEAOFkYADjcGQC9wFIA6ZNL
AKodXABv2TYAkREEAPw9HAD//mAAcVFlAP39MACIyUwAZjUDAK64YwBvyQUA3X43
AIo4MAAt50UAC6BvAB1bBQDHIAgAkT8+ADqoOwDtP0EAaXAwAD5cTwCSDjsAipMG
AM3WewDYsxwAPH5/AFjscQDpaQEA2z01ANX8OADI1h4A5b4kAIuNWQA/oBcAKeBa
AHocWQADPBsAaFANAA+LEwDqEQgARZIYAAJAZgBoIBAAdQppACVIHQAnhFQAm0g2
APViNQC8ZDsAZ8NbAInXIwAIVBIAC/RwAO2MKwBWV3sABN0xAFJFBgB8dFsAvyME
AP0fDQDtFQMAKr44AA5jbQBP7zkAPo5nAMqSEAB41E0AvNwNALiXDwA21AYA7kgr
AMyndABhM1UAa8NLAEhPEgAhek4ABmZpAMMzBQBFbw0AMD46AEVvdwCKZUAAD/0U
AAz9EgDH/1UAP/4oAIy8RAC6JW8AaRt9APBxBAA9uAAAbcA2AIY7VQDBAWkAPq9x
ACYSbwAxo3wAOHQ6ACBLYACronwAr3MkAIFmdwADmVIAnrYSAEEeTQBlEmoAd/FH
AJ/tJADKNWYAKPYaADIlKQCaly4ANn0xAHWMbwBoJg0AGUk/AM1BKQCM7HEAcrxY
ACCXTwCLd0sAJ9w2AEdBbQAI9HAAzC5lAJEXDAAsVUEAoQ4UAKFMLwDPjXEAmnU/
AChHWwCu6z8A/YRPAIUFOAAHSE8AG5dMAJwDdQCBoncA0r9FAMp3RQB0qn0A/ZwR
AK2TQwAoqEwASotaAE6rOABdAlAAnfFXAMPyEwD9NxIAnUczAAUjUADNUkwAV1Y0
AGO8VwBjsygAt8pMABkMIgAehwQAvPBrACqtaQCs7SEAyv0vAJYjDwARo3gAUhti
AA+KOwCVCkIAVuUsAP+IJQAZowEAmhV9AMsQYwB4BQ0AaQAcADxFQwBB6CcAs2As
ANcxJgABIwYAfANSAAROKQAfPzcA4notANTZNwDu7mgA090EAH1hGAC6230AqaV9
AItHGADZc0oAaHxZAIpndQBEgG8AENwuAO6yFAC3nmkACyJKAPBPfQDwpAgA9Sx9
AAvZcQCIs2QANbodAMbjHgDOj0IAp0oHANtcDAAMoQwA4RwMAOMvZwDnvxAA7gdf
ANKvUQAKWW4AERAPAFWgLwCtQA8A1GEYANe6TACunV0A0KcjAL2DNABVDnwA/UxQ
AHrlXwBbRjYAiL9dAOJ7BgDNTBgAN+FZAJhaGQBsCXAAhNcxAPJ6LACPEBAADH4I
AA+ePAC6jw4AWeR3ABH1HAC4Sz8A649vAGIgYgBoAzcAtYM7AMwlTADqWBQAGekZ
AMaOewDfSE0Af/E6AFmNCgC8EhkA9HsoAFW3HwBxPUMAAoteAI+PXABNNS4A0ssY
AGlaJgBuak8A3Lt5ANVYaQDtqH4AyZxZAF+pcQCpGnoAhR5VAOAQVwBinR0A4vZw
ADM6WwARBAEAaZ4vAM2NcwA7m00A01xeANwhKAD/BCwAMDM8AJypLABde2cANitE
AMVhWwB8UE4AMRAvAPiwVQAth3MABncRAMX4VgDfVi8AJA9SAFd9cADABnoA8iVQ
AHDuRgDU30oAbtRgADG5NQB/fysAlZgmALo1JgDOyUwAQh1aAPXLRQBx83IAYihV
AFO4DQDpnyEAAIoyAKd5DgCWUzoAW2YLAJvAAQCMzzEAtn9GABrPaQBIHhIAjOEW
AAA+SQAlZgIABHt8AAxFFQBHzx8ASgh1AI1wKQDmXVgAktg1AGANDQD9nw0Ai6BE
AAbOCwBTMxMAgSJ5AD1WJQD0B3YAC5MbAOVmMAAFi2QA4u1hAEVCdQD2dHIAMfAF
AMAlBgCYOBAAqwpVADDLYACRyHoAPmwAADRBfwAD4SAAnx8uAN5lWwB9RgIAJS5z
AI3SMAD9njAAudlnAH5WXgAWMlMAMDgCAHSXHABJDV8ASYhEAG/CHgCSBX4AqEc+
APVELAC3PG0AlTFBAP/mJQDr5ioAyLJbACYmKACLuQ0AYWh1ACrtBQC0+yoAUgY8
AFkQVQDX2i8Ac6wgAIj7YgCjmnUAFWEnALOfTwAnmVYAxWh4AAnPTgBq5CAA0LML
AG5WXwDkTxcARH8jAMHgQQCUSh0AFYJZAI+iQQDPtiIAR15tACszZwDRvy8A8RhK
AInKWAD6QHkAs+B9AFJxPACoem4AcQYgACyDWAD94nMAES8kAOsJHABOc0oAS9gc
ADOxWgAflW4AgZNJAMLfVABA/T0AbZchAL6ZVgAlVmwATPBVAK4iSQCn1QcAyH1s
ADtbEQACsGwA3OxFANRkZQAMwkQAQxtQADyHBwBxAXsAE546ACZeLQC9Ux8A7Ukr
AFeeOADSfwIAv30SAB3mYQBzD1AA4JMpAEYQNgD1bSkA4RZJADkdJwBxrXkA1d1Z
AN53WQBALlEA45VpAIetLQDhC08A6PU4ALoMdwBuQTUA0mxAAHsDGwDax3YAuWUI
AByZKgDR32wAaJkaAGJnUwCvm3YA9VIeAERCSAAKhDIAoFQgAACzPAAZLVUADhl2
AC3YCwA403AAdtcIAE7zMAC2rjgAsPUsAKIcfwAwqDMAfwNPABmKCACQ6VUAF/hm
AOMCCAANVG0AaaxoAIXuEAAWCGIAurN7ABpdRQDy8HEAOoEkAC/OCwCuKBgA+C1q
AAxxYAC0Ej4Ab9hBADKJAwB9K0UAHGcyABOsbwCVTEEABQkuACToAgC6RwQAfZl/
AI+VZQCcJQ4AO+AfAFg4TAAOfQ8Av3dgAJmiGgAslGcA/Nd+AL2AOwDiVDIAl6JD
AMe3ZgA65nQA8L9QAP1OYgDXEgQA5cAvAKfFewC7JWkAGfgQAG3eQgD/cV4ArBc2
APQMKgBHVW8AgSpKAPfZMwBUAEYAH0IbABxhEABde3AACs0TANRQbgAKVGIANIsZ
ADNbcwB4EiIAAPRgAFpLJAA85mMAP1chAIYUEQAlVA4AFTkTAKEEVgDpLRoAr/0k
AF0feQDCaH4ATDh8AEyRSACr+ioALOwTANKXUAD1sFsAmbNIADN5bQBNvlYAz1tZ
AEHbCQDArz0AzVplAMvHbACiImIAlHUUAByCVABtWC8A3l17APL/KQB/IBgAtM49
APsbcwBbiw8AlDR5AEtxHQDzHGUAa8Q5ACQvHwC8iVEANWdkAPQgIgDpOVsANalv
AMy0EwAAmyEA+fpQAM40UAC7pFAAPaYLAPoVQgBh6l4ALjN/AN6JKgDFUmQAUGd/
AAJXVwBNnCEA0GdZABx+dgAATCYAYBNNAKm/OACmyQMA0rAQADFKGACyFTQAB6Zj
AHsXFwCyXw4A/CMdACoAfgDpCgIAsSlGALxoFABnuQ4AdFVhAAgLDACKlG4AkxgK
ABHDFQDMQwsAjjpHADQfRQB+u20A0HJyANnGagBGs3oAOyExACrRRACzanwAtjZI
ANmrAQBfql0Au0BlAOYfDgDX2AUAY8hzABasKAD77CwAnk4dACmbUwDsiBUAvsNA
AJi0MQCciQ4AULkeAODMRABXf0oAj+1sAAkqAQA2AzAAUrUYAIEtQQA9ymwA6KhU
APbNZQD7DEoADldIAOhOJQCgkikAhDwWACcPBAAMmW8AOzsmACYydQDV1k4AMMYp
AM7YYAC4gEoAqbZxAPLNcwDP7BMA7N4YAB/nMwCommUAcIBZAHVjGwANTgwACQ4u
ABSBWwAuxG8AW2EgABSfAABsolUAAk5tADSuPwCxkAoAFZYRABDyKADHnX0AyCdh
ACQIXAA1OEoAkCkUAN7SDQBecAAAgoVTANAJawD4MCcAKLRTANgnLQAo40sAmSZH
ADnPdgDEoxgAbCFHAAw9CwDVh04AsFZ+ANE6XwAUYGcAtnUhAARmHwCb+1kA5FBB
AHwwWwCX9xIAmktmAKmxUwAOQUAAmgt2AEQ6NwB3KSIAw7kkANVuXgDfj14Ap/lG
AKj4HABFJFUANe1WAPdsPwCQthUA8AFaANXXWwBi20YAiOR+AN2WAwCQSiIArEUh
AF4jXQB/hnYAEGYwAD0dSQDPcSsAyE9sAIHFMwBx/nkApupQANuaHADrIhYAvNoy
AEw0QQBociAA/kUpACKCVQAAgAwA2/xrABNNfADZiA8AAAs4AMM3ZACaClUAesQK
AJhBegDLPBcA6J8fALabLgBOkD4AYyhdALAjVwAy7yUAkxJcAKVuZgDRahIAVCNB
AHPlaQAgtDgAQTowAP7bEACNazQAyWoeAMOSLwA0zjwAfU12AIhgbQCUE3QAa7pb
AMiYawDvIRwA5pwwAIijWAByCScA52YdAPTVUQBtRkQAkLwYAH0TfgARxSUAq+Yk
AKKfAADGSDMAfns8AEPJAACyQE0ATfNmAKyLdQDxSBQAQvRFAKkdYQDMKzYA8MNQ
ANiqUAAcrAoA9UtLAKFReQDkEQEAmOQ/AAB6VQAH1xkAj+kGAK+8JgCzOxsAjT5Q
AG4OEQCzzwUAHtNQAF25fAA3HyQAksIqAKMjVADzXGMAQ8Y/AJuXVQCYpioA8nAf
AA5FegCs3gwAB49WANMpVQCqQ2QAvRFaAGJ2YQDG8TQAJFAKACHyLQAYrGgALIJF
AHK/AQBNiWoAvJd9ANqBPwC8DHgAVa5wACzWKgBw/EoADkNmAFcrQQBHLTYAe7ds
ACsgAwB/9nsAVG1mACekIgBy2FAAU48xAGB2egA6LEgALyYkAJXjYgDTwS4Aonhp
AGuWUwCCaHMA0X5yAGBZOgDMegIA7QcKANb5NAAp9AgAUTd9AMT4BQCcnF8AaW9N
ANNvWwAhlU0A/HVQAJ5IGgCsZmcAYQo1ANKAOQClUioAI2oIABa/eQBD+zgAdBZX
ALAQZwARGGMAn8h1AN6jawCTbxQAuGltAMGiGQBNJkIA164QAO2xJgAXrAwAqARC
AHAeJgBHIjEAh8NZAK5GCgDTV3wAW5l/AMNCRgAAdDMA7tgeAHbuFQCP+i8AzvRF
AJEDQwBDdQEAH+sdAC0/GQBtIBIAYUZgACyZDQCXPzUASMZgAHj1NQC0jmwAnr0X
AJbCcgAxGC0A0s4sAGOhRgDqrGYAgXZIAPsARgDT1gwAZJ13ANyATgCKuScAbD4R
AM3VWwDBl1UAN5oVAHNnNQC4ggQA8f5SAGemUwDL0AkABLYBAPpRXgCVEVgA0TBV
AMBNCwATRiIAOxUQAM64awAJiXMAhuwOAIUkNAAnvTEAfrxaAE3nJgDNzgcA15FK
ADpAagANx0cAQxA3AO9kdADQGlQATysaAKt3awBUNF4AUYc4AOelCgAzXCUAy01I
AGeTIgDt80gAKncMAD2iHADDx1wA/AZDAEW2KQBUnWQAw6hIAPIMNwDUHHcA9Lk8
AA68HQDQ5S8Ako1lAB4jAgDGOSQApZJDANPEZgCFylwACGRzAIqNOgCQfCUATr4i
ADTUNgCKhHgAXhMYALZ7VQDiCxAA0VZZAE/jAwBHoVYA68UrABsFagCoiUsATJZ8
AMbsRABYHiYAaW5dAIL+dwBwlH0ANmBWANUsNwB/UiUAkdBFAH5gcQCKaxgAGbwo
ANLsRgAY3y4AhhIbAGPAewCltEYAwAdrAP2kNgAKbHIApHIhAFNfRgDQlV8Av6d4
AFCrBADnFGkAxtBCAHi+TQBemxAAP1ULABI1WABGc0AAgS5eAOZbOQDavCIAkp10
AJlKTwAoGkIAZ5weAH4QdwAVx3oANj5/AF8hQgDX9HkAEgFMAEsJKgDh8gUAw5Vw
AIfIDwBYTmwAqi1zAFrbRgAR3RYAkWRuAD2+FwAbBHYAoHl9ADuqIwBAclsAz3pZ
AM39PQDTtC0A/v13AN9nLADIOjoAAmBiAAVzSACV1SoANWgCANXsawCkUXMAgthn
ALIDJQCR520ALkYNANY6eQAWgE4AT5x1AAvKAgCIQTwAe/MXAPMFMQCLdFEAYgo6
AHUrEwBDmj4AJ7hFAFWhPgBqrE0AP3pnAKQvUQBE51oAeYgPAG7YLwD4zTsArEgD
AKRIewCdan0ABZlNAH0BIwA1OzQAxeFSAJPJMwCTE2oAl2g5AB/bYQAKGxwAlEcE
ALazVQBHeBMA0Zd3ACiZCQBRi1UArAtLAKjfAQCWBycAviIXAJsCCQAFwzEAf5gk
AJsTFwD3diIAnQUYAAM9KQCGXWMANLRGAHodfADiuGAAak5pACfOYwBFCwwAl8xu
AIOjCQDGKEMATe8KAHAmHACIUQ4AxJBmAJEpAgA3CQ4ANzN9AHbLcAAVrXkAMwBJ
ALeqcQC7YzoAA80FAO/QUwCZDx4A/JtYAAz4NwDpOiYAQH5XAPavUQA55GoAqkdu
AE1VEQDO4Q4AdYx8AEmADQBesEQARDRIAIO8PwAVCBcALbNTAIo/RADYJVYAThQv
AEP+WQDwLwIAnFBdAEu4LwC2c1wAzrp3ACxPSAB2pEoAFsoTAMDzJQBjdXAAUU8S
AE41OAAptkkAnRdIAPvgWACR7VMAt9Q8AHZDbgBae1AAdf5WAOJRWgDNHicAngIw
AJ6/eQBe3kgAM0EIAIOFDAConhgASpIWAOM6SQCni3EAs5A5AAjYNgCTgmEAdv9a
ALjVEAAk9wkAk1Q9ABJ1cwBXo28A2/Y0AO3ZeQAI+FAAFc16AKQcGAD/ulwA6iUR
AAnxMACqNFIAO+k3AJDxfgCNuQwAhfEsAM+EIQB/HEwAj/ZaAMTiTgAOmnQAAIpU
AGP+VQDzDUEA87YZAOQ7EgDR30MAXoMKAC+AVwD260kAkqghANDvTwCkOyIAcShK
AAWjAwD2ZwYAgR51AJNYIQCwEA4ANEYVAHuzBQByK2MAt/0kAHrSMgBm6QcAndsJ
ACEXGQD+VkcAuIg4AD+cawCuliUAT+8mADknMgBhIlUAX4FMAKVyAwA7UBkAlYZj
ADNcQgAM/EoAVzVkAOgVWgDZwXMAsVVTAGPsZACbwzEABsBeAFVOLwBG/2IAky9D
AErsRQCa3zkAYPN0AJdhSwBmYG8AzHVBAAUWQgBoR30AqPpwALxOWQBIfzEAXKUF
AEAdTgBevzIAA0QQADp9YwAUah8ADuB7AKaYEQCX7ioAJYZMAJn4TwCZRDkA6vMg
AN6scwBGAWYAZmp0AEU/NgDlwhkANoZWANhycQCrMW0AVWQlAKhxewBMGxgAdQQL
AKaebwD4XCIAatpQAIulawB+4CIAKEJKAEBjaAAbPB4ArIFQAE01GABobGoACEFd
ALSKMgBBJ18A2y9RANZVKgDvxTYAxuQpAGXhewDJkT0Ac9g2AJVCIgA8uWQAJe4y
AM9gbQB/rkIA/DUkALD/bwB05hEA1DE6ANLZGABjvXAAfPt5AOnmVAAjn3IA+1VW
ACW/AAAVjHgAw0E7ADwbGQC9UngAIyNQAGXLdwC0ewwAlGwBAGeXFgC4tRMA3l8+
ABccAgAjVWQAsoh8ACPtagB2QCoAFc9UAP9mbQDkURQAliEtAIiuXwCZTx8AQvEc
AEI+ZgAxLwEApCg4AJ/FaQCI22EAAqgYAKXPIADemlAAUFlKAI6QbgB+AXIAtJN0
AFYvTADtX1QAwVxkAA8tTwC+RAkAkFVNAOmnVwAljUoAlWpbADeMWgDoQT8AHfJ8
AMXpSgBFTi4A6/UmADwNSADSDg8AuVp9AJ7OXwD4YDIArP8sAC8qPwDiQGMAnls6
AJOKWQDZKWAAM3IzAPxFOQCB1iAAzcQ3AKCIIAB3tmAA+ON8AP4YJACw2TYAnApe
AMBFFQC33zcAFbUkADNLXgDh5D0A/3hrAC4FfABwfQUAMIxqAPKTPABs0isAshQT
AFm9EQCGChsATmMCAE8HeQCHLCQAg0FhACLLAgDDNjgAOHtsAKSWLAAm/RAA7gNx
AL8dAwCbwEYA4UMxADRDMgB/0CkABNccALpoOwDHVUoABz5VACbafgBrQHMAHa43
AM8GbgAefCAA5XwtAPffJgB9jx8AqpEkAP2XMQAuu0YArEFSAJT3NQB4K3cAOyBd
AF7EDwCKZE0ARVRWAEK0aQBrW30A+a1MAIkgbQBNajUA19wmAKXyMQD4tyoA480b
AFwldgAx5lwAbkZkAFf0JwAmRxAACZcsALvyXwDyfG0ABSR+ADqbfQATtScAes9d
AK9aCAAgaEQAgeR+AJgTeQDqLRgAzQsnAKUcHgBWFFoAYptZAJcdWAAPjGMA4C5Z
AAqiAgC2hScAXbQJAFeYBgAi1n8AOzcyAL0aZgDdxRIADVZVACcUEABbqCAAs0Bz
AFMQSgDCDD4AgohwAIgECQAoxFMA3aYuAEjnBAAZ4xMAWns5AKb5ZwDKVBoA7sVq
AGGQeAC9BzwAXxdSALclQAC38B8AQDoOAOr+KQCV0nkABAwVAM/kcQDxYjAAv9R2
AKIIHgDZg1UAl/YQAHOmDwDqlzkAlUdKAP9FKACKjUIAY8FbAB/NGgA2phsAmad3
ACBnLgCtnXsAC95bAFLdawD6ZwcANQFkAIyjJQCyoE4A819XACRvPgBaQlAAEgJv
AGD8aADzVTMAdyJ4AERQCQBv7k4A8mcyAMuOTADJIgEAAbA/AFPcfADq0EgAeJ86
AL4WSQA8A3oAzrUvAKaYHQDeO2QAfhUtAHj3awAuuC0Aq+USACaNUQA+aHMA++RC
AAsyVAA5XyQAbTFoAJCqNgCnDm4Ar4cRAKMnXQDxoUkAPfcyAMkODgBaQkEA8vl2
AJ/tQwAUOB8AIygbALgZRgBrBFoAQuhCACQuTwCfSxwAsH5lAA1udwAmJHgAVdxA
AMmSWQCmlioAM61PAHnRfwCVewYAtzJrAAonWgAII2UAHPcOAMUVWQCXL3IAWSoi
AJReGQDpRnkA93ggAJjZWwAsM0IAJEUBAJmUCgCCAiwAzvYFAKpFAQD6qGkAJH9L
ANOfLgAXsjEAHqEiABSZEwDXGS8AUTxAAIbXWQA26x4AJEV9AFP4DwDT1EAA+J55
AEqqdQC+YB4Az4NdAFCDeAD/TlsAsh8qAHPiSwA/NhoAe2pFANVxdgCk4hYAljtQ
AAN5GAAl2V0AyPtDAEwNbQC4L0wA0vBeAIIZaAA8hnMAPQ9fAMn4MABYHAwATRVb
AEoBHgAD0SkAOOtCAOdMfABVoh8AGR06ADKoYgA/lRsAa7UMAEZ2YQAfXCEAlB04
ANFSMgAQBxMAUbh9AAbUewDIFHkAKQxKALxiAACpGzgAgHgPAIelfQCvJ0QAqdM1
AFdFRQDM/CAA0IooANAkTAAulnoAZgc8AFlkaAB8/SoACOggAKcFewCnCRcAelV9
AAgDcQAhsSkAEWpBAG+xSwBsKgUA0ttIAEfLAgD9VQoAPehpAKJsQgBEex4AwH0P
AEU8aQANK0oA7zZEAND/MgB9uCMAbXJwANFuRgAl8h0AN1MdAGM5DgCKuGMAlkET
AP7LUADxtUcATntrABy1WwCb/mYAav8lAIVzFQCk7wcAS5VqAOYVTwAlmWMAP/o8
AAfoCwDJfGoAYY4GAE9qXQBAzk0AKfgnAAwqVQDMhzsAojFPABu5fAD+DlUAJ+5u
AFfTXQDkJWAArfgYAJEMEwAM2lkAOyclAO3lZQBI51gAJogxAPBfSAAMTT0AF0Fy
AGZgWQDtZy8AEwQ4ABnQGQAKCSkAt4AEAFdhHwBsz38ArZ4gAN2YTACzZC4A97MI
AKGuLADMBwMAQrZgAOGpBAAGTxMARkxkAOgYUgAICGcANu0BALeEUQD0gU8AoTIc
AIPRXAA8j3AADrlLAGBZIwBzSEYA1CU3AAX6KwDlk0IADickACoFUgChJiUA6I5y
AFMzNQD1Mg8AWtMQAFvkYQDpKQ8As5QkAFr+MQCAxy4A7zA8AGPfagCqZxIApOFj
APNTMwAKrAQAM+l5ANUcDAAlqFwA07dUAAWUCQAKZSYAJBcwAG4cZQCMsEsAki8o
ALxwNACWnA8A8KxJAFOiBABUVT0AuXJZAIMeEwC9zGIAPbBjAPPULAAfMDAAGoka
ALP7VQCATwoAWJ4OAM1wQABwuyoAHAY+ALCLZAA45XEAGP0HABOsOQC6h1MAwGEv
AOelBQDyO0QAuhwwAL7AGwBB1gAAjnUpADU3aQA20RkAxvtEAONAeQBGEAEApQtG
AKgDVAC2xw4Af8MNAO+ecQDErT0AkgFAAG3bHgCjy0cAOUFTAJ1bRwAfuGsACxwo
ALY/egBshlIAcE4HAP1YSQAIOWMA+dMEAD6sRADKaFUAx08KADpYAQAjTCkAw7Yh
AEUgZQAbay8AZoAKANJ4FQCQrFwAC31YAIi0LQAiG3QAqitdAJ9UOQDbyy4AuTAS
AHyjUQBBEksApdxxAPtPTwB0OmsAIOc3ADx3bAA+ZB8AQlQtAD45ZQCDLm8ANXp/
ADEDbAAmEgsA2uVZANNUJADLAx0AEqZlAASJegBL6w0AvdE8AK8iYQCEdjoAT2cR
AIVPWwDMFzMAIawUAC0eCwBW2xgA9gBfAODwNgDma2oAIlFMAIRWEQAjyyUAWRsU
AKqAFwAnsXwA4BhNAAisfwAvtnoAbXsgADYIWADwJEgAtfx8ABFeLAC62y8AFAdF
AKjWTABnMBsA9yBVAMOBQQCipUQAcbMEADWOeABHu3YAB0w6AMcrMgAPLjQAECN0
ANnkfQA9mB0AzEQ6ALokAgBt91wAUY8KAE/7aAD6jToAwct6AOqpNQCN3w0APV1w
ANWFWwA1SXgA6yspAN3SbwBhrWoAyet8APV0AgAV6h8AAp0pANYmJACBAAUAIc5g
ACNWFACANUcAUTlcAA8FNQDneUwA29p2ADWnZgC44GIA67JKAOMgUAC4JC8ANsEw
AD6LEgBYonwAR3o1ALPcewDnngMAN1F9AFRibgDrFkgAEFUAAMG0HQAZanMA1ft0
APcgDABkXWgAT+pwADxKCQAZxDQAAwEyACIVZgDXSkEA3fZHAG+PLgCgG3kAb4Yf
ABCvAQCq70QAzyBUAOPJSAAy2xkAyeVaAPL+FgBFA1EAln5HAOq+dAAbmxkAQUV4
AP2SFQD7e0IAT/I/ANVJNgA+amUAsHINAMqMTQCCDlQAwPBeAApAaABoTW4AETE3
AK0lYABsDyoAcGVJAB4pNwCmMT8ApJUhAN21AwC6GQUA8aVHAGLITABryyUAlVoG
ACspGACkO3kA8mhZAC2VRwDXkl0AgsAXAI7CLABbFWgA/XY/AIn/awCb1C0AKyd/
AGtMfwAkXSEATjAWALLnHQAcdRcA2E1zAKiLOgBBlREAkQ8yAI+7PQBndkYAlk46
ABvJEAAgb08AmJxQAOSPLAD71BkAtoYCANEJdADbFXAA8Bw5AGl2bwBssFgA4Adu
AJKQBwDq+2gAEoxFAFZ0LwA/qzQAmtwqAIF/QQAgZ3YA+ZZpAIejfAB1jWwAyvdS
ABckMgCbSTQAQi1SADE4DwC6QxgAREwxAHA/SwDyvx4AZzl6ACHZRQCmgFMATAQl
ABaVVgCulRsA+7ZEAEQOegC/GGsANQ1bAAOeJgA/u0cARMd6APtIYwB+BjAAHpcb
AHJMcgCYUCsAAO4fAIveUgD0QiUAGvAqACiWbgDVcDQA6n8ZAIeFDgC42RAAFyc9
AIPTHQC9SBgAJvwbAHR2WwBU/x4AQ25AAHR1LABI/yMAyEoIAOgrEAAsokYAtjY+
AG5QSABTASoAEktDAArYfQDOoBEA8H0GAJmXaQDnykUAZxsjAImeTACnAyUAddIZ
AFMIWwA2g0YA3IZyAJAvWgD7lUMADglFAEffVQACxjMAunsGAJdQWgAOSmkArJw3
AOvWTwBLMxUAh+BxAFlcbQCuOzAAyOEzAK+UBgB/SAsA3W4NAKceYwBo0F0AhfwT
AA6fVwAq4EkAIvgqAKiMQACLciMAE4l6AGnvUwAPA3oAoro4AGXwXQCcQWoA671t
ACyCagC9Ki4Ao6F2ALkOKQBKhmQAuphXAOi+JAAEZVkAzjMVAPbhYQCzaGoA3A1h
AM59KQD8DBMA17hLAGa6PQAt4XgAvyBrAIgBagANElMAG/4nADmCfABdylIAuKco
AD3HLwCwnz8AQhBcABGxUAAsgW8AwBU6ANnacAA4h28AVO1DAGEBIwCBSTkAbpph
AIgjKABbeWYA9/NGADbudQDoOnsAe3sOAJU+QQBnARsAVZwyAKSzbAAAjFkAtvYX
AGftQgCpKkwAgC07ALC0UwDHoSAAXkk1AAK9dQDihRQAyPgyANAoTgBbfSsAx9k5
ABfEUwCYLAAAqlN5AP8dEQAeLAwAZF1XAMOPGgBC2QMAq7xlALlqPAA173QAeHxr
ACDPKAA25hkAtNM2AFKYUADXBCUA0PpKACcvLQDdHAIALGsZAKVqJwAGQQoA7dNh
APGPbwDPPQ4AdesYALusFgCB3EEASBpOADBEFgAOZE4Alb9SAEaEOwCvnAUAd8Nr
ANteJAAGrkoAFUR2AEAXCAAeSVQAQt5YAOxMLQC7iFAAP/lzAEcqZQDNLCsAeEcR
APBmYwAOXwcA2MQCAEi8WADAL2wAj8JrAPNYQQAGhh8AVVgMANjlXQCt4nIATvFp
ANEJJQAwqhkAcjJHACy2EABsQgIAjq9PAESMMABr7CAA//ksAEg6GwDkvk0AxFAq
AChbQwAbgF0ABTMwAFnpOQC+hAsAG94JAEs+DgAOfRsAYL9SAIqxEwBeQVEAro0m
ACt/PAAfHFEAOKA9ALqAUwBJYlwAnUtZAJEMKgCmQ2oAow4EAOZeawA6TVQAsYRb
AKrPeQCvoHkA2REaADQQSwC7lScAGZBxADRUVQAckhcAGtMgAK3HbAD4yBQAzS4b
AL9bAwBldDcArdNPAIcCKwDbWwMAqod1AMJqZgD0qHMACYNYANqUOwDL0EEAyx4Z
APfZXgB0PyoAOHgcAIxQEgDyRWoAAaELANejaADk7SYAt8tXAFyacgDo3GAAFx02
ANH+GgDOogQA25xdAEtdcQCvBz8AaAZUAGRbHAAnwmcAuRdSAHYXVgDyQhMAMh0G
AIXUMgD0GGMAv+s0AJNfPQBeRkkAYW0mABpqNwBn9wwAzzhxAEUrcQDalXsASSt5
AHt2NACsEyoAhOl7AIojJwB9nSYAaoR/ACRjCgAbKUoAMB5KAB5FWAC392cAWK8M
ANLFXQBWcFcAPEwBAE7qTgDxb2sAbH12AD0hKgB29loAxphuAD9uHAA4HAcA0OcT
AEdmBQCaSzgArqBCAPsvXwCTFxkA/Cs4AHYrJQAVWW4AOGMUABegAAAvGGQAtuR3
APLfEwBjow4ARRASAKXKTwBad0oATS10AOwBMgCibSEAVRItANkxEQD7UmkAZGIY
ALI4ZwBMk2AArtRXAMdgIgA7pnQAIbpQAG4ifQBljzIAeT0bAFxZCACQwlwA8kFC
AKQcPQBH6C0AkJlMAFQoIABA+gUAGzIZAPyNWgA5nx4ASAZMACAMLgD5TAsAf9IQ
AM96DAD8jk8A0YNoAKYgTwCOs0YABVQ9ACp1KACsKgMANJMDAAjndgAQuDUATG4f
ANNyBwCmK0sA4nMBABkXbQBfED8Av115AGXAQgA7+EgAx+VGAM6aBAD9QgsAvvBT
AJenHQAX71YAeGhnABDlbQCpFSgATlgTALhwYQC6xzUAkSw0ALcTTAAq7VMAkf0X
AMgEeQBNBzsAgZEzAKc6eQArEEAA21FGADnXVwBS5i0AlZY1AGirbABgVwoA8CsN
ALJlPABhRGoAMpQtAJcXSgCJWHAAwaAqABP+RgAsdEEAIKgzAAqUZgAJuhUAuBMv
AFjNNQAvb18AG5Q4AHpVbADwXWsAYRxMANXRTwD6nUAAAK1FAOAyDADH9X0AwuUl
AN2vGwAT8iEALhN7AJTSUwCJa0AAu+UpAP1jQQAIWjMAYVgtAOAoewD2DUQAE0ph
AHWEdgCc7yAAy/Q4AKrZBwAo8EUAdKIJADkNKQDLLkIANs1AAKOKfwDUzhAAuS9M
ALbqHACukk4AWeAxAPd6cwBvAjcATbclAHgGZwAvFTIAhANEADjOWABpAhMA234p
ALPxKQBrRkIAvmxzAOw/bQAl4RoApC0VANsHKgAvYwQAZLk3AOZ5CwDN210AbIAU
AN//IADe7zcArntCAHJ7fAAsqmIA//t1AHAjXABO1nkAGAsNAG5CCQCCFhQA5xh1
ACJcCABcq14AKKEXAKZyQwBB4QAA7Y4yAIf/cQByUXQAaXdzANfccAAnWhYA+T9G
AFVQQABpa1AARvQXAOkXOABdCQoAP8sCAPquFQB3nQgAsrt3ABIKUQAMLQ4AvzJ1
AHRRVwBrbAYATVQNACSbcgACSgsAvqoxANroJwCMVT0AMulQAJOQFwBF/CkAs+M3
AJlHcQC+QhsAS50PAJ4nTQDX9QAA4vUjAKtRHwCkRQYAMD96APbJCAAv53UAwtdL
AJtwOQCKDyAAy95tAN6aHgAayyYAQe0SAPQaTQAxLxAAz0YyAATsRwBhiS8AjpYr
AOycUwAgFVoATEMxANmbfAAXxQwAA4t9AFxvcADwmAcA0IxIALu2AAC8WDIAAodA
AIRODAA10VYA6HAIAJBvVACuLw8A00Y2AHmVawBnwnAAajRFAALyJgD98WkAiwN5
AJ25BQCj334AFkEmAF/SXADM9CAA8+JxAO3zKQANPyYAGaY4ANJSCwBwRRcA3CJl
AAIucABrS1kAAXoqABE8FgBwR1IAp3QnAFI2RACfoXYATUdvAIC7bABndycAIrFm
AMFTegAueWkAuCcWALWqEAA5DBwAlsFIACntCwA//XkA0qg4ANTUEgACvwwAM49K
AEVtWAAafX4Ar3BsAJiMcgAeTVcAWihVAO8tNQCnsyMAPcVeAOi+RgDv/m8AjdUU
AJkLeQB/lFMAjWZWAL4CLQAOv3AARONAAM09DgCF808AmpE1AI66ZgAtLjkA8hAi
ACL4EwBZ5m0AAf1GAPDEPAC0rl8AtSwCAPrzIQB4qUkA2MlPALHdeQAsM1EAZz0o
ALhHRACqtScAFJ9gAI8idgBjAlAAigBPAPkzSwD57wAAl/cIAB2nWwCvcmgAyPN3
ABXRJACY6k0AEwRXAHZyAAAPmUkAx6FWACnGXgDInDkA5fwxAPLvAABn/WYA5xcR
ABnKKwCemFMAmq4cAFZYeACHJgMAXsgAAEgQNQC/iBEA+99aAOc5dADq+jkACbkT
AKXTNwCtQy0AdihFAN7eCADQzWkA+yMyABxqRgCldCoAcDZPACIJeQBuwEgAbK9z
ANWBbAAohBQAnSk3AL2aXQB49iYA2iI4AADyfgA2JBEAq41/AIMtcQCO+0MAuL0J
ABBDUABFGQMAQeQXANVuAwAe7G8AjeYLAFxxAQBVeTUACtshAEvKLQCDcgEAKesn
AEoADwASlVIARoo6APR4fQBC+mQA+AMlAEpaKwCRVkYALw9pAF7TQQBqiWkA1Ad+
AFn2dwDPjnkAK4VVAPRGVQBX51kA/olmAA8bcQAMsQQA7PIVAMmvXwBD8UAAX1Fz
AC6WOgDqRkIA52UpACnuFgCm5BoAKSQLAPysDgAPJ24AKw1kAF2MSAAWlQcA7hos
AFYCcgDSE1QA9al9ALhqWwCq+B4Apw0eAKiDMgAmmTwAvhhCAKk9VQBWPwwA7DgB
AD8INwDZWFQATQQcAPmCCgDcfjQAE6BIALvqOwCYpF0A9EQAAMkTbgAOZzAA2BhF
AH/EOgB4uUcAlwx8ANb1bgACGF0AJQcaACvDBgBp1TMAw5MgAHS4aADXtT0AvA1L
ADDDXAAf7AgAtoNqAHZNfwCOV3wAhZ0mAKbHXQDGPzIAKgEkAPvkLADczB4AKcFh
AL7ABgAJqxIAg6gTAPvVRAAn53QAjfBTADUVQwAM0xsA06RsAMTWUwCZCVgAbndj
AAzpcgAWYTwAeUJoABPxOQDUd0cAcGxXADI9ZwCc6FQAHT9GAJ9mQgDJBz0APNRh
ALs+NgCqEm0A63JCACvWGwCQ9SAA1ZVJAOWcAwCC1CQAuBgAACGKWgB7yEIATbA1
ACnPcAAEwikARH1kAGx7PQBJKVcAvv4sAAuxYgC1KCMASDkmAN6aUQCeJSgAG/1O
AAysaQAjP1EA/mM1AJIfVwAESWAAyQ9NABvudACXx2sAgjRQAP7NagAfLUsAdUQ8
AD9uEwD4QSwAL7wVAGYwcwCh5CwACBV2AINPewDRXGgA3WdgAPhtMQAsPl0AvtsI
APKqGgAOpzUAENZUAM3nQwDceBUAaI8/AIseKQBtwQMAwxwhABYEHwBkwzYABedU
AAc/EgA0jG8Ab9cEAFBcbgDv8mYAD1ZqALTfWgB93CMAv2ZoAKnaBAB8O0IAQlhs
ADJpDAASokAAyRBkAHgvXgAnAQYA4EQNAOTZRgBkkTsA4BpEAL/2BQAHDnYAAvBm
AOr6RQApJ3YAgTJjAO27aAAg6QIAeJshAP9vGwAA63AAvulAABMuTwAZOFUAam5W
AN7AVQBfOxQAIzwbAP9xfAAILS0AqwIDAEWYbgAi2UUAGGQJAD+TYgB1TjYAcmoh
ADiLSgDdMw0A3nNfAMrQYgAvKywAveJ+AL4gbwDiij8AbhFdALjyFABUsgwAEPwK
ADweLQBjWFwAKMBVAOKELgAJKX4AqGlcADTlKQDWclUALytmAMNoQwAI9E8AsFZ4
AAb+DwDRRGgAEoIPAGD5BACv6QMAvXYoACZZHgAOnnsAZHNrAOl4fAAxtmMANI4A
ACxnNwCw7UkAc+EnAFtjFgB2aQ0A9Xc+AG+PdwBIOGYAZFIXACrhXgDMkDsAD7Bd
ADbqEAA9NXwAzHI8ACfCaAAisjcAUVVEANPrSQDfpkIAI1hNABB+LwDr2VcAgh9P
AFfHDABsFGIAMcdxALmGcABDjXcAw40FALsmAQA3v0EAM/glAAQwagAusBoA8IUj
ALy5NgDcVlkARDdPABwVQwAzFggABMBGANq6ZQBZQnYAHVYVANrtJgAsK0UA+lMD
AD77fgAsYjEAqApiACg7GgAPk3AAwn1NAAjZYwCfHiEAjhRWAD9nbAAqWAkA7FQt
ADgJHQDGY2kAxXVeAM2UAgCVDEgAeJ8XAJjhSwBfAVYAS50yANAjZABLhzMA4t5X
AFDzSQAurTcAGcIYADBmWwB80GgArZFSAKgISgDccy4ARF4gANkwYADNOFEAQwtN
ALSGBAAyoToATedGAGRtfwDTUnkAmntvAGx5VAANMCoABQ8aAIAbdwC5Ey8A3Lo+
AE9BLQDV2E4ApGBnAG0sUgALdjoAWCc1AD+wGABWICsAqKExADN/eQAFumgAzE1n
ALmvRABWIA8ABQdwAJU1awAPDjUAhugdAEPQBgBYhHEAghk4AG1fUgCSrG0AGGJY
APUOKACUgG8AeukoAL8BbAA6V34An1EgAKBFPQA09GgAL+dMAMEBdwBLDiAALBhP
AEwzeQBT21oAMKwBALktawBbaQwAHmBIAGGXRwBKvWQAv+dZAD89OQDBWhsAdvc8
AM4dUgDU4h0AnYMIAF/sXgCSEmkACIMwALm4CgDOwUwACZZ8AJgoYQCO5wkAfvI0
AMM1WgAUTzAAmSkaAHpGTADLlksA0ywPADoJLQA6WzEATXEiABKnbQDLV2EAdT8y
AOctRABLl0IAvgt3APXPbADeSAMA0B4PAOAYeQBz02IARJ07APelWgAEqygA+lN5
ALdKOQC8qjIAYzxoAEyAKAAXryQATZINAAHdSQDqVSQAzY1cALSHYgDpLl4A6elx
AJrJbwCej3MAo+JRAGpjawCyyz8A7KBVAG0PJwACw2kAySd3AMC1PAAYF3EAbnZ4
AJvqegBUfSYAKmF6AC0BIAA4m3YAvgwOAMvkUQBo3mEAnnsnAHBJYQC1RAgAJ3J5
APYvIQBbR0wAT3dfAOTZUQAdw2cAYEhhAICQAQA1DU8AK3pTAJg8aAA8KH4ALd4P
ADMoIwDtEzQAmclPAP3oeQCSPRMAeYwYAMwPTwBNzDIASkY5ABAiNwAeCRYAXlhJ
AJW4TACgIDAAPwVzAL+CGABp4nAA7El8AHpQfwAQowQAPndAAB4begASznwApfAv
APxdeQB6LAIAq0p8AL1uQgD8V24AF5RndONc32pjJyC9GUWBihU1eTTv90+KddZs
MachXNa/Cmf25VZk1w3To1om4XE/lOIq5RidMA8b+FWgXyMsb0tZOf03xYs9Q+et
/zdkQGdKbB+usGyjghjJ4Gsdd2PrHpvNCE0F5HURalHGM0ITqcPXZgF0hnukynYR
1NdirKvYV1ua96OgnO8ndTg3wE67k9O8tWlM+E3TNeLHJD3TgWVkVAvMgY95s/PK
HE+9RKb9unKQfLhVnP2gJp8TOCt58zBDcyr47G/XzfaweRtCjdZ3wfJWaaHP19lJ
lymRMi9j8h8pOjK6E9Eg4sOPonjUjELPzYIfURGjQG0E4uSnNz8C+3Y2Ov7LAhxZ
vxTVd4Ag6YNnqOzdhud+4xy/qI4+WvXVEHN9bFOD5wdPCC9aAqcEgRIzefUxbAx3
atD8VE7PrzUKhUspY2ZmNBzKikmwFYR3kfhv52s7xcAKWDARsEfpl970//lDzlwY
DzCcc8P05kf0nWQQkCUMVi4aDUkjVunCIjn8XOVX4VVmDMo2aehpQInDbVMe7oaY
8o9qQVVp7nSZIQHBPJUSnjBBSZHsXCArG7zV86KV+TElU53+/SoVfcDSB90bj3Cu
vUD37cJhTCNa69D1RZyw9v59SAaOvAktr90aAkgo0hIGE4nzvUUOy4ojlgioiv2N
m9f+n3wc9Re4YyBGUGZeo8ce4R+1dfFkNej8bhSh6EK7Mljkvqgh3BWVPhL4Lupe
7nLNYgZG62FpP+CXLyhlNhzz5D93RctG06uYWE2rDVd83qu8NwsUG5dTmUbT2F+b
/xlpK1E4cyBGdb9t7/xGgN+KGnrnSfqLguWqHSTG74+77+ScJ0a0EzPTlmOaW1pf
kXZRthGLzcQ/YUx4kBYEO7EEu8wjAC0HYZIMBunFA/zd3H6lOoKUt5emFzdPOvSh
IZvn2ne2jbQN/GMNPI19RPUnaMSMsDxn7PKkrlO1k0gkj6P7hT6MaPfDys1UEevk
UXAw6aa3y7I1xt+Mv7+qxR3oHYvodVovHeKZOeH58DLUsdOqCPyPow98D0oMJeXn
5I6vk2GyMKkAhE+o1kfsH98uZUocwbtWW7yzKw8KuUCY++/S05Rof/O57I2Ykxoe
X+dsYbwH02wM/bHu81ET5WFPvbRDR2h6GQFriHsskEhihLe1J41RhIIX+6Qz93z1
LZDmv0MDsZrFch8+qIGgDcyGgxgRa5e+L3s4xh/LdSl4c/unxie72EjmFp88eRvc
D4xCl/Tk9Ww+mXuA2AiYZslbpQ+SN31jxAlgghC5/Ip4vEmtSIbClHOX+T/1vLNN
yp6obLf9Lv/dVb/85e4xQlc5TZHPCFu9tBJMztEqv1VlGspX/eI12EDWpRQvZUtV
doHAKpufiQoFmDdyU8cBlvynhacww09lhWLvmSSRSwj60GvchgZvK7TTSbQ7JG6m
hbg3pHKpTMwfRy2zL6uYKCmWQihrysXO9qL7/UErpIcfsYReT+muBHob8gBEMYEe
QdZeeT3jj1dSGGchUhAzHqbwKZ0EjKaDwKuGFf+3gTcNzY5JmAvvlAdWowfENfQR
GmdGhIFRbiaMAT2fOcmm28TyOe97BoNu1BcXWci5w81+I+m+mevMcA3uaPzYR1BR
R5DgeKO1LSmtB1Ahkz0VLNdSlXSM7rK0ZqK4OUd7dKOoaRUe8MdkGtmX9NMshoAS
K35c0/1oaFp/JGTsl8JPlAKL31S7UanZ0CLPY7s68iLHOdDPyr+yWK5hZSA6+jBz
Wo2WJpJLaeLo58lS6H0olqXmxXDMmbMaxbmgRv9u+WO9mZN7i/ShZpi1hZbJePhx
po2EPUlZYR7Nt4lqNmiZ1TJkOBYv9iiE8+ZustLKaKXlkU558oi/EX3VgegXKxVh
7E1AsF5QnADQug/X1j/dARyHJERFplDGsmycs7OMomqt+8chgqQIeW6yoGQqsMRB
VLBqT20EggXAF5RndONc32pjJyC9GUWBihU1eTTv90+KddZsMachXNa/Cmf25VZk
1w3To1om4XE/lOIq5RidMA8b+FWgXyMsb0tZOf03xYs9Q+et/zdkQGdKbB+usGyj
ghjJ4Gsdd2PrHpvNCE0F5HURalHGM0ITqcPXZgF0hnukynYR1NdirKvYV1ua96Og
nO8ndTg3wE67k9O8tWlM+E3TNeLHJD3TgWVkVAvMgY95s/PKHE+9RKb9unKQfLhV
nP2gJp8TOCt58zBDcyr47G/XzfaweRtCjdZ3wfJWaaHP19lJlymRMi9j8h8pOjK6
E9Eg4sOPonjUjELPzYIfURGjQG0E4uSnNz8C+3Y2Ov7LAhxZvxTVd4Ag6YNnqOzd
hud+4xy/qI4+WvXVEHN9bFOD5wdPCC9aAqcEgRIzefUxbAx3atD8VE7PrzUKhUsp
Y2ZmNBzKikmwFYR3kfhv52s7xcAKWDARsEfpl970//lDzlwYDzCcc8P05kf0nWQQ
kCUMVi4aDUkjVunCIjn8XOVX4VVmDMo2aehpQInDbVMe7oaY8o9qQVVp7nSZIQHB
PJUSnjBBSZHsXCArG7zV86KV+TElU53+/SoVfcDSB90bj3CuvUD37cJhTCNa69D1
RZyw9v59SAaOvAktr90aAkgo0hIGE4nzvUUOy4ojlgioiv2Nm9f+n3wc9Re4YyBG
UGZeo8ce4R+1dfFkNej8bhSh6EK7Mljkvqgh3BWVPhL4Lupe7nLNYgZG62FpP+CX
LyhlNhzz5D93RctG06uYWE2rDVd83qu8NwsUG5dTmUbT2F+b/xlpK1E4cyBGdb9t
7/xGgN+KGnrnSfqLguWqHSTG74+77+ScJ0a0EzPTlmOaW1pfkXZRthGLzcQ/YUx4
kBYEO7EEu8wjAC0HYZIMBunFA/zd3H6lOoKUt5emFzdPOvShIZvn2ne2jbQN/GMN
PI19RPUnaMSMsDxn7PKkrlO1k0gkj6P7hT6MaPfDys1UEevkUXAw6aa3y7I1xt+M
v7+qxR3oHYvodVovHeKZOeH58DLUsdOqCPyPow98D0oMJeXn5I6vk2GyMKkAhE+o
1kfsH98uZUocwbtWW7yzKw8KuUCY++/S05Rof/O57I2YkxoeX+dsYbwH02wM/bHu
81ET5WFPvbRDR2h6GQFriHsskEhihLe1J41RhIIX+6Qz93z1LZDmv0MDsZrFch8+
qIGgDcyGgxgRa5e+L3s4xh/LdSl4c/unxie72EjmFp88eRvcD4xCl/Tk9Ww+mXuA
2AiYZslbpQ+SN31jxAlgghC5/Ip4vEmtSIbClHOX+T/1vLNNyp6obLf9Lv/dVb/8
5e4xQlc5TZHPCFu9tBJMztEqv1VlGspX/eI12EDWpRQvZUtVdoHAKpufiQoFmDdy
U8cBlvynhacww09lhWLvmSSRSwj60GvchgZvK7TTSbQ7JG6mhbg3pHKpTMwfRy2z
L6uYKCmWQihrysXO9qL7/UErpIcfsYReT+muBHob8gBEMYEeQdZeeT3jj1dSGGch
UhAzHqbwKZ0EjKaDwKuGFf+3gTcNzY5JmAvvlAdWowfENfQRGmdGhIFRbiaMAT2f
Ocmm28TyOe97BoNu1BcXWci5w81+I+m+mevMcA3uaPzYR1BRR5DgeKO1LSmtB1Ah
kz0VLNdSlXSM7rK0ZqK4OUd7dKOoaRUe8MdkGtmX9NMshoASK35c0/1oaFp/JGTs
l8JPlAKL31S7UanZ0CLPY7s68iLHOdDPyr+yWK5hZSA6+jBzWo2WJpJLaeLo58lS
6H0olqXmxXDMmbMaxbmgRv9u+WO9mZN7i/ShZpi1hZbJePhxpo2EPUlZYR7Nt4lq
NmiZ1TJkOBYv9iiE8+ZustLKaKXlkU558oi/EX3VgegXKxVh7E1AsF5QnADQug/X
1j/dARyHJERFplDGsmycs7OMomqt+8chgqQIeW6yoGQqsMRBVLBqT20=
-----END PRIVATE KEY-----
`
var dilithiumPubKey = `
-----BEGIN PUBLIC KEY-----
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
+8chgqQIeW6yoGQqsMRBVLBqT20=
-----END PUBLIC KEY-----
`
func TestImportExportDilithium(t *testing.T) {
var ctx *IqrContext
var rng *IqrRNG
err := IqrCreateContext(&ctx)
if err != nil {
t.Fatalf("IqrCreateContext ret is: %s\n", err)
}
err = IqrInitRNG(&ctx, &rng, rand.Reader)
if err != nil {
t.Fatalf("IqrInitRNG ret is: %s\n", err)
}
variant := IqrDILITHIUM128
var params *IqrDilithiumParams
var priv *IqrDilithiumPrivateKey
var pub *IqrDilithiumPublicKey
err = IqrDilithiumCreateParams(ctx, variant, ¶ms)
if err != nil {
t.Fatalf("IqrDilithiumCreateParams error is: %s\n", err)
}
defer IqrDilithiumDestroyParams(¶ms)
err = IqrDilithiumCreateKeyPair(params, rng, &pub, &priv)
if err != nil {
t.Fatalf("IqrDilithiumCreateKeyPair error: %s\n", err)
}
var publicKeySize int64
err = IqrDilithiumGetPublicKeySize(params, &publicKeySize)
if err != nil {
t.Fatalf("IqrDilithiumGetPublicKeySize error: %s\n", err)
}
var privateKeySize int64
err = IqrDilithiumGetPrivateKeySize(params, &privateKeySize)
if err != nil {
t.Fatalf("IqrDilithiumGetPrivateKeySize error: %s\n", err)
}
// Export public key
buf := make([]byte, publicKeySize)
err = IqrDilithiumExportPublicKey(pub, buf, publicKeySize)
if err != nil {
t.Fatalf("IqrDilithiumExportPublicKey error: %s\n", err)
}
// Import public key
var publicKey *IqrDilithiumPublicKey = nil
err = IqrDilithiumImportPublicKey(params, buf, int64(len(buf)), &publicKey)
if err != nil {
t.Fatalf("IqrDilithiumImportPublicKey error: %s\n", err)
}
// Export private key
buf = make([]byte, privateKeySize)
err = IqrDilithiumExportPrivateKey(priv, buf, privateKeySize)
if err != nil {
t.Fatalf("IqrDilithiumExportPrivateKey error: %s\n", err)
}
privK := DilithiumPrivateKey{
PrivKey: priv,
PubKey: pub,
Params: params,
Variant: variant,
}
der, err := IqrDilithiumExportPrivateKeyPKCS8(&privK)
if err != nil {
t.Fatalf("IqrDilithiumExportPrivateKeyPKCS8 error: %s\n", err)
}
var tmpPrivKey *IqrDilithiumPrivateKey = nil
var tmpParms *IqrDilithiumParams = nil
var tmpVariant *IqrDilithiumVariant = nil
err = IqrDilithiumImportPrivateKeyFromPKCS8(ctx, der, int64(len(der)), &tmpPrivKey, &tmpVariant, &tmpParms)
if err != nil {
t.Fatalf("IqrDilithiumImportPrivateKeyFromPKCS8 error: %s\n", err)
}
// Import private key
var privateKey *IqrDilithiumPrivateKey = nil
err = IqrDilithiumImportPrivateKey(params, buf, int64(len(buf)), &privateKey)
if err != nil {
t.Fatalf("IqrDilithiumImportPrivateKey error: %s\n", err)
}
var qsSigSize int64
err = IqrDilithiumGetSignatureSize(params, &qsSigSize)
if err != nil {
t.Fatalf("IqrDilithiumGetSignatureSize failed: %s\n", err)
}
var message = []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
var qsSig = make([]byte, int(qsSigSize))
err = IqrDilithiumSign(privateKey, message, int64(len(message)), qsSig, qsSigSize)
if err != nil {
t.Fatalf("qrDilithiumSign failed: %s\n", err)
}
err = IqrDilithiumVerify(publicKey, message, int64(len(message)), qsSig, qsSigSize)
if err != nil {
t.Fatalf("IqrDilithiumVerify failed: %s\n", err)
}
err = IqrRNGDestroy(&rng)
if err != nil {
t.Fatalf("IqrRNGDestroy ret is: %s\n", err)
}
err = IqrDestroyContext(&ctx)
if err != nil {
t.Fatalf("IqrDestroyContext ret is: %s\n", err)
}
privKey, err := GenerateDilithiumPrivateKey(IqrDILITHIUM160, rand.Reader)
sig, err := privKey.Sign(rand.Reader, message, nil)
err = IqrDilithiumVerify(privKey.PubKey, message, int64(len(message)), sig, int64(len(sig)))
if err != nil {
t.Fatalf("IqrDilithiumVerify failed for privKey.Sign: %s\n", err)
}
privKey.Destroy()
}
func TestImportExportDilithiumPEM(t *testing.T) {
var ctx *IqrContext
err := IqrCreateContext(&ctx)
if err != nil {
t.Fatalf("IqrCreateContext error: %s\n", err)
}
defer IqrDestroyContext(&ctx)
// Now read the QS key.
qsPrivDer, _ := pem.Decode([]byte(dilithiumPrivKey))
if qsPrivDer == nil {
log.Fatal("error parsing classicPrivPEM")
}
var qsPrivKey *IqrDilithiumPrivateKey = nil
var variant *IqrDilithiumVariant = nil
var params *IqrDilithiumParams = nil
err = IqrDilithiumImportPrivateKeyFromPKCS8(ctx, qsPrivDer.Bytes, int64(len(qsPrivDer.Bytes)), &qsPrivKey, &variant, ¶ms)
if err != nil {
log.Fatalf("error import QS priv key: %s", err)
}
qsPubDer, _ := pem.Decode([]byte(dilithiumPubKey))
if qsPubDer == nil {
log.Fatal("error parsing qsPub")
}
var qsPubKey *IqrDilithiumPublicKey = nil
params = nil
err = IqrDilithiumImportPublicKeyFromASN1(ctx, qsPubDer.Bytes, int64(len(qsPubDer.Bytes)), &qsPubKey, &variant, ¶ms)
if err != nil {
log.Fatal("error import QS priv key", err)
}
}