aboutsummaryrefslogtreecommitdiffstats
path: root/tests/test_utils.py
blob: 04182a06f0e522a584c482c1dc5a60ac17d1b800 (plain)
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
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
pre { line-height: 125%; margin: 0; }
td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #ffffff; }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
/*
 *  yosys -- Yosys Open SYnthesis Suite
 *
 *  Copyright (C) 2012  Clifford Wolf <clifford@clifford.at>
 *            (C) 2019  Eddie Hung    <eddie@fpgeh.com>
 *
 *  Permission to use, copy, modify, and/or distribute this software for any
 *  purpose with or without fee is hereby granted, provided that the above
 *  copyright notice and this permission notice appear in all copies.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 */

#include "kernel/register.h"
#include "kernel/celltypes.h"
#include "kernel/rtlil.h"
#include "kernel/log.h"

USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN

struct SynthXilinxPass : public ScriptPass
{
	SynthXilinxPass() : ScriptPass("synth_xilinx", "synthesis for Xilinx FPGAs") { }

	void on_register() YS_OVERRIDE
	{
		RTLIL::constpad["synth_xilinx.abc9.xc7.W"] = "300"; // Number with which ABC will map a 6-input gate
								    // to one LUT6 (instead of a LUT5 + LUT2)
	}

	void help() YS_OVERRIDE
	{
		//   |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
		log("\n");
		log("    synth_xilinx [options]\n");
		log("\n");
		log("This command runs synthesis for Xilinx FPGAs. This command does not operate on\n");
		log("partly selected designs. At the moment this command creates netlists that are\n");
		log("compatible with 7-Series Xilinx devices.\n");
		log("\n");
		log("    -top <module>\n");
		log("        use the specified module as top module\n");
		log("\n");
		log("    -family <family>\n");
		log("        run synthesis for the specified Xilinx architecture\n");
		log("        generate the synthesis netlist for the specified family.\n");
		log("        supported values:\n");
		log("        - xcup: Ultrascale Plus\n");
		log("        - xcu: Ultrascale\n");
		log("        - xc7: Series 7 (default)\n");
		log("        - xc6s: Spartan 6\n");
		log("        - xc6v: Virtex 6\n");
		log("        - xc5v: Virtex 5 (EXPERIMENTAL)\n");
		log("        - xc4v: Virtex 4 (EXPERIMENTAL)\n");
		log("        - xc3sda: Spartan 3A DSP (EXPERIMENTAL)\n");
		log("        - xc3sa: Spartan 3A (EXPERIMENTAL)\n");
		log("        - xc3se: Spartan 3E (EXPERIMENTAL)\n");
		log("        - xc3s: Spartan 3 (EXPERIMENTAL)\n");
		log("        - xc2vp: Virtex 2 Pro (EXPERIMENTAL)\n");
		log("        - xc2v: Virtex 2 (EXPERIMENTAL)\n");
		log("        - xcve: Virtex E, Spartan 2E (EXPERIMENTAL)\n");
		log("        - xcv: Virtex, Spartan 2 (EXPERIMENTAL)\n");
		log("\n");
		log("    -edif <file>\n");
		log("        write the design to the specified edif file. writing of an output file\n");
		log("        is omitted if this parameter is not specified.\n");
		log("\n");
		log("    -blif <file>\n");
		log("        write the design to the specified BLIF file. writing of an output file\n");
		log("        is omitted if this parameter is not specified.\n");
		log("\n");
		log("    -vpr\n");
		log("        generate an output netlist (and BLIF file) suitable for VPR\n");
		log("        (this feature is experimental and incomplete)\n");
		log("\n");
		log("    -ise\n");
		log("        generate an output netlist suitable for ISE\n");
		log("\n");
		log("    -nobram\n");
		log("        do not use block RAM cells in output netlist\n");
		log("\n");
		log("    -nolutram\n");
		log("        do not use distributed RAM cells in output netlist\n");
		log("\n");
		log("    -nosrl\n");
		log("        do not use distributed SRL cells in output netlist\n");
		log("\n");
		log("    -nocarry\n");
		log("        do not use XORCY/MUXCY/CARRY4 cells in output netlist\n");
		log("\n");
		log("    -nowidelut\n");
		log("        do not use MUXF[5-9] resources to implement LUTs larger than native for the target\n");
		log("\n");
		log("    -nodsp\n");
		log("        do not use DSP48*s to implement multipliers and associated logic\n");
		log("\n");
		log("    -noiopad\n");
		log("        disable I/O buffer insertion (useful for hierarchical or \n");
		log("        out-of-context flows)\n");
		log("\n");
		log("    -noclkbuf\n");
		log("        disable automatic clock buffer insertion\n");
		log("\n");
		log("    -uram\n");
		log("        infer URAM288s for large memories (xcup only)\n");
		log("\n");
		log("    -widemux <int>\n");
		log("        enable inference of hard multiplexer resources (MUXF[78]) for muxes at or\n");
		log("        above this number of inputs (minimum value 2, recommended value >= 5).\n");
		log("        default: 0 (no inference)\n");
		log("\n");
		log("    -run <from_label>:<to_label>\n");
		log("        only run the commands between the labels (see below). an empty\n");
		log("        from label is synonymous to 'begin', and empty to label is\n");
		log("        synonymous to the end of the command list.\n");
		log("\n");
		log("    -flatten\n");
		log("        flatten design before synthesis\n");
		log("\n");
		log("    -dff\n");
		log("        run 'abc'/'abc9' with -dff option\n");
		log("\n");
		log("    -retime\n");
		log("        run 'abc' with '-D 1' option to enable flip-flop retiming.\n");
		log("        implies -dff.\n");
		log("\n");
		log("    -abc9\n");
		log("        use new ABC9 flow (EXPERIMENTAL)\n");
		log("\n");
		log("\n");
		log("The following commands are executed by this synthesis command:\n");
		help_script();
		log("\n");
	}

	std::string top_opt, edif_file, blif_file, family;
	bool flatten, retime, vpr, ise, noiopad, noclkbuf, nobram, nolutram, nosrl, nocarry, nowidelut, nodsp, uram;
	bool abc9, dff_mode;
	bool flatten_before_abc;
	int widemux;
	int lut_size;
	int widelut_size;

	void clear_flags() YS_OVERRIDE
	{
		top_opt = "-auto-top";
		edif_file.clear();
		blif_file.clear();
		family = "xc7";
		flatten = false;
		retime = false;
		vpr = false;
		ise = false;
		noiopad = false;
		noclkbuf = false;
		nocarry = false;
		nobram = false;
		nolutram = false;
		nosrl = false;
		nocarry = false;
		nowidelut = false;
		nodsp = false;
		uram = false;
		abc9 = false;
		dff_mode = false;
		flatten_before_abc = false;
		widemux = 0;
		lut_size = 6;
	}

	void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE
	{
		std::string run_from, run_to;
		clear_flags();

		size_t argidx;
		for (argidx = 1; argidx < args.size(); argidx++)
		{
			if (args[argidx] == "-top" && argidx+1 < args.size()) {
				top_opt = "-top " + args[++argidx];
				continue;
			}
			if ((args[argidx] == "-family" || args[argidx] == "-arch") && argidx+1 < args.size()) {
				family = args[++argidx];
				continue;
			}
			if (args[argidx] == "-edif" && argidx+1 < args.size()) {
				edif_file = args[++argidx];
				continue;
			}
			if (args[argidx] == "-blif" && argidx+1 < args.size()) {
				blif_file = args[++argidx];
				continue;
			}
			if (args[argidx] == "-run" && argidx+1 < args.size()) {
				size_t pos = args[argidx+1].find(':');
				if (pos == std::string::npos)
					break;
				run_from = args[++argidx].substr(0, pos);
				run_to = args[argidx].substr(pos+1);
				continue;
			}
			if (args[argidx] == "-flatten") {
				flatten = true;
				continue;
			}
			if (args[argidx] == "-flatten_before_abc") {
				flatten_before_abc = true;
				continue;
			}
			if (args[argidx] == "-retime") {
				dff_mode = true;
				retime = true;
				continue;
			}
			if (args[argidx] == "-nocarry") {
				nocarry = true;
				continue;
			}
			if (args[argidx] == "-nowidelut") {
				nowidelut = true;
				continue;
			}
			if (args[argidx] == "-vpr") {
				vpr = true;
				continue;
			}
			if (args[argidx] == "-ise") {
				ise = true;
				continue;
			}
			if (args[argidx] == "-iopad") {
				continue;
			}
			if (args[argidx] == "-noiopad") {
				noiopad = true;
				continue;
			}
			if (args[argidx] == "-noclkbuf") {
				noclkbuf = true;
				continue;
			}
			if (args[argidx] == "-nocarry") {
				nocarry = true;
				continue;
			}
			if (args[argidx] == "-nobram") {
				nobram = true;
				continue;
			}
			if (args[argidx] == "-nolutram" || /*deprecated alias*/ args[argidx] == "-nodram") {
				nolutram = true;
				continue;
			}
			if (args[argidx] == "-nosrl") {
				nosrl = true;
				continue;
			}
			if (args[argidx] == "-widemux" && argidx+1 < args.size()) {
				widemux = atoi(args[++argidx].c_str());
				continue;
			}
			if (args[argidx] == "-abc9") {
				abc9 = true;
				continue;
			}
			if (args[argidx] == "-nodsp") {
				nodsp = true;
				continue;
			}
			if (args[argidx] == "-uram") {
				uram = true;
				continue;
			}
			if (args[argidx] == "-dff") {
				dff_mode = true;
				continue;
			}
			break;
		}
		extra_args(args, argidx, design);

		if (family == "xcup" || family == "xcu") {
			lut_size = 6;
			widelut_size = 9;
		} else if (family == "xc7" ||
				family == "xc6v" ||
				family == "xc5v" ||
				family == "xc6s") {
			lut_size = 6;
			widelut_size = 8;
		} else if (family == "xc4v" ||
				family == "xc3sda" ||
				family == "xc3sa" ||
				family == "xc3se" ||
				family == "xc3s" ||
				family == "xc2vp" ||
				family == "xc2v") {
			lut_size = 4;
			widelut_size = 8;
		} else if (family == "xcve" || family == "xcv") {
			lut_size = 4;
			widelut_size = 6;
		} else
			log_cmd_error("Invalid Xilinx -family setting: '%s'.\n", family.c_str());

		if (widemux != 0 && lut_size != 6)
			log_cmd_error("-widemux is not currently supported for LUT4-based architectures.\n");

		if (lut_size != 6) {
			log_warning("Shift register inference not yet supported for family %s.\n", family.c_str());
			nosrl = true;
		}

		if (widemux != 0 && widemux < 2)
			log_cmd_error("-widemux value must be 0 or >= 2.\n");

		if (!design->full_selection())
			log_cmd_error("This command only operates on fully selected designs!\n");

		if (abc9 && retime)
			log_cmd_error("-retime option not currently compatible with -abc9!\n");

		log_header(design, "Executing SYNTH_XILINX pass.\n");
		log_push();

		run_script(design, run_from, run_to);

		log_pop();
	}

	void script() YS_OVERRIDE
	{
		std::string lut_size_s = std::to_string(lut_size);
		if (help_mode)
			lut_size_s = "[46]";
		std::string ff_map_file;
		if (help_mode)
			ff_map_file = "+/xilinx/{family}_ff_map.v";
		else if (family == "xc6s")
			ff_map_file = "+/xilinx/xc6s_ff_map.v";
		else
			ff_map_file = "+/xilinx/xc7_ff_map.v";

		if (check_label("begin")) {
			std::string read_args;
			if (vpr)
				read_args += " -D_EXPLICIT_CARRY";
			read_args += " -lib -specify +/xilinx/cells_sim.v";
			run("read_verilog" + read_args);

			run("read_verilog -lib +/xilinx/cells_xtra.v");

			run(stringf("hierarchy -check %s", top_opt.c_str()));
		}

		if (check_label("prepare")) {
			run("proc");
			if (flatten || help_mode)
				run("flatten", "(with '-flatten')");
			if (active_design)
				active_design->scratchpad_unset("tribuf.added_something");
			run("tribuf -logic");
			if (noiopad && active_design && active_design->scratchpad_get_bool("tribuf.added_something"))
				log_error("Tristate buffers are unsupported without the '-iopad' option.\n");
			run("deminout");
			run("opt_expr");
			run("opt_clean");
			run("check");
			run("opt");
			if (help_mode)
				run("wreduce [-keepdc]", "(option for '-widemux')");
			else
				run("wreduce" + std::string(widemux > 0 ? " -keepdc" : ""));
			run("peepopt");
			run("opt_clean");

			if (widemux > 0 || help_mode)
				run("muxpack", "    ('-widemux' only)");

			// xilinx_srl looks for $shiftx cells for identifying variable-length
			//   shift registers, so attempt to convert $pmux-es to this
			// Also: wide multiplexer inference benefits from this too
			if (!(nosrl && widemux == 0) || help_mode) {
				run("pmux2shiftx", "(skip if '-nosrl' and '-widemux=0')");
				run("clean", "      (skip if '-nosrl' and '-widemux=0')");
			}

			run("techmap -map +/cmp2lut.v -D LUT_WIDTH=" + lut_size_s);
		}

		if (check_label("map_dsp", "(skip if '-nodsp')")) {
			if (!nodsp || help_mode) {
				run("memory_dff"); // xilinx_dsp will merge registers, reserve memory port registers first
				// NB: Xilinx multipliers are signed only
				if (help_mode)
					run("techmap -map +/mul2dsp.v -map +/xilinx/{family}_dsp_map.v {options}");
				else if (family == "xc2v" || family == "xc2vp" || family == "xc3s" || family == "xc3se" || family == "xc3sa")
					run("techmap -map +/mul2dsp.v -map +/xilinx/xc3s_mult_map.v -D DSP_A_MAXWIDTH=18 -D DSP_B_MAXWIDTH=18 "
						"-D DSP_A_MINWIDTH=2 -D DSP_B_MINWIDTH=2 " // Blocks Nx1 multipliers
						"-D DSP_Y_MINWIDTH=9 " // UG901 suggests small multiplies are those 4x4 and smaller
						"-D DSP_SIGNEDONLY=1 -D DSP_NAME=$__MUL18X18");
				else if (family == "xc3sda")
					run("techmap -map +/mul2dsp.v -map +/xilinx/xc3sda_dsp_map.v -D DSP_A_MAXWIDTH=18 -D DSP_B_MAXWIDTH=18 "
						"-D DSP_A_MINWIDTH=2 -D DSP_B_MINWIDTH=2 " // Blocks Nx1 multipliers
						"-D DSP_Y_MINWIDTH=9 " // UG901 suggests small multiplies are those 4x4 and smaller
						"-D DSP_SIGNEDONLY=1 -D DSP_NAME=$__MUL18X18");
				else if (family == "xc6s")
					run("techmap -map +/mul2dsp.v -map +/xilinx/xc6s_dsp_map.v -D DSP_A_MAXWIDTH=18 -D DSP_B_MAXWIDTH=18 "
						"-D DSP_A_MINWIDTH=2 -D DSP_B_MINWIDTH=2 " // Blocks Nx1 multipliers
						"-D DSP_Y_MINWIDTH=9 " // UG901 suggests small multiplies are those 4x4 and smaller
						"-D DSP_SIGNEDONLY=1 -D DSP_NAME=$__MUL18X18");
				else if (family == "xc4v")
					run("techmap -map +/mul2dsp.v -map +/xilinx/xc4v_dsp_map.v -D DSP_A_MAXWIDTH=18 -D DSP_B_MAXWIDTH=18 "
						"-D DSP_A_MINWIDTH=2 -D DSP_B_MINWIDTH=2 " // Blocks Nx1 multipliers
						"-D DSP_Y_MINWIDTH=9 " // UG901 suggests small multiplies are those 4x4 and smaller
						"-D DSP_SIGNEDONLY=1 -D DSP_NAME=$__MUL18X18");
				else if (family == "xc5v")
					run("techmap -map +/mul2dsp.v -map +/xilinx/xc5v_dsp_map.v -D DSP_A_MAXWIDTH=25 -D DSP_B_MAXWIDTH=18 "
						"-D DSP_A_MINWIDTH=2 -D DSP_B_MINWIDTH=2 " // Blocks Nx1 multipliers
						"-D DSP_Y_MINWIDTH=9 " // UG901 suggests small multiplies are those 4x4 and smaller
						"-D DSP_SIGNEDONLY=1 -D DSP_NAME=$__MUL25X18");
				else if (family == "xc6v" || family == "xc7")
					run("techmap -map +/mul2dsp.v -map +/xilinx/xc7_dsp_map.v -D DSP_A_MAXWIDTH=25 -D DSP_B_MAXWIDTH=18 "
						"-D DSP_A_MAXWIDTH_PARTIAL=18 "	// Partial multipliers are intentionally
										// limited to 18x18 in order to take
										// advantage of the (PCOUT << 17) -> PCIN
										// dedicated cascade chain capability
						"-D DSP_A_MINWIDTH=2 -D DSP_B_MINWIDTH=2 " // Blocks Nx1 multipliers
						"-D DSP_Y_MINWIDTH=9 " // UG901 suggests small multiplies are those 4x4 and smaller
						"-D DSP_SIGNEDONLY=1 -D DSP_NAME=$__MUL25X18");
				else if (family == "xcu" || family == "xcup")
					run("techmap -map +/mul2dsp.v -map +/xilinx/xcu_dsp_map.v -D DSP_A_MAXWIDTH=27 -D DSP_B_MAXWIDTH=18 "
						"-D DSP_A_MAXWIDTH_PARTIAL=18 "	// Partial multipliers are intentionally
										// limited to 18x18 in order to take
										// advantage of the (PCOUT << 17) -> PCIN
										// dedicated cascade chain capability
						"-D DSP_A_MINWIDTH=2 -D DSP_B_MINWIDTH=2 " // Blocks Nx1 multipliers
						"-D DSP_Y_MINWIDTH=9 " // UG901 suggests small multiplies are those 4x4 and smaller
						"-D DSP_SIGNEDONLY=1 -D DSP_NAME=$__MUL27X18");
				run("select a:mul2dsp");
				run("setattr -unset mul2dsp");
				run("opt_expr -fine");
				run("wreduce");
				run("select -clear");
				if (help_mode)
					run("xilinx_dsp -family <family>");
				else
					run("xilinx_dsp -family " + family);
				run("chtype -set $mul t:$__soft_mul");
			}
		}

		if (check_label("coarse")) {
			run("alumacc");
			run("share");
			run("opt");
			run("fsm");
			run("opt -fast");
			run("memory -nomap");
			run("opt_clean");
		}

		if (check_label("map_uram", "(only if '-uram')")) {
			if (help_mode) {
				run("memory_bram -rules +/xilinx/{family}_urams.txt");
				run("techmap -map +/xilinx/{family}_urams_map.v");
			} else if (uram) {
				if (family == "xcup") {
					run("memory_bram -rules +/xilinx/xcup_urams.txt");
					run("techmap -map +/xilinx/xcup_urams_map.v");
				} else {
					log_warning("UltraRAM inference not supported for family %s.\n", family.c_str());
				}
			}
		}

		if (check_label("map_bram", "(skip if '-nobram')")) {
			if (help_mode) {
				run("memory_bram -rules +/xilinx/{family}_brams.txt");
				run("techmap -map +/xilinx/{family}_brams_map.v");
			} else if (!nobram) {
				if (family == "xc2v" || family == "xc2vp" || family == "xc3s" || family == "xc3se") {
					run("memory_bram -rules +/xilinx/xc2v_brams.txt");
					run("techmap -map +/xilinx/xc2v_brams_map.v");
				} else if (family == "xc3sa") {
					// Superset of Virtex 2 primitives — uses common map file.
					run("memory_bram -rules +/xilinx/xc3sa_brams.txt");
					run("techmap -map +/xilinx/xc2v_brams_map.v");
				} else if (family == "xc3sda") {
					// Supported block RAMs for Spartan 3A DSP are
					// a subset of Spartan 6's ones.
					run("memory_bram -rules +/xilinx/xc3sda_brams.txt");
					run("techmap -map +/xilinx/xc6s_brams_map.v");
				} else if (family == "xc6s") {
					run("memory_bram -rules +/xilinx/xc6s_brams.txt");
					run("techmap -map +/xilinx/xc6s_brams_map.v");
				} else if (family == "xc6v" || family == "xc7") {
					run("memory_bram -rules +/xilinx/xc7_xcu_brams.txt");
					run("techmap -map +/xilinx/xc7_brams_map.v");
				} else if (family == "xcu" || family == "xcup") {
					run("memory_bram -rules +/xilinx/xc7_xcu_brams.txt");
					run("techmap -map +/xilinx/xcu_brams_map.v");					
				} else {
					log_warning("Block RAM inference not yet supported for family %s.\n", family.c_str());
				}
			}
		}

		if (check_label("map_lutram", "(skip if '-nolutram')")) {
			if (!nolutram || help_mode) {
				run("memory_bram -rules +/xilinx/lut" + lut_size_s + "_lutrams.txt");
				run("techmap -map +/xilinx/lutrams_map.v");
			}
		}

		if (check_label("map_ffram")) {
			// Required for dffsr2dff to work.
			run("simplemap t:$dff t:$adff t:$mux");
			// Needs to be done before opt -mux_bool happens.
			run("dffsr2dff");
			if (help_mode)
				run("dff2dffs [-match-init]", "(-match-init for xc6s only)");
			else if (family == "xc6s")
				run("dff2dffs -match-init");
			else
				run("dff2dffs");
			if (widemux > 0)
				run("opt -fast -mux_bool -undriven -fine"); // Necessary to omit -mux_undef otherwise muxcover
									    // performs less efficiently
			else
				run("opt -fast -full");
			run("memory_map");
		}

		if (check_label("fine")) {
			run("dff2dffe -direct-match $_DFF_* -direct-match $__DFFS_*");
			if (help_mode)
				run("muxcover <internal options> ('-widemux' only)");
			else if (widemux > 0) {
				constexpr int cost_mux2 = 100;
				std::string muxcover_args = stringf(" -nodecode -mux2=%d", cost_mux2);
				switch (widemux) {
					case  2: muxcover_args += stringf(" -mux4=%d -mux8=%d -mux16=%d", cost_mux2+1, cost_mux2+2, cost_mux2+3); break;
					case  3:
					case  4: muxcover_args += stringf(" -mux4=%d -mux8=%d -mux16=%d", cost_mux2*(widemux-1)-2, cost_mux2*(widemux-1)-1, cost_mux2*(widemux-1)); break;
					case  5:
					case  6:
					case  7:
					case  8: muxcover_args += stringf(" -mux8=%d -mux16=%d", cost_mux2*(widemux-1)-1, cost_mux2*(widemux-1)); break;
					case  9:
					case 10:
					case 11:
					case 12:
					case 13:
					case 14:
					case 15:
					default: muxcover_args += stringf(" -mux16=%d", cost_mux2*(widemux-1)-1); break;
				}
				run("muxcover " + muxcover_args);
			}
			run("opt -full");

			if (!nosrl || help_mode)
				run("xilinx_srl -variable -minlen 3", "(skip if '-nosrl')");

			std::string techmap_args = " -map +/techmap.v -D LUT_SIZE=" + lut_size_s;
			if (help_mode)
				techmap_args += " [-map +/xilinx/mux_map.v]";
			else if (widemux > 0)
				techmap_args += stringf(" -D MIN_MUX_INPUTS=%d -map +/xilinx/mux_map.v", widemux);
			if (!nocarry) {
				techmap_args += " -map +/xilinx/arith_map.v";
				if (vpr)
					techmap_args += " -D _EXPLICIT_CARRY";
			}
			run("techmap " + techmap_args);
			run("opt -fast");
		}

		if (check_label("map_cells")) {
			// Needs to be done before logic optimization, so that inverters (OE vs T) are handled.
			if (help_mode || !noiopad)
				run("iopadmap -bits -outpad OBUF I:O -inpad IBUF O:I -toutpad $__XILINX_TOUTPAD OE:I:O -tinoutpad $__XILINX_TINOUTPAD OE:O:I:IO A:top", "(skip if '-noiopad')");
			std::string techmap_args = "-map +/techmap.v -map +/xilinx/cells_map.v";
			if (widemux > 0)
				techmap_args += stringf(" -D MIN_MUX_INPUTS=%d", widemux);
			run("techmap " + techmap_args);
			run("clean");
		}

		if (check_label("map_ffs")) {
			if (abc9 || help_mode) {
				run("techmap -map " + ff_map_file, "('-abc9' only)");
			}
		}

		if (check_label("map_luts")) {
			run("opt_expr -mux_undef");
			if (flatten_before_abc)
				run("flatten");
			if (help_mode)
				run("abc -luts 2:2,3,6:5[,10,20] [-dff] [-D 1]", "(option for 'nowidelut', '-dff', '-retime')");
			else if (abc9) {
				if (lut_size != 6)
					log_error("'synth_xilinx -abc9' not currently supported for LUT4-based devices.\n");
				if (family != "xc7")
					log_warning("'synth_xilinx -abc9' not currently supported for the '%s' family, "
							"will use timing for 'xc7' instead.\n", family.c_str());
				std::string techmap_args = "-map +/xilinx/abc9_map.v -max_iter 1";
				if (dff_mode)
					techmap_args += " -D DFF_MODE";
				run("techmap " + techmap_args);
				run("read_verilog -icells -lib -specify +/abc9_model.v +/xilinx/abc9_model.v");
				std::string abc9_opts;
				auto k = stringf("synth_xilinx.abc9.%s.W", family.c_str());
				if (active_design->scratchpad.count(k))
					abc9_opts += stringf(" -W %s", active_design->scratchpad_get_string(k).c_str());
				else
					abc9_opts += stringf(" -W %s", RTLIL::constpad.at(k, RTLIL::constpad.at("synth_xilinx.abc9.xc7.W")).c_str());
				if (nowidelut)
					abc9_opts += stringf(" -maxlut %d", lut_size);
				if (dff_mode)
					abc9_opts += " -dff";
				run("abc9" + abc9_opts);
				run("techmap -map +/xilinx/abc9_unmap.v");
			}
			else {
				std::string abc_opts;
				if (lut_size != 6) {
					if (nowidelut)
						abc_opts += " -lut " + lut_size_s;
					else
						abc_opts += " -lut " + lut_size_s + ":" + std::to_string(widelut_size);
				} else {
					if (nowidelut)
						abc_opts += " -luts 2:2,3,6:5";
					else if (widelut_size == 8)
						abc_opts += " -luts 2:2,3,6:5,10,20";
					else
						abc_opts += " -luts 2:2,3,6:5,10,20,40";
				}
				if (dff_mode)
					abc_opts += " -dff";
				if (retime)
					abc_opts += " -D 1"pre { line-height: 125%; margin: 0; }
td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #ffffff; }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.

from __future__ import absolute_import, division, print_function

import binascii
import os
import textwrap

import pretend

import pytest

import cryptography
from cryptography.exceptions import UnsupportedAlgorithm, _Reasons

import cryptography_vectors

from .utils import (
    check_backend_support, load_cryptrec_vectors,
    load_fips_dsa_key_pair_vectors, load_fips_dsa_sig_vectors,
    load_fips_ecdsa_key_pair_vectors, load_fips_ecdsa_signing_vectors,
    load_hash_vectors, load_kasvs_dh_vectors,
    load_kasvs_ecdh_vectors, load_nist_vectors,
    load_pkcs1_vectors, load_rsa_nist_vectors, load_vectors_from_file,
    load_x963_vectors,
    raises_unsupported_algorithm, select_backends, skip_if_empty
)


class FakeInterface(object):
    pass


def test_select_one_backend():
    b1 = pretend.stub(name="b1")
    b2 = pretend.stub(name="b2")
    b3 = pretend.stub(name="b3")
    backends = [b1, b2, b3]
    name = "b2"
    selected_backends = select_backends(name, backends)
    assert len(selected_backends) == 1
    assert selected_backends[0] == b2


def test_select_no_backend():
    b1 = pretend.stub(name="b1")
    b2 = pretend.stub(name="b2")
    b3 = pretend.stub(name="b3")
    backends = [b1, b2, b3]
    name = "back!"
    with pytest.raises(ValueError):
        select_backends(name, backends)


def test_select_backends_none():
    b1 = pretend.stub(name="b1")
    b2 = pretend.stub(name="b2")
    b3 = pretend.stub(name="b3")
    backends = [b1, b2, b3]
    name = None
    selected_backends = select_backends(name, backends)
    assert len(selected_backends) == 3


def test_select_two_backends():
    b1 = pretend.stub(name="b1")
    b2 = pretend.stub(name="b2")
    b3 = pretend.stub(name="b3")
    backends = [b1, b2, b3]
    name = "b2 ,b1 "
    selected_backends = select_backends(name, backends)
    assert len(selected_backends) == 2
    assert selected_backends == [b1, b2]


def test_skip_if_empty():
    with pytest.raises(pytest.skip.Exception):
        skip_if_empty([], [FakeInterface])

    skip_if_empty(["notempty"], [FakeInterface])


def test_check_backend_support_skip():
    supported = pretend.stub(
        kwargs={"only_if": lambda backend: False, "skip_message": "Nope"}
    )
    item = pretend.stub(keywords={"supported": [supported]},
                        funcargs={"backend": True})
    with pytest.raises(pytest.skip.Exception) as exc_info:
        check_backend_support(item)
    assert exc_info.value.args[0] == "Nope (True)"


def test_check_backend_support_no_skip():
    supported = pretend.stub(
        kwargs={"only_if": lambda backend: True, "skip_message": "Nope"}
    )
    item = pretend.stub(keywords={"supported": [supported]},
                        funcargs={"backend": True})
    assert check_backend_support(item) is None


def test_check_backend_support_no_backend():
    supported = pretend.stub(
        kwargs={"only_if": "notalambda", "skip_message": "Nope"}
    )
    item = pretend.stub(keywords={"supported": supported},
                        funcargs={})
    with pytest.raises(ValueError):
        check_backend_support(item)


def test_load_nist_vectors():
    vector_data = textwrap.dedent("""
    # CAVS 11.1
    # Config info for aes_values
    # AESVS GFSbox test data for CBC
    # State : Encrypt and Decrypt
    # Key Length : 128
    # Generated on Fri Apr 22 15:11:33 2011

    [ENCRYPT]

    COUNT = 0
    KEY = 00000000000000000000000000000000
    IV = 00000000000000000000000000000000
    PLAINTEXT = f34481ec3cc627bacd5dc3fb08f273e6
    CIPHERTEXT = 0336763e966d92595a567cc9ce537f5e

    COUNT = 1
    KEY = 00000000000000000000000000000000
    IV = 00000000000000000000000000000000
    PLAINTEXT = 9798c4640bad75c7c3227db910174e72
    CIPHERTEXT = a9a1631bf4996954ebc093957b234589

    [DECRYPT]

    COUNT = 0
    KEY = 00000000000000000000000000000000
    IV = 00000000000000000000000000000000
    CIPHERTEXT = 0336763e966d92595a567cc9ce537f5e
    PLAINTEXT = f34481ec3cc627bacd5dc3fb08f273e6

    COUNT = 1
    KEY = 00000000000000000000000000000000
    IV = 00000000000000000000000000000000
    CIPHERTEXT = a9a1631bf4996954ebc093957b234589
    PLAINTEXT = 9798c4640bad75c7c3227db910174e72
    """).splitlines()

    assert load_nist_vectors(vector_data) == [
        {
            "key": b"00000000000000000000000000000000",
            "iv": b"00000000000000000000000000000000",
            "plaintext": b"f34481ec3cc627bacd5dc3fb08f273e6",
            "ciphertext": b"0336763e966d92595a567cc9ce537f5e",
        },
        {
            "key": b"00000000000000000000000000000000",
            "iv": b"00000000000000000000000000000000",
            "plaintext": b"9798c4640bad75c7c3227db910174e72",
            "ciphertext": b"a9a1631bf4996954ebc093957b234589",
        },
        {
            "key": b"00000000000000000000000000000000",
            "iv": b"00000000000000000000000000000000",
            "plaintext": b"f34481ec3cc627bacd5dc3fb08f273e6",
            "ciphertext": b"0336763e966d92595a567cc9ce537f5e",
        },
        {
            "key": b"00000000000000000000000000000000",
            "iv": b"00000000000000000000000000000000",
            "plaintext": b"9798c4640bad75c7c3227db910174e72",
            "ciphertext": b"a9a1631bf4996954ebc093957b234589",
        },
    ]


def test_load_nist_vectors_with_null_chars():
    vector_data = textwrap.dedent("""
    COUNT = 0
    KEY = thing\\0withnulls

    COUNT = 1
    KEY = 00000000000000000000000000000000
    """).splitlines()

    assert load_nist_vectors(vector_data) == [
        {
            "key": b"thing\x00withnulls",
        },
        {
            "key": b"00000000000000000000000000000000",
        },
    ]


def test_load_cryptrec_vectors():
    vector_data = textwrap.dedent("""
    # Vectors taken from http://info.isl.ntt.co.jp/crypt/eng/camellia/
    # Download is t_camelia.txt

    # Camellia with 128-bit key

    K No.001 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    P No.001 : 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    C No.001 : 07 92 3A 39 EB 0A 81 7D 1C 4D 87 BD B8 2D 1F 1C

    P No.002 : 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    C No.002 : 48 CD 64 19 80 96 72 D2 34 92 60 D8 9A 08 D3 D3

    K No.002 : 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    P No.001 : 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    C No.001 : 07 92 3A 39 EB 0A 81 7D 1C 4D 87 BD B8 2D 1F 1C
    """).splitlines()

    assert load_cryptrec_vectors(vector_data) == [
        {
            "key": b"00000000000000000000000000000000",
            "plaintext": b"80000000000000000000000000000000",
            "ciphertext": b"07923A39EB0A817D1C4D87BDB82D1F1C",
        },
        {
            "key": b"00000000000000000000000000000000",
            "plaintext": b"40000000000000000000000000000000",
            "ciphertext": b"48CD6419809672D2349260D89A08D3D3",
        },
        {
            "key": b"10000000000000000000000000000000",
            "plaintext": b"80000000000000000000000000000000",
            "ciphertext": b"07923A39EB0A817D1C4D87BDB82D1F1C",
        },
    ]


def test_load_cryptrec_vectors_invalid():
    vector_data = textwrap.dedent("""
    # Vectors taken from http://info.isl.ntt.co.jp/crypt/eng/camellia/
    # Download is t_camelia.txt

    # Camellia with 128-bit key

    E No.001 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    """).splitlines()

    with pytest.raises(ValueError):
        load_cryptrec_vectors(vector_data)


def test_load_hash_vectors():
    vector_data = textwrap.dedent("""

        # http://tools.ietf.org/html/rfc1321
        [irrelevant]

        Len = 0
        Msg = 00
        MD = d41d8cd98f00b204e9800998ecf8427e

        Len = 8
        Msg = 61
        MD = 0cc175b9c0f1b6a831c399e269772661

        Len = 24
        Msg = 616263
        MD = 900150983cd24fb0d6963f7d28e17f72

        Len = 112
        Msg = 6d65737361676520646967657374
        MD = f96b697d7cb7938d525a2f31aaf161d0
    """).splitlines()
    assert load_hash_vectors(vector_data) == [
        (b"", "d41d8cd98f00b204e9800998ecf8427e"),
        (b"61", "0cc175b9c0f1b6a831c399e269772661"),
        (b"616263", "900150983cd24fb0d6963f7d28e17f72"),
        (b"6d65737361676520646967657374", "f96b697d7cb7938d525a2f31aaf161d0"),
    ]


def test_load_hmac_vectors():
    vector_data = textwrap.dedent("""
Len = 224
# "Jefe"
Key = 4a656665
# "what do ya want for nothing?"
Msg = 7768617420646f2079612077616e7420666f72206e6f7468696e673f
MD = 750c783e6ab0b503eaa86e310a5db738
    """).splitlines()
    assert load_hash_vectors(vector_data) == [
        (b"7768617420646f2079612077616e7420666f72206e6f7468696e673f",
         "750c783e6ab0b503eaa86e310a5db738",
         b"4a656665"),
    ]


def test_load_hash_vectors_bad_data():
    vector_data = textwrap.dedent("""
        # http://tools.ietf.org/html/rfc1321

        Len = 0
        Msg = 00
        UNKNOWN=Hello World
    """).splitlines()
    with pytest.raises(ValueError):
        load_hash_vectors(vector_data)


def test_load_vectors_from_file():
    vectors = load_vectors_from_file(
        os.path.join("ciphers", "Blowfish", "bf-cfb.txt"),
        load_nist_vectors,
    )
    assert vectors == [
        {
            "key": b"0123456789ABCDEFF0E1D2C3B4A59687",
            "iv": b"FEDCBA9876543210",
            "plaintext": (
                b"37363534333231204E6F77206973207468652074696D6520666F722000"
            ),
            "ciphertext": (
                b"E73214A2822139CAF26ECF6D2EB9E76E3DA3DE04D1517200519D57A6C3"
            ),
        }
    ]


def test_load_nist_gcm_vectors():
    vector_data = textwrap.dedent("""
        [Keylen = 128]
        [IVlen = 96]
        [PTlen = 0]
        [AADlen = 0]
        [Taglen = 128]

        Count = 0
        Key = 11754cd72aec309bf52f7687212e8957
        IV = 3c819d9a9bed087615030b65
        PT =
        AAD =
        CT =
        Tag = 250327c674aaf477aef2675748cf6971

        Count = 1
        Key = 272f16edb81a7abbea887357a58c1917
        IV = 794ec588176c703d3d2a7a07
        PT =
        AAD =
        CT =
        Tag = b6e6f197168f5049aeda32dafbdaeb

        Count = 2
        Key = a49a5e26a2f8cb63d05546c2a62f5343
        IV = 907763b19b9b4ab6bd4f0281
        CT =
        AAD =
        Tag = a2be08210d8c470a8df6e8fbd79ec5cf
        FAIL

        Count = 3
        Key = 5c1155084cc0ede76b3bc22e9f7574ef
        IV = 9549e4ba69a61cad7856efc1
        PT = d1448fa852b84408e2dad8381f363de7
        AAD = e98e9d9c618e46fef32660976f854ee3
        CT = f78b60ca125218493bea1c50a2e12ef4
        Tag = d72da7f5c6cf0bca7242c71835809449

        [Keylen = 128]
        [IVlen = 96]
        [PTlen = 0]
        [AADlen = 0]
        [Taglen = 120]

        Count = 0
        Key = eac258e99c55e6ae8ef1da26640613d7
        IV = 4e8df20faaf2c8eebe922902
        CT =
        AAD =
        Tag = e39aeaebe86aa309a4d062d6274339
        PT =

        Count = 1
        Key = 3726cf02fcc6b8639a5497652c94350d
        IV = 55fef82cde693ce76efcc193
        CT =
        AAD =
        Tag = 3d68111a81ed22d2ef5bccac4fc27f
        FAIL

        Count = 2
        Key = f202299d5fd74f03b12d2119a6c4c038
        IV = eec51e7958c3f20a1bb71815
        CT =
        AAD =
        Tag = a81886b3fb26e51fca87b267e1e157
        FAIL

        Count = 3
        Key = fd52925f39546b4c55ffb6b20c59898c
        IV = f5cf3227444afd905a5f6dba
        CT =
        AAD =
        Tag = 1665b0f1a0b456e1664cfd3de08ccd
        PT =

        [Keylen = 128]
        [IVlen = 8]
        [PTlen = 104]
        [AADlen = 0]
        [Taglen = 128]

        Count = 0
        Key = 58fab7632bcf10d2bcee58520bf37414
        IV = 3c
        CT = 15c4db4cbb451211179d57017f
        AAD =
        Tag = eae841d4355feeb3f786bc86625f1e5b
        FAIL
    """).splitlines()
    assert load_nist_vectors(vector_data) == [
        {'aad': b'',
         'pt': b'',
         'iv': b'3c819d9a9bed087615030b65',
         'tag': b'250327c674aaf477aef2675748cf6971',
         'key': b'11754cd72aec309bf52f7687212e8957',
         'ct': b''},
        {'aad': b'',
         'pt': b'',
         'iv': b'794ec588176c703d3d2a7a07',
         'tag': b'b6e6f197168f5049aeda32dafbdaeb',
         'key': b'272f16edb81a7abbea887357a58c1917',
         'ct': b''},
        {'aad': b'',
         'iv': b'907763b19b9b4ab6bd4f0281',
         'tag': b'a2be08210d8c470a8df6e8fbd79ec5cf',
         'key': b'a49a5e26a2f8cb63d05546c2a62f5343',
         'ct': b'',
         'fail': True},
        {'aad': b'e98e9d9c618e46fef32660976f854ee3',
         'pt': b'd1448fa852b84408e2dad8381f363de7',
         'iv': b'9549e4ba69a61cad7856efc1',
         'tag': b'd72da7f5c6cf0bca7242c71835809449',
         'key': b'5c1155084cc0ede76b3bc22e9f7574ef',
         'ct': b'f78b60ca125218493bea1c50a2e12ef4'},
        {'aad': b'',
         'pt': b'',
         'iv': b'4e8df20faaf2c8eebe922902',
         'tag': b'e39aeaebe86aa309a4d062d6274339',
         'key': b'eac258e99c55e6ae8ef1da26640613d7',
         'ct': b''},
        {'aad': b'',
         'iv': b'55fef82cde693ce76efcc193',
         'tag': b'3d68111a81ed22d2ef5bccac4fc27f',
         'key': b'3726cf02fcc6b8639a5497652c94350d',
         'ct': b'',
         'fail': True},
        {'aad': b'',
         'iv': b'eec51e7958c3f20a1bb71815',
         'tag': b'a81886b3fb26e51fca87b267e1e157',
         'key': b'f202299d5fd74f03b12d2119a6c4c038',
         'ct': b'',
         'fail': True},
        {'aad': b'',
         'pt': b'',
         'iv': b'f5cf3227444afd905a5f6dba',
         'tag': b'1665b0f1a0b456e1664cfd3de08ccd',
         'key': b'fd52925f39546b4c55ffb6b20c59898c',
         'ct': b''},
        {'aad': b'',
         'iv': b'3c',
         'tag': b'eae841d4355feeb3f786bc86625f1e5b',
         'key': b'58fab7632bcf10d2bcee58520bf37414',
         'ct': b'15c4db4cbb451211179d57017f',
         'fail': True},
    ]


def test_load_pkcs1_vectors():
    vector_data = textwrap.dedent("""
    Test vectors for RSA-PSS
    ========================

    This file contains an extract of the original pss-vect.txt

    Key lengths:

    Key  8: 1031 bits
    Key  9: 1536 bits
    ===========================================================================

    <snip>

    # Example 8: A 1031-bit RSA key pair
    # -----------------------------------


    # Public key
    # ----------

    # Modulus:
    49 53 70 a1 fb 18 54 3c 16 d3 63 1e 31 63 25 5d
    f6 2b e6 ee e8 90 d5 f2 55 09 e4 f7 78 a8 ea 6f
    bb bc df 85 df f6 4e 0d 97 20 03 ab 36 81 fb ba
    6d d4 1f d5 41 82 9b 2e 58 2d e9 f2 a4 a4 e0 a2
    d0 90 0b ef 47 53 db 3c ee 0e e0 6c 7d fa e8 b1
    d5 3b 59 53 21 8f 9c ce ea 69 5b 08 66 8e de aa
    dc ed 94 63 b1 d7 90 d5 eb f2 7e 91 15 b4 6c ad
    4d 9a 2b 8e fa b0 56 1b 08 10 34 47 39 ad a0 73
    3f

    # Exponent:
    01 00 01

    # Private key
    # -----------

    # Modulus:
    49 53 70 a1 fb 18 54 3c 16 d3 63 1e 31 63 25 5d
    f6 2b e6 ee e8 90 d5 f2 55 09 e4 f7 78 a8 ea 6f
    bb bc df 85 df f6 4e 0d 97 20 03 ab 36 81 fb ba
    6d d4 1f d5 41 82 9b 2e 58 2d e9 f2 a4 a4 e0 a2
    d0 90 0b ef 47 53 db 3c ee 0e e0 6c 7d fa e8 b1
    d5 3b 59 53 21 8f 9c ce ea 69 5b 08 66 8e de aa
    dc ed 94 63 b1 d7 90 d5 eb f2 7e 91 15 b4 6c ad
    4d 9a 2b 8e fa b0 56 1b 08 10 34 47 39 ad a0 73
    3f

    # Public exponent:
    01 00 01

    # Exponent:
    6c 66 ff e9 89 80 c3 8f cd ea b5 15 98 98 83 61
    65 f4 b4 b8 17 c4 f6 a8 d4 86 ee 4e a9 13 0f e9
    b9 09 2b d1 36 d1 84 f9 5f 50 4a 60 7e ac 56 58
    46 d2 fd d6 59 7a 89 67 c7 39 6e f9 5a 6e ee bb
    45 78 a6 43 96 6d ca 4d 8e e3 de 84 2d e6 32 79
    c6 18 15 9c 1a b5 4a 89 43 7b 6a 61 20 e4 93 0a
    fb 52 a4 ba 6c ed 8a 49 47 ac 64 b3 0a 34 97 cb
    e7 01 c2 d6 26 6d 51 72 19 ad 0e c6 d3 47 db e9

    # Prime 1:
    08 da d7 f1 13 63 fa a6 23 d5 d6 d5 e8 a3 19 32
    8d 82 19 0d 71 27 d2 84 6c 43 9b 0a b7 26 19 b0
    a4 3a 95 32 0e 4e c3 4f c3 a9 ce a8 76 42 23 05
    bd 76 c5 ba 7b e9 e2 f4 10 c8 06 06 45 a1 d2 9e
    db

    # Prime 2:
    08 47 e7 32 37 6f c7 90 0f 89 8e a8 2e b2 b0 fc
    41 85 65 fd ae 62 f7 d9 ec 4c e2 21 7b 97 99 0d
    d2 72 db 15 7f 99 f6 3c 0d cb b9 fb ac db d4 c4
    da db 6d f6 77 56 35 8c a4 17 48 25 b4 8f 49 70
    6d

    # Prime exponent 1:
    05 c2 a8 3c 12 4b 36 21 a2 aa 57 ea 2c 3e fe 03
    5e ff 45 60 f3 3d de bb 7a da b8 1f ce 69 a0 c8
    c2 ed c1 65 20 dd a8 3d 59 a2 3b e8 67 96 3a c6
    5f 2c c7 10 bb cf b9 6e e1 03 de b7 71 d1 05 fd
    85

    # Prime exponent 2:
    04 ca e8 aa 0d 9f aa 16 5c 87 b6 82 ec 14 0b 8e
    d3 b5 0b 24 59 4b 7a 3b 2c 22 0b 36 69 bb 81 9f
    98 4f 55 31 0a 1a e7 82 36 51 d4 a0 2e 99 44 79
    72 59 51 39 36 34 34 e5 e3 0a 7e 7d 24 15 51 e1
    b9

    # Coefficient:
    07 d3 e4 7b f6 86 60 0b 11 ac 28 3c e8 8d bb 3f
    60 51 e8 ef d0 46 80 e4 4c 17 1e f5 31 b8 0b 2b
    7c 39 fc 76 63 20 e2 cf 15 d8 d9 98 20 e9 6f f3
    0d c6 96 91 83 9c 4b 40 d7 b0 6e 45 30 7d c9 1f
    3f

    # RSA-PSS signing of 6 random messages with random salts
    # -------------------------------------------------------
    # PSS Example 8.1

    # -----------------

    # Message to be signed:
    81 33 2f 4b e6 29 48 41 5e a1 d8 99 79 2e ea cf
    6c 6e 1d b1 da 8b e1 3b 5c ea 41 db 2f ed 46 70
    92 e1 ff 39 89 14 c7 14 25 97 75 f5 95 f8 54 7f
    73 56 92 a5 75 e6 92 3a f7 8f 22 c6 99 7d db 90
    fb 6f 72 d7 bb 0d d5 74 4a 31 de cd 3d c3 68 58
    49 83 6e d3 4a ec 59 63 04 ad 11 84 3c 4f 88 48
    9f 20 97 35 f5 fb 7f da f7 ce c8 ad dc 58 18 16
    8f 88 0a cb f4 90 d5 10 05 b7 a8 e8 4e 43 e5 42
    87 97 75 71 dd 99 ee a4 b1 61 eb 2d f1 f5 10 8f
    12 a4 14 2a 83 32 2e db 05 a7 54 87 a3 43 5c 9a
    78 ce 53 ed 93 bc 55 08 57 d7 a9 fb

    # Salt:
    1d 65 49 1d 79 c8 64 b3 73 00 9b e6 f6 f2 46 7b
    ac 4c 78 fa

    # Signature:
    02 62 ac 25 4b fa 77 f3 c1 ac a2 2c 51 79 f8 f0
    40 42 2b 3c 5b af d4 0a 8f 21 cf 0f a5 a6 67 cc
    d5 99 3d 42 db af b4 09 c5 20 e2 5f ce 2b 1e e1
    e7 16 57 7f 1e fa 17 f3 da 28 05 2f 40 f0 41 9b
    23 10 6d 78 45 aa f0 11 25 b6 98 e7 a4 df e9 2d
    39 67 bb 00 c4 d0 d3 5b a3 55 2a b9 a8 b3 ee f0
    7c 7f ec db c5 42 4a c4 db 1e 20 cb 37 d0 b2 74
    47 69 94 0e a9 07 e1 7f bb ca 67 3b 20 52 23 80
    c5

    # PSS Example 8.2

    # -----------------

    # Message to be signed:
    e2 f9 6e af 0e 05 e7 ba 32 6e cc a0 ba 7f d2 f7
    c0 23 56 f3 ce de 9d 0f aa bf 4f cc 8e 60 a9 73
    e5 59 5f d9 ea 08

    # Salt:
    43 5c 09 8a a9 90 9e b2 37 7f 12 48 b0 91 b6 89
    87 ff 18 38

    # Signature:
    27 07 b9 ad 51 15 c5 8c 94 e9 32 e8 ec 0a 28 0f
    56 33 9e 44 a1 b5 8d 4d dc ff 2f 31 2e 5f 34 dc
    fe 39 e8 9c 6a 94 dc ee 86 db bd ae 5b 79 ba 4e
    08 19 a9 e7 bf d9 d9 82 e7 ee 6c 86 ee 68 39 6e
    8b 3a 14 c9 c8 f3 4b 17 8e b7 41 f9 d3 f1 21 10
    9b f5 c8 17 2f ad a2 e7 68 f9 ea 14 33 03 2c 00
    4a 8a a0 7e b9 90 00 0a 48 dc 94 c8 ba c8 aa be
    2b 09 b1 aa 46 c0 a2 aa 0e 12 f6 3f bb a7 75 ba
    7e

    # <snip>

    # =============================================

    # Example 9: A 1536-bit RSA key pair
    # -----------------------------------


    # Public key
    # ----------

    # Modulus:
    e6 bd 69 2a c9 66 45 79 04 03 fd d0 f5 be b8 b9
    bf 92 ed 10 00 7f c3 65 04 64 19 dd 06 c0 5c 5b
    5b 2f 48 ec f9 89 e4 ce 26 91 09 97 9c bb 40 b4
    a0 ad 24 d2 24 83 d1 ee 31 5a d4 cc b1 53 42 68
    35 26 91 c5 24 f6 dd 8e 6c 29 d2 24 cf 24 69 73
    ae c8 6c 5b f6 b1 40 1a 85 0d 1b 9a d1 bb 8c bc
    ec 47 b0 6f 0f 8c 7f 45 d3 fc 8f 31 92 99 c5 43
    3d db c2 b3 05 3b 47 de d2 ec d4 a4 ca ef d6 14
    83 3d c8 bb 62 2f 31 7e d0 76 b8 05 7f e8 de 3f
    84 48 0a d5 e8 3e 4a 61 90 4a 4f 24 8f b3 97 02
    73 57 e1 d3 0e 46 31 39 81 5c 6f d4 fd 5a c5 b8
    17 2a 45 23 0e cb 63 18 a0 4f 14 55 d8 4e 5a 8b

    # Exponent:
    01 00 01

    # Private key
    # -----------

    # Modulus:
    e6 bd 69 2a c9 66 45 79 04 03 fd d0 f5 be b8 b9
    bf 92 ed 10 00 7f c3 65 04 64 19 dd 06 c0 5c 5b
    5b 2f 48 ec f9 89 e4 ce 26 91 09 97 9c bb 40 b4
    a0 ad 24 d2 24 83 d1 ee 31 5a d4 cc b1 53 42 68
    35 26 91 c5 24 f6 dd 8e 6c 29 d2 24 cf 24 69 73
    ae c8 6c 5b f6 b1 40 1a 85 0d 1b 9a d1 bb 8c bc
    ec 47 b0 6f 0f 8c 7f 45 d3 fc 8f 31 92 99 c5 43
    3d db c2 b3 05 3b 47 de d2 ec d4 a4 ca ef d6 14
    83 3d c8 bb 62 2f 31 7e d0 76 b8 05 7f e8 de 3f
    84 48 0a d5 e8 3e 4a 61 90 4a 4f 24 8f b3 97 02
    73 57 e1 d3 0e 46 31 39 81 5c 6f d4 fd 5a c5 b8
    17 2a 45 23 0e cb 63 18 a0 4f 14 55 d8 4e 5a 8b

    # Public exponent:
    01 00 01

    # Exponent:
    6a 7f d8 4f b8 5f ad 07 3b 34 40 6d b7 4f 8d 61
    a6 ab c1 21 96 a9 61 dd 79 56 5e 9d a6 e5 18 7b
    ce 2d 98 02 50 f7 35 95 75 35 92 70 d9 15 90 bb
    0e 42 7c 71 46 0b 55 d5 14 10 b1 91 bc f3 09 fe
    a1 31 a9 2c 8e 70 27 38 fa 71 9f 1e 00 41 f5 2e
    40 e9 1f 22 9f 4d 96 a1 e6 f1 72 e1 55 96 b4 51
    0a 6d ae c2 61 05 f2 be bc 53 31 6b 87 bd f2 13
    11 66 60 70 e8 df ee 69 d5 2c 71 a9 76 ca ae 79
    c7 2b 68 d2 85 80 dc 68 6d 9f 51 29 d2 25 f8 2b
    3d 61 55 13 a8 82 b3 db 91 41 6b 48 ce 08 88 82
    13 e3 7e eb 9a f8 00 d8 1c ab 32 8c e4 20 68 99
    03 c0 0c 7b 5f d3 1b 75 50 3a 6d 41 96 84 d6 29

    # Prime 1:
    f8 eb 97 e9 8d f1 26 64 ee fd b7 61 59 6a 69 dd
    cd 0e 76 da ec e6 ed 4b f5 a1 b5 0a c0 86 f7 92
    8a 4d 2f 87 26 a7 7e 51 5b 74 da 41 98 8f 22 0b
    1c c8 7a a1 fc 81 0c e9 9a 82 f2 d1 ce 82 1e dc
    ed 79 4c 69 41 f4 2c 7a 1a 0b 8c 4d 28 c7 5e c6
    0b 65 22 79 f6 15 4a 76 2a ed 16 5d 47 de e3 67

    # Prime 2:
    ed 4d 71 d0 a6 e2 4b 93 c2 e5 f6 b4 bb e0 5f 5f
    b0 af a0 42 d2 04 fe 33 78 d3 65 c2 f2 88 b6 a8
    da d7 ef e4 5d 15 3e ef 40 ca cc 7b 81 ff 93 40
    02 d1 08 99 4b 94 a5 e4 72 8c d9 c9 63 37 5a e4
    99 65 bd a5 5c bf 0e fe d8 d6 55 3b 40 27 f2 d8
    62 08 a6 e6 b4 89 c1 76 12 80 92 d6 29 e4 9d 3d

    # Prime exponent 1:
    2b b6 8b dd fb 0c 4f 56 c8 55 8b ff af 89 2d 80
    43 03 78 41 e7 fa 81 cf a6 1a 38 c5 e3 9b 90 1c
    8e e7 11 22 a5 da 22 27 bd 6c de eb 48 14 52 c1
    2a d3 d6 1d 5e 4f 77 6a 0a b5 56 59 1b ef e3 e5
    9e 5a 7f dd b8 34 5e 1f 2f 35 b9 f4 ce e5 7c 32
    41 4c 08 6a ec 99 3e 93 53 e4 80 d9 ee c6 28 9f

    # Prime exponent 2:
    4f f8 97 70 9f ad 07 97 46 49 45 78 e7 0f d8 54
    61 30 ee ab 56 27 c4 9b 08 0f 05 ee 4a d9 f3 e4
    b7 cb a9 d6 a5 df f1 13 a4 1c 34 09 33 68 33 f1
    90 81 6d 8a 6b c4 2e 9b ec 56 b7 56 7d 0f 3c 9c
    69 6d b6 19 b2 45 d9 01 dd 85 6d b7 c8 09 2e 77
    e9 a1 cc cd 56 ee 4d ba 42 c5 fd b6 1a ec 26 69

    # Coefficient:
    77 b9 d1 13 7b 50 40 4a 98 27 29 31 6e fa fc 7d
    fe 66 d3 4e 5a 18 26 00 d5 f3 0a 0a 85 12 05 1c
    56 0d 08 1d 4d 0a 18 35 ec 3d 25 a6 0f 4e 4d 6a
    a9 48 b2 bf 3d bb 5b 12 4c bb c3 48 92 55 a3 a9
    48 37 2f 69 78 49 67 45 f9 43 e1 db 4f 18 38 2c
    ea a5 05 df c6 57 57 bb 3f 85 7a 58 dc e5 21 56

    # PKCS#1 v1.5 Signature Example 2.17

    # -----------------

    # Message to be signed:
    06 ad d7 5a b6 89 de 06 77 44 e6 9a 2e bd 4b 90
    fa 93 83 00 3c d0 5f f5 36 cb f2 94 cd 21 5f 09
    23 b7 fc 90 04 f0 aa 18 52 71 a1 d0 06 1f d0 e9
    77 7a d1 ec 0c 71 59 1f 57 8b f7 b8 e5 a1

    # Signature:
    45 14 21 0e 54 1d 5b ad 7d d6 0a e5 49 b9 43 ac
    c4 4f 21 39 0d f5 b6 13 18 45 5a 17 61 0d f5 b7
    4d 84 ae d2 32 f1 7e 59 d9 1d d2 65 99 22 f8 12
    db d4 96 81 69 03 84 b9 54 e9 ad fb 9b 1a 96 8c
    0c bf f7 63 ec ee d6 27 50 c5 91 64 b5 e0 80 a8
    fe f3 d5 5b fe 2a cf ad 27 52 a6 a8 45 9f a1 fa
    b4 9a d3 78 c6 96 4b 23 ee 97 fd 10 34 61 0c 5c
    c1 4c 61 e0 eb fb 17 11 f8 ad e9 6f e6 55 7b 38

    # <snip>

    # =============================================

    # <snip>
    """).splitlines()

    vectors = tuple(load_pkcs1_vectors(vector_data))
    expected = (
        (
            {
                'modulus': int(
                    '495370a1fb18543c16d3631e3163255df62be6eee890d5f25509e4f77'
                    '8a8ea6fbbbcdf85dff64e0d972003ab3681fbba6dd41fd541829b2e58'
                    '2de9f2a4a4e0a2d0900bef4753db3cee0ee06c7dfae8b1d53b5953218'
                    'f9cceea695b08668edeaadced9463b1d790d5ebf27e9115b46cad4d9a'
                    '2b8efab0561b0810344739ada0733f', 16),
                'public_exponent': int('10001', 16),
                'private_exponent': int(
                    '6c66ffe98980c38fcdeab5159898836165f4b4b817c4f6a8d486ee4ea'
                    '9130fe9b9092bd136d184f95f504a607eac565846d2fdd6597a8967c7'
                    '396ef95a6eeebb4578a643966dca4d8ee3de842de63279c618159c1ab'
                    '54a89437b6a6120e4930afb52a4ba6ced8a4947ac64b30a3497cbe701'
                    'c2d6266d517219ad0ec6d347dbe9', 16),
                'p': int(
                    '8dad7f11363faa623d5d6d5e8a319328d82190d7127d2846c439b0ab7'
                    '2619b0a43a95320e4ec34fc3a9cea876422305bd76c5ba7be9e2f410c'
                    '8060645a1d29edb', 16),
                'q': int(
                    '847e732376fc7900f898ea82eb2b0fc418565fdae62f7d9ec4ce2217b'
                    '97990dd272db157f99f63c0dcbb9fbacdbd4c4dadb6df67756358ca41'
                    '74825b48f49706d', 16),
                'dmp1': int(
                    '05c2a83c124b3621a2aa57ea2c3efe035eff4560f33ddebb7adab81fc'
                    'e69a0c8c2edc16520dda83d59a23be867963ac65f2cc710bbcfb96ee1'
                    '03deb771d105fd85', 16),
                'dmq1': int(
                    '04cae8aa0d9faa165c87b682ec140b8ed3b50b24594b7a3b2c220b366'
                    '9bb819f984f55310a1ae7823651d4a02e99447972595139363434e5e3'
                    '0a7e7d241551e1b9', 16),
                'iqmp': int(
                    '07d3e47bf686600b11ac283ce88dbb3f6051e8efd04680e44c171ef53'
                    '1b80b2b7c39fc766320e2cf15d8d99820e96ff30dc69691839c4b40d7'
                    'b06e45307dc91f3f', 16),
                'examples': [
                    {
                        'message': b'81332f4be62948415ea1d899792eeacf6c6e1db1d'
                                   b'a8be13b5cea41db2fed467092e1ff398914c71425'
                                   b'9775f595f8547f735692a575e6923af78f22c6997'
                                   b'ddb90fb6f72d7bb0dd5744a31decd3dc368584983'
                                   b'6ed34aec596304ad11843c4f88489f209735f5fb7'
                                   b'fdaf7cec8addc5818168f880acbf490d51005b7a8'
                                   b'e84e43e54287977571dd99eea4b161eb2df1f5108'
                                   b'f12a4142a83322edb05a75487a3435c9a78ce53ed'
                                   b'93bc550857d7a9fb',
                        'salt': b'1d65491d79c864b373009be6f6f2467bac4c78fa',
                        'signature': b'0262ac254bfa77f3c1aca22c5179f8f040422b3'
                                     b'c5bafd40a8f21cf0fa5a667ccd5993d42dbafb4'
                                     b'09c520e25fce2b1ee1e716577f1efa17f3da280'
                                     b'52f40f0419b23106d7845aaf01125b698e7a4df'
                                     b'e92d3967bb00c4d0d35ba3552ab9a8b3eef07c7'
                                     b'fecdbc5424ac4db1e20cb37d0b2744769940ea9'
                                     b'07e17fbbca673b20522380c5'
                    }, {
                        'message': b'e2f96eaf0e05e7ba326ecca0ba7fd2f7c02356f3c'
                                   b'ede9d0faabf4fcc8e60a973e5595fd9ea08',
                        'salt': b'435c098aa9909eb2377f1248b091b68987ff1838',
                        'signature': b'2707b9ad5115c58c94e932e8ec0a280f56339e4'
                                     b'4a1b58d4ddcff2f312e5f34dcfe39e89c6a94dc'
                                     b'ee86dbbdae5b79ba4e0819a9e7bfd9d982e7ee6'
                                     b'c86ee68396e8b3a14c9c8f34b178eb741f9d3f1'
                                     b'21109bf5c8172fada2e768f9ea1433032c004a8'
                                     b'aa07eb990000a48dc94c8bac8aabe2b09b1aa46'
                                     b'c0a2aa0e12f63fbba775ba7e'
                    }
                ]
            },

            {
                'modulus': int(
                    '495370a1fb18543c16d3631e3163255df62be6eee890d5f25509e4f77'
                    '8a8ea6fbbbcdf85dff64e0d972003ab3681fbba6dd41fd541829b2e58'
                    '2de9f2a4a4e0a2d0900bef4753db3cee0ee06c7dfae8b1d53b5953218'
                    'f9cceea695b08668edeaadced9463b1d790d5ebf27e9115b46cad4d9a'
                    '2b8efab0561b0810344739ada0733f', 16),
                'public_exponent': int('10001', 16)
            }
        ),
        (
            {
                'modulus': int(
                    'e6bd692ac96645790403fdd0f5beb8b9bf92ed10007fc365046419dd0'
                    '6c05c5b5b2f48ecf989e4ce269109979cbb40b4a0ad24d22483d1ee31'
                    '5ad4ccb1534268352691c524f6dd8e6c29d224cf246973aec86c5bf6b'
                    '1401a850d1b9ad1bb8cbcec47b06f0f8c7f45d3fc8f319299c5433ddb'
                    'c2b3053b47ded2ecd4a4caefd614833dc8bb622f317ed076b8057fe8d'
                    'e3f84480ad5e83e4a61904a4f248fb397027357e1d30e463139815c6f'
                    'd4fd5ac5b8172a45230ecb6318a04f1455d84e5a8b', 16),
                'public_exponent': int('10001', 16),
                'private_exponent': int(
                    '6a7fd84fb85fad073b34406db74f8d61a6abc12196a961dd79565e9da'
                    '6e5187bce2d980250f7359575359270d91590bb0e427c71460b55d514'
                    '10b191bcf309fea131a92c8e702738fa719f1e0041f52e40e91f229f4'
                    'd96a1e6f172e15596b4510a6daec26105f2bebc53316b87bdf2131166'
                    '6070e8dfee69d52c71a976caae79c72b68d28580dc686d9f5129d225f'
                    '82b3d615513a882b3db91416b48ce08888213e37eeb9af800d81cab32'
                    '8ce420689903c00c7b5fd31b75503a6d419684d629', 16),
                'p': int(
                    'f8eb97e98df12664eefdb761596a69ddcd0e76daece6ed4bf5a1b50ac'
                    '086f7928a4d2f8726a77e515b74da41988f220b1cc87aa1fc810ce99a'
                    '82f2d1ce821edced794c6941f42c7a1a0b8c4d28c75ec60b652279f61'
                    '54a762aed165d47dee367', 16),
                'q': int(
                    'ed4d71d0a6e24b93c2e5f6b4bbe05f5fb0afa042d204fe3378d365c2f'
                    '288b6a8dad7efe45d153eef40cacc7b81ff934002d108994b94a5e472'
                    '8cd9c963375ae49965bda55cbf0efed8d6553b4027f2d86208a6e6b48'
                    '9c176128092d629e49d3d', 16),
                'dmp1': int(
                    '2bb68bddfb0c4f56c8558bffaf892d8043037841e7fa81cfa61a38c5e'
                    '39b901c8ee71122a5da2227bd6cdeeb481452c12ad3d61d5e4f776a0a'
                    'b556591befe3e59e5a7fddb8345e1f2f35b9f4cee57c32414c086aec9'
                    '93e9353e480d9eec6289f', 16),
                'dmq1': int(
                    '4ff897709fad079746494578e70fd8546130eeab5627c49b080f05ee4'
                    'ad9f3e4b7cba9d6a5dff113a41c3409336833f190816d8a6bc42e9bec'
                    '56b7567d0f3c9c696db619b245d901dd856db7c8092e77e9a1cccd56e'
                    'e4dba42c5fdb61aec2669', 16),
                'iqmp': int(
                    '77b9d1137b50404a982729316efafc7dfe66d34e5a182600d5f30a0a8'
                    '512051c560d081d4d0a1835ec3d25a60f4e4d6aa948b2bf3dbb5b124c'
                    'bbc3489255a3a948372f6978496745f943e1db4f18382ceaa505dfc65'
                    '757bb3f857a58dce52156', 16),
                'examples': [
                    {
                        'message': b'06add75ab689de067744e69a2ebd4b90fa9383003'
                                   b'cd05ff536cbf294cd215f0923b7fc9004f0aa1852'
                                   b'71a1d0061fd0e9777ad1ec0c71591f578bf7b8e5a'
                                   b'1',
                        'signature': b'4514210e541d5bad7dd60ae549b943acc44f213'
                                     b'90df5b61318455a17610df5b74d84aed232f17e'
                                     b'59d91dd2659922f812dbd49681690384b954e9a'
                                     b'dfb9b1a968c0cbff763eceed62750c59164b5e0'
                                     b'80a8fef3d55bfe2acfad2752a6a8459fa1fab49'
                                     b'ad378c6964b23ee97fd1034610c5cc14c61e0eb'
                                     b'fb1711f8ade96fe6557b38'
                    }
                ]
            },

            {
                'modulus': int(
                    'e6bd692ac96645790403fdd0f5beb8b9bf92ed10007fc365046419dd0'
                    '6c05c5b5b2f48ecf989e4ce269109979cbb40b4a0ad24d22483d1ee31'
                    '5ad4ccb1534268352691c524f6dd8e6c29d224cf246973aec86c5bf6b'
                    '1401a850d1b9ad1bb8cbcec47b06f0f8c7f45d3fc8f319299c5433ddb'
                    'c2b3053b47ded2ecd4a4caefd614833dc8bb622f317ed076b8057fe8d'
                    'e3f84480ad5e83e4a61904a4f248fb397027357e1d30e463139815c6f'
                    'd4fd5ac5b8172a45230ecb6318a04f1455d84e5a8b', 16),
                'public_exponent': int('10001', 16)
            }
        )
    )
    assert vectors == expected


def test_load_pkcs1_oaep_vectors():
    vector_data = textwrap.dedent("""
    Test vectors for RSA-OAEP
    =========================

    This file contains test vectors for the RSA-OAEP encryption

    Key lengths:

    Key  1: 1024 bits
    # <snip>
    ===========================================================================
    # Example 1: A 1024-bit RSA key pair
    # -----------------------------------


    # Public key
    # ----------

    # Modulus:
    a8 b3 b2 84 af 8e b5 0b 38 70 34 a8 60 f1 46 c4
    91 9f 31 87 63 cd 6c 55 98 c8 ae 48 11 a1 e0 ab
    c4 c7 e0 b0 82 d6 93 a5 e7 fc ed 67 5c f4 66 85
    12 77 2c 0c bc 64 a7 42 c6 c6 30 f5 33 c8 cc 72
    f6 2a e8 33 c4 0b f2 58 42 e9 84 bb 78 bd bf 97
    c0 10 7d 55 bd b6 62 f5 c4 e0 fa b9 84 5c b5 14
    8e f7 39 2d d3 aa ff 93 ae 1e 6b 66 7b b3 d4 24
    76 16 d4 f5 ba 10 d4 cf d2 26 de 88 d3 9f 16 fb

    # Exponent:
    01 00 01

    # Private key
    # -----------

    # Modulus:
    a8 b3 b2 84 af 8e b5 0b 38 70 34 a8 60 f1 46 c4
    91 9f 31 87 63 cd 6c 55 98 c8 ae 48 11 a1 e0 ab
    c4 c7 e0 b0 82 d6 93 a5 e7 fc ed 67 5c f4 66 85
    12 77 2c 0c bc 64 a7 42 c6 c6 30 f5 33 c8 cc 72
    f6 2a e8 33 c4 0b f2 58 42 e9 84 bb 78 bd bf 97
    c0 10 7d 55 bd b6 62 f5 c4 e0 fa b9 84 5c b5 14
    8e f7 39 2d d3 aa ff 93 ae 1e 6b 66 7b b3 d4 24
    76 16 d4 f5 ba 10 d4 cf d2 26 de 88 d3 9f 16 fb

    # Public exponent:
    01 00 01

    # Exponent:
    53 33 9c fd b7 9f c8 46 6a 65 5c 73 16 ac a8 5c
    55 fd 8f 6d d8 98 fd af 11 95 17 ef 4f 52 e8 fd
    8e 25 8d f9 3f ee 18 0f a0 e4 ab 29 69 3c d8 3b
    15 2a 55 3d 4a c4 d1 81 2b 8b 9f a5 af 0e 7f 55
    fe 73 04 df 41 57 09 26 f3 31 1f 15 c4 d6 5a 73
    2c 48 31 16 ee 3d 3d 2d 0a f3 54 9a d9 bf 7c bf
    b7 8a d8 84 f8 4d 5b eb 04 72 4d c7 36 9b 31 de
    f3 7d 0c f5 39 e9 cf cd d3 de 65 37 29 ea d5 d1

    # Prime 1:
    d3 27 37 e7 26 7f fe 13 41 b2 d5 c0 d1 50 a8 1b
    58 6f b3 13 2b ed 2f 8d 52 62 86 4a 9c b9 f3 0a
    f3 8b e4 48 59 8d 41 3a 17 2e fb 80 2c 21 ac f1
    c1 1c 52 0c 2f 26 a4 71 dc ad 21 2e ac 7c a3 9d

    # Prime 2:
    cc 88 53 d1 d5 4d a6 30 fa c0 04 f4 71 f2 81 c7
    b8 98 2d 82 24 a4 90 ed be b3 3d 3e 3d 5c c9 3c
    47 65 70 3d 1d d7 91 64 2f 1f 11 6a 0d d8 52 be
    24 19 b2 af 72 bf e9 a0 30 e8 60 b0 28 8b 5d 77

    # Prime exponent 1:
    0e 12 bf 17 18 e9 ce f5 59 9b a1 c3 88 2f e8 04
    6a 90 87 4e ef ce 8f 2c cc 20 e4 f2 74 1f b0 a3
    3a 38 48 ae c9 c9 30 5f be cb d2 d7 68 19 96 7d
    46 71 ac c6 43 1e 40 37 96 8d b3 78 78 e6 95 c1

    # Prime exponent 2:
    95 29 7b 0f 95 a2 fa 67 d0 07 07 d6 09 df d4 fc
    05 c8 9d af c2 ef 6d 6e a5 5b ec 77 1e a3 33 73
    4d 92 51 e7 90 82 ec da 86 6e fe f1 3c 45 9e 1a
    63 13 86 b7 e3 54 c8 99 f5 f1 12 ca 85 d7 15 83

    # Coefficient:
    4f 45 6c 50 24 93 bd c0 ed 2a b7 56 a3 a6 ed 4d
    67 35 2a 69 7d 42 16 e9 32 12 b1 27 a6 3d 54 11
    ce 6f a9 8d 5d be fd 73 26 3e 37 28 14 27 43 81
    81 66 ed 7d d6 36 87 dd 2a 8c a1 d2 f4 fb d8 e1

    # RSA-OAEP encryption of 6 random messages with random seeds
    # -----------------------------------------------------------

    # OAEP Example 1.1
    # ------------------

    # Message:
    66 28 19 4e 12 07 3d b0 3b a9 4c da 9e f9 53 23
    97 d5 0d ba 79 b9 87 00 4a fe fe 34

    # Seed:
    18 b7 76 ea 21 06 9d 69 77 6a 33 e9 6b ad 48 e1
    dd a0 a5 ef

    # Encryption:
    35 4f e6 7b 4a 12 6d 5d 35 fe 36 c7 77 79 1a 3f
    7b a1 3d ef 48 4e 2d 39 08 af f7 22 fa d4 68 fb
    21 69 6d e9 5d 0b e9 11 c2 d3 17 4f 8a fc c2 01
    03 5f 7b 6d 8e 69 40 2d e5 45 16 18 c2 1a 53 5f
    a9 d7 bf c5 b8 dd 9f c2 43 f8 cf 92 7d b3 13 22
    d6 e8 81 ea a9 1a 99 61 70 e6 57 a0 5a 26 64 26
    d9 8c 88 00 3f 84 77 c1 22 70 94 a0 d9 fa 1e 8c
    40 24 30 9c e1 ec cc b5 21 00 35 d4 7a c7 2e 8a

    # OAEP Example 1.2
    # ------------------

    # Message:
    75 0c 40 47 f5 47 e8 e4 14 11 85 65 23 29 8a c9
    ba e2 45 ef af 13 97 fb e5 6f 9d d5

    # Seed:
    0c c7 42 ce 4a 9b 7f 32 f9 51 bc b2 51 ef d9 25
    fe 4f e3 5f

    # Encryption:
    64 0d b1 ac c5 8e 05 68 fe 54 07 e5 f9 b7 01 df
    f8 c3 c9 1e 71 6c 53 6f c7 fc ec 6c b5 b7 1c 11
    65 98 8d 4a 27 9e 15 77 d7 30 fc 7a 29 93 2e 3f
    00 c8 15 15 23 6d 8d 8e 31 01 7a 7a 09 df 43 52
    d9 04 cd eb 79 aa 58 3a dc c3 1e a6 98 a4 c0 52
    83 da ba 90 89 be 54 91 f6 7c 1a 4e e4 8d c7 4b
    bb e6 64 3a ef 84 66 79 b4 cb 39 5a 35 2d 5e d1
    15 91 2d f6 96 ff e0 70 29 32 94 6d 71 49 2b 44

    # =============================================
    """).splitlines()

    vectors = load_pkcs1_vectors(vector_data)
    expected = [
        (
            {
                'modulus': int(
                    'a8b3b284af8eb50b387034a860f146c4919f318763cd6c5598c8ae481'
                    '1a1e0abc4c7e0b082d693a5e7fced675cf4668512772c0cbc64a742c6'
                    'c630f533c8cc72f62ae833c40bf25842e984bb78bdbf97c0107d55bdb'
                    '662f5c4e0fab9845cb5148ef7392dd3aaff93ae1e6b667bb3d4247616'
                    'd4f5ba10d4cfd226de88d39f16fb', 16),
                'public_exponent': int('10001', 16),
                'private_exponent': int(
                    '53339cfdb79fc8466a655c7316aca85c55fd8f6dd898fdaf119517ef4'
                    'f52e8fd8e258df93fee180fa0e4ab29693cd83b152a553d4ac4d1812b'
                    '8b9fa5af0e7f55fe7304df41570926f3311f15c4d65a732c483116ee3'
                    'd3d2d0af3549ad9bf7cbfb78ad884f84d5beb04724dc7369b31def37d'
                    '0cf539e9cfcdd3de653729ead5d1', 16),
                'p': int(
                    'd32737e7267ffe1341b2d5c0d150a81b586fb3132bed2f8d5262864a9'
                    'cb9f30af38be448598d413a172efb802c21acf1c11c520c2f26a471dc'
                    'ad212eac7ca39d', 16),
                'q': int(
                    'cc8853d1d54da630fac004f471f281c7b8982d8224a490edbeb33d3e3'
                    'd5cc93c4765703d1dd791642f1f116a0dd852be2419b2af72bfe9a030'
                    'e860b0288b5d77', 16),
                'dmp1': int(
                    '0e12bf1718e9cef5599ba1c3882fe8046a90874eefce8f2ccc20e4f27'
                    '41fb0a33a3848aec9c9305fbecbd2d76819967d4671acc6431e403796'
                    '8db37878e695c1', 16),
                'dmq1': int(
                    '95297b0f95a2fa67d00707d609dfd4fc05c89dafc2ef6d6ea55bec771'
                    'ea333734d9251e79082ecda866efef13c459e1a631386b7e354c899f5'
                    'f112ca85d71583', 16),
                'iqmp': int(
                    '4f456c502493bdc0ed2ab756a3a6ed4d67352a697d4216e93212b127a'
                    '63d5411ce6fa98d5dbefd73263e3728142743818166ed7dd63687dd2a'
                    '8ca1d2f4fbd8e1', 16),
                'examples': [
                    {
                        'message': b'6628194e12073db03ba94cda9ef9532397d50dba7'
                                   b'9b987004afefe34',
                        'seed': b'18b776ea21069d69776a33e96bad48e1dda0a5ef',
                        'encryption': b'354fe67b4a126d5d35fe36c777791a3f7ba13d'
                                      b'ef484e2d3908aff722fad468fb21696de95d0b'
                                      b'e911c2d3174f8afcc201035f7b6d8e69402de5'
                                      b'451618c21a535fa9d7bfc5b8dd9fc243f8cf92'
                                      b'7db31322d6e881eaa91a996170e657a05a2664'
                                      b'26d98c88003f8477c1227094a0d9fa1e8c4024'
                                      b'309ce1ecccb5210035d47ac72e8a'
                    }, {
                        'message': b'750c4047f547e8e41411856523298ac9bae245efa'
                                   b'f1397fbe56f9dd5',
                        'seed': b'0cc742ce4a9b7f32f951bcb251efd925fe4fe35f',
                        'encryption': b'640db1acc58e0568fe5407e5f9b701dff8c3c9'
                                      b'1e716c536fc7fcec6cb5b71c1165988d4a279e'
                                      b'1577d730fc7a29932e3f00c81515236d8d8e31'
                                      b'017a7a09df4352d904cdeb79aa583adcc31ea6'
                                      b'98a4c05283daba9089be5491f67c1a4ee48dc7'
                                      b'4bbbe6643aef846679b4cb395a352d5ed11591'
                                      b'2df696ffe0702932946d71492b44'
                    }
                ]
            },

            {
                'modulus': int(
                    'a8b3b284af8eb50b387034a860f146c4919f318763cd6c5598c8ae481'
                    '1a1e0abc4c7e0b082d693a5e7fced675cf4668512772c0cbc64a742c6'
                    'c630f533c8cc72f62ae833c40bf25842e984bb78bdbf97c0107d55bdb'
                    '662f5c4e0fab9845cb5148ef7392dd3aaff93ae1e6b667bb3d4247616'
                    'd4f5ba10d4cfd226de88d39f16fb', 16),
                'public_exponent': int('10001', 16),
            }
        )
    ]
    assert vectors == expected


def test_load_hotp_vectors():
    vector_data = textwrap.dedent("""
    # HOTP Test Vectors
    # RFC 4226 Appendix D

    COUNT = 0
    COUNTER = 0
    INTERMEDIATE = cc93cf18508d94934c64b65d8ba7667fb7cde4b0
    TRUNCATED = 4c93cf18
    HOTP = 755224
    SECRET = 12345678901234567890

    COUNT = 1
    COUNTER = 1
    INTERMEDIATE = 75a48a19d4cbe100644e8ac1397eea747a2d33ab
    TRUNCATED = 41397eea
    HOTP = 287082
    SECRET = 12345678901234567890


    COUNT = 2
    COUNTER = 2
    INTERMEDIATE = 0bacb7fa082fef30782211938bc1c5e70416ff44
    TRUNCATED = 82fef30
    HOTP = 359152
    SECRET = 12345678901234567890


    COUNT = 3
    COUNTER = 3
    INTERMEDIATE = 66c28227d03a2d5529262ff016a1e6ef76557ece
    TRUNCATED = 66ef7655
    HOTP = 969429
    SECRET = 12345678901234567890
    """).splitlines()

    assert load_nist_vectors(vector_data) == [
        {
            "counter": b"0",
            "intermediate": b"cc93cf18508d94934c64b65d8ba7667fb7cde4b0",
            "truncated": b"4c93cf18",
            "hotp": b"755224",
            "secret": b"12345678901234567890",
        },
        {
            "counter": b"1",
            "intermediate": b"75a48a19d4cbe100644e8ac1397eea747a2d33ab",
            "truncated": b"41397eea",
            "hotp": b"287082",
            "secret": b"12345678901234567890",
        },
        {
            "counter": b"2",
            "intermediate": b"0bacb7fa082fef30782211938bc1c5e70416ff44",
            "truncated": b"82fef30",
            "hotp": b"359152",
            "secret": b"12345678901234567890",
        },
        {
            "counter": b"3",
            "intermediate": b"66c28227d03a2d5529262ff016a1e6ef76557ece",
            "truncated": b"66ef7655",
            "hotp": b"969429",
            "secret": b"12345678901234567890",
        },
    ]


def test_load_totp_vectors():
    vector_data = textwrap.dedent("""
    # TOTP Test Vectors
    # RFC 6238 Appendix B

    COUNT = 0
    TIME = 59
    TOTP = 94287082
    MODE = SHA1
    SECRET = 12345678901234567890

    COUNT = 1
    TIME = 59
    TOTP = 46119246
    MODE = SHA256
    SECRET = 12345678901234567890

    COUNT = 2
    TIME = 59
    TOTP = 90693936
    MODE = SHA512
    SECRET = 12345678901234567890
    """).splitlines()

    assert load_nist_vectors(vector_data) == [
        {
            "time": b"59",
            "totp": b"94287082",
            "mode": b"SHA1",
            "secret": b"12345678901234567890",
        },
        {
            "time": b"59",
            "totp": b"46119246",
            "mode": b"SHA256",
            "secret": b"12345678901234567890",
        },
        {
            "time": b"59",
            "totp": b"90693936",
            "mode": b"SHA512",
            "secret": b"12345678901234567890",
        },
    ]


def test_load_rsa_nist_vectors():
    vector_data = textwrap.dedent("""
    # CAVS 11.4
    # "SigGen PKCS#1 RSASSA-PSS" information
    # Mod sizes selected: 1024 1536 2048 3072 4096
    # SHA Algorithm selected:SHA1 SHA224 SHA256 SHA384 SHA512
    # Salt len: 20

    [mod = 1024]

    n = bcb47b2e0dafcba81ff2a2b5cb115ca7e757184c9d72bcdcda707a146b3b4e29989d

    e = 00000000000000000000000000000000000000000000000000000000000000000010001
    SHAAlg = SHA1
    Msg = 1248f62a4389f42f7b4bb131053d6c88a994db2075b912ccbe3ea7dc611714f14e
    S = 682cf53c1145d22a50caa9eb1a9ba70670c5915e0fdfde6457a765de2a8fe12de97

    SHAAlg = SHA384
    Msg = e511903c2f1bfba245467295ac95413ac4746c984c3750a728c388aa628b0ebf
    S = 9c748702bbcc1f9468864cd360c8c39d007b2d8aaee833606c70f7593cf0d1519

    [mod = 1024]

    n = 1234567890

    e = 0010001

    SHAAlg = SHA512
    Msg = 3456781293fab829
    S = deadbeef0000
    """).splitlines()

    vectors = load_rsa_nist_vectors(vector_data)
    assert vectors == [
        {
            "modulus": int("bcb47b2e0dafcba81ff2a2b5cb115ca7e757184c9d72bcdcda"
                           "707a146b3b4e29989d", 16),
            "public_exponent": 65537,
            "algorithm": "SHA1",
            "salt_length": 20,
            "msg": b"1248f62a4389f42f7b4bb131053d6c88a994db2075b912ccbe3ea7dc6"
                   b"11714f14e",
            "s": b"682cf53c1145d22a50caa9eb1a9ba70670c5915e0fdfde6457a765de2a8"
                 b"fe12de97",
            "fail": False
        },
        {
            "modulus": int("bcb47b2e0dafcba81ff2a2b5cb115ca7e757184c9d72bcdcda"
                           "707a146b3b4e29989d", 16),
            "public_exponent": 65537,
            "algorithm": "SHA384",
            "salt_length": 20,
            "msg": b"e511903c2f1bfba245467295ac95413ac4746c984c3750a728c388aa6"
                   b"28b0ebf",
            "s": b"9c748702bbcc1f9468864cd360c8c39d007b2d8aaee833606c70f7593cf"
                 b"0d1519",
            "fail": False
        },
        {
            "modulus": 78187493520,
            "public_exponent": 65537,
            "algorithm": "SHA512",
            "salt_length": 20,
            "msg": b"3456781293fab829",
            "s": b"deadbeef0000",
            "fail": False
        },
    ]


def test_load_rsa_nist_pkcs1v15_verification_vectors():
    vector_data = textwrap.dedent("""
    # CAVS 11.0
    # "SigVer PKCS#1 Ver 1.5" information
    # Mod sizes selected: 1024 1536 2048 3072 4096
    # SHA Algorithm selected:SHA1 SHA224 SHA256 SHA384 SHA512
    # Generated on Wed Mar 02 00:13:02 2011

    [mod = 1024]

    n = be499b5e7f06c83fa0293e31465c8eb6b58af920bae52a7b5b9bfeb7aa72db126411

    p = e7a80c5d211c06acb900939495f26d365fc2b4825b75e356f89003eaa5931e6be5c3
    q = d248aa248000f720258742da67b711940c8f76e1ecd52b67a6ffe1e49354d66ff84f

    SHAAlg = SHA1
    e = 00000000000000000000000000000000000000000000000000000000000000000011
    d = 0d0f17362bdad181db4e1fe03e8de1a3208989914e14bf269558826bfa20faf4b68d
    Msg = 6b9cfac0ba1c7890b13e381ce752195cc1375237db2afcf6a9dcd1f95ec733a80c
    S = 562d87b5781c01d166fef3972669a0495c145b898a17df4743fbefb0a1582bd6ba9d
    SaltVal = 11223344555432167890
    Result = F (3 - Signature changed )

    SHAAlg = SHA1
    e = 0000000000003
    d = bfa20faf4b68d
    Msg = 2a67c70ff14f9b34ddb42e6f89d5971057a0da980fc9ae70c81a84da0c0ac42737
    S = 2b91c6ae2b3c46ff18d5b7abe239634cb752d0acb53eea0ccd8ea8483036a50e8faf
    SaltVal = 11223344555432167890
    Result = P
    """).splitlines()

    vectors = load_rsa_nist_vectors(vector_data)
    assert vectors == [
        {
            "modulus": int("be499b5e7f06c83fa0293e31465c8eb6b58af920bae52a7b5b"
                           "9bfeb7aa72db126411", 16),
            "p": int("e7a80c5d211c06acb900939495f26d365fc2b4825b75e356f89003ea"
                     "a5931e6be5c3", 16),
            "q": int("d248aa248000f720258742da67b711940c8f76e1ecd52b67a6ffe1e4"
                     "9354d66ff84f", 16),
            "public_exponent": 17,
            "algorithm": "SHA1",
            "private_exponent": int("0d0f17362bdad181db4e1fe03e8de1a3208989914"
                                    "e14bf269558826bfa20faf4b68d", 16),
            "msg": b"6b9cfac0ba1c7890b13e381ce752195cc1375237db2afcf6a9dcd1f95"
                   b"ec733a80c",
            "s": b"562d87b5781c01d166fef3972669a0495c145b898a17df4743fbefb0a15"
                 b"82bd6ba9d",
            "saltval": b"11223344555432167890",
            "fail": True
        },
        {
            "modulus": int("be499b5e7f06c83fa0293e31465c8eb6b58af920bae52a7b5b"
                           "9bfeb7aa72db126411", 16),
            "p": int("e7a80c5d211c06acb900939495f26d365fc2b4825b75e356f89003ea"
                     "a5931e6be5c3", 16),
            "q": int("d248aa248000f720258742da67b711940c8f76e1ecd52b67a6ffe1e4"
                     "9354d66ff84f", 16),
            "public_exponent": 3,
            "algorithm": "SHA1",
            "private_exponent": int("bfa20faf4b68d", 16),
            "msg": b"2a67c70ff14f9b34ddb42e6f89d5971057a0da980fc9ae70c81a84da0"
                   b"c0ac42737",
            "s": b"2b91c6ae2b3c46ff18d5b7abe239634cb752d0acb53eea0ccd8ea848303"
                 b"6a50e8faf",
            "saltval": b"11223344555432167890",
            "fail": False
        },
    ]


def test_load_rsa_nist_pss_verification_vectors():
    vector_data = textwrap.dedent("""
    # CAVS 11.0
    # "SigVer PKCS#1 RSASSA-PSS" information
    # Mod sizes selected: 1024 1536 2048 3072 4096
    # SHA Algorithm selected:SHA1 SHA224 SHA256 SHA384 SHA512
    # Salt len: 10
    # Generated on Wed Mar 02 00:25:22 2011

    [mod = 1024]

    n = be499b5e7f06c83fa0293e31465c8eb6b5

    p = e7a80c5d211c06acb900939495f26d365f
    q = d248aa248000f720258742da67b711940c

    SHAAlg = SHA1
    e = 00000000000000011
    d = c8e26a88239672cf49b3422a07c4d834ba
    Msg = 6b9cfac0ba1c7890b13e381ce752195c
    S = 562d87b5781c01d166fef3972669a0495c
    SaltVal = 11223344555432167890
    Result = F (3 - Signature changed )

    SHAAlg = SHA384
    e = 000003
    d = 0d0f17362bdad181db4e1fe03e8de1a320
    Msg = 2a67c70ff14f9b34ddb42e6f89d59710
    S = 2b91c6ae2b3c46ff18d5b7abe239634cb7
    SaltVal = 11223344555432167890
    Result = P
    """).splitlines()

    vectors = load_rsa_nist_vectors(vector_data)
    assert vectors == [
        {
            "modulus": int("be499b5e7f06c83fa0293e31465c8eb6b5", 16),
            "p": int("e7a80c5d211c06acb900939495f26d365f", 16),
            "q": int("d248aa248000f720258742da67b711940c", 16),
            "public_exponent": 17,
            "algorithm": "SHA1",
            "private_exponent": int("c8e26a88239672cf49b3422a07c4d834ba", 16),
            "msg": b"6b9cfac0ba1c7890b13e381ce752195c",
            "s": b"562d87b5781c01d166fef3972669a0495c",
            "saltval": b"11223344555432167890",
            "salt_length": 10,
            "fail": True
        },
        {
            "modulus": int("be499b5e7f06c83fa0293e31465c8eb6b5", 16),
            "p": int("e7a80c5d211c06acb900939495f26d365f", 16),
            "q": int("d248aa248000f720258742da67b711940c", 16),
            "public_exponent": 3,
            "algorithm": "SHA384",
            "private_exponent": int("0d0f17362bdad181db4e1fe03e8de1a320", 16),
            "msg": b"2a67c70ff14f9b34ddb42e6f89d59710",
            "s": b"2b91c6ae2b3c46ff18d5b7abe239634cb7",
            "saltval": b"11223344555432167890",
            "salt_length": 10,
            "fail": False
        },
    ]


def test_load_fips_dsa_key_pair_vectors():
    vector_data = textwrap.dedent("""
    #  CAVS 11.1
    #  "KeyPair" information
    #  Mod sizes selected: L=1024, N=160:: L=2048, N=224 :: L=2048, N=256 :: L
=3072, N=256
    # Generated on Wed May 04 08:50:52 2011


    [mod = L=1024, N=160]

    P = d38311e2cd388c3ed698e82fdf88eb92b5a9a483dc88005d4b725ef341eabb47cf8a7a\
8a41e792a156b7ce97206c4f9c5ce6fc5ae7912102b6b502e59050b5b21ce263dddb2044b65223\
6f4d42ab4b5d6aa73189cef1ace778d7845a5c1c1c7147123188f8dc551054ee162b634d60f097\
f719076640e20980a0093113a8bd73
    Q = 96c5390a8b612c0e422bb2b0ea194a3ec935a281
    G = 06b7861abbd35cc89e79c52f68d20875389b127361ca66822138ce4991d2b862259d6b\
4548a6495b195aa0e0b6137ca37eb23b94074d3c3d300042bdf15762812b6333ef7b07ceba7860\
7610fcc9ee68491dbc1e34cd12615474e52b18bc934fb00c61d39e7da8902291c4434a4e2224c3\
f4fd9f93cd6f4f17fc076341a7e7d9

    X = 8185fee9cc7c0e91fd85503274f1cd5a3fd15a49
    Y = 6f26d98d41de7d871b6381851c9d91fa03942092ab6097e76422070edb71db44ff5682\
80fdb1709f8fc3feab39f1f824adaeb2a298088156ac31af1aa04bf54f475bdcfdcf2f8a2dd973\
e922d83e76f016558617603129b21c70bf7d0e5dc9e68fe332e295b65876eb9a12fe6fca9f1a1c\
e80204646bf99b5771d249a6fea627

    X = 85322d6ea73083064376099ca2f65f56e8522d9b
    Y = 21f8690f717c9f4dcb8f4b6971de2f15b9231fcf41b7eeb997d781f240bfdddfd2090d\
22083c26cca39bf37c9caf1ec89518ea64845a50d747b49131ffff6a2fd11ea7bacbb93c7d0513\
7383a06365af82225dd3713ca5a45006316f53bd12b0e260d5f79795e5a4c9f353f12867a1d320\
2394673ada8563b71555e53f415254

    [mod = L=2048, N=224]

    P = 904ef8e31e14721910fa0969e77c99b79f190071a86026e37a887a6053960dbfb74390\
a6641319fe0af32c4e982934b0f1f4c5bc57534e8e56d77c36f0a99080c0d5bc9022fa34f58922\
81d7b1009571cb5b35699303f912b276d86b1b0722fc0b1500f0ffb2e4d90867a3bdca181a9734\
617a8a9f991aa7c14dec1cf45ceba00600f8425440ed0c3b52c82e3aa831932a98b477da220867\
eb2d5e0ca34580b33b1b65e558411ed09c369f4717bf03b551787e13d9e47c267c91c697225265\
da157945cd8b32e84fc45b80533265239aa00a2dd3d05f5cb231b7daf724b7ecdce170360a8397\
2e5be94626273d449f441be300a7345db387bebadad67d8060a7
    Q = d7d0a83e84d13032b830ed74a6a88592ec9a4cf42bf37080c6600aad
    G = 2050b18d3c9f39fac396c009310d6616f9309b67b59aef9aee813d6b4f12ee29ba8a6b\
350b11d4336d44b4641230002d870f1e6b1d8728bdd40262df0d2440999185ae077f7034c61679\
f4360fbb5d181569e7cb8acb04371c11ba55f1bbd777b74304b99b66d4405303e7120dc8bc4785\
f56e9533e65b63a0c77cce7bba0d5d6069df5edffa927c5a255a09405a008258ed93506a843366\
2154f6f67e922d7c9788f04d4ec09581063950d9cde8e373ea59a58b2a6df6ba8663345574fabb\
a9ca981696d83aeac1f34f14f1a813ba900b3f0341dea23f7d3297f919a97e1ae00ac0728c93fe\
0a88b66591baf4eb0bc6900f39ba5feb41cbbeea7eb7919aa4d3

    X = 3f19424da3b4f0cafca3fc5019fcd225dd7e496ffdf6b77e364f45be
    Y = 7681ed0ac257ab7ff17c52de4638c0614749792707a0c0d23883697e34963df15c806f\
a6206f7fafb3269018e7703bd1e6f518d13544331a017713dbbe0cee8da6c095271fbf24edb74a\
44e18b1d3b835622f68d31921c67c83e8479d1972ed0cb106c68188fe22c044254251ebf880b90\
49dc3b7958ef61e1e67d2f677d2a7d2ab6b7c42b70cc5dedc3e5de7459a2dbc70c69008553d7ff\
b6bf81c012c8bd67bdddeaab9a4a4373027912a7c7d9cd9cfc6c81dffe0cc7a6d40c3b2065aee7\
be80e3c35497d64c8045bc511edaf7314c84c56bd9f0fecf62262ea5b45b49a0cffb223713bdbd\
3ad03a25a0bb2211eba41ffcd08ab0e1ad485c29a3fc25ee8359

    X = 241396352dd26efe0e2e184da52fe2b61d9d51b91b5009674c447854
    Y = 2f07a3aa9884c65288e5fef56c7b7f4445632273290bae6fcaab87c90058b2bef81ad3\
34958657cf649ffb976d618b34ce69ef6d68c0d8bfe275cf097a301e8dd5595958e0c668c15f67\
b5c0b0d01983057ce61593635aab5e0564ed720b0336f055a86755c76be22df3b8487f16e2ba0b\
5136fd30d7e3b1d30c3bd298d3acc0a1988a11756c94e9a53184d0d3edfbb649caf03eace3083d\
e9933921e627f4b2e011d1c79e45d8ea1eb7e4e59a1cbd8382b3238474eb949749c985200fbb25\
41e2dce080aa881945d4d935076e48a0846dc5513bb4da8563b946af54f546455931e79c065ce7\
ca223a98f8fde40091d38eb2c3eb8e3b81d88374f3146b0afc42

    [mod = L=2048, N=256]

    P = ea1fb1af22881558ef93be8a5f8653c5a559434c49c8c2c12ace5e9c41434c9cf0a8e9\
498acb0f4663c08b4484eace845f6fb17dac62c98e706af0fc74e4da1c6c2b3fbf5a1d58ff82fc\
1a66f3e8b12252c40278fff9dd7f102eed2cb5b7323ebf1908c234d935414dded7f8d244e54561\
b0dca39b301de8c49da9fb23df33c6182e3f983208c560fb5119fbf78ebe3e6564ee235c6a15cb\
b9ac247baba5a423bc6582a1a9d8a2b4f0e9e3d9dbac122f750dd754325135257488b1f6ecabf2\
1bff2947fe0d3b2cb7ffe67f4e7fcdf1214f6053e72a5bb0dd20a0e9fe6db2df0a908c36e95e60\
bf49ca4368b8b892b9c79f61ef91c47567c40e1f80ac5aa66ef7
    Q = 8ec73f3761caf5fdfe6e4e82098bf10f898740dcb808204bf6b18f507192c19d
    G = e4c4eca88415b23ecf811c96e48cd24200fe916631a68a684e6ccb6b1913413d344d1d\
8d84a333839d88eee431521f6e357c16e6a93be111a98076739cd401bab3b9d565bf4fb99e9d18\
5b1e14d61c93700133f908bae03e28764d107dcd2ea7674217622074bb19efff482f5f5c1a86d5\
551b2fc68d1c6e9d8011958ef4b9c2a3a55d0d3c882e6ad7f9f0f3c61568f78d0706b10a26f23b\
4f197c322b825002284a0aca91807bba98ece912b80e10cdf180cf99a35f210c1655fbfdd74f13\
b1b5046591f8403873d12239834dd6c4eceb42bf7482e1794a1601357b629ddfa971f2ed273b14\
6ec1ca06d0adf55dd91d65c37297bda78c6d210c0bc26e558302

    X = 405772da6e90d809e77d5de796562a2dd4dfd10ef00a83a3aba6bd818a0348a1
    Y = 6b32e31ab9031dc4dd0b5039a78d07826687ab087ae6de4736f5b0434e1253092e8a0b\
231f9c87f3fc8a4cb5634eb194bf1b638b7a7889620ce6711567e36aa36cda4604cfaa601a4591\
8371d4ccf68d8b10a50a0460eb1dc0fff62ef5e6ee4d473e18ea4a66c196fb7e677a49b48241a0\
b4a97128eff30fa437050501a584f8771e7280d26d5af30784039159c11ebfea10b692fd0a5821\
5eeb18bff117e13f08db792ed4151a218e4bed8dddfb0793225bd1e9773505166f4bd8cedbb286\
ea28232972da7bae836ba97329ba6b0a36508e50a52a7675e476d4d4137eae13f22a9d2fefde70\
8ba8f34bf336c6e76331761e4b0617633fe7ec3f23672fb19d27

    X = 0e0b95e31fda3f888059c46c3002ef8f2d6be112d0209aeb9e9545da67aeea80
    Y = 778082b77ddba6f56597cc74c3a612abf2ddbd85cc81430c99ab843c1f630b9db01399\
65f563978164f9bf3a8397256be714625cd41cd7fa0067d94ea66d7e073f7125af692ad01371d4\
a17f4550590378f2b074030c20e36911598a1018772f61be3b24de4be5a388ccc09e15a92819c3\
1dec50de9fde105b49eaa097b9d13d9219eeb33b628facfd1c78a7159c8430d0647c506e7e3de7\
4763cb351eada72c00bef3c9641881e6254870c1e6599f8ca2f1bbb74f39a905e3a34e4544168e\
6e50c9e3305fd09cab6ed4aff6fda6e0d5bf375c81ac9054406d9193b003c89272f1bd83d48250\
134b65c77c2b6332d38d34d9016f0e8975536ad6c348a1faedb0

    [mod = L=3072, N=256]

    P = f335666dd1339165af8b9a5e3835adfe15c158e4c3c7bd53132e7d5828c352f593a9a7\
87760ce34b789879941f2f01f02319f6ae0b756f1a842ba54c85612ed632ee2d79ef17f06b77c6\
41b7b080aff52a03fc2462e80abc64d223723c236deeb7d201078ec01ca1fbc1763139e25099a8\
4ec389159c409792080736bd7caa816b92edf23f2c351f90074aa5ea2651b372f8b58a0a65554d\
b2561d706a63685000ac576b7e4562e262a14285a9c6370b290e4eb7757527d80b6c0fd5df831d\
36f3d1d35f12ab060548de1605fd15f7c7aafed688b146a02c945156e284f5b71282045aba9844\
d48b5df2e9e7a5887121eae7d7b01db7cdf6ff917cd8eb50c6bf1d54f90cce1a491a9c74fea88f\
7e7230b047d16b5a6027881d6f154818f06e513faf40c8814630e4e254f17a47bfe9cb519b9828\
9935bf17673ae4c8033504a20a898d0032ee402b72d5986322f3bdfb27400561f7476cd715eaab\
b7338b854e51fc2fa026a5a579b6dcea1b1c0559c13d3c1136f303f4b4d25ad5b692229957
    Q = d3eba6521240694015ef94412e08bf3cf8d635a455a398d6f210f6169041653b
    G = ce84b30ddf290a9f787a7c2f1ce92c1cbf4ef400e3cd7ce4978db2104d7394b493c183\
32c64cec906a71c3778bd93341165dee8e6cd4ca6f13afff531191194ada55ecf01ff94d6cf7c4\
768b82dd29cd131aaf202aefd40e564375285c01f3220af4d70b96f1395420d778228f1461f5d0\
b8e47357e87b1fe3286223b553e3fc9928f16ae3067ded6721bedf1d1a01bfd22b9ae85fce7782\
0d88cdf50a6bde20668ad77a707d1c60fcc5d51c9de488610d0285eb8ff721ff141f93a9fb23c1\
d1f7654c07c46e58836d1652828f71057b8aff0b0778ef2ca934ea9d0f37daddade2d823a4d8e3\
62721082e279d003b575ee59fd050d105dfd71cd63154efe431a0869178d9811f4f231dc5dcf3b\
0ec0f2b0f9896c32ec6c7ee7d60aa97109e09224907328d4e6acd10117e45774406c4c947da802\
0649c3168f690e0bd6e91ac67074d1d436b58ae374523deaf6c93c1e6920db4a080b744804bb07\
3cecfe83fa9398cf150afa286dc7eb7949750cf5001ce104e9187f7e16859afa8fd0d775ae

    X = b2764c46113983777d3e7e97589f1303806d14ad9f2f1ef033097de954b17706
    Y = 814824e435e1e6f38daa239aad6dad21033afce6a3ebd35c1359348a0f2418871968c2\
babfc2baf47742148828f8612183178f126504da73566b6bab33ba1f124c15aa461555c2451d86\
c94ee21c3e3fc24c55527e01b1f03adcdd8ec5cb08082803a7b6a829c3e99eeb332a2cf5c035b0\
ce0078d3d414d31fa47e9726be2989b8d06da2e6cd363f5a7d1515e3f4925e0b32adeae3025cc5\
a996f6fd27494ea408763de48f3bb39f6a06514b019899b312ec570851637b8865cff3a52bf5d5\
4ad5a19e6e400a2d33251055d0a440b50d53f4791391dc754ad02b9eab74c46b4903f9d76f8243\
39914db108057af7cde657d41766a99991ac8787694f4185d6f91d7627048f827b405ec67bf2fe\
56141c4c581d8c317333624e073e5879a82437cb0c7b435c0ce434e15965db1315d64895991e6b\
be7dac040c42052408bbc53423fd31098248a58f8a67da3a39895cd0cc927515d044c1e3cb6a32\
59c3d0da354cce89ea3552c59609db10ee989986527436af21d9485ddf25f90f7dff6d2bae

    X = 52e3e040efb30e1befd909a0bdbcfd140d005b1bff094af97186080262f1904d
    Y = a5ae6e8f9b7a68ab0516dad4d7b7d002126f811d5a52e3d35c6d387fcb43fd19bf7792\
362f9c98f8348aa058bb62376685f3d0c366c520d697fcd8416947151d4bbb6f32b53528a01647\
9e99d2cd48d1fc679027c15f0042f207984efe05c1796bca8eba678dfdd00b80418e3ea840557e\
73b09e003882f9a68edba3431d351d1ca07a8150b018fdbdf6c2f1ab475792a3ccaa6594472a45\
f8dc777b60bf67de3e0f65c20d11b7d59faedf83fbce52617f500d9e514947c455274c6e900464\
767fb56599b81344cf6d12c25cb2b7d038d7b166b6cf30534811c15d0e8ab880a2ac06786ae2dd\
de61329a78d526f65245380ce877e979c5b50de66c9c30d66382c8f254653d25a1eb1d3a4897d7\
623399b473ce712a2184cf2da1861706c41466806aefe41b497db82aca6c31c8f4aa68c17d1d9e\
380b57998917655783ec96e5234a131f7299398d36f1f5f84297a55ff292f1f060958c358fed34\
6db2de45127ca728a9417b2c54203e33e53b9a061d924395b09afab8daf3e8dd7eedcec3ac
    """).splitlines()

    expected = [
        {'g': int('06b7861abbd35cc89e79c52f68d20875389b127361ca66822138ce499'
                  '1d2b862259d6b4548a6495b195aa0e0b6137ca37eb23b94074d3c3d3000'
                  '42bdf15762812b6333ef7b07ceba78607610fcc9ee68491dbc1e34cd12'
                  '615474e52b18bc934fb00c61d39e7da8902291c4434a4e2224c3f'
                  '4fd9f93cd6f4f17fc076341a7e7d9', 16),
         'p': int('d38311e2cd388c3ed698e82fdf88eb92b5a9a483dc88005d4b725e'
                  'f341eabb47cf8a7a8a41e792a156b7ce97206c4f9c5ce6fc5ae791210'
                  '2b6b502e59050b5b21ce263dddb2044b652236f4d42ab4b5d6aa73189c'
                  'ef1ace778d7845a5c1c1c7147123188f8dc551054ee162b634d60f097f7'
                  '19076640e20980a0093113a8bd73', 16),
         'q': int('96c5390a8b612c0e422bb2b0ea194a3ec935a281', 16),
         'x': int('8185fee9cc7c0e91fd85503274f1cd5a3fd15a49', 16),
         'y': int('6f26d98d41de7d871b6381851c9d91fa03942092ab6097e76422'
                  '070edb71db44ff568280fdb1709f8fc3feab39f1f824adaeb2a29808815'
                  '6ac31af1aa04bf54f475bdcfdcf2f8a2dd973e922d83e76f01655861760'
                  '3129b21c70bf7d0e5dc9e68fe332e295b65876eb9a12fe6fca9f1a1ce80'
                  '204646bf99b5771d249a6fea627', 16)},
        {'g': int('06b7861abbd35cc89e79c52f68d20875389b127361ca66822138ce4991d'
                  '2b862259d6b4548a6495b195aa0e0b6137ca37eb23b94074d3c3d30004'
                  '2bdf15762812b6333ef7b07ceba78607610fcc9ee68491dbc1e34cd126'
                  '15474e52b18bc934fb00c61d39e7da8902291c4434a4e2224c3f4fd9'
                  'f93cd6f4f17fc076341a7e7d9', 16),
         'p': int('d38311e2cd388c3ed698e82fdf88eb92b5a9a483dc88005d4b725ef341e'
                  'abb47cf8a7a8a41e792a156b7ce97206c4f9c5ce6fc5ae7912102b6b50'
                  '2e59050b5b21ce263dddb2044b652236f4d42ab4b5d6aa73189cef1a'
                  'ce778d7845a5c1c1c7147123188f8dc551054ee162b634d6'
                  '0f097f719076640e20980a0093113a8bd73', 16),
         'q': int('96c5390a8b612c0e422bb2b0ea194a3ec935a281', 16),
         'x': int('85322d6ea73083064376099ca2f65f56e8522d9b', 16),
         'y': int('21f8690f717c9f4dcb8f4b6971de2f15b9231fcf41b7eeb997d781f240'
                  'bfdddfd2090d22083c26cca39bf37c9caf1ec89518ea64845a50d747b49'
                  '131ffff6a2fd11ea7bacbb93c7d05137383a06365af82225dd3713c'
                  'a5a45006316f53bd12b0e260d5f79795e5a4c9f353f12867a1d3'
                  '202394673ada8563b71555e53f415254', 16)},

        {'g': int('e4c4eca88415b23ecf811c96e48cd24200fe916631a68a684e6ccb6b191'
                  '3413d344d1d8d84a333839d88eee431521f6e357c16e6a93be111a9807'
                  '6739cd401bab3b9d565bf4fb99e9d185b1e14d61c93700133f908bae0'
                  '3e28764d107dcd2ea7674217622074bb19efff482f5f5c1a86d5551b2'
                  'fc68d1c6e9d8011958ef4b9c2a3a55d0d3c882e6ad7f9f0f3c61568f78'
                  'd0706b10a26f23b4f197c322b825002284a0aca91807bba98ece912'
                  'b80e10cdf180cf99a35f210c1655fbfdd74f13b1b5046591f8403873d'
                  '12239834dd6c4eceb42bf7482e1794a1601357b629ddfa971f2ed273b1'
                  '46ec1ca06d0adf55dd91d65c37297bda78c6d210c0bc26e558302', 16),
         'p': int('ea1fb1af22881558ef93be8a5f8653c5a559434c49c8c2c12ace'
                  '5e9c41434c9cf0a8e9498acb0f4663c08b4484eace845f6fb17d'
                  'ac62c98e706af0fc74e4da1c6c2b3fbf5a1d58ff82fc1a66f3e8b122'
                  '52c40278fff9dd7f102eed2cb5b7323ebf1908c234d935414dded7f8d2'
                  '44e54561b0dca39b301de8c49da9fb23df33c6182e3f983208c560fb5'
                  '119fbf78ebe3e6564ee235c6a15cbb9ac247baba5a423bc6582a1a9d8a'
                  '2b4f0e9e3d9dbac122f750dd754325135257488b1f6ecabf21bff2947'
                  'fe0d3b2cb7ffe67f4e7fcdf1214f6053e72a5bb0dd20a0e9fe6db2df0a'
                  '908c36e95e60bf49ca4368b8b892b9c79f61ef91c47567c40e1f80ac'
                  '5aa66ef7', 16),
         'q': int('8ec73f3761caf5fdfe6e4e82098bf10f898740dcb808204bf6b1'
                  '8f507192c19d', 16),
         'x': int('405772da6e90d809e77d5de796562a2dd4dfd10ef00a83a3aba6'
                  'bd818a0348a1', 16),
         'y': int('6b32e31ab9031dc4dd0b5039a78d07826687ab087ae6de4736f5'
                  'b0434e1253092e8a0b231f9c87f3fc8a4cb5634eb194bf1b638'
                  'b7a7889620ce6711567e36aa36cda4604cfaa601a45918371d'
                  '4ccf68d8b10a50a0460eb1dc0fff62ef5e6ee4d473e18ea4a6'
                  '6c196fb7e677a49b48241a0b4a97128eff30fa437050501a584'
                  'f8771e7280d26d5af30784039159c11ebfea10b692fd0a58215ee'
                  'b18bff117e13f08db792ed4151a218e4bed8dddfb0793225bd1e97'
                  '73505166f4bd8cedbb286ea28232972da7bae836ba97329ba6b0a36508'
                  'e50a52a7675e476d4d4137eae13f22a9d2fefde708ba8f34bf336c6e7'
                  '6331761e4b0617633fe7ec3f23672fb19d27', 16)},
        {'g': int('e4c4eca88415b23ecf811c96e48cd24200fe916631a68a684e6ccb6b191'
                  '3413d344d1d8d84a333839d88eee431521f6e357c16e6a93be111a9807'
                  '6739cd401bab3b9d565bf4fb99e9d185b1e14d61c93700133f908bae0'
                  '3e28764d107dcd2ea7674217622074bb19efff482f5f5c1a86d5551b2'
                  'fc68d1c6e9d8011958ef4b9c2a3a55d0d3c882e6ad7f9f0f3c61568f78'
                  'd0706b10a26f23b4f197c322b825002284a0aca91807bba98ece912'
                  'b80e10cdf180cf99a35f210c1655fbfdd74f13b1b5046591f8403873d'
                  '12239834dd6c4eceb42bf7482e1794a1601357b629ddfa971f2ed273b1'
                  '46ec1ca06d0adf55dd91d65c37297bda78c6d210c0bc26e558302', 16),
         'p': int('ea1fb1af22881558ef93be8a5f8653c5a559434c49c8c2c12ace'
                  '5e9c41434c9cf0a8e9498acb0f4663c08b4484eace845f6fb17d'
                  'ac62c98e706af0fc74e4da1c6c2b3fbf5a1d58ff82fc1a66f3e8b122'
                  '52c40278fff9dd7f102eed2cb5b7323ebf1908c234d935414dded7f8d2'
                  '44e54561b0dca39b301de8c49da9fb23df33c6182e3f983208c560fb5'
                  '119fbf78ebe3e6564ee235c6a15cbb9ac247baba5a423bc6582a1a9d8a'
                  '2b4f0e9e3d9dbac122f750dd754325135257488b1f6ecabf21bff2947'
                  'fe0d3b2cb7ffe67f4e7fcdf1214f6053e72a5bb0dd20a0e9fe6db2df0a'
                  '908c36e95e60bf49ca4368b8b892b9c79f61ef91c47567c40e1f80ac'
                  '5aa66ef7', 16),
         'q': int('8ec73f3761caf5fdfe6e4e82098bf10f898740dcb808204bf6b1'
                  '8f507192c19d', 16),
         'x': int('0e0b95e31fda3f888059c46c3002ef8f2d6be112d0209aeb9e95'
                  '45da67aeea80', 16),
         'y': int('778082b77ddba6f56597cc74c3a612abf2ddbd85cc81430c99ab'
                  '843c1f630b9db0139965f563978164f9bf3a8397256be714625'
                  'cd41cd7fa0067d94ea66d7e073f7125af692ad01371d4a17f45'
                  '50590378f2b074030c20e36911598a1018772f61be3b24de4be'
                  '5a388ccc09e15a92819c31dec50de9fde105b49eaa097b9d13d'
                  '9219eeb33b628facfd1c78a7159c8430d0647c506e7e3de74763c'
                  'b351eada72c00bef3c9641881e6254870c1e6599f8ca2f1bbb74f'
                  '39a905e3a34e4544168e6e50c9e3305fd09cab6ed4aff6fda6e0d'
                  '5bf375c81ac9054406d9193b003c89272f1bd83d48250134b65c77'
                  'c2b6332d38d34d9016f0e8975536ad6c348a1faedb0', 16)},

        {'g': int('ce84b30ddf290a9f787a7c2f1ce92c1cbf4ef400e3cd7ce4978d'
                  'b2104d7394b493c18332c64cec906a71c3778bd93341165dee8'
                  'e6cd4ca6f13afff531191194ada55ecf01ff94d6cf7c4768b82'
                  'dd29cd131aaf202aefd40e564375285c01f3220af4d70b96f1'
                  '395420d778228f1461f5d0b8e47357e87b1fe3286223b553e3'
                  'fc9928f16ae3067ded6721bedf1d1a01bfd22b9ae85fce77820d88cdf'
                  '50a6bde20668ad77a707d1c60fcc5d51c9de488610d0285eb8ff721f'
                  'f141f93a9fb23c1d1f7654c07c46e58836d1652828f71057b8aff0b077'
                  '8ef2ca934ea9d0f37daddade2d823a4d8e362721082e279d003b575ee'
                  '59fd050d105dfd71cd63154efe431a0869178d9811f4f231dc5dcf3b'
                  '0ec0f2b0f9896c32ec6c7ee7d60aa97109e09224907328d4e6acd1011'
                  '7e45774406c4c947da8020649c3168f690e0bd6e91ac67074d1d436b'
                  '58ae374523deaf6c93c1e6920db4a080b744804bb073cecfe83fa939'
                  '8cf150afa286dc7eb7949750cf5001ce104e9187f7e16859afa8fd0d'
                  '775ae', 16),
         'p': int('f335666dd1339165af8b9a5e3835adfe15c158e4c3c7bd53132e7d5828'
                  'c352f593a9a787760ce34b789879941f2f01f02319f6ae0b756f1a842'
                  'ba54c85612ed632ee2d79ef17f06b77c641b7b080aff52a03fc2462e8'
                  '0abc64d223723c236deeb7d201078ec01ca1fbc1763139e25099a84ec'
                  '389159c409792080736bd7caa816b92edf23f2c351f90074aa5ea2651'
                  'b372f8b58a0a65554db2561d706a63685000ac576b7e4562e262a1428'
                  '5a9c6370b290e4eb7757527d80b6c0fd5df831d36f3d1d35f12ab0605'
                  '48de1605fd15f7c7aafed688b146a02c945156e284f5b71282045aba9'
                  '844d48b5df2e9e7a5887121eae7d7b01db7cdf6ff917cd8eb50c6bf1d'
                  '54f90cce1a491a9c74fea88f7e7230b047d16b5a6027881d6f154818f'
                  '06e513faf40c8814630e4e254f17a47bfe9cb519b98289935bf17673a'
                  'e4c8033504a20a898d0032ee402b72d5986322f3bdfb27400561f7476'
                  'cd715eaabb7338b854e51fc2fa026a5a579b6dcea1b1c0559c13d3c11'
                  '36f303f4b4d25ad5b692229957', 16),
         'q': int('d3eba6521240694015ef94412e08bf3cf8d635a455a398d6f210'
                  'f6169041653b', 16),
         'x': int('b2764c46113983777d3e7e97589f1303806d14ad9f2f1ef03309'
                  '7de954b17706', 16),
         'y': int('814824e435e1e6f38daa239aad6dad21033afce6a3ebd35c1359348a0f2'
                  '418871968c2babfc2baf47742148828f8612183178f126504da73566b6'
                  'bab33ba1f124c15aa461555c2451d86c94ee21c3e3fc24c55527e'
                  '01b1f03adcdd8ec5cb08082803a7b6a829c3e99eeb332a2cf5c035b0c'
                  'e0078d3d414d31fa47e9726be2989b8d06da2e6cd363f5a7d1515e3f4'
                  '925e0b32adeae3025cc5a996f6fd27494ea408763de48f3bb39f6a06'
                  '514b019899b312ec570851637b8865cff3a52bf5d54ad5a19e6e400'
                  'a2d33251055d0a440b50d53f4791391dc754ad02b9eab74c46b4903'
                  'f9d76f824339914db108057af7cde657d41766a99991ac8787694f'
                  '4185d6f91d7627048f827b405ec67bf2fe56141c4c581d8c317333'
                  '624e073e5879a82437cb0c7b435c0ce434e15965db1315d648959'
                  '91e6bbe7dac040c42052408bbc53423fd31098248a58f8a67da3a'
                  '39895cd0cc927515d044c1e3cb6a3259c3d0da354cce89ea3552c'
                  '59609db10ee989986527436af21d9485ddf25f90f7dff6d2bae', 16)},
        {'g': int('ce84b30ddf290a9f787a7c2f1ce92c1cbf4ef400e3cd7ce4978d'
                  'b2104d7394b493c18332c64cec906a71c3778bd93341165dee8'
                  'e6cd4ca6f13afff531191194ada55ecf01ff94d6cf7c4768b82'
                  'dd29cd131aaf202aefd40e564375285c01f3220af4d70b96f1'
                  '395420d778228f1461f5d0b8e47357e87b1fe3286223b553e3'
                  'fc9928f16ae3067ded6721bedf1d1a01bfd22b9ae85fce77820d88cdf'
                  '50a6bde20668ad77a707d1c60fcc5d51c9de488610d0285eb8ff721f'
                  'f141f93a9fb23c1d1f7654c07c46e58836d1652828f71057b8aff0b077'
                  '8ef2ca934ea9d0f37daddade2d823a4d8e362721082e279d003b575ee'
                  '59fd050d105dfd71cd63154efe431a0869178d9811f4f231dc5dcf3b'
                  '0ec0f2b0f9896c32ec6c7ee7d60aa97109e09224907328d4e6acd1011'
                  '7e45774406c4c947da8020649c3168f690e0bd6e91ac67074d1d436b'
                  '58ae374523deaf6c93c1e6920db4a080b744804bb073cecfe83fa939'
                  '8cf150afa286dc7eb7949750cf5001ce104e9187f7e16859afa8fd0d'
                  '775ae', 16),
         'p': int('f335666dd1339165af8b9a5e3835adfe15c158e4c3c7bd53132e7d5828'
                  'c352f593a9a787760ce34b789879941f2f01f02319f6ae0b756f1a842'
                  'ba54c85612ed632ee2d79ef17f06b77c641b7b080aff52a03fc2462e8'
                  '0abc64d223723c236deeb7d201078ec01ca1fbc1763139e25099a84ec'
                  '389159c409792080736bd7caa816b92edf23f2c351f90074aa5ea2651'
                  'b372f8b58a0a65554db2561d706a63685000ac576b7e4562e262a1428'
                  '5a9c6370b290e4eb7757527d80b6c0fd5df831d36f3d1d35f12ab0605'
                  '48de1605fd15f7c7aafed688b146a02c945156e284f5b71282045aba9'
                  '844d48b5df2e9e7a5887121eae7d7b01db7cdf6ff917cd8eb50c6bf1d'
                  '54f90cce1a491a9c74fea88f7e7230b047d16b5a6027881d6f154818f'
                  '06e513faf40c8814630e4e254f17a47bfe9cb519b98289935bf17673a'
                  'e4c8033504a20a898d0032ee402b72d5986322f3bdfb27400561f7476'
                  'cd715eaabb7338b854e51fc2fa026a5a579b6dcea1b1c0559c13d3c11'
                  '36f303f4b4d25ad5b692229957', 16),
         'q': int('d3eba6521240694015ef94412e08bf3cf8d635a455a398d6f210'
                  'f6169041653b', 16),
         'x': int('52e3e040efb30e1befd909a0bdbcfd140d005b1bff094af97186'
                  '080262f1904d', 16),
         'y': int('a5ae6e8f9b7a68ab0516dad4d7b7d002126f811d5a52e3d35c6d'
                  '387fcb43fd19bf7792362f9c98f8348aa058bb62376685f3d0c3'
                  '66c520d697fcd8416947151d4bbb6f32b53528a016479e99d2cd'
                  '48d1fc679027c15f0042f207984efe05c1796bca8eba678dfdd0'
                  '0b80418e3ea840557e73b09e003882f9a68edba3431d351d1ca0'
                  '7a8150b018fdbdf6c2f1ab475792a3ccaa6594472a45f8dc777b'
                  '60bf67de3e0f65c20d11b7d59faedf83fbce52617f500d9e5149'
                  '47c455274c6e900464767fb56599b81344cf6d12c25cb2b7d038'
                  'd7b166b6cf30534811c15d0e8ab880a2ac06786ae2ddde61329a'
                  '78d526f65245380ce877e979c5b50de66c9c30d66382c8f25465'
                  '3d25a1eb1d3a4897d7623399b473ce712a2184cf2da1861706c4'
                  '1466806aefe41b497db82aca6c31c8f4aa68c17d1d9e380b5799'
                  '8917655783ec96e5234a131f7299398d36f1f5f84297a55ff292'
                  'f1f060958c358fed346db2de45127ca728a9417b2c54203e33e5'
                  '3b9a061d924395b09afab8daf3e8dd7eedcec3ac', 16)}
    ]

    assert expected == load_fips_dsa_key_pair_vectors(vector_data)


def test_load_fips_dsa_sig_ver_vectors():
    vector_data = textwrap.dedent("""
    # CAVS 11.0
    # "SigVer" information
    # Mod sizes selected: SHA-1 L=1024, N=160,SHA-384 L=2048, N=256
    # Generated on Fri Apr 01 08:37:15 2011

    [mod = L=1024, N=160, SHA-1]

    P = dc5bf3a88b2d99e4c95cdd7a0501cc38630d425cf5c390af3429cff1f35147b795cae\
a923f0d3577158f8a0c89dabd1962c2c453306b5d70cacfb01430aceb54e5a5fa6f93\
40d3bd2da612fceeb76b0ec1ebfae635a56ab141b108e00dc76eefe2edd0c514c21c4\
57457c39065dba9d0ecb7569c247172d8438ad2827b60435b
    Q = e956602b83d195dbe945b3ac702fc61f81571f1d
    G = d7eb9ca20a3c7a079606bafc4c9261ccaba303a5dc9fe9953f197dfe548c234895baa\
77f441ee6a2d97b909cbbd26ff7b869d24cae51b5c6edb127a4b5d75cd8b46608bfa1\
48249dffdb59807c5d7dde3fe3080ca3a2d28312142becb1fa8e24003e21c72871081\
74b95d5bc711e1c8d9b1076784f5dc37a964a5e51390da713

    Msg = 0fe1bfee500bdb76026099b1d37553f6bdfe48c82094ef98cb309dd777330bedfaa\
2f94c823ef74ef4074b50d8706041ac0e371c7c22dcf70263b8d60e17a86c7c379c\
fda8f22469e0df9d49d59439fc99891873628fff25dda5fac5ac794e948babdde96\
8143ba05f1128f34fdad5875edc4cd71c6c24ba2060ffbd439ce2b3
    X = 1d93010c29ecfc432188942f46f19f44f0e1bb5d
    Y = 6240ea0647117c38fe705106d56db578f3e10130928452d4f3587881b8a2bc6873a8b\
efc3237f20914e2a91c7f07a928ee22adeed23d74ab7f82ea11f70497e578f7a9b4cb\
d6f10226222b0b4da2ea1e49813d6bb9882fbf675c0846bb80cc891857b89b0ef1beb\
6cce3378a9aab5d66ad4cb9277cf447dfe1e64434749432fb
    R = b5af307867fb8b54390013cc67020ddf1f2c0b81
    S = 620d3b22ab5031440c3e35eab6f481298f9e9f08
    Result = P

    Msg = 97d50898025d2f9ba633866e968ca75e969d394edba6517204cb3dd537c2ba38778\
a2dc9dbc685a915e5676fcd43bc3726bc59ce3d7a9fae35565082a069c139fa37c9\
0d922b126933db3fa6c5ef6b1edf00d174a51887bb76909c6a94fe994ecc7b7fc8f\
26113b17f30f9d01693df99a125b4f17e184331c6b6e8ca00f54f3a
    X = 350e13534692a7e0c4b7d58836046c436fbb2322
    Y = 69974de550fe6bd3099150faea1623ad3fb6d9bf23a07215093f319725ad0877accff\
d291b6da18eb0cbe51676ceb0977504eb97c27c0b191883f72fb2710a9fbd8bcf13be\
0bf854410b32f42b33ec89d3cc1cf892bcd536c4195ca9ada302ad600c3408739935d\
77dc247529ca47f844cc86f5016a2fe962c6e20ca7c4d4e8f
    R = b5d05faa7005764e8dae0327c5bf1972ff7681b9
    S = 18ea15bd9f00475b25204cbc23f8c23e01588015
    Result = F (3 - R changed )

    [mod = L=2048, N=224, SHA-1]

    # unsupported so we ignore this

    Msg = f9d01693df99a125b4f17e184331c6b6e8ca00f54f3a
    X = e0c4b7d58836046c436fbb2322
    Y = fb6d9bf23a07215093f319725ad0877accff
    R = 5764e8dae0327c5bf1972ff7681b9
    S = 475b25204cbc23f8c23e01588015
    Result = F (3 - R changed )

    [mod = L=2048, N=256, SHA-384]

    P = e7c1c86125db9ef417da1ced7ea0861bdad629216a3f3c745df42a46b989e59f4d984\
25ee3c932fa3c2b6f637bdb6545bec526faa037e11f5578a4363b9fca5eba60d6a9cb\
aa2befd04141d989c7356285132c2eaf74f2d868521cdc0a17ae9a2546ef863027d3f\
8cc7949631fd0e2971417a912c8b8c5c989730db6ea6e8baee0e667850429038093c8\
51ccb6fb173bb081e0efe0bd7450e0946888f89f75e443ab93ef2da293a01622cf43c\
6dd79625d41ba8f9ef7e3086ab39134283d8e96c89249488120fd061e4a87d34af410\
69c0b4fd3934c31b589cbe85b68b912718d5dab859fda7082511fad1d152044905005\
546e19b14aa96585a55269bf2b831
    Q = 8e056ec9d4b7acb580087a6ed9ba3478711bb025d5b8d9c731ef9b38bd43db2f
    G = dc2bfb9776786ad310c8b0cdcbba3062402613c67e6959a8d8d1b05aab636528b7b1f\
e9cd33765f853d6dbe13d09f2681f8c7b1ed7886aaed70c7bd76dbe858ffb8bd86235\
ddf759244678f428c6519af593dc94eeadbd9852ba2b3d61664e8d58c29d2039af3c3\
d6d16f90988f6a8c824569f3d48050e30896a9e17cd0232ef01ab8790008f6973b84c\
763a72f4ae8b485abfb7e8efeb86808fa2b281d3e5d65d28f5992a34c077c5aa8026c\
b2fbc34a45f7e9bd216b10e6f12ecb172e9a6eb8f2e91316905b6add1fd22e83bc2f0\
89f1d5e6a6e6707c18ff55ddcb7954e8bceaf0efc4e8314910c03b0e51175f344faaf\
ee476a373ac95743cec712b72cf2e

    Msg = 6cd6ccfd66bcd832189c5f0c77994210e3bf2c43416f0fe77c4e92f31c5369538dc\
2c003f146c5ac79df43194ccf3c44d470d9f1083bd15b99b5bcf88c32d8a9021f09\
ea2288d7b3bf345a12aef3949c1e121b9fb371a67c2d1377364206ac839dd784835\
61426bda0303f285aa12e9c45d3cdfc6beae3549703b187deeb3296
    X = 56c897b5938ad5b3d437d7e4826da586a6b3be15e893fa1aaa946f20a028b6b3
    Y = 38ad44489e1a5778b9689f4dcf40e2acf23840fb954e987d6e8cb629106328ac64e1f\
3c3eba48b21176ad4afe3b733bead382ee1597e1b83e4b43424f2daaba04e5bd79e14\
36693ac2bddb79a298f026e57e200a252efd1e848a4a2e90be6e78f5242b468b9c0c6\
d2615047a5a40b9ae7e57a519114db55bf3bed65e580f894b094630ca9c217f6accd0\
91e72d2f22da620044ff372d7273f9445017fad492959e59600b7494dbe766a03e401\
25d4e6747c76f68a5b0cdc0e7d7cee12d08c6fb7d0fb049e420a33405075ed4463296\
345ca695fb7feab7c1b5333ae519fcd4bb6a043f4555378969114743d4face96cad31\
c0e0089da4e3f61b6d7dabc088ab7
    R = 3b85b17be240ed658beb3652c9d93e8e9eea160d35ee2459614305802963374e
    S = 726800a5174a53b56dce86064109c0273cd11fcfa3c92c5cd6aa910260c0e3c7
    Result = F (1 - Message changed)

    Msg = 3ad6b0884f358dea09c31a9abc40c45a6000611fc2b907b30eac00413fd2819de70\
15488a411609d46c499b8f7afa1b78b352ac7f8535bd805b8ff2a5eae557098c668\
f7ccd73af886d6823a6d456c29931ee864ed46d767382785728c2a83fcff5271007\
d2a67d06fa205fd7b9d1a42ea5d6dc76e5e18a9eb148cd1e8b262ae
    X = 2faf566a9f057960f1b50c69508f483d9966d6e35743591f3a677a9dc40e1555
    Y = 926425d617babe87c442b03903e32ba5bbf0cd9d602b59c4df791a4d64a6d4333ca0c\
0d370552539197d327dcd1bbf8c454f24b03fc7805f862db34c7b066ddfddbb11dbd0\
10b27123062d028fe041cb56a2e77488348ae0ab6705d87aac4d4e9e6600e9e706326\
d9979982cffa839beb9eacc3963bcca455a507e80c1c37ad4e765b2c9c0477a075e9b\
c584feacdf3a35a9391d4711f14e197c54022282bfed9a191213d64127f17a9c5affe\
c26e0c71f15d3a5b16098fec118c45bf8bb2f3b1560df0949254c1c0aeb0a16d5a95a\
40fab8521fbe8ea77c51169b587cc3360e5733e6a23b9fded8c40724ea1f9e93614b3\
a6c9b4f8dbbe915b794497227ba62
    R = 343ea0a9e66277380f604d5880fca686bffab69ca97bfba015a102a7e23dce0e
    S = 6258488c770e0f5ad7b9da8bade5023fc0d17c6ec517bd08d53e6dc01ac5c2b3
    Result = P
    """).splitlines()

    expected = [
        {
            'p': int('dc5bf3a88b2d99e4c95cdd7a0501cc38630d425cf5c390af3429cff1'
                     'f35147b795caea923f0d3577158f8a0c89dabd1962c2c453306b5d70'
                     'cacfb01430aceb54e5a5fa6f9340d3bd2da612fceeb76b0ec1ebfae6'
                     '35a56ab141b108e00dc76eefe2edd0c514c21c457457c39065dba9d0'
                     'ecb7569c247172d8438ad2827b60435b', 16),
            'q': int('e956602b83d195dbe945b3ac702fc61f81571f1d', 16),
            'g': int('d7eb9ca20a3c7a079606bafc4c9261ccaba303a5dc9fe9953f197dfe'
                     '548c234895baa77f441ee6a2d97b909cbbd26ff7b869d24cae51b5c6'
                     'edb127a4b5d75cd8b46608bfa148249dffdb59807c5d7dde3fe3080c'
                     'a3a2d28312142becb1fa8e24003e21c7287108174b95d5bc711e1c8d'
                     '9b1076784f5dc37a964a5e51390da713', 16),
            'digest_algorithm': 'SHA-1',
            'msg': binascii.unhexlify(
                b'0fe1bfee500bdb76026099b1d37553f6bdfe48c82094ef98cb309dd77733'
                b'0bedfaa2f94c823ef74ef4074b50d8706041ac0e371c7c22dcf70263b8d6'
                b'0e17a86c7c379cfda8f22469e0df9d49d59439fc99891873628fff25dda5'
                b'fac5ac794e948babdde968143ba05f1128f34fdad5875edc4cd71c6c24ba'
                b'2060ffbd439ce2b3'),
            'x': int('1d93010c29ecfc432188942f46f19f44f0e1bb5d', 16),
            'y': int('6240ea0647117c38fe705106d56db578f3e10130928452d4f3587881'
                     'b8a2bc6873a8befc3237f20914e2a91c7f07a928ee22adeed23d74ab'
                     '7f82ea11f70497e578f7a9b4cbd6f10226222b0b4da2ea1e49813d6b'
                     'b9882fbf675c0846bb80cc891857b89b0ef1beb6cce3378a9aab5d66'
                     'ad4cb9277cf447dfe1e64434749432fb', 16),
            'r': int('b5af307867fb8b54390013cc67020ddf1f2c0b81', 16),
            's': int('620d3b22ab5031440c3e35eab6f481298f9e9f08', 16),
            'result': 'P'},
        {
            'p': int('dc5bf3a88b2d99e4c95cdd7a0501cc38630d425cf5c390af3429cff1'
                     'f35147b795caea923f0d3577158f8a0c89dabd1962c2c453306b5d70'
                     'cacfb01430aceb54e5a5fa6f9340d3bd2da612fceeb76b0ec1ebfae6'
                     '35a56ab141b108e00dc76eefe2edd0c514c21c457457c39065dba9d0'
                     'ecb7569c247172d8438ad2827b60435b', 16),
            'q': int('e956602b83d195dbe945b3ac702fc61f81571f1d', 16),
            'g': int('d7eb9ca20a3c7a079606bafc4c9261ccaba303a5dc9fe9953f197dfe'
                     '548c234895baa77f441ee6a2d97b909cbbd26ff7b869d24cae51b5c6'
                     'edb127a4b5d75cd8b46608bfa148249dffdb59807c5d7dde3fe3080c'
                     'a3a2d28312142becb1fa8e24003e21c7287108174b95d5bc711e1c8d'
                     '9b1076784f5dc37a964a5e51390da713', 16),
            'digest_algorithm': 'SHA-1',
            'msg': binascii.unhexlify(
                b'97d50898025d2f9ba633866e968ca75e969d394edba6517204cb3dd537c2'
                b'ba38778a2dc9dbc685a915e5676fcd43bc3726bc59ce3d7a9fae35565082'
                b'a069c139fa37c90d922b126933db3fa6c5ef6b1edf00d174a51887bb7690'
                b'9c6a94fe994ecc7b7fc8f26113b17f30f9d01693df99a125b4f17e184331'
                b'c6b6e8ca00f54f3a'),
            'x': int('350e13534692a7e0c4b7d58836046c436fbb2322', 16),
            'y': int('69974de550fe6bd3099150faea1623ad3fb6d9bf23a07215093f3197'
                     '25ad0877accffd291b6da18eb0cbe51676ceb0977504eb97c27c0b19'
                     '1883f72fb2710a9fbd8bcf13be0bf854410b32f42b33ec89d3cc1cf8'
                     '92bcd536c4195ca9ada302ad600c3408739935d77dc247529ca47f84'
                     '4cc86f5016a2fe962c6e20ca7c4d4e8f', 16),
            'r': int('b5d05faa7005764e8dae0327c5bf1972ff7681b9', 16),
            's': int('18ea15bd9f00475b25204cbc23f8c23e01588015', 16),
            'result': 'F'},
        {
            'p': int('e7c1c86125db9ef417da1ced7ea0861bdad629216a3f3c745df42a4'
                     '6b989e59f4d98425ee3c932fa3c2b6f637bdb6545bec526faa037e1'
                     '1f5578a4363b9fca5eba60d6a9cbaa2befd04141d989c7356285132'
                     'c2eaf74f2d868521cdc0a17ae9a2546ef863027d3f8cc7949631fd0'
                     'e2971417a912c8b8c5c989730db6ea6e8baee0e667850429038093c'
                     '851ccb6fb173bb081e0efe0bd7450e0946888f89f75e443ab93ef2d'
                     'a293a01622cf43c6dd79625d41ba8f9ef7e3086ab39134283d8e96c'
                     '89249488120fd061e4a87d34af41069c0b4fd3934c31b589cbe85b6'
                     '8b912718d5dab859fda7082511fad1d152044905005546e19b14aa9'
                     '6585a55269bf2b831', 16),
            'q': int('8e056ec9d4b7acb580087a6ed9ba3478711bb025d5b8d9c731ef9b3'
                     '8bd43db2f', 16),
            'g': int('dc2bfb9776786ad310c8b0cdcbba3062402613c67e6959a8d8d1b05'
                     'aab636528b7b1fe9cd33765f853d6dbe13d09f2681f8c7b1ed7886a'
                     'aed70c7bd76dbe858ffb8bd86235ddf759244678f428c6519af593d'
                     'c94eeadbd9852ba2b3d61664e8d58c29d2039af3c3d6d16f90988f6'
                     'a8c824569f3d48050e30896a9e17cd0232ef01ab8790008f6973b84'
                     'c763a72f4ae8b485abfb7e8efeb86808fa2b281d3e5d65d28f5992a'
                     '34c077c5aa8026cb2fbc34a45f7e9bd216b10e6f12ecb172e9a6eb8'
                     'f2e91316905b6add1fd22e83bc2f089f1d5e6a6e6707c18ff55ddcb'
                     '7954e8bceaf0efc4e8314910c03b0e51175f344faafee476a373ac9'
                     '5743cec712b72cf2e', 16),
            'digest_algorithm': 'SHA-384',
            'msg': binascii.unhexlify(
                b'6cd6ccfd66bcd832189c5f0c77994210e3bf2c43416f0fe77c4e92f31c5'
                b'369538dc2c003f146c5ac79df43194ccf3c44d470d9f1083bd15b99b5bc'
                b'f88c32d8a9021f09ea2288d7b3bf345a12aef3949c1e121b9fb371a67c2'
                b'd1377364206ac839dd78483561426bda0303f285aa12e9c45d3cdfc6bea'
                b'e3549703b187deeb3296'),
            'x': int('56c897b5938ad5b3d437d7e4826da586a6b3be15e893fa1aaa946f2'
                     '0a028b6b3', 16),
            'y': int('38ad44489e1a5778b9689f4dcf40e2acf23840fb954e987d6e8cb62'
                     '9106328ac64e1f3c3eba48b21176ad4afe3b733bead382ee1597e1b'
                     '83e4b43424f2daaba04e5bd79e1436693ac2bddb79a298f026e57e2'
                     '00a252efd1e848a4a2e90be6e78f5242b468b9c0c6d2615047a5a40'
                     'b9ae7e57a519114db55bf3bed65e580f894b094630ca9c217f6accd'
                     '091e72d2f22da620044ff372d7273f9445017fad492959e59600b74'
                     '94dbe766a03e40125d4e6747c76f68a5b0cdc0e7d7cee12d08c6fb7'
                     'd0fb049e420a33405075ed4463296345ca695fb7feab7c1b5333ae5'
                     '19fcd4bb6a043f4555378969114743d4face96cad31c0e0089da4e3'
                     'f61b6d7dabc088ab7', 16),
            'r': int('3b85b17be240ed658beb3652c9d93e8e9eea160d35ee24596143058'
                     '02963374e', 16),
            's': int('726800a5174a53b56dce86064109c0273cd11fcfa3c92c5cd6aa910'
                     '260c0e3c7', 16),
            'result': 'F'},
        {
            'p': int('e7c1c86125db9ef417da1ced7ea0861bdad629216a3f3c745df42a4'
                     '6b989e59f4d98425ee3c932fa3c2b6f637bdb6545bec526faa037e1'
                     '1f5578a4363b9fca5eba60d6a9cbaa2befd04141d989c7356285132'
                     'c2eaf74f2d868521cdc0a17ae9a2546ef863027d3f8cc7949631fd0'
                     'e2971417a912c8b8c5c989730db6ea6e8baee0e667850429038093c'
                     '851ccb6fb173bb081e0efe0bd7450e0946888f89f75e443ab93ef2d'
                     'a293a01622cf43c6dd79625d41ba8f9ef7e3086ab39134283d8e96c'
                     '89249488120fd061e4a87d34af41069c0b4fd3934c31b589cbe85b6'
                     '8b912718d5dab859fda7082511fad1d152044905005546e19b14aa9'
                     '6585a55269bf2b831', 16),
            'q': int('8e056ec9d4b7acb580087a6ed9ba3478711bb025d5b8d9c731ef9b3'
                     '8bd43db2f', 16),
            'g': int('dc2bfb9776786ad310c8b0cdcbba3062402613c67e6959a8d8d1b05'
                     'aab636528b7b1fe9cd33765f853d6dbe13d09f2681f8c7b1ed7886a'
                     'aed70c7bd76dbe858ffb8bd86235ddf759244678f428c6519af593d'
                     'c94eeadbd9852ba2b3d61664e8d58c29d2039af3c3d6d16f90988f6'
                     'a8c824569f3d48050e30896a9e17cd0232ef01ab8790008f6973b84'
                     'c763a72f4ae8b485abfb7e8efeb86808fa2b281d3e5d65d28f5992a'
                     '34c077c5aa8026cb2fbc34a45f7e9bd216b10e6f12ecb172e9a6eb8'
                     'f2e91316905b6add1fd22e83bc2f089f1d5e6a6e6707c18ff55ddcb'
                     '7954e8bceaf0efc4e8314910c03b0e51175f344faafee476a373ac9'
                     '5743cec712b72cf2e', 16),
            'digest_algorithm': 'SHA-384',
            'msg': binascii.unhexlify(
                b'3ad6b0884f358dea09c31a9abc40c45a6000611fc2b907b30eac00413fd'
                b'2819de7015488a411609d46c499b8f7afa1b78b352ac7f8535bd805b8ff'
                b'2a5eae557098c668f7ccd73af886d6823a6d456c29931ee864ed46d7673'
                b'82785728c2a83fcff5271007d2a67d06fa205fd7b9d1a42ea5d6dc76e5e'
                b'18a9eb148cd1e8b262ae'),
            'x': int('2faf566a9f057960f1b50c69508f483d9966d6e35743591f3a677a9'
                     'dc40e1555', 16),
            'y': int('926425d617babe87c442b03903e32ba5bbf0cd9d602b59c4df791a4d'
                     '64a6d4333ca0c0d370552539197d327dcd1bbf8c454f24b03fc7805f'
                     '862db34c7b066ddfddbb11dbd010b27123062d028fe041cb56a2e774'
                     '88348ae0ab6705d87aac4d4e9e6600e9e706326d9979982cffa839be'
                     'b9eacc3963bcca455a507e80c1c37ad4e765b2c9c0477a075e9bc584'
                     'feacdf3a35a9391d4711f14e197c54022282bfed9a191213d64127f1'
                     '7a9c5affec26e0c71f15d3a5b16098fec118c45bf8bb2f3b1560df09'
                     '49254c1c0aeb0a16d5a95a40fab8521fbe8ea77c51169b587cc3360e'
                     '5733e6a23b9fded8c40724ea1f9e93614b3a6c9b4f8dbbe915b79449'
                     '7227ba62', 16),
            'r': int('343ea0a9e66277380f604d5880fca686bffab69ca97bfba015a102a'
                     '7e23dce0e', 16),
            's': int('6258488c770e0f5ad7b9da8bade5023fc0d17c6ec517bd08d53e6dc'
                     '01ac5c2b3', 16),
            'result': 'P'}
    ]

    assert expected == load_fips_dsa_sig_vectors(vector_data)


def test_load_fips_dsa_sig_gen_vectors():
    vector_data = textwrap.dedent("""
    # CAVS 11.2
    # "SigGen" information for "dsa2_values"
    # Mod sizes selected: SHA-1 L=1024, N=160, SHA-256 L=2048, N=256

    [mod = L=1024, N=160, SHA-1]

    P = a8f9cd201e5e35d892f85f80e4db2599a5676a3b1d4f190330ed3256b26d0e80a0e49\
a8fffaaad2a24f472d2573241d4d6d6c7480c80b4c67bb4479c15ada7ea8424d2502fa01472e7\
60241713dab025ae1b02e1703a1435f62ddf4ee4c1b664066eb22f2e3bf28bb70a2a76e4fd5eb\
e2d1229681b5b06439ac9c7e9d8bde283
    Q = f85f0f83ac4df7ea0cdf8f469bfeeaea14156495
    G = 2b3152ff6c62f14622b8f48e59f8af46883b38e79b8c74deeae9df131f8b856e3ad6c\
8455dab87cc0da8ac973417ce4f7878557d6cdf40b35b4a0ca3eb310c6a95d68ce284ad4e25ea\
28591611ee08b8444bd64b25f3f7c572410ddfb39cc728b9c936f85f419129869929cdb909a6a\
3a99bbe089216368171bd0ba81de4fe33

    Msg = 3b46736d559bd4e0c2c1b2553a33ad3c6cf23cac998d3d0c0e8fa4b19bca06f2f38\
6db2dcff9dca4f40ad8f561ffc308b46c5f31a7735b5fa7e0f9e6cb512e63d7eea05538d66a75\
cd0d4234b5ccf6c1715ccaaf9cdc0a2228135f716ee9bdee7fc13ec27a03a6d11c5c5b3685f51\
900b1337153bc6c4e8f52920c33fa37f4e7
    Y = 313fd9ebca91574e1c2eebe1517c57e0c21b0209872140c5328761bbb2450b33f1b18\
b409ce9ab7c4cd8fda3391e8e34868357c199e16a6b2eba06d6749def791d79e95d3a4d09b24c\
392ad89dbf100995ae19c01062056bb14bce005e8731efde175f95b975089bdcdaea562b32786\
d96f5a31aedf75364008ad4fffebb970b
    R = 50ed0e810e3f1c7cb6ac62332058448bd8b284c0
    S = c6aded17216b46b7e4b6f2a97c1ad7cc3da83fde

    Msg = d2bcb53b044b3e2e4b61ba2f91c0995fb83a6a97525e66441a3b489d9594238bc74\
0bdeea0f718a769c977e2de003877b5d7dc25b182ae533db33e78f2c3ff0645f2137abc137d4e\
7d93ccf24f60b18a820bc07c7b4b5fe08b4f9e7d21b256c18f3b9d49acc4f93e2ce6f3754c780\
7757d2e1176042612cb32fc3f4f70700e25
    Y = 29bdd759aaa62d4bf16b4861c81cf42eac2e1637b9ecba512bdbc13ac12a80ae8de25\
26b899ae5e4a231aef884197c944c732693a634d7659abc6975a773f8d3cd5a361fe2492386a3\
c09aaef12e4a7e73ad7dfc3637f7b093f2c40d6223a195c136adf2ea3fbf8704a675aa7817aa7\
ec7f9adfb2854d4e05c3ce7f76560313b
    R = a26c00b5750a2d27fe7435b93476b35438b4d8ab
    S = 61c9bfcb2938755afa7dad1d1e07c6288617bf70

    [mod = L=2048, N=256, SHA-256]

    P = a8adb6c0b4cf9588012e5deff1a871d383e0e2a85b5e8e03d814fe13a059705e66323\
0a377bf7323a8fa117100200bfd5adf857393b0bbd67906c081e585410e38480ead51684dac3a\
38f7b64c9eb109f19739a4517cd7d5d6291e8af20a3fbf17336c7bf80ee718ee087e322ee4104\
7dabefbcc34d10b66b644ddb3160a28c0639563d71993a26543eadb7718f317bf5d9577a61565\
61b082a10029cd44012b18de6844509fe058ba87980792285f2750969fe89c2cd6498db354563\
8d5379d125dccf64e06c1af33a6190841d223da1513333a7c9d78462abaab31b9f96d5f34445c\
eb6309f2f6d2c8dde06441e87980d303ef9a1ff007e8be2f0be06cc15f
    Q = e71f8567447f42e75f5ef85ca20fe557ab0343d37ed09edc3f6e68604d6b9dfb
    G = 5ba24de9607b8998e66ce6c4f812a314c6935842f7ab54cd82b19fa104abfb5d84579\
a623b2574b37d22ccae9b3e415e48f5c0f9bcbdff8071d63b9bb956e547af3a8df99e5d306197\
9652ff96b765cb3ee493643544c75dbe5bb39834531952a0fb4b0378b3fcbb4c8b5800a533039\
2a2a04e700bb6ed7e0b85795ea38b1b962741b3f33b9dde2f4ec1354f09e2eb78e95f037a5804\
b6171659f88715ce1a9b0cc90c27f35ef2f10ff0c7c7a2bb0154d9b8ebe76a3d764aa879af372\
f4240de8347937e5a90cec9f41ff2f26b8da9a94a225d1a913717d73f10397d2183f1ba3b7b45\
a68f1ff1893caf69a827802f7b6a48d51da6fbefb64fd9a6c5b75c4561

    Msg = 4e3a28bcf90d1d2e75f075d9fbe55b36c5529b17bc3a9ccaba6935c9e20548255b3\
dfae0f91db030c12f2c344b3a29c4151c5b209f5e319fdf1c23b190f64f1fe5b330cb7c8fa952\
f9d90f13aff1cb11d63181da9efc6f7e15bfed4862d1a62c7dcf3ba8bf1ff304b102b1ec3f149\
7dddf09712cf323f5610a9d10c3d9132659
    Y = 5a55dceddd1134ee5f11ed85deb4d634a3643f5f36dc3a70689256469a0b651ad2288\
0f14ab85719434f9c0e407e60ea420e2a0cd29422c4899c416359dbb1e592456f2b3cce233259\
c117542fd05f31ea25b015d9121c890b90e0bad033be1368d229985aac7226d1c8c2eab325ef3\
b2cd59d3b9f7de7dbc94af1a9339eb430ca36c26c46ecfa6c5481711496f624e188ad7540ef5d\
f26f8efacb820bd17a1f618acb50c9bc197d4cb7ccac45d824a3bf795c234b556b06aeb929173\
453252084003f69fe98045fe74002ba658f93475622f76791d9b2623d1b5fff2cc16844746efd\
2d30a6a8134bfc4c8cc80a46107901fb973c28fc553130f3286c1489da
    R = 633055e055f237c38999d81c397848c38cce80a55b649d9e7905c298e2a51447
    S = 2bbf68317660ec1e4b154915027b0bc00ee19cfc0bf75d01930504f2ce10a8b0

    Msg = a733b3f588d5ac9b9d4fe2f804df8c256403a9f8eef6f191fc48e1267fb5b4d546b\
a11e77b667844e489bf0d5f72990aeb061d01ccd7949a23def74a803b7d92d51abfadeb4885ff\
d8ffd58ab87548a15c087a39b8993b2fa64c9d31a594eeb7512da16955834336a234435c5a9d0\
dd9b15a94e116154dea63fdc8dd7a512181
    Y = 356ed47537fbf02cb30a8cee0537f300dff1d0c467399ce70b87a8758d5ec9dd25624\
6fccaeb9dfe109f2a984f2ddaa87aad54ce0d31f907e504521baf4207d7073b0a4a9fc67d8ddd\
a99f87aed6e0367cec27f9c608af743bf1ee6e11d55a182d43b024ace534029b866f6422828bb\
81a39aae9601ee81c7f81dd358e69f4e2edfa4654d8a65bc64311dc86aac4abc1fc7a3f651596\
61a0d8e288eb8d665cb0adf5ac3d6ba8e9453facf7542393ae24fd50451d3828086558f7ec528\
e284935a53f67a1aa8e25d8ad5c4ad55d83aef883a4d9eeb6297e6a53f65049ba9e2c6b7953a7\
60bc1dc46f78ceaaa2c02f5375dd82e708744aa40b15799eb81d7e5b1a
    R = bcd490568c0a89ba311bef88ea4f4b03d273e793722722327095a378dd6f3522
    S = 74498fc43091fcdd2d1ef0775f8286945a01cd72b805256b0451f9cbd943cf82
    """).splitlines()

    expected = [
        {
            'p': int('a8f9cd201e5e35d892f85f80e4db2599a5676a3b1d4f190330ed325'
                     '6b26d0e80a0e49a8fffaaad2a24f472d2573241d4d6d6c7480c80b4'
                     'c67bb4479c15ada7ea8424d2502fa01472e760241713dab025ae1b0'
                     '2e1703a1435f62ddf4ee4c1b664066eb22f2e3bf28bb70a2a76e4fd'
                     '5ebe2d1229681b5b06439ac9c7e9d8bde283', 16),
            'q': int('f85f0f83ac4df7ea0cdf8f469bfeeaea14156495', 16),
            'g': int('2b3152ff6c62f14622b8f48e59f8af46883b38e79b8c74deeae9df1'
                     '31f8b856e3ad6c8455dab87cc0da8ac973417ce4f7878557d6cdf40'
                     'b35b4a0ca3eb310c6a95d68ce284ad4e25ea28591611ee08b8444bd'
                     '64b25f3f7c572410ddfb39cc728b9c936f85f419129869929cdb909'
                     'a6a3a99bbe089216368171bd0ba81de4fe33', 16),
            'digest_algorithm': 'SHA-1',
            'msg': binascii.unhexlify(
                b'3b46736d559bd4e0c2c1b2553a33ad3c6cf23cac998d3d0c0e8fa4b19bc'
                b'a06f2f386db2dcff9dca4f40ad8f561ffc308b46c5f31a7735b5fa7e0f9'
                b'e6cb512e63d7eea05538d66a75cd0d4234b5ccf6c1715ccaaf9cdc0a222'
                b'8135f716ee9bdee7fc13ec27a03a6d11c5c5b3685f51900b1337153bc6c'
                b'4e8f52920c33fa37f4e7'),
            'y': int('313fd9ebca91574e1c2eebe1517c57e0c21b0209872140c5328761b'
                     'bb2450b33f1b18b409ce9ab7c4cd8fda3391e8e34868357c199e16a'
                     '6b2eba06d6749def791d79e95d3a4d09b24c392ad89dbf100995ae1'
                     '9c01062056bb14bce005e8731efde175f95b975089bdcdaea562b32'
                     '786d96f5a31aedf75364008ad4fffebb970b', 16),
            'r': int('50ed0e810e3f1c7cb6ac62332058448bd8b284c0', 16),
            's': int('c6aded17216b46b7e4b6f2a97c1ad7cc3da83fde', 16)},
        {
            'p': int('a8f9cd201e5e35d892f85f80e4db2599a5676a3b1d4f190330ed325'
                     '6b26d0e80a0e49a8fffaaad2a24f472d2573241d4d6d6c7480c80b4'
                     'c67bb4479c15ada7ea8424d2502fa01472e760241713dab025ae1b0'
                     '2e1703a1435f62ddf4ee4c1b664066eb22f2e3bf28bb70a2a76e4fd'
                     '5ebe2d1229681b5b06439ac9c7e9d8bde283', 16),
            'q': int('f85f0f83ac4df7ea0cdf8f469bfeeaea14156495', 16),
            'g': int('2b3152ff6c62f14622b8f48e59f8af46883b38e79b8c74deeae9df1'
                     '31f8b856e3ad6c8455dab87cc0da8ac973417ce4f7878557d6cdf40'
                     'b35b4a0ca3eb310c6a95d68ce284ad4e25ea28591611ee08b8444bd'
                     '64b25f3f7c572410ddfb39cc728b9c936f85f419129869929cdb909'
                     'a6a3a99bbe089216368171bd0ba81de4fe33', 16),
            'digest_algorithm': 'SHA-1',
            'msg': binascii.unhexlify(
                b'd2bcb53b044b3e2e4b61ba2f91c0995fb83a6a97525e66441a3b489d959'
                b'4238bc740bdeea0f718a769c977e2de003877b5d7dc25b182ae533db33e'
                b'78f2c3ff0645f2137abc137d4e7d93ccf24f60b18a820bc07c7b4b5fe08'
                b'b4f9e7d21b256c18f3b9d49acc4f93e2ce6f3754c7807757d2e11760426'
                b'12cb32fc3f4f70700e25'),
            'y': int('29bdd759aaa62d4bf16b4861c81cf42eac2e1637b9ecba512bdbc13'
                     'ac12a80ae8de2526b899ae5e4a231aef884197c944c732693a634d7'
                     '659abc6975a773f8d3cd5a361fe2492386a3c09aaef12e4a7e73ad7'
                     'dfc3637f7b093f2c40d6223a195c136adf2ea3fbf8704a675aa7817'
                     'aa7ec7f9adfb2854d4e05c3ce7f76560313b', 16),
            'r': int('a26c00b5750a2d27fe7435b93476b35438b4d8ab', 16),
            's': int('61c9bfcb2938755afa7dad1d1e07c6288617bf70', 16)},
        {
            'p': int('a8adb6c0b4cf9588012e5deff1a871d383e0e2a85b5e8e03d814fe1'
                     '3a059705e663230a377bf7323a8fa117100200bfd5adf857393b0bb'
                     'd67906c081e585410e38480ead51684dac3a38f7b64c9eb109f1973'
                     '9a4517cd7d5d6291e8af20a3fbf17336c7bf80ee718ee087e322ee4'
                     '1047dabefbcc34d10b66b644ddb3160a28c0639563d71993a26543e'
                     'adb7718f317bf5d9577a6156561b082a10029cd44012b18de684450'
                     '9fe058ba87980792285f2750969fe89c2cd6498db3545638d5379d1'
                     '25dccf64e06c1af33a6190841d223da1513333a7c9d78462abaab31'
                     'b9f96d5f34445ceb6309f2f6d2c8dde06441e87980d303ef9a1ff00'
                     '7e8be2f0be06cc15f', 16),
            'q': int('e71f8567447f42e75f5ef85ca20fe557ab0343d37ed09edc3f6e686'
                     '04d6b9dfb', 16),
            'g': int('5ba24de9607b8998e66ce6c4f812a314c6935842f7ab54cd82b19fa'
                     '104abfb5d84579a623b2574b37d22ccae9b3e415e48f5c0f9bcbdff'
                     '8071d63b9bb956e547af3a8df99e5d3061979652ff96b765cb3ee49'
                     '3643544c75dbe5bb39834531952a0fb4b0378b3fcbb4c8b5800a533'
                     '0392a2a04e700bb6ed7e0b85795ea38b1b962741b3f33b9dde2f4ec'
                     '1354f09e2eb78e95f037a5804b6171659f88715ce1a9b0cc90c27f3'
                     '5ef2f10ff0c7c7a2bb0154d9b8ebe76a3d764aa879af372f4240de8'
                     '347937e5a90cec9f41ff2f26b8da9a94a225d1a913717d73f10397d'
                     '2183f1ba3b7b45a68f1ff1893caf69a827802f7b6a48d51da6fbefb'
                     '64fd9a6c5b75c4561', 16),
            'digest_algorithm': 'SHA-256',
            'msg': binascii.unhexlify(
                b'4e3a28bcf90d1d2e75f075d9fbe55b36c5529b17bc3a9ccaba6935c9e20'
                b'548255b3dfae0f91db030c12f2c344b3a29c4151c5b209f5e319fdf1c23'
                b'b190f64f1fe5b330cb7c8fa952f9d90f13aff1cb11d63181da9efc6f7e1'
                b'5bfed4862d1a62c7dcf3ba8bf1ff304b102b1ec3f1497dddf09712cf323'
                b'f5610a9d10c3d9132659'),
            'y': int('5a55dceddd1134ee5f11ed85deb4d634a3643f5f36dc3a706892564'
                     '69a0b651ad22880f14ab85719434f9c0e407e60ea420e2a0cd29422'
                     'c4899c416359dbb1e592456f2b3cce233259c117542fd05f31ea25b'
                     '015d9121c890b90e0bad033be1368d229985aac7226d1c8c2eab325'
                     'ef3b2cd59d3b9f7de7dbc94af1a9339eb430ca36c26c46ecfa6c548'
                     '1711496f624e188ad7540ef5df26f8efacb820bd17a1f618acb50c9'
                     'bc197d4cb7ccac45d824a3bf795c234b556b06aeb92917345325208'
                     '4003f69fe98045fe74002ba658f93475622f76791d9b2623d1b5fff'
                     '2cc16844746efd2d30a6a8134bfc4c8cc80a46107901fb973c28fc5'
                     '53130f3286c1489da', 16),
            'r': int('633055e055f237c38999d81c397848c38cce80a55b649d9e7905c29'
                     '8e2a51447', 16),
            's': int('2bbf68317660ec1e4b154915027b0bc00ee19cfc0bf75d01930504f'
                     '2ce10a8b0', 16)},
        {
            'p': int('a8adb6c0b4cf9588012e5deff1a871d383e0e2a85b5e8e03d814fe1'
                     '3a059705e663230a377bf7323a8fa117100200bfd5adf857393b0bb'
                     'd67906c081e585410e38480ead51684dac3a38f7b64c9eb109f1973'
                     '9a4517cd7d5d6291e8af20a3fbf17336c7bf80ee718ee087e322ee4'
                     '1047dabefbcc34d10b66b644ddb3160a28c0639563d71993a26543e'
                     'adb7718f317bf5d9577a6156561b082a10029cd44012b18de684450'
                     '9fe058ba87980792285f2750969fe89c2cd6498db3545638d5379d1'
                     '25dccf64e06c1af33a6190841d223da1513333a7c9d78462abaab31'
                     'b9f96d5f34445ceb6309f2f6d2c8dde06441e87980d303ef9a1ff00'
                     '7e8be2f0be06cc15f', 16),
            'q': int('e71f8567447f42e75f5ef85ca20fe557ab0343d37ed09edc3f6e686'
                     '04d6b9dfb', 16),
            'g': int('5ba24de9607b8998e66ce6c4f812a314c6935842f7ab54cd82b19fa'
                     '104abfb5d84579a623b2574b37d22ccae9b3e415e48f5c0f9bcbdff'
                     '8071d63b9bb956e547af3a8df99e5d3061979652ff96b765cb3ee49'
                     '3643544c75dbe5bb39834531952a0fb4b0378b3fcbb4c8b5800a533'
                     '0392a2a04e700bb6ed7e0b85795ea38b1b962741b3f33b9dde2f4ec'
                     '1354f09e2eb78e95f037a5804b6171659f88715ce1a9b0cc90c27f3'
                     '5ef2f10ff0c7c7a2bb0154d9b8ebe76a3d764aa879af372f4240de8'
                     '347937e5a90cec9f41ff2f26b8da9a94a225d1a913717d73f10397d'
                     '2183f1ba3b7b45a68f1ff1893caf69a827802f7b6a48d51da6fbefb'
                     '64fd9a6c5b75c4561', 16),
            'digest_algorithm': 'SHA-256',
            'msg': binascii.unhexlify(
                b'a733b3f588d5ac9b9d4fe2f804df8c256403a9f8eef6f191fc48e1267fb'
                b'5b4d546ba11e77b667844e489bf0d5f72990aeb061d01ccd7949a23def7'
                b'4a803b7d92d51abfadeb4885ffd8ffd58ab87548a15c087a39b8993b2fa'
                b'64c9d31a594eeb7512da16955834336a234435c5a9d0dd9b15a94e11615'
                b'4dea63fdc8dd7a512181'),
            'y': int('356ed47537fbf02cb30a8cee0537f300dff1d0c467399ce70b87a87'
                     '58d5ec9dd256246fccaeb9dfe109f2a984f2ddaa87aad54ce0d31f9'
                     '07e504521baf4207d7073b0a4a9fc67d8ddda99f87aed6e0367cec2'
                     '7f9c608af743bf1ee6e11d55a182d43b024ace534029b866f642282'
                     '8bb81a39aae9601ee81c7f81dd358e69f4e2edfa4654d8a65bc6431'
                     '1dc86aac4abc1fc7a3f65159661a0d8e288eb8d665cb0adf5ac3d6b'
                     'a8e9453facf7542393ae24fd50451d3828086558f7ec528e284935a'
                     '53f67a1aa8e25d8ad5c4ad55d83aef883a4d9eeb6297e6a53f65049'
                     'ba9e2c6b7953a760bc1dc46f78ceaaa2c02f5375dd82e708744aa40'
                     'b15799eb81d7e5b1a', 16),
            'r': int('bcd490568c0a89ba311bef88ea4f4b03d273e793722722327095a37'
                     '8dd6f3522', 16),
            's': int('74498fc43091fcdd2d1ef0775f8286945a01cd72b805256b0451f9c'
                     'bd943cf82', 16)}
    ]
    assert expected == load_fips_dsa_sig_vectors(vector_data)


def test_load_fips_ecdsa_key_pair_vectors():
    vector_data = textwrap.dedent("""
    #  CAVS 11.0
    #  "Key Pair" information
    #  Curves selected: P-192 K-233 B-571
    #  Generated on Wed Mar 16 16:16:42 2011


    [P-192]

    [B.4.2 Key Pair Generation by Testing Candidates]
    N = 2

    d = e5ce89a34adddf25ff3bf1ffe6803f57d0220de3118798ea
    Qx = 8abf7b3ceb2b02438af19543d3e5b1d573fa9ac60085840f
    Qy = a87f80182dcd56a6a061f81f7da393e7cffd5e0738c6b245

    d = 7d14435714ad13ff23341cb567cc91198ff8617cc39751b2
    Qx = 39dc723b19527daa1e80425209c56463481b9b47c51f8cbd
    Qy = 432a3e84f2a16418834fabaf6b7d2341669512951f1672ad


    [K-233]

    [B.4.2 Key Pair Generation by Testing Candidates]
    N = 2

    d = 01da7422b50e3ff051f2aaaed10acea6cbf6110c517da2f4eaca8b5b87
    Qx = 01c7475da9a161e4b3f7d6b086494063543a979e34b8d7ac44204d47bf9f
    Qy = 0131cbd433f112871cc175943991b6a1350bf0cdd57ed8c831a2a7710c92

    d = 530951158f7b1586978c196603c12d25607d2cb0557efadb23cd0ce8
    Qx = d37500a0391d98d3070d493e2b392a2c79dc736c097ed24b7dd5ddec44
    Qy = 01d996cc79f37d8dba143d4a8ad9a8a60ed7ea760aae1ddba34d883f65d9


    [B-571]

    [B.4.2 Key Pair Generation by Testing Candidates]
    N = 2

    d = 01443e93c7ef6802655f641ecbe95e75f1f15b02d2e172f49a32e22047d5c00ebe1b3f\
f0456374461360667dbf07bc67f7d6135ee0d1d46a226a530fefe8ebf3b926e9fbad8d57a6
    Qx = 053e3710d8e7d4138db0a369c97e5332c1be38a20a4a84c36f5e55ea9fd6f34545b86\
4ea64f319e74b5ee9e4e1fa1b7c5b2db0e52467518f8c45b658824871d5d4025a6320ca06f8
    Qy = 03a22cfd370c4a449b936ae97ab97aab11c57686cca99d14ef184f9417fad8bedae4d\
f8357e3710bcda1833b30e297d4bf637938b995d231e557d13f062e81e830af5ab052208ead

    d = 03d2bd44ca9eeee8c860a4873ed55a54bdfdf5dab4060df7292877960b85d1fd496aa3\
3c587347213d7f6bf208a6ab4b430546e7b6ffbc3135bd12f44a28517867ca3c83a821d6f8
    Qx = 07a7af10f6617090bade18b2e092d0dfdc87cd616db7f2db133477a82bfe3ea421ebb\
7d6289980819292a719eb247195529ea60ad62862de0a26c72bfc49ecc81c2f9ed704e3168f
    Qy = 0721496cf16f988b1aabef3368450441df8439a0ca794170f270ead56203d675b57f5\
a4090a3a2f602a77ff3bac1417f7e25a683f667b3b91f105016a47afad46a0367b18e2bdf0c
    """).splitlines()

    expected = [
        {
            "curve": "secp192r1",
            "d": int("e5ce89a34adddf25ff3bf1ffe6803f57d0220de3118798ea", 16),
            "x": int("8abf7b3ceb2b02438af19543d3e5b1d573fa9ac60085840f", 16),
            "y": int("a87f80182dcd56a6a061f81f7da393e7cffd5e0738c6b245", 16)
        },

        {
            "curve": "secp192r1",
            "d": int("7d14435714ad13ff23341cb567cc91198ff8617cc39751b2", 16),
            "x": int("39dc723b19527daa1e80425209c56463481b9b47c51f8cbd", 16),
            "y": int("432a3e84f2a16418834fabaf6b7d2341669512951f1672ad", 16),
        },

        {
            "curve": "sect233k1",
            "d": int("1da7422b50e3ff051f2aaaed10acea6cbf6110c517da2f4e"
                     "aca8b5b87", 16),
            "x": int("1c7475da9a161e4b3f7d6b086494063543a979e34b8d7ac4"
                     "4204d47bf9f", 16),
            "y": int("131cbd433f112871cc175943991b6a1350bf0cdd57ed8c83"
                     "1a2a7710c92", 16),
        },

        {
            "curve": "sect233k1",
            "d": int("530951158f7b1586978c196603c12d25607d2cb0557efadb"
                     "23cd0ce8", 16),
            "x": int("d37500a0391d98d3070d493e2b392a2c79dc736c097ed24b"
                     "7dd5ddec44", 16),
            "y": int("1d996cc79f37d8dba143d4a8ad9a8a60ed7ea760aae1ddba"
                     "34d883f65d9", 16),
        },

        {
            "curve": "sect571r1",
            "d": int("1443e93c7ef6802655f641ecbe95e75f1f15b02d2e172f49"
                     "a32e22047d5c00ebe1b3ff0456374461360667dbf07bc67f"
                     "7d6135ee0d1d46a226a530fefe8ebf3b926e9fbad8d57a6", 16),
            "x": int("53e3710d8e7d4138db0a369c97e5332c1be38a20a4a84c36"
                     "f5e55ea9fd6f34545b864ea64f319e74b5ee9e4e1fa1b7c5"
                     "b2db0e52467518f8c45b658824871d5d4025a6320ca06f8", 16),
            "y": int("3a22cfd370c4a449b936ae97ab97aab11c57686cca99d14e"
                     "f184f9417fad8bedae4df8357e3710bcda1833b30e297d4b"
                     "f637938b995d231e557d13f062e81e830af5ab052208ead", 16),
        },

        {
            "curve": "sect571r1",
            "d": int("3d2bd44ca9eeee8c860a4873ed55a54bdfdf5dab4060df72"
                     "92877960b85d1fd496aa33c587347213d7f6bf208a6ab4b4"
                     "30546e7b6ffbc3135bd12f44a28517867ca3c83a821d6f8", 16),
            "x": int("7a7af10f6617090bade18b2e092d0dfdc87cd616db7f2db1"
                     "33477a82bfe3ea421ebb7d6289980819292a719eb2471955"
                     "29ea60ad62862de0a26c72bfc49ecc81c2f9ed704e3168f", 16),
            "y": int("721496cf16f988b1aabef3368450441df8439a0ca794170f"
                     "270ead56203d675b57f5a4090a3a2f602a77ff3bac1417f7"
                     "e25a683f667b3b91f105016a47afad46a0367b18e2bdf0c", 16),
        },
    ]

    assert expected == load_fips_ecdsa_key_pair_vectors(vector_data)


def test_load_fips_ecdsa_signing_vectors():
    vector_data = textwrap.dedent("""
    #  CAVS 11.2
    #  "SigVer" information for "ecdsa_values"
    #  Curves/SHAs selected: P-192, B-571,SHA-512
    #  Generated on Tue Aug 16 15:27:42 2011

    [P-192,SHA-1]

    Msg = ebf748d748ebbca7d29fb473698a6e6b4fb10c865d4af024cc39ae3df3464ba4f1d6\
d40f32bf9618a91bb5986fa1a2af048a0e14dc51e5267eb05e127d689d0ac6f1a7f156ce066316\
b971cc7a11d0fd7a2093e27cf2d08727a4e6748cc32fd59c7810c5b9019df21cdcc0bca432c0a3\
eed0785387508877114359cee4a071cf
    d = e14f37b3d1374ff8b03f41b9b3fdd2f0ebccf275d660d7f3
    Qx = 07008ea40b08dbe76432096e80a2494c94982d2d5bcf98e6
    Qy = 76fab681d00b414ea636ba215de26d98c41bd7f2e4d65477
    k = cb0abc7043a10783684556fb12c4154d57bc31a289685f25
    R = 6994d962bdd0d793ffddf855ec5bf2f91a9698b46258a63e
    S = 02ba6465a234903744ab02bc8521405b73cf5fc00e1a9f41
    Result = F (3 - S changed)

    Msg = 0dcb3e96d77ee64e9d0a350d31563d525755fc675f0c833504e83fc69c030181b42f\
e80c378e86274a93922c570d54a7a358c05755ec3ae91928e02236e81b43e596e4ccbf6a910488\
9c388072bec4e1faeae11fe4eb24fa4f9573560dcf2e3abc703c526d46d502c7a7222583431cc8\
178354ae7dbb84e3479917707bce0968
    d = 7a0235bea3d70445f14d56f9b7fb80ec8ff4eb2f76865244
    Qx = 0ea3c1fa1f124f26530cbfddeb831eecc67df31e08889d1d
    Qy = 7215a0cce0501b47903bd8fe1179c2dfe07bd076f89f5225
    k = 3c646b0f03f5575e5fd463d4319817ce8bd3022eaf551cef
    R = a3ba51c39c43991d87dff0f34d0bec7c883299e04f60f95e
    S = 8a7f9c59c6d65ad390e4c19636ba92b53be5d0f848b4e1f7

    [B-571,SHA-512]

    Msg = 10d2e00ae57176c79cdfc746c0c887abe799ee445b151b008e3d9f81eb69be40298d\
df37b5c45a9b6e5ff83785d8c140cf11e6a4c3879a2845796872363da24b10f1f8d9cc48f8af20\
681dceb60dd62095d6d3b1779a4a805de3d74e38983b24c0748618e2f92ef7cac257ff4bd1f411\
13f2891eb13c47930e69ddbe91f270fb
    d = 03e1b03ffca4399d5b439fac8f87a5cb06930f00d304193d7daf83d5947d0c1e293f74\
aef8e56849f16147133c37a6b3d1b1883e5d61d6b871ea036c5291d9a74541f28878cb986
    Qx = 3b236fc135d849d50140fdaae1045e6ae35ef61091e98f5059b30eb16acdd0deb2bc0\
d3544bc3a666e0014e50030134fe5466a9e4d3911ed580e28851f3747c0010888e819d3d1f
    Qy = 3a8b6627a587d289032bd76374d16771188d7ff281c39542c8977f6872fa932e5daa1\
4e13792dea9ffe8e9f68d6b525ec99b81a5a60cfb0590cc6f297cfff8d7ba1a8bb81fe2e16
    k = 2e56a94cfbbcd293e242f0c2a2e9df289a9480e6ba52e0f00fa19bcf2a7769bd155e6b\
79ddbd6a8646b0e69c8baea27f8034a18796e8eb4fe6e0e2358c383521d9375d2b6b437f9
    R = 2eb1c5c1fc93cf3c8babed12c031cf1504e094174fd335104cbe4a2abd210b5a14b1c3\
a455579f1ed0517c31822340e4dd3c1f967e1b4b9d071a1072afc1a199f8c548cd449a634
    S = 22f97bb48641235826cf4e597fa8de849402d6bd6114ad2d7fbcf53a08247e5ee921f1\
bd5994dffee36eedff5592bb93b8bb148214da3b7baebffbd96b4f86c55b3f6bbac142442
    Result = P (0 )

    Msg = b61a0849a28672cb536fcf61ea2eb389d02ff7a09aa391744cae6597bd56703c40c5\
0ca2dee5f7ee796acfd47322f03d8dbe4d99dc8eec588b4e5467f123075b2d74b2a0b0bbfd3ac5\
487a905fad6d6ac1421c2e564c0cf15e1f0f10bc31c249b7b46edd2462a55f85560d99bde9d5b0\
6b97817d1dbe0a67c701d6e6e7878272
    d = 2e09ffd8b434bb7f67d1d3ccf482164f1653c6e4ec64dec2517aa21b7a93b2b21ea1ee\
bb54734882f29303e489f02e3b741a87287e2dcdf3858eb6d2ec668f8b5b26f442ce513a2
    Qx = 36f1be8738dd7dae4486b86a08fe90424f3673e76b10e739442e15f3bfafaf841842a\
c98e490521b7e7bb94c127529f6ec6a42cc6f06fc80606f1210fe020ff508148f93301c9d3
    Qy = 4d39666ebe99fe214336ad440d776c88eb916f2f4a3433548b87d2aebed840b424d15\
c8341b4a0a657bf6a234d4fe78631c8e07ac1f4dc7474cd6b4545d536b7b17c160db4562d9
    k = 378e7801566d7b77db7a474717ab2195b02957cc264a9449d4126a7cc574728ed5a476\
9abd5dde987ca66cfe3d45b5fc52ffd266acb8a8bb3fcb4b60f7febbf48aebe33bd3efbdd
    R = 3d8105f87fe3166046c08e80a28acc98a80b8b7a729623053c2a9e80afd06756edfe09\
bdcf3035f6829ede041b745955d219dc5d30ddd8b37f6ba0f6d2857504cdc68a1ed812a10
    S = 34db9998dc53527114518a7ce3783d674ca8cced823fa05e2942e7a0a20b3cc583dcd9\
30c43f9b93079c5ee18a1f5a66e7c3527c18610f9b47a4da7e245ef803e0662e4d2ad721c
    """).splitlines()

    expected = [
        {
            "curve": "secp192r1",
            "digest_algorithm": "SHA-1",
            "message": binascii.unhexlify(
                b"ebf748d748ebbca7d29fb473698a6e6b4fb10c865d4af024cc39ae3df346"
                b"4ba4f1d6d40f32bf9618a91bb5986fa1a2af048a0e14dc51e5267eb05e12"
                b"7d689d0ac6f1a7f156ce066316b971cc7a11d0fd7a2093e27cf2d08727a4"
                b"e6748cc32fd59c7810c5b9019df21cdcc0bca432c0a3eed0785387508877"
                b"114359cee4a071cf"
            ),
            "d": int("e14f37b3d1374ff8b03f41b9b3fdd2f0ebccf275d660d7f3", 16),
            "x": int("7008ea40b08dbe76432096e80a2494c94982d2d5bcf98e6", 16),
            "y": int("76fab681d00b414ea636ba215de26d98c41bd7f2e4d65477", 16),
            "r": int("6994d962bdd0d793ffddf855ec5bf2f91a9698b46258a63e", 16),
            "s": int("02ba6465a234903744ab02bc8521405b73cf5fc00e1a9f41", 16),
            "fail": True
        },
        {
            "curve": "secp192r1",
            "digest_algorithm": "SHA-1",
            "message": binascii.unhexlify(
                b"0dcb3e96d77ee64e9d0a350d31563d525755fc675f0c833504e83fc69c03"
                b"0181b42fe80c378e86274a93922c570d54a7a358c05755ec3ae91928e022"
                b"36e81b43e596e4ccbf6a9104889c388072bec4e1faeae11fe4eb24fa4f95"
                b"73560dcf2e3abc703c526d46d502c7a7222583431cc8178354ae7dbb84e3"
                b"479917707bce0968"
            ),
            "d": int("7a0235bea3d70445f14d56f9b7fb80ec8ff4eb2f76865244", 16),
            "x": int("ea3c1fa1f124f26530cbfddeb831eecc67df31e08889d1d", 16),
            "y": int("7215a0cce0501b47903bd8fe1179c2dfe07bd076f89f5225", 16),
            "r": int("a3ba51c39c43991d87dff0f34d0bec7c883299e04f60f95e", 16),
            "s": int("8a7f9c59c6d65ad390e4c19636ba92b53be5d0f848b4e1f7", 16),
        },
        {
            "curve": "sect571r1",
            "digest_algorithm": "SHA-512",
            "message": binascii.unhexlify(
                b"10d2e00ae57176c79cdfc746c0c887abe799ee445b151b008e3d9f81eb69"
                b"be40298ddf37b5c45a9b6e5ff83785d8c140cf11e6a4c3879a2845796872"
                b"363da24b10f1f8d9cc48f8af20681dceb60dd62095d6d3b1779a4a805de3"
                b"d74e38983b24c0748618e2f92ef7cac257ff4bd1f41113f2891eb13c4793"
                b"0e69ddbe91f270fb"
            ),
            "d": int("3e1b03ffca4399d5b439fac8f87a5cb06930f00d304193d7daf83d59"
                     "47d0c1e293f74aef8e56849f16147133c37a6b3d1b1883e5d61d6b87"
                     "1ea036c5291d9a74541f28878cb986", 16),
            "x": int("3b236fc135d849d50140fdaae1045e6ae35ef61091e98f5059b30eb1"
                     "6acdd0deb2bc0d3544bc3a666e0014e50030134fe5466a9e4d3911ed"
                     "580e28851f3747c0010888e819d3d1f", 16),
            "y": int("3a8b6627a587d289032bd76374d16771188d7ff281c39542c8977f68"
                     "72fa932e5daa14e13792dea9ffe8e9f68d6b525ec99b81a5a60cfb05"
                     "90cc6f297cfff8d7ba1a8bb81fe2e16", 16),
            "r": int("2eb1c5c1fc93cf3c8babed12c031cf1504e094174fd335104cbe4a2a"
                     "bd210b5a14b1c3a455579f1ed0517c31822340e4dd3c1f967e1b4b9d"
                     "071a1072afc1a199f8c548cd449a634", 16),
            "s": int("22f97bb48641235826cf4e597fa8de849402d6bd6114ad2d7fbcf53a"
                     "08247e5ee921f1bd5994dffee36eedff5592bb93b8bb148214da3b7b"
                     "aebffbd96b4f86c55b3f6bbac142442", 16),
            "fail": False
        },
        {
            "curve": "sect571r1",
            "digest_algorithm": "SHA-512",
            "message": binascii.unhexlify(
                b"b61a0849a28672cb536fcf61ea2eb389d02ff7a09aa391744cae6597bd56"
                b"703c40c50ca2dee5f7ee796acfd47322f03d8dbe4d99dc8eec588b4e5467"
                b"f123075b2d74b2a0b0bbfd3ac5487a905fad6d6ac1421c2e564c0cf15e1f"
                b"0f10bc31c249b7b46edd2462a55f85560d99bde9d5b06b97817d1dbe0a67"
                b"c701d6e6e7878272"
            ),
            "d": int("2e09ffd8b434bb7f67d1d3ccf482164f1653c6e4ec64dec2517aa21b"
                     "7a93b2b21ea1eebb54734882f29303e489f02e3b741a87287e2dcdf3"
                     "858eb6d2ec668f8b5b26f442ce513a2", 16),
            "x": int("36f1be8738dd7dae4486b86a08fe90424f3673e76b10e739442e15f3"
                     "bfafaf841842ac98e490521b7e7bb94c127529f6ec6a42cc6f06fc80"
                     "606f1210fe020ff508148f93301c9d3", 16),
            "y": int("4d39666ebe99fe214336ad440d776c88eb916f2f4a3433548b87d2ae"
                     "bed840b424d15c8341b4a0a657bf6a234d4fe78631c8e07ac1f4dc74"
                     "74cd6b4545d536b7b17c160db4562d9", 16),
            "r": int("3d8105f87fe3166046c08e80a28acc98a80b8b7a729623053c2a9e80"
                     "afd06756edfe09bdcf3035f6829ede041b745955d219dc5d30ddd8b3"
                     "7f6ba0f6d2857504cdc68a1ed812a10", 16),
            "s": int("34db9998dc53527114518a7ce3783d674ca8cced823fa05e2942e7a0"
                     "a20b3cc583dcd930c43f9b93079c5ee18a1f5a66e7c3527c18610f9b"
                     "47a4da7e245ef803e0662e4d2ad721c", 16)
        }
    ]
    assert expected == load_fips_ecdsa_signing_vectors(vector_data)


def test_load_kasvs_dh_vectors():
    vector_data = textwrap.dedent("""
    [SHA(s) supported (Used for hashing Z): SHA256 ]
    #  Generated on Thu Mar 17 20:44:26 2011



    [FA - SHA1]
    P = da3a8085d372437805de95b88b675122f575df976610c6a844de99f1df82a06848bf7a\
42f18895c97402e81118e01a00d0855d51922f434c022350861d58ddf60d65bc6941fc6064b147\
071a4c30426d82fc90d888f94990267c64beef8c304a4b2b26fb93724d6a9472fa16bc50c5b9b8\
b59afb62cfe9ea3ba042c73a6ade35
    Q = f2ca7621eb250aa5f22cef1907011295defc50a7
    G = a51883e9ac0539859df3d25c716437008bb4bd8ec4786eb4bc643299daef5e3e5af586\
3a6ac40a597b83a27583f6a658d408825105b16d31b6ed088fc623f648fd6d95e9cefcb0745763\
cddf564c87bcf4ba7928e74fd6a3080481f588d535e4c026b58a21e1e5ec412ff241b436043e29\
173f1dc6cb943c09742de989547288



    COUNT = 0
    XstatCAVS = 42c6ee70beb7465928a1efe692d2281b8f7b53d6
    YstatCAVS = 5a7890f6d20ee9c7162cd84222cb0c7cb5b4f29244a58fc95327fc41045f47\
6fb3da42fca76a1dd59222a7a7c3872d5af7d8dc254e003eccdb38f291619c51911df2b6ed67d0\
b459f4bc25819c0078777b9a1a24c72e7c037a3720a1edad5863ef5ac75ce816869c820859558d\
5721089ddbe331f55bef741396a3bbf85c6c1a
    XstatIUT = 54081a8fef2127a1f22ed90440b1b09c331d0614
    YstatIUT = 0b92af0468b841ea5de4ca91d895b5e922245421de57ed7a88d2de41610b208\
e8e233705f17b2e9eb91914bad2fa87f0a58519a7da2980bc06e7411c925a6050526bd86e62150\
5e6f610b63fdcd9afcfaa96bd087afca44d9197cc35b559f731357a5b979250c0f3a254bb8165f\
5072156e3fd6f9a6e69bcf4b4578f78b3bde7
    Z = 8d8f4175e16e15a42eb9099b11528af88741cc206a088971d3064bb291eda608d1600b\
ff829624db258fd15e95d96d3e74c6be3232afe5c855b9c59681ce13b7aea9ff2b16707e4c02f0\
e82bf6dadf2149ac62630f6c62dea0e505e3279404da5ffd5a088e8474ae0c8726b8189cb3d2f0\
4baffe700be849df9f91567fc2ebb8
    CAVSHashZZ = eb99e77ac2272c7a2ee70c59375ac4d167312c20
    Result = P (0 - Correct)



    COUNT = 2
    XstatCAVS = 32e642683d745a23dccf4f12f989d8dfd1fd9894c422930950cb4c71
    YstatCAVS = 8cd371363b32fcc2e936e345f2278b77001f2efdf78512c3ee75c12f88507e\
2d5c0e5cdded3bb78435506c8028a3f4d6f028c0f49a0d61f1285795197e56deac80279e723f2b\
3746e213ac8ec60f1cefc2308ff17a7e9e2efab537e17406d2829fd85e0c54dda2d9f0b4fcda3d\
2776110e096a817588e19588b77be8b41bafdd41ad91b0edf629333bd6ac1e461208ead124c31b\
8a7935c723e1c450c5798dc05f8265ad9e35095ff112af9e889f00315fa337a76a450670866eca\
12cc6ad0778576962eb9cdc12721d3c15e4d87b67488a145d400240670eb26695a42879cd3940a\
55087f6527667277e1212a202dbe455c45c64b9be4a38153557bbb8fd755
    XstatIUT = 7d8ae93df3bc09d399a4157ec562126acf51092c3269ab27f60a3a2b
    YstatIUT = 22127e9728e906ea4b1512c8b1e80474b58446210c23ccfc800f83c2c15da81\
59940e494b235266f6a9d5f80529067794f1a9edd566755d23d0a3060fe074c5a10122df3e4729\
73bba39ea3a988e8387f5f0491e590b6b5edc299b4598ab1e79b72681a0be8cd8735a5adb85fa3\
1310f29ec407c9654f1bb83bcdf7f771b68d176817f662e8d798b53ebb4e5dd407b7b1d8fdb62e\
a9e1b60d6c3d75d9bcf83f4b8d1ed39408bd8d973b4ea81e8e832eac361dcd530713388a60971e\
a9f8b1e69c1e99df1cca12bdaf293dacfa1419c5692ceffa91988aef3321ac8cbc2efae6c4337c\
8808310fb5a240395a98e6004fe613c39e84f4177341746d9e388dcb2e8
    Z = 0efeaa399a182e0a603baf0dd95aa0fae5289ebd47d5f0f60c86bc936839c31c9f7f37\
bf04f76ab02f4094a8ab10ed907ec7291585cc085c3e8981df2bd46a01c19ec9a2f66709df1d4f\
efbeb48c8263554e46890f59eb642bf95ff7f0de70138621c22c4cc32be6c3d5c82c0c9a76a9f5\
a65bffe0c096a350f96a9da945d7e5095b15b566ce3cb8b0377cd9375b6c046afa9ea0bc084677\
3445f16566b2c84cae4f6d212e89ee539a1ce7ea325273fd228053efce2a585eb9e8f308b48cf4\
e29593b6f7a02e8625e1e8bff1ea1405f8c8c34b8339a9a99c7c9de4eb9895df7719ccda9394f5\
3080eff1226f6b9c7ae0a38941e18b1a137aabbb62308eb35ba2
    CAVSHashZZ = 76dedc997d5113573bbeeaf991f62b257511b7d9aa83270dfc4fec40
    Result = P (10 - Z value should have leading 0 nibble )



    COUNT = 3
    XstatCAVS = 66502429aba271e2f2ee2197a2b336e5f0467f192aa28b60dcbf1194
    YstatCAVS = dfb001294215423d7146a2453cdb8598ccef01e1d931a913c3e4ed4a3cf38a\
912066c28e4eaf77dd80ff07183a6160bd95932f513402f864dcf7a70cbedc9b60bbfbc67f72a8\
3d5f6463a2b5a4fc906d3e921f5e1069126113265b440e15ccf2d7164bad7131f1613fec35df7f\
470d45888e0c91be091f3f9552d670b8b7f479853193cb3c39f35fc7bd547ccb1bc579a67302b4\
ba948e6db51043d351bb74a952e6a694e6e7456f714c47d7c8eeeb4fd83ad93c86b78445f9393f\
dfd65c7dbd7fd6eba9794ddf183901b1d213321fd0ab3f7588ab0f6b3692f365a87131eda0e062\
505861988f6ce63150207545ecf9678e0971330253dfb7cfd546c5346fec
    XstatIUT = 106b358be4f068348ac240ecbb454e5c39ca80b078cb0fafd856e9c5
    YstatIUT = 715d0781975b7b03162f4401c1eda343fd9bf1140006034573b31828a618c35\
6163554cd27da956f7179a69e860fb6efeaa2e2aa9f1261506a8344c4929953621381b13d6426e\
152c0f2f94bfcd2b758eca24923596d427ed8f957e8bc9b1c7d21a87ef02222a1477cf3bfaadc6\
8106456ab9706026006eccd290b21543de6bb97d5b8cf4ccee1c081a6d1dd27aaef060fa93888a\
47a4a416ad5c5bd490ea600e04379232fb1077fbf394f4579accdbe352714e25b88916dca8d8f7\
e0c4ed9594f7693f656a235a2e88ebda48b0d557e32da9f12d2a4c3180f05b16b4fba9bec79278\
a3971b77f9223b5ab78b857e0376c5008211592c8c72d521373ee3b22b8
    Z = cf879ebd107bb877457809c3fc410218b7acba3c5967495a8f1c3370d57f038a48dd69\
f9f69b9f4dd855e7c58a1e4ec32646a978266eb314db468ea1dfcee8a85a1644a5732498c4fbcd\
f85098c6ed0ce12e431e99142fd2335369b3f56620ada21aa69d883e82a0b5e35484dde32d17c2\
dc873f2cc5518eb7fc19695dff9fc94c9d9432bb4b09d8180323cfc561ebc2d6eff8dd5f8496f2\
b22377700a22bbfe61a6969c198129397454843e4fc3540026986039665095490056287e4fc49e\
6cb3181cb2bf06444fd0040150271c9ce1f61c13ecd5dd022194a2dbf3e1c7fbc6bd19497c7b88\
8b4da613d28fa6f378a43369cb8795a1c823f7d6cf4d84bba578
    CAVSHashZZ = ebac4fb70699224f85d9e3c799b1f3a56dab268b882aba49525df02d
    Result = F (5 - Z changed )



    [FB - SHA224]
    P = f3722b9b911c6aede9eaeeaa406283de66a097f39a7225df6c3c916e57920d356e5047\
8d307dbfd146bfb91b6f68ecbbcf54b3d19c33a4b17293fea3e3d6bff8ac4cca93a805386f062a\
8a27ae906ef5da94d279fd7b3d7289e00956f76bae9c0d2b8d11742ca5809630632aae58f9c6dc\
e00c7380581deffde2187b022f83c6ceaeaadb0844a17fcbb04039ca6843c91f0c9058b22434b2\
63c3dfda8de8429e087c5be97fc5c9db9526031ad3a218bd9916fb4a3c27966d208b1e360014c0\
1e95530c148fb3cd27e6a7250d3c3b81dcd220ca14548dbccf99ebb9e334db6bcd14e632c98dd3\
f9860af7ae450f1b7809b45f0ec10e6f27672beebc9963befc73
    Q = a9a17de95a29091bf8e07dab53ea1aba9403be3c61027c6c8f48bac5
    G = 035513ec441402b78353ab1bba550b21c76c89973885a627170262ef52497d5d137b89\
27a212aaab2f051198c90bb81dffd9eb10b36b7ca3b63565b4c1025aea3b5e9c4a348c9cfa17f3\
907a1e4469701c0dedb8a4b9e96c5965b1fb8c229b0c34baac774bf9dda4fc5ee8764358b3c848\
12878aab7464bc09e97aecab7d7e3fbb4870e2a3b89667a4158bf1ed1a90dfaf47019fbb52b1b9\
6365bb4e1e9474993fe382fd23480dc875861be152997a621fdb7aef977ea5b4d3d74486b162dc\
28f95a64cf65587a919a57eef92934fc9410df7f09fa82f975328ed82ff29cc3e15a971f56f4ac\
2dcb289252575e02a6cdb7fcc6cddd7b0dca9c422e63eb2b8f05



    COUNT = 0
    XstatCAVS = 1610eaa4e0ccc8857e2b53149e008492b1fbd9025a6e8d95aaee9c0f
    YstatCAVS = 51ee21cd9f97015180f258fad5c94ff5a458806b1412087236bf77fe87aae1\
a36735816ed6e2160a731159814b6ae1f3f52c478dd9207094adfb62f7667d5c366327e66d2309\
6395e938504db330953a708015f861fe9d9487611093b9fe7327518a7cc15994ab573313e15411\
7c1a3ae88b8bdd1e316748249e4a9cbd1947f159836d13613d1f9449fc3442171d1970bc28958c\
1cafa2776a6f14ccdb29db02f64911bd83bfdcdfc843dd14a4cab9acb0bda8b293d2f5f7050768\
e57533cbc415a29e6f31cc365e107f91ae3722484e2c7329a85af69055a5a104da37e810878896\
d1b247b02b75234ecff82b1958f42d7b031622e9394c98b5229112f7f620
    XstatIUT = 0c4c83d75b27864b052cadc556e500e25aabf0c9d1bc01f0e1fe3862
    YstatIUT = 467a857337a82472a1307a64dccc8e9994c5c63ec4312936885d17be419051a\
5f037fbb052d7010ebe01634d9e8b8b522d9ab4749fdc274f465369b89e360df8f70b7865a3c71\
d2dbcd2df19e9293dab1153d3d63fcb7deb559b684dde6c6eed63214444807041c9a0ce3f52ca4\
39ec16dd231995b5dc6f18e6801b6bd6454babccf9abbfacffb49c71e6494a4779cbfa550c5d71\
44114e6fc193f460dcd0be7e6e06e546da7653770dc5859df87029e722dbe81361030569148d16\
36988926bf0dcfe47c9d8a54698c08b3b5c70afe86b5c6f643463f8f34889d27d6cfd2d478c2d7\
b3d008a985c7380f0b43f10024b59c3543880883c42d0e7e0a07326ba3a
    Z = 10a30bacab82e652415376baffdbc008c7eb2e5a3aa68bc10ce486ca84983fd89b1b02\
7bb40e75333406361005f5e756526a95fe01202df9217d81b1713d5187c368fdd4c9c2433d9e6c\
18844769479b725c4140c92a304ee1bc5726d8f5321b5b1c54a1a6b67c527e6817c0ed613a0d4e\
60db55de898788b7e8d4aa9a81ab5ed7f6282962c433d246ed640555bdd76d29c2874551264d74\
c76373f8a88871b41b041c98041b16f94f983ddf00f5bc7d2416d19168c90178974a0602436cd1\
86748bcc63a629edc3a0db59415cccd37a65130ea477c89da92d41371f5972891cf41f9c7f0e75\
ccbff9893225384db30daa5e310f08e3e0fad98bcdf8ecf35fe5
    CAVSHashZZ = 014f5daea733d0e9e100f852e74d64a319f741cfbdb47975ab9dd3d0
    Result = F (3 - IUT's Static public key fails PKV 5.6.2.4)


    COUNT = 1
    XstatCAVS = 9ee22ac51664e40e0a24dbb94142dba40605e2b6eeaaa0268a0f6847
    YstatCAVS = c2630c9d38ed5c825d1c6a3eba7143f3fc8a049c8bcd1efc212d2af64eca99\
4308208691d330aa8f27fc4a1e55de4e512113996d21375a667f8c26d76dee2f6809b15432a33f\
b735aca5c2263940f58712bded08f55443dee300b9489589e0462bd6bce19deaec4adc12fa61a6\
94c8c5c999b28211d7835bac0ffd2b316850823e2dc1d1f58e05cbf75c673036d116b3f03b9687\
c89f9c2a0d43c4ffc9a605addbdcce0cb3790c6db846156bb857a7b3df40dc6ed04d19cc9eaebb\
6bbc034e77c3d882a1a62317cce25b6130f0803e3bc49b5e36768260073a617034872be0b50bed\
32740224beaf582d67fbcfef3b3ecc18f9c71c782e9a68495ef31dc7986e
    XstatIUT = 438093a468236658821bf64eb08456139963d4fb27121c3ed6c55876
    YstatIUT = e192da8e1244e27221c1765344a5bb379dce741d427a734b4bdb6c4d16b2490\
bd37564d745008e63ae46ef332331d79887ac63298ce143e125f8b320c0f859b7f5f2c1e0053e4\
a7a16997e6143ff702300c9863ae7caef5c1dfca0ecf5197c557745b793f0790a4fe678aeb93fd\
b52490d4f273a5553944dda3ac8b9b792c9b67f8d7b9496398e432a423ae87ebeba688be3ed67e\
ddd7575fa56431cd48579bf53c903bbe066dd78b23c0996ef3a880f0d91315104366a82f01abde\
cce96fd371f94e8420f8bc5b896c801df573554f749b03d0d28b1e1a990bc61c7e9659342ac7e2\
68e9c0b7c40fdaab394f29cf0a54f780022f9a03b0bd28eb7db8b0b1b47
    Z = 56f8f40fa4b8f3580f9014b30d60a42933a53a62182a690142f458dc275c3b2f0e721b\
c5ee6e890b14516419110f5252ff1cceea8e274b2987aa78e3bae90c1935b276b7a1f1c944f79d\
4774b7a85b3355bdf25cb02bddfbda4ee7918bc93a5c9ca6d7e8fdedbda8e6c8a6ca794bad055a\
52b19c148958227344cbddd70271d4610316cfea1e559b0bc3a12d15023b30d9f2db602053a056\
9c3bd2ce1faf59280ecd339f845dbcaaf2e883c5cc6263996f866b18b75d049d4c82097af8a5ce\
353e14416b3eeb31ba9bc4f6f3dbd846c5299fb5c0043a1b95b9149b39d14df9e6a69547abf8a4\
d518475576730ed528779366568e46b7dd4ed787cb72d0733c93
    CAVSHashZZ = 17dbbaa7a20c1390cd8cb3d31ee947bf9dde87739e067b9861ffeea9
    Result = P (0 - Correct)
    """).splitlines()

    expected = [
        {
            'fail_agree': False,
            'fail_z': False,
            'g': int(
                "a51883e9ac0539859df3d25c716437008bb4bd8ec4786eb4bc643299daef5"
                "e3e5af5863a6ac40a597b83a27583f6a658d408825105b16d31b6ed088fc6"
                "23f648fd6d95e9cefcb0745763cddf564c87bcf4ba7928e74fd6a3080481f"
                "588d535e4c026b58a21e1e5ec412ff241b436043e29173f1dc6cb943c0974"
                "2de989547288", 16),
            'p': int(
                "da3a8085d372437805de95b88b675122f575df976610c6a844de99f1df82a"
                "06848bf7a42f18895c97402e81118e01a00d0855d51922f434c022350861d"
                "58ddf60d65bc6941fc6064b147071a4c30426d82fc90d888f94990267c64b"
                "eef8c304a4b2b26fb93724d6a9472fa16bc50c5b9b8b59afb62cfe9ea3ba0"
                "42c73a6ade35", 16),
            'q': 1386090807861091316803998193774751098153687863463,
            'x1': 381229709512864262422021151581620734547375903702,
            'x2': 479735944608461101114916716909067001453470352916,
            'y1': int(
                "5a7890f6d20ee9c7162cd84222cb0c7cb5b4f29244a58fc95327fc41045f4"
                "76fb3da42fca76a1dd59222a7a7c3872d5af7d8dc254e003eccdb38f29161"
                "9c51911df2b6ed67d0b459f4bc25819c0078777b9a1a24c72e7c037a3720a"
                "1edad5863ef5ac75ce816869c820859558d5721089ddbe331f55bef741396"
                "a3bbf85c6c1a", 16),
            'y2': int(
                "b92af0468b841ea5de4ca91d895b5e922245421de57ed7a88d2de41610b20"
                "8e8e233705f17b2e9eb91914bad2fa87f0a58519a7da2980bc06e7411c925"
                "a6050526bd86e621505e6f610b63fdcd9afcfaa96bd087afca44d9197cc35"
                "b559f731357a5b979250c0f3a254bb8165f5072156e3fd6f9a6e69bcf4b45"
                "78f78b3bde7", 16),
            'z': binascii.unhexlify(
                b"8d8f4175e16e15a42eb9099b11528af88741cc206a088971d3064bb291ed"
                b"a608d1600bff829624db258fd15e95d96d3e74c6be3232afe5c855b9c596"
                b"81ce13b7aea9ff2b16707e4c02f0e82bf6dadf2149ac62630f6c62dea0e5"
                b"05e3279404da5ffd5a088e8474ae0c8726b8189cb3d2f04baffe700be849"
                b"df9f91567fc2ebb8"
            )
        },
        {
            'fail_agree': False,
            'fail_z': False,
            'g': int(
                "a51883e9ac0539859df3d25c716437008bb4bd8ec4786eb4bc643299daef5"
                "e3e5af5863a6ac40a597b83a27583f6a658d408825105b16d31b6ed088fc6"
                "23f648fd6d95e9cefcb0745763cddf564c87bcf4ba7928e74fd6a3080481f"
                "588d535e4c026b58a21e1e5ec412ff241b436043e29173f1dc6cb943c0974"
                "2de989547288", 16),
            'p': int(
                "da3a8085d372437805de95b88b675122f575df976610c6a844de99f1df82a"
                "06848bf7a42f18895c97402e81118e01a00d0855d51922f434c022350861d"
                "58ddf60d65bc6941fc6064b147071a4c30426d82fc90d888f94990267c64b"
                "eef8c304a4b2b26fb93724d6a9472fa16bc50c5b9b8b59afb62cfe9ea3ba0"
                "42c73a6ade35", 16),
            'q': 1386090807861091316803998193774751098153687863463,
            'x1': int(
                "32e642683d745a23dccf4f12f989d8dfd1fd9894c422930950cb4c71",
                16),
            'x2': int(
                "7d8ae93df3bc09d399a4157ec562126acf51092c3269ab27f60a3a2b",
                16),
            'y1': int(
                "8cd371363b32fcc2e936e345f2278b77001f2efdf78512c3ee75c12f88507"
                "e2d5c0e5cdded3bb78435506c8028a3f4d6f028c0f49a0d61f1285795197e"
                "56deac80279e723f2b3746e213ac8ec60f1cefc2308ff17a7e9e2efab537e"
                "17406d2829fd85e0c54dda2d9f0b4fcda3d2776110e096a817588e19588b7"
                "7be8b41bafdd41ad91b0edf629333bd6ac1e461208ead124c31b8a7935c72"
                "3e1c450c5798dc05f8265ad9e35095ff112af9e889f00315fa337a76a4506"
                "70866eca12cc6ad0778576962eb9cdc12721d3c15e4d87b67488a145d4002"
                "40670eb26695a42879cd3940a55087f6527667277e1212a202dbe455c45c6"
                "4b9be4a38153557bbb8fd755", 16),
            'y2': int(
                "22127e9728e906ea4b1512c8b1e80474b58446210c23ccfc800f83c2c15da"
                "8159940e494b235266f6a9d5f80529067794f1a9edd566755d23d0a3060fe"
                "074c5a10122df3e472973bba39ea3a988e8387f5f0491e590b6b5edc299b4"
                "598ab1e79b72681a0be8cd8735a5adb85fa31310f29ec407c9654f1bb83bc"
                "df7f771b68d176817f662e8d798b53ebb4e5dd407b7b1d8fdb62ea9e1b60d"
                "6c3d75d9bcf83f4b8d1ed39408bd8d973b4ea81e8e832eac361dcd5307133"
                "88a60971ea9f8b1e69c1e99df1cca12bdaf293dacfa1419c5692ceffa9198"
                "8aef3321ac8cbc2efae6c4337c8808310fb5a240395a98e6004fe613c39e8"
                "4f4177341746d9e388dcb2e8", 16),
            'z': binascii.unhexlify(
                b"0efeaa399a182e0a603baf0dd95aa0fae5289ebd47d5f0f60c86bc936839"
                b"c31c9f7f37bf04f76ab02f4094a8ab10ed907ec7291585cc085c3e8981df"
                b"2bd46a01c19ec9a2f66709df1d4fefbeb48c8263554e46890f59eb642bf9"
                b"5ff7f0de70138621c22c4cc32be6c3d5c82c0c9a76a9f5a65bffe0c096a3"
                b"50f96a9da945d7e5095b15b566ce3cb8b0377cd9375b6c046afa9ea0bc08"
                b"46773445f16566b2c84cae4f6d212e89ee539a1ce7ea325273fd228053ef"
                b"ce2a585eb9e8f308b48cf4e29593b6f7a02e8625e1e8bff1ea1405f8c8c3"
                b"4b8339a9a99c7c9de4eb9895df7719ccda9394f53080eff1226f6b9c7ae0"
                b"a38941e18b1a137aabbb62308eb35ba2"
            )
        },
        {
            'fail_agree': False,
            'fail_z': True,
            'g': int(
                "a51883e9ac0539859df3d25c716437008bb4bd8ec4786eb4bc643299daef5"
                "e3e5af5863a6ac40a597b83a27583f6a658d408825105b16d31b6ed088fc6"
                "23f648fd6d95e9cefcb0745763cddf564c87bcf4ba7928e74fd6a3080481f"
                "588d535e4c026b58a21e1e5ec412ff241b436043e29173f1dc6cb943c0974"
                "2de989547288", 16),
            'p': int(
                "da3a8085d372437805de95b88b675122f575df976610c6a844de99f1df82a"
                "06848bf7a42f18895c97402e81118e01a00d0855d51922f434c022350861d"
                "58ddf60d65bc6941fc6064b147071a4c30426d82fc90d888f94990267c64b"
                "eef8c304a4b2b26fb93724d6a9472fa16bc50c5b9b8b59afb62cfe9ea3ba0"
                "42c73a6ade35", 16),
            'q': 1386090807861091316803998193774751098153687863463,
            'x1': int(
                "66502429aba271e2f2ee2197a2b336e5f0467f192aa28b60dcbf1194",
                16),
            'x2': int(
                "106b358be4f068348ac240ecbb454e5c39ca80b078cb0fafd856e9c5",
                16),
            'y1': int(
                "dfb001294215423d7146a2453cdb8598ccef01e1d931a913c3e4ed4a3cf38"
                "a912066c28e4eaf77dd80ff07183a6160bd95932f513402f864dcf7a70cbe"
                "dc9b60bbfbc67f72a83d5f6463a2b5a4fc906d3e921f5e1069126113265b4"
                "40e15ccf2d7164bad7131f1613fec35df7f470d45888e0c91be091f3f9552"
                "d670b8b7f479853193cb3c39f35fc7bd547ccb1bc579a67302b4ba948e6db"
                "51043d351bb74a952e6a694e6e7456f714c47d7c8eeeb4fd83ad93c86b784"
                "45f9393fdfd65c7dbd7fd6eba9794ddf183901b1d213321fd0ab3f7588ab0"
                "f6b3692f365a87131eda0e062505861988f6ce63150207545ecf9678e0971"
                "330253dfb7cfd546c5346fec", 16),
            'y2': int(
                "715d0781975b7b03162f4401c1eda343fd9bf1140006034573b31828a618c"
                "356163554cd27da956f7179a69e860fb6efeaa2e2aa9f1261506a8344c492"
                "9953621381b13d6426e152c0f2f94bfcd2b758eca24923596d427ed8f957e"
                "8bc9b1c7d21a87ef02222a1477cf3bfaadc68106456ab9706026006eccd29"
                "0b21543de6bb97d5b8cf4ccee1c081a6d1dd27aaef060fa93888a47a4a416"
                "ad5c5bd490ea600e04379232fb1077fbf394f4579accdbe352714e25b8891"
                "6dca8d8f7e0c4ed9594f7693f656a235a2e88ebda48b0d557e32da9f12d2a"
                "4c3180f05b16b4fba9bec79278a3971b77f9223b5ab78b857e0376c500821"
                "1592c8c72d521373ee3b22b8", 16),
            'z': binascii.unhexlify(
                b"cf879ebd107bb877457809c3fc410218b7acba3c5967495a8f1c3370d57f"
                b"038a48dd69f9f69b9f4dd855e7c58a1e4ec32646a978266eb314db468ea1"
                b"dfcee8a85a1644a5732498c4fbcdf85098c6ed0ce12e431e99142fd23353"
                b"69b3f56620ada21aa69d883e82a0b5e35484dde32d17c2dc873f2cc5518e"
                b"b7fc19695dff9fc94c9d9432bb4b09d8180323cfc561ebc2d6eff8dd5f84"
                b"96f2b22377700a22bbfe61a6969c198129397454843e4fc3540026986039"
                b"665095490056287e4fc49e6cb3181cb2bf06444fd0040150271c9ce1f61c"
                b"13ecd5dd022194a2dbf3e1c7fbc6bd19497c7b888b4da613d28fa6f378a4"
                b"3369cb8795a1c823f7d6cf4d84bba578"
            )
        },
        {
            'fail_agree': True,
            'fail_z': False,
            'g': int(
                "35513ec441402b78353ab1bba550b21c76c89973885a627170262ef52497d"
                "5d137b8927a212aaab2f051198c90bb81dffd9eb10b36b7ca3b63565b4c10"
                "25aea3b5e9c4a348c9cfa17f3907a1e4469701c0dedb8a4b9e96c5965b1fb"
                "8c229b0c34baac774bf9dda4fc5ee8764358b3c84812878aab7464bc09e97"
                "aecab7d7e3fbb4870e2a3b89667a4158bf1ed1a90dfaf47019fbb52b1b963"
                "65bb4e1e9474993fe382fd23480dc875861be152997a621fdb7aef977ea5b"
                "4d3d74486b162dc28f95a64cf65587a919a57eef92934fc9410df7f09fa82"
                "f975328ed82ff29cc3e15a971f56f4ac2dcb289252575e02a6cdb7fcc6cdd"
                "d7b0dca9c422e63eb2b8f05", 16),
            'p': int(
                "f3722b9b911c6aede9eaeeaa406283de66a097f39a7225df6c3c916e57920"
                "d356e50478d307dbfd146bfb91b6f68ecbbcf54b3d19c33a4b17293fea3e3"
                "d6bff8ac4cca93a805386f062a8a27ae906ef5da94d279fd7b3d7289e0095"
                "6f76bae9c0d2b8d11742ca5809630632aae58f9c6dce00c7380581deffde2"
                "187b022f83c6ceaeaadb0844a17fcbb04039ca6843c91f0c9058b22434b26"
                "3c3dfda8de8429e087c5be97fc5c9db9526031ad3a218bd9916fb4a3c2796"
                "6d208b1e360014c01e95530c148fb3cd27e6a7250d3c3b81dcd220ca14548"
                "dbccf99ebb9e334db6bcd14e632c98dd3f9860af7ae450f1b7809b45f0ec1"
                "0e6f27672beebc9963befc73", 16),
            'q': int(
                "a9a17de95a29091bf8e07dab53ea1aba9403be3c61027c6c8f48bac5",
                16),
            'x1': int(
                "1610eaa4e0ccc8857e2b53149e008492b1fbd9025a6e8d95aaee9c0f",
                16),
            'x2': int(
                "c4c83d75b27864b052cadc556e500e25aabf0c9d1bc01f0e1fe3862",
                16),
            'y1': int(
                "51ee21cd9f97015180f258fad5c94ff5a458806b1412087236bf77fe87aae"
                "1a36735816ed6e2160a731159814b6ae1f3f52c478dd9207094adfb62f766"
                "7d5c366327e66d23096395e938504db330953a708015f861fe9d948761109"
                "3b9fe7327518a7cc15994ab573313e154117c1a3ae88b8bdd1e316748249e"
                "4a9cbd1947f159836d13613d1f9449fc3442171d1970bc28958c1cafa2776"
                "a6f14ccdb29db02f64911bd83bfdcdfc843dd14a4cab9acb0bda8b293d2f5"
                "f7050768e57533cbc415a29e6f31cc365e107f91ae3722484e2c7329a85af"
                "69055a5a104da37e810878896d1b247b02b75234ecff82b1958f42d7b0316"
                "22e9394c98b5229112f7f620", 16),
            'y2': int(
                "467a857337a82472a1307a64dccc8e9994c5c63ec4312936885d17be41905"
                "1a5f037fbb052d7010ebe01634d9e8b8b522d9ab4749fdc274f465369b89e"
                "360df8f70b7865a3c71d2dbcd2df19e9293dab1153d3d63fcb7deb559b684"
                "dde6c6eed63214444807041c9a0ce3f52ca439ec16dd231995b5dc6f18e68"
                "01b6bd6454babccf9abbfacffb49c71e6494a4779cbfa550c5d7144114e6f"
                "c193f460dcd0be7e6e06e546da7653770dc5859df87029e722dbe81361030"
                "569148d1636988926bf0dcfe47c9d8a54698c08b3b5c70afe86b5c6f64346"
                "3f8f34889d27d6cfd2d478c2d7b3d008a985c7380f0b43f10024b59c35438"
                "80883c42d0e7e0a07326ba3a", 16),
            'z': binascii.unhexlify(
                b"10a30bacab82e652415376baffdbc008c7eb2e5a3aa68bc10ce486ca8498"
                b"3fd89b1b027bb40e75333406361005f5e756526a95fe01202df9217d81b1"
                b"713d5187c368fdd4c9c2433d9e6c18844769479b725c4140c92a304ee1bc"
                b"5726d8f5321b5b1c54a1a6b67c527e6817c0ed613a0d4e60db55de898788"
                b"b7e8d4aa9a81ab5ed7f6282962c433d246ed640555bdd76d29c287455126"
                b"4d74c76373f8a88871b41b041c98041b16f94f983ddf00f5bc7d2416d191"
                b"68c90178974a0602436cd186748bcc63a629edc3a0db59415cccd37a6513"
                b"0ea477c89da92d41371f5972891cf41f9c7f0e75ccbff9893225384db30d"
                b"aa5e310f08e3e0fad98bcdf8ecf35fe5"
            )
        },
        {
            'fail_agree': False,
            'fail_z': False,
            'g': int("35513ec441402b78353ab1bba550b21c76c89973885a627170262ef5"
                     "2497d5d137b8927a212aaab2f051198c90bb81dffd9eb10b36b7ca3b"
                     "63565b4c1025aea3b5e9c4a348c9cfa17f3907a1e4469701c0dedb8a"
                     "4b9e96c5965b1fb8c229b0c34baac774bf9dda4fc5ee8764358b3c84"
                     "812878aab7464bc09e97aecab7d7e3fbb4870e2a3b89667a4158bf1e"
                     "d1a90dfaf47019fbb52b1b96365bb4e1e9474993fe382fd23480dc87"
                     "5861be152997a621fdb7aef977ea5b4d3d74486b162dc28f95a64cf6"
                     "5587a919a57eef92934fc9410df7f09fa82f975328ed82ff29cc3e15"
                     "a971f56f4ac2dcb289252575e02a6cdb7fcc6cddd7b0dca9c422e63e"
                     "b2b8f05", 16),
            'p': int("f3722b9b911c6aede9eaeeaa406283de66a097f39a7225df6c3c916e"
                     "57920d356e50478d307dbfd146bfb91b6f68ecbbcf54b3d19c33a4b1"
                     "7293fea3e3d6bff8ac4cca93a805386f062a8a27ae906ef5da94d279"
                     "fd7b3d7289e00956f76bae9c0d2b8d11742ca5809630632aae58f9c6"
                     "dce00c7380581deffde2187b022f83c6ceaeaadb0844a17fcbb04039"
                     "ca6843c91f0c9058b22434b263c3dfda8de8429e087c5be97fc5c9db"
                     "9526031ad3a218bd9916fb4a3c27966d208b1e360014c01e95530c14"
                     "8fb3cd27e6a7250d3c3b81dcd220ca14548dbccf99ebb9e334db6bcd"
                     "14e632c98dd3f9860af7ae450f1b7809b45f0ec10e6f27672beebc99"
                     "63befc73", 16),
            'q': int(
                "a9a17de95a29091bf8e07dab53ea1aba9403be3c61027c6c8f48bac5",
                16),
            'x1': int(
                "9ee22ac51664e40e0a24dbb94142dba40605e2b6eeaaa0268a0f6847",
                16),
            'x2': int(
                "438093a468236658821bf64eb08456139963d4fb27121c3ed6c55876",
                16),
            'y1': int(
                "c2630c9d38ed5c825d1c6a3eba7143f3fc8a049c8bcd1efc212d2af64eca9"
                "94308208691d330aa8f27fc4a1e55de4e512113996d21375a667f8c26d76d"
                "ee2f6809b15432a33fb735aca5c2263940f58712bded08f55443dee300b94"
                "89589e0462bd6bce19deaec4adc12fa61a694c8c5c999b28211d7835bac0f"
                "fd2b316850823e2dc1d1f58e05cbf75c673036d116b3f03b9687c89f9c2a0"
                "d43c4ffc9a605addbdcce0cb3790c6db846156bb857a7b3df40dc6ed04d19"
                "cc9eaebb6bbc034e77c3d882a1a62317cce25b6130f0803e3bc49b5e36768"
                "260073a617034872be0b50bed32740224beaf582d67fbcfef3b3ecc18f9c7"
                "1c782e9a68495ef31dc7986e", 16),
            'y2': int(
                "e192da8e1244e27221c1765344a5bb379dce741d427a734b4bdb6c4d16b24"
                "90bd37564d745008e63ae46ef332331d79887ac63298ce143e125f8b320c0"
                "f859b7f5f2c1e0053e4a7a16997e6143ff702300c9863ae7caef5c1dfca0e"
                "cf5197c557745b793f0790a4fe678aeb93fdb52490d4f273a5553944dda3a"
                "c8b9b792c9b67f8d7b9496398e432a423ae87ebeba688be3ed67eddd7575f"
                "a56431cd48579bf53c903bbe066dd78b23c0996ef3a880f0d91315104366a"
                "82f01abdecce96fd371f94e8420f8bc5b896c801df573554f749b03d0d28b"
                "1e1a990bc61c7e9659342ac7e268e9c0b7c40fdaab394f29cf0a54f780022"
                "f9a03b0bd28eb7db8b0b1b47", 16),
            'z': binascii.unhexlify(
                b"56f8f40fa4b8f3580f9014b30d60a42933a53a62182a690142f458dc275c"
                b"3b2f0e721bc5ee6e890b14516419110f5252ff1cceea8e274b2987aa78e3"
                b"bae90c1935b276b7a1f1c944f79d4774b7a85b3355bdf25cb02bddfbda4e"
                b"e7918bc93a5c9ca6d7e8fdedbda8e6c8a6ca794bad055a52b19c14895822"
                b"7344cbddd70271d4610316cfea1e559b0bc3a12d15023b30d9f2db602053"
                b"a0569c3bd2ce1faf59280ecd339f845dbcaaf2e883c5cc6263996f866b18"
                b"b75d049d4c82097af8a5ce353e14416b3eeb31ba9bc4f6f3dbd846c5299f"
                b"b5c0043a1b95b9149b39d14df9e6a69547abf8a4d518475576730ed52877"
                b"9366568e46b7dd4ed787cb72d0733c93"
            )
        }
    ]

    assert expected == load_kasvs_dh_vectors(vector_data)


def test_load_kasvs_ecdh_vectors_empty_vector_data():
    assert [] == load_kasvs_ecdh_vectors([])


def test_load_kasvs_ecdh_vectors():
    vector_data = textwrap.dedent("""
    #  CAVS 11.0
    #  Parameter set(s) supported: EA EB EC ED EE
    #  CAVSid: CAVSid (in hex: 434156536964)
    #  IUTid: In hex: a1b2c3d4e5
    [EA]

    [Curve selected:  P-192]
    [SHA(s) supported (Used for hashing Z):  SHA1]
    [EB]

    [Curve selected:  P-224]
    [SHA(s) supported (Used for hashing Z):  SHA224]
    [EC]

    [Curve selected:  P-256]
    [SHA(s) supported (Used for hashing Z):  SHA256]
    [ED]

    [Curve selected:  P-384]
    [SHA(s) supported (Used for hashing Z):  SHA384]
    [EE]

    [Curve selected:  P-521]
    [SHA(s) supported (Used for hashing Z):  SHA512]
    #  Generated on Thu Mar 17 19:46:10 2011



    [EA - SHA1]


    COUNT = 0
    dsCAVS = f70c297a683d6b7ef82b5af7349606c4447c8b4fc6fa5e80
    QsCAVSx = f7b5061fb557e516c50abf541d97dbfd76ca7172b22cf590
    QsCAVSy = 135e15e21f9e85c76205fd148a92ac19f9e6243ddab322d1
    dsIUT = a5b4bbad57f101ca48021cb7440cd681a9d40cd51b99d917
    QsIUTx = 79a77fcb18a32cdb59ed5d87740f29e8565d649dbf01ce86
    QsIUTy = f7187efaa0b1573f1fb00905d46810b880bf738b4c720bb7
    Z = 26382468d721761e14a87dc3bee67340095c6455962d1ba3
    CAVSHashZZ = af52ba700d3bbba7ce2916d6b729422c26c32364
    Result = P (0 - Correct)



    COUNT = 2
    dsCAVS = 5f909dcb0ccce58c82fada748c47297579e6a981b5518a96
    QsCAVSx = 537f1ecfda0e366de393a9bc8188fcc280311bffefe21ecf
    QsCAVSy = a1fa1f98498d65f2754caff4e5303a4066a5ff89fde95381
    dsIUT = 3357aa7f47f3e09421602cc12cdce4434c68e330d44de05e
    QsIUTx = 6a33d43d9c72173eabc7a771a5687748c4774c62762e96ec
    QsIUTy = 8033f238b3abc69470aad4be8dbe4f60a2fd50207626c56a
    Z = 3153034f6617326f19c35be8c99a0585431adf09d2f8e0fd
    CAVSHashZZ = f8414e30c2d382e28d2a57a2447fdc203baa416b
    Result = F (8 - Z changed )



    COUNT = 8
    dsCAVS = 8fcfaf0524cc868fad20e50410a2205319f1327308d98dc8
    QsCAVSx = 9b0243d80a9e328738080fb4d46bc450243d0efb7ead0c92
    QsCAVSy = ad5bebad7f03849693071537f60ef858cad214123beee7c7
    dsIUT = bba95dac90289cb68ca2b006f9757219b70579c299ad7a7d
    QsIUTx = 7733dc0cb365cd6312724196b9b4eb491fd4d2e31b9afdb1
    QsIUTy = 92ffa3722acc5b94d772258ba2d471b06c0f53f56fcd8662
    Z = 0f3c6e4a29a08296ae730f56a1ebf819ea2edfa6f0434e40
    CAVSHashZZ = c124545eed4b83a799e7e90371d806b5684a1bd2
    Result = P (13 - Z value should have leading 0 nibble )


    [EB - SHA224]


    COUNT = 0
    dsCAVS = e53a88af7cf8ce6bf13c8b9ad191494e37a6acc1368c71f4306e39e5
    QsCAVSx = 3a24217c4b957fea922eec9d9ac52d5cb4b3fcd95efde1e4fa0dd6e2
    QsCAVSy = 775b94025a808eb6f4af14ea4b57dca576c35373c6dc198b15b981df
    dsIUT = 09f51e302c6a0fe6ff48f34c208c6af91e70f65f88102e6fcab9af4a
    QsIUTx = c5d5706ccd7424c74fd616e699865af96e56f39adea6aa059e5092b5
    QsIUTy = f0729077bb602404d56d2f7e2ba5bb2f383df4a5425567881ff0165d
    Z = b1259ceedfb663d9515089cf727e7024fb3d86cbcec611b4ba0b4ab6
    CAVSHashZZ = 8b21fd05a4b50e401908cd8f26757f5c57f22b69f170aa7381f8596d
    Result = P (0 - Correct)



    [EC - SHA256]


    COUNT = 0
    dsCAVS = 305dfb4a8850cc59280891147baf457bfe5e2bae984571634a77dc8d3472fa9b
    QsCAVSx = 202cb5a224e6c2a84e624094486edf04116c8d68ec1f4a0e0ed9ee090e1a900b
    QsCAVSy = cacf3a5789bb33954be600425d62d9eae5371f90f88167258814213e4a4f4b1a
    dsIUT = 72cc52808f294b64b6f7233c3d2f5d96cc1d29287320e39e1c151deef0bc14eb
    QsIUTx = 49a768c9a4ca56e374f685dd76a461b1016c59dcded2c8d8cbd9f23ca453831f
    QsIUTy = b1e3bb9b5f12a3b5ae788535d4554bd8c46e0e6130075e4e437d3854cf8f1c34
    Z = c0147c3c2691b450b5edc08b51aea224d9f4359ff67aab6da3146f396dbceaea
    CAVSHashZZ = ea9ffd54511979ab8c4b387784972cbd05fc5fd4ff78e048b0026557b56a5\
1dd
    Result = F (2 - CAVS's Static public key Y fails PKV 5.6.2.5)



    [ED - SHA384]


    COUNT = 0
    dsCAVS = 0e5c98ff2d2a3aab14ad0067b60dbe64e4f541ab5bed11c5a0c55ae1e60b51ff5\
faaf377837977d80cbfdc33c2ff542b
    QsCAVSx = d1bf2ac21637d66d6398aac01dcd56ac6f065fb45d1f6f16747bab9e9b01b463\
0b59b20927aea147355bf41838acb482
    QsCAVSy = 4c9e23f1c5a41647d094086bf4ed31708651f21d996c47780688ac10f77deee2\
e43b5241b6caecd2fd5444bc50472e0e
    dsIUT = f865418473e5bf7d2e1bbcd9bd5a9270c003a9dd35e778133ca59fcab4bb64fe24\
d6800e7047bdd033abc8bfa8db35b5
    QsIUTx = 32b72ab9b558249dcbc6cbade234f58e4f7aa5d3f6420ea99a5f997e8c2a91fb7\
fd83779d0d2169428683771c745fd1a
    QsIUTy = c749e02a3719bb56bf1dfc4ba3820309c01ab6e84cb29db7cdd80f127233f5295\
687f8178f3a8704c1063b84c2ee472f
    Z = a781430e6078a179df3f9ee27cd8fdc6188f161b6c4ccc4053ef6c6ca6fc222946883a\
53c06db08f0a020023ced055aa
    CAVSHashZZ = ccb70d0adbabe4d8956519db0d536605cbb366aed58fc55718f56ae3648fa\
5c9ee7bae56cc463587cb74e2f9c6ace1cb
    Result = P (0 - Correct)



    [EE - SHA512]


    COUNT = 0
    dsCAVS = 0000002fef62381162942889a6094a6bb9ac1f4ddf66d9cda9f618232d31b90c5\
0d7da78a47ed91d40cae946898571db972dc294b109815f38feee9eaac0d5f7c3250728
    QsCAVSx = 0000004b05ffa025113390797f2736174aa1c784f4dd34e764ee40d40e4d2442\
677ebea3498086c9473e5c92789cbdb02bb327bbd61d58690f6a83d9ca73bccbde37dec4
    QsCAVSy = 0000004da67cffc98070b82af61feba78787efefb13bd810d80ff92304788e49\
a4e5b634b3565474a8ecb1615d7b1b77a7a27875adb73a8a5d8f3f84e5e8b744cda250b0
    dsIUT = 00000311a5e520e238141527671a38cb6f776d96a9f82ef70dffa11dc0895f4060\
f1abbb9ad6fd259e4a7beaf5f7266ea1bb45bcbfebfda2705e5c551e710fb1d745f57e
    QsIUTx = 0000010ba3778cb2cc965834c0a9593adc6a222692656d657fb0d15293edf0ab3\
3762384a96a16fddea7540b7ccbcca46ec4ac9bcf95fdb5aa18e158aab4d91981bd733e
    QsIUTy = 0000018522df93ddd636e5bc94daecdc600fa241686ec18634fd30b7cbdfdc9ff\
ba1166ac08df34a31896f6fad191414929261ebd7187afb72919f8a0c926be37f99c1e5
    Z = 01a5e4b31be4b1346e53906b6767b1fe94ec1a8a5abc28fb6f01518c056959af3bc933\
5dddab178b52318cc5512559931b8dc18de0ce810c2c7f15769d7ce70e719c
    CAVSHashZZ = d2d6538feb65d609f377b81a027dc800eed07b69c0e9eedb243369202ed47\
f47021022a6c9b45ed791d09d9540eb81ea065fc1959eca365001ee39928c343d75
    Result = F (7 - IUT's Static private key d changed-prikey validity)



    """).splitlines()

    expected = [
        {'errno': 0,
         'fail': False,
         'COUNT': 0,
         'CAVS': {
             'd': int("f70c297a683d6b7ef82b5af7349606c4447c8b4fc6fa5e80", 16),
             'x': int("f7b5061fb557e516c50abf541d97dbfd76ca7172b22cf590", 16),
             'y': int("135e15e21f9e85c76205fd148a92ac19f9e6243ddab322d1", 16)},
         'IUT': {
             'd': int("a5b4bbad57f101ca48021cb7440cd681a9d40cd51b99d917", 16),
             'x': int("79a77fcb18a32cdb59ed5d87740f29e8565d649dbf01ce86", 16),
             'y': int("f7187efaa0b1573f1fb00905d46810b880bf738b4c720bb7", 16)},
         'Z': int("26382468d721761e14a87dc3bee67340095c6455962d1ba3", 16),
         'curve': 'secp192r1'},

        {'errno': 8,
         'fail': True,
         'COUNT': 2,
         'CAVS': {
             'd': int("5f909dcb0ccce58c82fada748c47297579e6a981b5518a96", 16),
             'x': int("537f1ecfda0e366de393a9bc8188fcc280311bffefe21ecf", 16),
             'y': int("a1fa1f98498d65f2754caff4e5303a4066a5ff89fde95381", 16)},
         'IUT': {
             'd': int("3357aa7f47f3e09421602cc12cdce4434c68e330d44de05e", 16),
             'x': int("6a33d43d9c72173eabc7a771a5687748c4774c62762e96ec", 16),
             'y': int("8033f238b3abc69470aad4be8dbe4f60a2fd50207626c56a", 16)},
         'Z': int("3153034f6617326f19c35be8c99a0585431adf09d2f8e0fd", 16),
         'curve': 'secp192r1'},

        {'errno': 13,
         'fail': False,
         'COUNT': 8,
         'CAVS': {
             'd': int("8fcfaf0524cc868fad20e50410a2205319f1327308d98dc8", 16),
             'x': int("9b0243d80a9e328738080fb4d46bc450243d0efb7ead0c92", 16),
             'y': int("ad5bebad7f03849693071537f60ef858cad214123beee7c7", 16)},
         'IUT': {
             'd': int("bba95dac90289cb68ca2b006f9757219b70579c299ad7a7d", 16),
             'x': int("7733dc0cb365cd6312724196b9b4eb491fd4d2e31b9afdb1", 16),
             'y': int("92ffa3722acc5b94d772258ba2d471b06c0f53f56fcd8662", 16)},
         'Z': int("0f3c6e4a29a08296ae730f56a1ebf819ea2edfa6f0434e40", 16),
         'curve': 'secp192r1'},

        {'errno': 0,
         'fail': False,
         'COUNT': 0,
         'CAVS': {
             'd': int("e53a88af7cf8ce6bf13c8b9ad191494e37a6acc1368c71f4"
                      "306e39e5", 16),
             'x': int("3a24217c4b957fea922eec9d9ac52d5cb4b3fcd95efde1e4"
                      "fa0dd6e2", 16),
             'y': int("775b94025a808eb6f4af14ea4b57dca576c35373c6dc198b"
                      "15b981df", 16)},
         'IUT': {
             'd': int("09f51e302c6a0fe6ff48f34c208c6af91e70f65f88102e6f"
                      "cab9af4a", 16),
             'x': int("c5d5706ccd7424c74fd616e699865af96e56f39adea6aa05"
                      "9e5092b5", 16),
             'y': int("f0729077bb602404d56d2f7e2ba5bb2f383df4a542556788"
                      "1ff0165d", 16)},
         'Z': int("b1259ceedfb663d9515089cf727e7024fb3d86cbcec611b4"
                  "ba0b4ab6", 16),
         'curve': 'secp224r1'},

        {'errno': 2,
         'fail': True,
         'COUNT': 0,
         'CAVS': {
             'd': int("305dfb4a8850cc59280891147baf457bfe5e2bae98457163"
                      "4a77dc8d3472fa9b", 16),
             'x': int("202cb5a224e6c2a84e624094486edf04116c8d68ec1f4a0e"
                      "0ed9ee090e1a900b", 16),
             'y': int("cacf3a5789bb33954be600425d62d9eae5371f90f8816725"
                      "8814213e4a4f4b1a", 16)},
         'IUT': {
             'd': int("72cc52808f294b64b6f7233c3d2f5d96cc1d29287320e39e"
                      "1c151deef0bc14eb", 16),
             'x': int("49a768c9a4ca56e374f685dd76a461b1016c59dcded2c8d8"
                      "cbd9f23ca453831f", 16),
             'y': int("b1e3bb9b5f12a3b5ae788535d4554bd8c46e0e6130075e4e"
                      "437d3854cf8f1c34", 16)},
         'Z': int("c0147c3c2691b450b5edc08b51aea224d9f4359ff67aab6d"
                  "a3146f396dbceaea", 16),
         'curve': 'secp256r1'},

        {'errno': 0,
         'fail': False,
         'COUNT': 0,
         'CAVS': {
             'd': int("0e5c98ff2d2a3aab14ad0067b60dbe64e4f541ab5bed11c5"
                      "a0c55ae1e60b51ff5faaf377837977d80cbfdc33c2ff542b", 16),
             'x': int("d1bf2ac21637d66d6398aac01dcd56ac6f065fb45d1f6f16"
                      "747bab9e9b01b4630b59b20927aea147355bf41838acb482", 16),
             'y': int("4c9e23f1c5a41647d094086bf4ed31708651f21d996c4778"
                      "0688ac10f77deee2e43b5241b6caecd2fd5444bc50472e0e", 16)},
         'IUT': {
             'd': int("f865418473e5bf7d2e1bbcd9bd5a9270c003a9dd35e77813"
                      "3ca59fcab4bb64fe24d6800e7047bdd033abc8bfa8db35b5", 16),
             'x': int("32b72ab9b558249dcbc6cbade234f58e4f7aa5d3f6420ea9"
                      "9a5f997e8c2a91fb7fd83779d0d2169428683771c745fd1a", 16),
             'y': int("c749e02a3719bb56bf1dfc4ba3820309c01ab6e84cb29db7"
                      "cdd80f127233f5295687f8178f3a8704c1063b84c2ee472f", 16)},
         'Z': int("a781430e6078a179df3f9ee27cd8fdc6188f161b6c4ccc40"
                  "53ef6c6ca6fc222946883a53c06db08f0a020023ced055aa", 16),
         'curve': 'secp384r1'},

        {'errno': 7,
         'fail': True,
         'COUNT': 0,
         'CAVS': {
             'd': int("0000002fef62381162942889a6094a6bb9ac1f4ddf66d9cd"
                      "a9f618232d31b90c50d7da78a47ed91d40cae946898571db"
                      "972dc294b109815f38feee9eaac0d5f7c3250728", 16),
             'x': int("0000004b05ffa025113390797f2736174aa1c784f4dd34e7"
                      "64ee40d40e4d2442677ebea3498086c9473e5c92789cbdb0"
                      "2bb327bbd61d58690f6a83d9ca73bccbde37dec4", 16),
             'y': int("0000004da67cffc98070b82af61feba78787efefb13bd810"
                      "d80ff92304788e49a4e5b634b3565474a8ecb1615d7b1b77"
                      "a7a27875adb73a8a5d8f3f84e5e8b744cda250b0", 16)},
         'IUT': {
             'd': int("00000311a5e520e238141527671a38cb6f776d96a9f82ef7"
                      "0dffa11dc0895f4060f1abbb9ad6fd259e4a7beaf5f7266e"
                      "a1bb45bcbfebfda2705e5c551e710fb1d745f57e", 16),
             'x': int("0000010ba3778cb2cc965834c0a9593adc6a222692656d65"
                      "7fb0d15293edf0ab33762384a96a16fddea7540b7ccbcca4"
                      "6ec4ac9bcf95fdb5aa18e158aab4d91981bd733e", 16),
             'y': int("0000018522df93ddd636e5bc94daecdc600fa241686ec186"
                      "34fd30b7cbdfdc9ffba1166ac08df34a31896f6fad191414"
                      "929261ebd7187afb72919f8a0c926be37f99c1e5", 16)},
         'Z': int("01a5e4b31be4b1346e53906b6767b1fe94ec1a8a5abc28fb"
                  "6f01518c056959af3bc9335dddab178b52318cc551255993"
                  "1b8dc18de0ce810c2c7f15769d7ce70e719c", 16),
         'curve': 'secp521r1'}
    ]

    assert expected == load_kasvs_ecdh_vectors(vector_data)


def test_load_kasvs_ecdh_kdf_vectors():
    vector_data = textwrap.dedent("""
    #  Parameter set(s) supported: EB EC ED EE
    #  CAVSid: CAVSid (in hex: 434156536964)
    #  IUTid: In hex: a1b2c3d4e5
    [EB]

    [Curve selected:  P-224]
    [SHA(s) supported (Used in the KDF function):  SHA224 SHA256 SHA384 SHA512]
    [MAC algorithm supported:  HMAC]
    [HMAC SHAs supported:  SHA512]
    [HMACKeySize(in bits):  112]
    [HMAC Tag length(in bits):  64]

    #  Generated on Mon Dec 22 11:45:18 2014



    [EB - SHA224]


    COUNT = 0
    dsCAVS = 540904b67b3716823dd621ed72ad3dbc615887b4f56f910b78a57199
    QsCAVSx = 28e5f3a72d8f6b8499dd1bcdfceafcecec68a0d715789bcf4b55fe15
    QsCAVSy = 8c8006a7da7c1a19f5328d7e865522b0c0dfb9a29b2c46dc96590d2a
    Nonce = 4eefb2a29a0e89c3898a7affdfa60dd7
    dsIUT = 5e717ae889fc8d67be11c2ebe1a7d3550051448d68a040b2dee8e327
    QsIUTx = ae7f3db340b647d61713f5374c019f1be2b28573cb6219bb7b747223
    QsIUTy = 800e6bffcf97c15864ec6e5673fb83359b45f89b8a26a27f6f3dfbff
    NonceDKMIUT = bb7f1b40d14ebd70443393990b57
    OI = a1b2c3d4e5bb7f1b40d14ebd70443393990b574341565369645b1582daab9cc6c30d6\
1fdcf1cdfc7e9a304651e0fdb
    CAVSTag = 84de198c3a958c62
    Z = 43f23b2c760d686fc99cc008b63aea92f866e224265af60d2d8ae540
    MacData = 5374616e646172642054657374204d6573736167654eefb2a29a0e89c3898a7a\
ffdfa60dd7
    DKM = ad65fa2d12541c3a21f3cd223efb
    Result = F (12 - Tag changed )
    """).splitlines()

    expected = [
        {'errno': 12,
         'fail': True,
         'COUNT': 0,
         'CAVS': {
             'd': int("540904b67b3716823dd621ed72ad3dbc615887b4f56f910b"
                      "78a57199", 16),
             'x': int("28e5f3a72d8f6b8499dd1bcdfceafcecec68a0d715789bcf"
                      "4b55fe15", 16),
             'y': int("8c8006a7da7c1a19f5328d7e865522b0c0dfb9a29b2c46dc"
                      "96590d2a", 16)},
         'IUT': {
             'd': int("5e717ae889fc8d67be11c2ebe1a7d3550051448d68a040b2"
                      "dee8e327", 16),
             'x': int("ae7f3db340b647d61713f5374c019f1be2b28573cb6219bb"
                      "7b747223", 16),
             'y': int("800e6bffcf97c15864ec6e5673fb83359b45f89b8a26a27f"
                      "6f3dfbff", 16)},
         'OI': int("a1b2c3d4e5bb7f1b40d14ebd70443393990b574341565369"
                   "645b1582daab9cc6c30d61fdcf1cdfc7e9a304651e0fdb", 16),
         'Z': int("43f23b2c760d686fc99cc008b63aea92f866e224265af60d"
                  "2d8ae540", 16),
         'DKM': int("ad65fa2d12541c3a21f3cd223efb", 16),
         'curve': 'secp224r1'}
    ]

    assert expected == load_kasvs_ecdh_vectors(vector_data)


def test_load_x963_vectors():
    vector_data = textwrap.dedent("""
    # CAVS 12.0
    # 'ANS X9.63-2001' information for sample

    [SHA-1]
    [shared secret length = 192]
    [SharedInfo length = 0]
    [key data length = 128]

    COUNT = 0
    Z = 1c7d7b5f0597b03d06a018466ed1a93e30ed4b04dc64ccdd
    SharedInfo =
        Counter = 00000001
        Hash input 1 = 1c7d7b5f0597b03d06a018466ed1a93e30ed4b04dc64ccdd00000001
        K1 = bf71dffd8f4d99223936beb46fee8ccc60439b7e
    key_data = bf71dffd8f4d99223936beb46fee8ccc

    COUNT = 1
    Z = 5ed096510e3fcf782ceea98e9737993e2b21370f6cda2ab1
    SharedInfo =
        Counter = 00000001
        Hash input 1 = 5ed096510e3fcf782ceea98e9737993e2b21370f6cda2ab100000001
        K1 = ec3e224446bfd7b3be1df404104af953c1b2d0f5
    key_data = ec3e224446bfd7b3be1df404104af953

    [SHA-512]
    [shared secret length = 521]
    [SharedInfo length = 128]
    [key data length = 1024]

    COUNT = 0
    Z = 00aa5bb79b33e389fa58ceadc047197f14e73712f452caa9fc4c9adb369348b8150739\
2f1a86ddfdb7c4ff8231c4bd0f44e44a1b55b1404747a9e2e753f55ef05a2d
    SharedInfo = e3b5b4c1b0d5cf1d2b3a2f9937895d31
        Counter = 00000001
        Hash input 1 = 00aa5bb79b33e389fa58ceadc047197f14e73712f452caa9fc4c9ad\
b369348b81507392f1a86ddfdb7c4ff8231c4bd0f44e44a1b55b1404747a9e2e753f55ef05a2d0\
0000001e3b5b4c1b0d5cf1d2b3a2f9937895d31
        K1 = 4463f869f3cc18769b52264b0112b5858f7ad32a5a2d96d8cffabf7fa733633d6\
e4dd2a599acceb3ea54a6217ce0b50eef4f6b40a5c30250a5a8eeee20800226
        Counter = 00000002
        Hash input 2 = 00aa5bb79b33e389fa58ceadc047197f14e73712f452caa9fc4c9ad\
b369348b81507392f1a86ddfdb7c4ff8231c4bd0f44e44a1b55b1404747a9e2e753f55ef05a2d0\
0000002e3b5b4c1b0d5cf1d2b3a2f9937895d31
        K2 = 7089dbf351f3f5022aa9638bf1ee419dea9c4ff745a25ac27bda33ca08bd56dd1\
a59b4106cf2dbbc0ab2aa8e2efa7b17902d34276951ceccab87f9661c3e8816
    key_data = 4463f869f3cc18769b52264b0112b5858f7ad32a5a2d96d8cffabf7fa733633\
d6e4dd2a599acceb3ea54a6217ce0b50eef4f6b40a5c30250a5a8eeee208002267089dbf351f3f\
5022aa9638bf1ee419dea9c4ff745a25ac27bda33ca08bd56dd1a59b4106cf2dbbc0ab2aa8e2ef\
a7b17902d34276951ceccab87f9661c3e8816
    """).splitlines()

    assert load_x963_vectors(vector_data) == [
        {"hash": "SHA-1", "count": 0,
         "shared_secret_length": 192,
         "Z": "1c7d7b5f0597b03d06a018466ed1a93e30ed4b04dc64ccdd",
         "sharedinfo_length": 0,
         "key_data_length": 128,
         "key_data": "bf71dffd8f4d99223936beb46fee8ccc"},
        {"hash": "SHA-1", "count": 1,
         "shared_secret_length": 192,
         "Z": "5ed096510e3fcf782ceea98e9737993e2b21370f6cda2ab1",
         "sharedinfo_length": 0,
         "key_data_length": 128,
         "key_data": "ec3e224446bfd7b3be1df404104af953"},
        {"hash": "SHA-512", "count": 0,
         "shared_secret_length": 521,
         "Z": "00aa5bb79b33e389fa58ceadc047197f14e73712f452caa9fc4c9adb369348b\
81507392f1a86ddfdb7c4ff8231c4bd0f44e44a1b55b1404747a9e2e753f55ef05a2d",
         "sharedinfo_length": 128,
         "sharedinfo": "e3b5b4c1b0d5cf1d2b3a2f9937895d31",
         "key_data_length": 1024,
         "key_data": "4463f869f3cc18769b52264b0112b5858f7ad32a5a2d96d8cffabf7f\
a733633d6e4dd2a599acceb3ea54a6217ce0b50eef4f6b40a5c30250a5a8eeee208002267089db\
f351f3f5022aa9638bf1ee419dea9c4ff745a25ac27bda33ca08bd56dd1a59b4106cf2dbbc0ab2\
aa8e2efa7b17902d34276951ceccab87f9661c3e8816"},
    ]


def test_vector_version():
    assert cryptography.__version__ == cryptography_vectors.__version__


def test_raises_unsupported_algorithm_wrong_type():
    # Check that it raises if the wrong type of exception is raised.
    class TestException(Exception):
        pass

    with pytest.raises(TestException):
        with raises_unsupported_algorithm(None):
            raise TestException


def test_raises_unsupported_algorithm_wrong_reason():
    # Check that it fails if the wrong reason code is raised.
    with pytest.raises(AssertionError):
        with raises_unsupported_algorithm(None):
            raise UnsupportedAlgorithm("An error.",
                                       _Reasons.BACKEND_MISSING_INTERFACE)


def test_raises_unsupported_no_exc():
    # Check that it fails if no exception is raised.
    with pytest.raises(pytest.fail.Exception):
        with raises_unsupported_algorithm(
            _Reasons.BACKEND_MISSING_INTERFACE
        ):
            pass


def test_raises_unsupported_algorithm():
    # Check that it doesn't assert if the right things are raised.
    with raises_unsupported_algorithm(
        _Reasons.BACKEND_MISSING_INTERFACE
    ) as exc_info:
        raise UnsupportedAlgorithm("An error.",
                                   _Reasons.BACKEND_MISSING_INTERFACE)
    assert exc_info.type is UnsupportedAlgorithm