summaryrefslogtreecommitdiff
path: root/src/regress
diff options
context:
space:
mode:
Diffstat (limited to 'src/regress')
-rw-r--r--src/regress/lib/libcrypto/bn/Makefile4
-rw-r--r--src/regress/lib/libcrypto/bn/bn_ffdh.c502
2 files changed, 505 insertions, 1 deletions
diff --git a/src/regress/lib/libcrypto/bn/Makefile b/src/regress/lib/libcrypto/bn/Makefile
index 8f49050615..2cf1b4250d 100644
--- a/src/regress/lib/libcrypto/bn/Makefile
+++ b/src/regress/lib/libcrypto/bn/Makefile
@@ -1,9 +1,10 @@
1# $OpenBSD: Makefile,v 1.38 2024/04/09 14:59:57 jsing Exp $ 1# $OpenBSD: Makefile,v 1.39 2026/01/23 07:24:48 tb Exp $
2 2
3PROGS += bn_add_sub 3PROGS += bn_add_sub
4PROGS += bn_bits 4PROGS += bn_bits
5PROGS += bn_cmp 5PROGS += bn_cmp
6PROGS += bn_convert 6PROGS += bn_convert
7PROGS += bn_ffdh
7PROGS += bn_gcd 8PROGS += bn_gcd
8PROGS += bn_general 9PROGS += bn_general
9PROGS += bn_isqrt 10PROGS += bn_isqrt
@@ -20,6 +21,7 @@ PROGS += bn_to_string
20PROGS += bn_unit 21PROGS += bn_unit
21PROGS += bn_word 22PROGS += bn_word
22 23
24STATIC_LINK += bn_ffdh
23STATIC_LINK += bn_gcd 25STATIC_LINK += bn_gcd
24STATIC_LINK += bn_isqrt 26STATIC_LINK += bn_isqrt
25STATIC_LINK += bn_mod_exp 27STATIC_LINK += bn_mod_exp
diff --git a/src/regress/lib/libcrypto/bn/bn_ffdh.c b/src/regress/lib/libcrypto/bn/bn_ffdh.c
new file mode 100644
index 0000000000..37dfe94278
--- /dev/null
+++ b/src/regress/lib/libcrypto/bn/bn_ffdh.c
@@ -0,0 +1,502 @@
1/* $OpenBSD: bn_ffdh.c,v 1.1 2026/01/23 07:24:48 tb Exp $ */
2
3/*
4 * Copyright (c) 2026 Theo Buehler <tb@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <err.h>
20#include <stdio.h>
21
22#include <openssl/bn.h>
23#include <openssl/dh.h>
24
25#include "bn_local.h"
26
27#define HAVE_RFC7919_PRIMES 0
28#define HAVE_SCAPY_SPECIAL 0
29
30/*
31 * The strings below were copied from RFCs 2409, 3526, 7919,
32 * wrapped to 6 columns, added quotes and semicolons.
33 */
34
35static const char *rfc2409_prime_768 =
36 "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
37 "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
38 "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
39 "E485B576" "625E7EC6" "F44C42E9" "A63A3620" "FFFFFFFF" "FFFFFFFF";
40
41static const char *rfc2409_prime_1024 =
42 "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
43 "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
44 "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
45 "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"
46 "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE65381"
47 "FFFFFFFF" "FFFFFFFF";
48
49static const char *rfc3526_prime_1536 =
50 "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
51 "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
52 "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
53 "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"
54 "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE45B3D"
55 "C2007CB8" "A163BF05" "98DA4836" "1C55D39A" "69163FA8" "FD24CF5F"
56 "83655D23" "DCA3AD96" "1C62F356" "208552BB" "9ED52907" "7096966D"
57 "670C354E" "4ABC9804" "F1746C08" "CA237327" "FFFFFFFF" "FFFFFFFF";
58
59static const char *rfc3526_prime_2048 =
60 "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
61 "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
62 "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
63 "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"
64 "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE45B3D"
65 "C2007CB8" "A163BF05" "98DA4836" "1C55D39A" "69163FA8" "FD24CF5F"
66 "83655D23" "DCA3AD96" "1C62F356" "208552BB" "9ED52907" "7096966D"
67 "670C354E" "4ABC9804" "F1746C08" "CA18217C" "32905E46" "2E36CE3B"
68 "E39E772C" "180E8603" "9B2783A2" "EC07A28F" "B5C55DF0" "6F4C52C9"
69 "DE2BCBF6" "95581718" "3995497C" "EA956AE5" "15D22618" "98FA0510"
70 "15728E5A" "8AACAA68" "FFFFFFFF" "FFFFFFFF";
71
72static const char *rfc3526_prime_3072 =
73 "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
74 "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
75 "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
76 "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"
77 "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE45B3D"
78 "C2007CB8" "A163BF05" "98DA4836" "1C55D39A" "69163FA8" "FD24CF5F"
79 "83655D23" "DCA3AD96" "1C62F356" "208552BB" "9ED52907" "7096966D"
80 "670C354E" "4ABC9804" "F1746C08" "CA18217C" "32905E46" "2E36CE3B"
81 "E39E772C" "180E8603" "9B2783A2" "EC07A28F" "B5C55DF0" "6F4C52C9"
82 "DE2BCBF6" "95581718" "3995497C" "EA956AE5" "15D22618" "98FA0510"
83 "15728E5A" "8AAAC42D" "AD33170D" "04507A33" "A85521AB" "DF1CBA64"
84 "ECFB8504" "58DBEF0A" "8AEA7157" "5D060C7D" "B3970F85" "A6E1E4C7"
85 "ABF5AE8C" "DB0933D7" "1E8C94E0" "4A25619D" "CEE3D226" "1AD2EE6B"
86 "F12FFA06" "D98A0864" "D8760273" "3EC86A64" "521F2B18" "177B200C"
87 "BBE11757" "7A615D6C" "770988C0" "BAD946E2" "08E24FA0" "74E5AB31"
88 "43DB5BFC" "E0FD108E" "4B82D120" "A93AD2CA" "FFFFFFFF" "FFFFFFFF";
89
90static const char *rfc3526_prime_4096 =
91 "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
92 "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
93 "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
94 "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"
95 "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE45B3D"
96 "C2007CB8" "A163BF05" "98DA4836" "1C55D39A" "69163FA8" "FD24CF5F"
97 "83655D23" "DCA3AD96" "1C62F356" "208552BB" "9ED52907" "7096966D"
98 "670C354E" "4ABC9804" "F1746C08" "CA18217C" "32905E46" "2E36CE3B"
99 "E39E772C" "180E8603" "9B2783A2" "EC07A28F" "B5C55DF0" "6F4C52C9"
100 "DE2BCBF6" "95581718" "3995497C" "EA956AE5" "15D22618" "98FA0510"
101 "15728E5A" "8AAAC42D" "AD33170D" "04507A33" "A85521AB" "DF1CBA64"
102 "ECFB8504" "58DBEF0A" "8AEA7157" "5D060C7D" "B3970F85" "A6E1E4C7"
103 "ABF5AE8C" "DB0933D7" "1E8C94E0" "4A25619D" "CEE3D226" "1AD2EE6B"
104 "F12FFA06" "D98A0864" "D8760273" "3EC86A64" "521F2B18" "177B200C"
105 "BBE11757" "7A615D6C" "770988C0" "BAD946E2" "08E24FA0" "74E5AB31"
106 "43DB5BFC" "E0FD108E" "4B82D120" "A9210801" "1A723C12" "A787E6D7"
107 "88719A10" "BDBA5B26" "99C32718" "6AF4E23C" "1A946834" "B6150BDA"
108 "2583E9CA" "2AD44CE8" "DBBBC2DB" "04DE8EF9" "2E8EFC14" "1FBECAA6"
109 "287C5947" "4E6BC05D" "99B2964F" "A090C3A2" "233BA186" "515BE7ED"
110 "1F612970" "CEE2D7AF" "B81BDD76" "2170481C" "D0069127" "D5B05AA9"
111 "93B4EA98" "8D8FDDC1" "86FFB7DC" "90A6C08F" "4DF435C9" "34063199"
112 "FFFFFFFF" "FFFFFFFF";
113
114static const char *rfc3526_prime_6144 =
115 "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
116 "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
117 "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
118 "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"
119 "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE45B3D"
120 "C2007CB8" "A163BF05" "98DA4836" "1C55D39A" "69163FA8" "FD24CF5F"
121 "83655D23" "DCA3AD96" "1C62F356" "208552BB" "9ED52907" "7096966D"
122 "670C354E" "4ABC9804" "F1746C08" "CA18217C" "32905E46" "2E36CE3B"
123 "E39E772C" "180E8603" "9B2783A2" "EC07A28F" "B5C55DF0" "6F4C52C9"
124 "DE2BCBF6" "95581718" "3995497C" "EA956AE5" "15D22618" "98FA0510"
125 "15728E5A" "8AAAC42D" "AD33170D" "04507A33" "A85521AB" "DF1CBA64"
126 "ECFB8504" "58DBEF0A" "8AEA7157" "5D060C7D" "B3970F85" "A6E1E4C7"
127 "ABF5AE8C" "DB0933D7" "1E8C94E0" "4A25619D" "CEE3D226" "1AD2EE6B"
128 "F12FFA06" "D98A0864" "D8760273" "3EC86A64" "521F2B18" "177B200C"
129 "BBE11757" "7A615D6C" "770988C0" "BAD946E2" "08E24FA0" "74E5AB31"
130 "43DB5BFC" "E0FD108E" "4B82D120" "A9210801" "1A723C12" "A787E6D7"
131 "88719A10" "BDBA5B26" "99C32718" "6AF4E23C" "1A946834" "B6150BDA"
132 "2583E9CA" "2AD44CE8" "DBBBC2DB" "04DE8EF9" "2E8EFC14" "1FBECAA6"
133 "287C5947" "4E6BC05D" "99B2964F" "A090C3A2" "233BA186" "515BE7ED"
134 "1F612970" "CEE2D7AF" "B81BDD76" "2170481C" "D0069127" "D5B05AA9"
135 "93B4EA98" "8D8FDDC1" "86FFB7DC" "90A6C08F" "4DF435C9" "34028492"
136 "36C3FAB4" "D27C7026" "C1D4DCB2" "602646DE" "C9751E76" "3DBA37BD"
137 "F8FF9406" "AD9E530E" "E5DB382F" "413001AE" "B06A53ED" "9027D831"
138 "179727B0" "865A8918" "DA3EDBEB" "CF9B14ED" "44CE6CBA" "CED4BB1B"
139 "DB7F1447" "E6CC254B" "33205151" "2BD7AF42" "6FB8F401" "378CD2BF"
140 "5983CA01" "C64B92EC" "F032EA15" "D1721D03" "F482D7CE" "6E74FEF6"
141 "D55E702F" "46980C82" "B5A84031" "900B1C9E" "59E7C97F" "BEC7E8F3"
142 "23A97A7E" "36CC88BE" "0F1D45B7" "FF585AC5" "4BD407B2" "2B4154AA"
143 "CC8F6D7E" "BF48E1D8" "14CC5ED2" "0F8037E0" "A79715EE" "F29BE328"
144 "06A1D58B" "B7C5DA76" "F550AA3D" "8A1FBFF0" "EB19CCB1" "A313D55C"
145 "DA56C9EC" "2EF29632" "387FE8D7" "6E3C0468" "043E8F66" "3F4860EE"
146 "12BF2D5B" "0B7474D6" "E694F91E" "6DCC4024" "FFFFFFFF" "FFFFFFFF";
147
148static const char *rfc3526_prime_8192 =
149 "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
150 "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
151 "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
152 "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"
153 "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE45B3D"
154 "C2007CB8" "A163BF05" "98DA4836" "1C55D39A" "69163FA8" "FD24CF5F"
155 "83655D23" "DCA3AD96" "1C62F356" "208552BB" "9ED52907" "7096966D"
156 "670C354E" "4ABC9804" "F1746C08" "CA18217C" "32905E46" "2E36CE3B"
157 "E39E772C" "180E8603" "9B2783A2" "EC07A28F" "B5C55DF0" "6F4C52C9"
158 "DE2BCBF6" "95581718" "3995497C" "EA956AE5" "15D22618" "98FA0510"
159 "15728E5A" "8AAAC42D" "AD33170D" "04507A33" "A85521AB" "DF1CBA64"
160 "ECFB8504" "58DBEF0A" "8AEA7157" "5D060C7D" "B3970F85" "A6E1E4C7"
161 "ABF5AE8C" "DB0933D7" "1E8C94E0" "4A25619D" "CEE3D226" "1AD2EE6B"
162 "F12FFA06" "D98A0864" "D8760273" "3EC86A64" "521F2B18" "177B200C"
163 "BBE11757" "7A615D6C" "770988C0" "BAD946E2" "08E24FA0" "74E5AB31"
164 "43DB5BFC" "E0FD108E" "4B82D120" "A9210801" "1A723C12" "A787E6D7"
165 "88719A10" "BDBA5B26" "99C32718" "6AF4E23C" "1A946834" "B6150BDA"
166 "2583E9CA" "2AD44CE8" "DBBBC2DB" "04DE8EF9" "2E8EFC14" "1FBECAA6"
167 "287C5947" "4E6BC05D" "99B2964F" "A090C3A2" "233BA186" "515BE7ED"
168 "1F612970" "CEE2D7AF" "B81BDD76" "2170481C" "D0069127" "D5B05AA9"
169 "93B4EA98" "8D8FDDC1" "86FFB7DC" "90A6C08F" "4DF435C9" "34028492"
170 "36C3FAB4" "D27C7026" "C1D4DCB2" "602646DE" "C9751E76" "3DBA37BD"
171 "F8FF9406" "AD9E530E" "E5DB382F" "413001AE" "B06A53ED" "9027D831"
172 "179727B0" "865A8918" "DA3EDBEB" "CF9B14ED" "44CE6CBA" "CED4BB1B"
173 "DB7F1447" "E6CC254B" "33205151" "2BD7AF42" "6FB8F401" "378CD2BF"
174 "5983CA01" "C64B92EC" "F032EA15" "D1721D03" "F482D7CE" "6E74FEF6"
175 "D55E702F" "46980C82" "B5A84031" "900B1C9E" "59E7C97F" "BEC7E8F3"
176 "23A97A7E" "36CC88BE" "0F1D45B7" "FF585AC5" "4BD407B2" "2B4154AA"
177 "CC8F6D7E" "BF48E1D8" "14CC5ED2" "0F8037E0" "A79715EE" "F29BE328"
178 "06A1D58B" "B7C5DA76" "F550AA3D" "8A1FBFF0" "EB19CCB1" "A313D55C"
179 "DA56C9EC" "2EF29632" "387FE8D7" "6E3C0468" "043E8F66" "3F4860EE"
180 "12BF2D5B" "0B7474D6" "E694F91E" "6DBE1159" "74A3926F" "12FEE5E4"
181 "38777CB6" "A932DF8C" "D8BEC4D0" "73B931BA" "3BC832B6" "8D9DD300"
182 "741FA7BF" "8AFC47ED" "2576F693" "6BA42466" "3AAB639C" "5AE4F568"
183 "3423B474" "2BF1C978" "238F16CB" "E39D652D" "E3FDB8BE" "FC848AD9"
184 "22222E04" "A4037C07" "13EB57A8" "1A23F0C7" "3473FC64" "6CEA306B"
185 "4BCBC886" "2F8385DD" "FA9D4B7F" "A2C087E8" "79683303" "ED5BDD3A"
186 "062B3CF5" "B3A278A6" "6D2A13F8" "3F44F82D" "DF310EE0" "74AB6A36"
187 "4597E899" "A0255DC1" "64F31CC5" "0846851D" "F9AB4819" "5DED7EA1"
188 "B1D510BD" "7EE74D73" "FAF36BC3" "1ECFA268" "359046F4" "EB879F92"
189 "4009438B" "481C6CD7" "889A002E" "D5EE382B" "C9190DA6" "FC026E47"
190 "9558E447" "5677E9AA" "9E3050E2" "765694DF" "C81F56E8" "80B96E71"
191 "60C980DD" "98EDD3DF" "FFFFFFFF" "FFFFFFFF"
192;
193
194#if HAVE_RFC7919_PRIMES
195
196static const char *rfc7919_prime_2048 =
197 "FFFFFFFF" "FFFFFFFF" "ADF85458" "A2BB4A9A" "AFDC5620" "273D3CF1"
198 "D8B9C583" "CE2D3695" "A9E13641" "146433FB" "CC939DCE" "249B3EF9"
199 "7D2FE363" "630C75D8" "F681B202" "AEC4617A" "D3DF1ED5" "D5FD6561"
200 "2433F51F" "5F066ED0" "85636555" "3DED1AF3" "B557135E" "7F57C935"
201 "984F0C70" "E0E68B77" "E2A689DA" "F3EFE872" "1DF158A1" "36ADE735"
202 "30ACCA4F" "483A797A" "BC0AB182" "B324FB61" "D108A94B" "B2C8E3FB"
203 "B96ADAB7" "60D7F468" "1D4F42A3" "DE394DF4" "AE56EDE7" "6372BB19"
204 "0B07A7C8" "EE0A6D70" "9E02FCE1" "CDF7E2EC" "C03404CD" "28342F61"
205 "9172FE9C" "E98583FF" "8E4F1232" "EEF28183" "C3FE3B1B" "4C6FAD73"
206 "3BB5FCBC" "2EC22005" "C58EF183" "7D1683B2" "C6F34A26" "C1B2EFFA"
207 "886B4238" "61285C97" "FFFFFFFF" "FFFFFFFF";
208
209static const char *rfc7919_prime_3072 =
210 "FFFFFFFF" "FFFFFFFF" "ADF85458" "A2BB4A9A" "AFDC5620" "273D3CF1"
211 "D8B9C583" "CE2D3695" "A9E13641" "146433FB" "CC939DCE" "249B3EF9"
212 "7D2FE363" "630C75D8" "F681B202" "AEC4617A" "D3DF1ED5" "D5FD6561"
213 "2433F51F" "5F066ED0" "85636555" "3DED1AF3" "B557135E" "7F57C935"
214 "984F0C70" "E0E68B77" "E2A689DA" "F3EFE872" "1DF158A1" "36ADE735"
215 "30ACCA4F" "483A797A" "BC0AB182" "B324FB61" "D108A94B" "B2C8E3FB"
216 "B96ADAB7" "60D7F468" "1D4F42A3" "DE394DF4" "AE56EDE7" "6372BB19"
217 "0B07A7C8" "EE0A6D70" "9E02FCE1" "CDF7E2EC" "C03404CD" "28342F61"
218 "9172FE9C" "E98583FF" "8E4F1232" "EEF28183" "C3FE3B1B" "4C6FAD73"
219 "3BB5FCBC" "2EC22005" "C58EF183" "7D1683B2" "C6F34A26" "C1B2EFFA"
220 "886B4238" "611FCFDC" "DE355B3B" "6519035B" "BC34F4DE" "F99C0238"
221 "61B46FC9" "D6E6C907" "7AD91D26" "91F7F7EE" "598CB0FA" "C186D91C"
222 "AEFE1309" "85139270" "B4130C93" "BC437944" "F4FD4452" "E2D74DD3"
223 "64F2E21E" "71F54BFF" "5CAE82AB" "9C9DF69E" "E86D2BC5" "22363A0D"
224 "ABC52197" "9B0DEADA" "1DBF9A42" "D5C4484E" "0ABCD06B" "FA53DDEF"
225 "3C1B20EE" "3FD59D7C" "25E41D2B" "66C62E37" "FFFFFFFF" "FFFFFFFF";
226
227static const char *rfc7919_prime_4096 =
228 "FFFFFFFF" "FFFFFFFF" "ADF85458" "A2BB4A9A" "AFDC5620" "273D3CF1"
229 "D8B9C583" "CE2D3695" "A9E13641" "146433FB" "CC939DCE" "249B3EF9"
230 "7D2FE363" "630C75D8" "F681B202" "AEC4617A" "D3DF1ED5" "D5FD6561"
231 "2433F51F" "5F066ED0" "85636555" "3DED1AF3" "B557135E" "7F57C935"
232 "984F0C70" "E0E68B77" "E2A689DA" "F3EFE872" "1DF158A1" "36ADE735"
233 "30ACCA4F" "483A797A" "BC0AB182" "B324FB61" "D108A94B" "B2C8E3FB"
234 "B96ADAB7" "60D7F468" "1D4F42A3" "DE394DF4" "AE56EDE7" "6372BB19"
235 "0B07A7C8" "EE0A6D70" "9E02FCE1" "CDF7E2EC" "C03404CD" "28342F61"
236 "9172FE9C" "E98583FF" "8E4F1232" "EEF28183" "C3FE3B1B" "4C6FAD73"
237 "3BB5FCBC" "2EC22005" "C58EF183" "7D1683B2" "C6F34A26" "C1B2EFFA"
238 "886B4238" "611FCFDC" "DE355B3B" "6519035B" "BC34F4DE" "F99C0238"
239 "61B46FC9" "D6E6C907" "7AD91D26" "91F7F7EE" "598CB0FA" "C186D91C"
240 "AEFE1309" "85139270" "B4130C93" "BC437944" "F4FD4452" "E2D74DD3"
241 "64F2E21E" "71F54BFF" "5CAE82AB" "9C9DF69E" "E86D2BC5" "22363A0D"
242 "ABC52197" "9B0DEADA" "1DBF9A42" "D5C4484E" "0ABCD06B" "FA53DDEF"
243 "3C1B20EE" "3FD59D7C" "25E41D2B" "669E1EF1" "6E6F52C3" "164DF4FB"
244 "7930E9E4" "E58857B6" "AC7D5F42" "D69F6D18" "7763CF1D" "55034004"
245 "87F55BA5" "7E31CC7A" "7135C886" "EFB4318A" "ED6A1E01" "2D9E6832"
246 "A907600A" "918130C4" "6DC778F9" "71AD0038" "092999A3" "33CB8B7A"
247 "1A1DB93D" "7140003C" "2A4ECEA9" "F98D0ACC" "0A8291CD" "CEC97DCF"
248 "8EC9B55A" "7F88A46B" "4DB5A851" "F44182E1" "C68A007E" "5E655F6A"
249 "FFFFFFFF" "FFFFFFFF";
250
251static const char *rfc7919_prime_6144 =
252 "FFFFFFFF" "FFFFFFFF" "ADF85458" "A2BB4A9A" "AFDC5620" "273D3CF1"
253 "D8B9C583" "CE2D3695" "A9E13641" "146433FB" "CC939DCE" "249B3EF9"
254 "7D2FE363" "630C75D8" "F681B202" "AEC4617A" "D3DF1ED5" "D5FD6561"
255 "2433F51F" "5F066ED0" "85636555" "3DED1AF3" "B557135E" "7F57C935"
256 "984F0C70" "E0E68B77" "E2A689DA" "F3EFE872" "1DF158A1" "36ADE735"
257 "30ACCA4F" "483A797A" "BC0AB182" "B324FB61" "D108A94B" "B2C8E3FB"
258 "B96ADAB7" "60D7F468" "1D4F42A3" "DE394DF4" "AE56EDE7" "6372BB19"
259 "0B07A7C8" "EE0A6D70" "9E02FCE1" "CDF7E2EC" "C03404CD" "28342F61"
260 "9172FE9C" "E98583FF" "8E4F1232" "EEF28183" "C3FE3B1B" "4C6FAD73"
261 "3BB5FCBC" "2EC22005" "C58EF183" "7D1683B2" "C6F34A26" "C1B2EFFA"
262 "886B4238" "611FCFDC" "DE355B3B" "6519035B" "BC34F4DE" "F99C0238"
263 "61B46FC9" "D6E6C907" "7AD91D26" "91F7F7EE" "598CB0FA" "C186D91C"
264 "AEFE1309" "85139270" "B4130C93" "BC437944" "F4FD4452" "E2D74DD3"
265 "64F2E21E" "71F54BFF" "5CAE82AB" "9C9DF69E" "E86D2BC5" "22363A0D"
266 "ABC52197" "9B0DEADA" "1DBF9A42" "D5C4484E" "0ABCD06B" "FA53DDEF"
267 "3C1B20EE" "3FD59D7C" "25E41D2B" "669E1EF1" "6E6F52C3" "164DF4FB"
268 "7930E9E4" "E58857B6" "AC7D5F42" "D69F6D18" "7763CF1D" "55034004"
269 "87F55BA5" "7E31CC7A" "7135C886" "EFB4318A" "ED6A1E01" "2D9E6832"
270 "A907600A" "918130C4" "6DC778F9" "71AD0038" "092999A3" "33CB8B7A"
271 "1A1DB93D" "7140003C" "2A4ECEA9" "F98D0ACC" "0A8291CD" "CEC97DCF"
272 "8EC9B55A" "7F88A46B" "4DB5A851" "F44182E1" "C68A007E" "5E0DD902"
273 "0BFD64B6" "45036C7A" "4E677D2C" "38532A3A" "23BA4442" "CAF53EA6"
274 "3BB45432" "9B7624C8" "917BDD64" "B1C0FD4C" "B38E8C33" "4C701C3A"
275 "CDAD0657" "FCCFEC71" "9B1F5C3E" "4E46041F" "388147FB" "4CFDB477"
276 "A52471F7" "A9A96910" "B855322E" "DB6340D8" "A00EF092" "350511E3"
277 "0ABEC1FF" "F9E3A26E" "7FB29F8C" "183023C3" "587E38DA" "0077D9B4"
278 "763E4E4B" "94B2BBC1" "94C6651E" "77CAF992" "EEAAC023" "2A281BF6"
279 "B3A739C1" "22611682" "0AE8DB58" "47A67CBE" "F9C9091B" "462D538C"
280 "D72B0374" "6AE77F5E" "62292C31" "1562A846" "505DC82D" "B854338A"
281 "E49F5235" "C95B9117" "8CCF2DD5" "CACEF403" "EC9D1810" "C6272B04"
282 "5B3B71F9" "DC6B80D6" "3FDD4A8E" "9ADB1E69" "62A69526" "D43161C1"
283 "A41D570D" "7938DAD4" "A40E329C" "D0E40E65" "FFFFFFFF" "FFFFFFFF";
284
285static const char *rfc7919_prime_8192 =
286 "FFFFFFFF" "FFFFFFFF" "ADF85458" "A2BB4A9A" "AFDC5620" "273D3CF1"
287 "D8B9C583" "CE2D3695" "A9E13641" "146433FB" "CC939DCE" "249B3EF9"
288 "7D2FE363" "630C75D8" "F681B202" "AEC4617A" "D3DF1ED5" "D5FD6561"
289 "2433F51F" "5F066ED0" "85636555" "3DED1AF3" "B557135E" "7F57C935"
290 "984F0C70" "E0E68B77" "E2A689DA" "F3EFE872" "1DF158A1" "36ADE735"
291 "30ACCA4F" "483A797A" "BC0AB182" "B324FB61" "D108A94B" "B2C8E3FB"
292 "B96ADAB7" "60D7F468" "1D4F42A3" "DE394DF4" "AE56EDE7" "6372BB19"
293 "0B07A7C8" "EE0A6D70" "9E02FCE1" "CDF7E2EC" "C03404CD" "28342F61"
294 "9172FE9C" "E98583FF" "8E4F1232" "EEF28183" "C3FE3B1B" "4C6FAD73"
295 "3BB5FCBC" "2EC22005" "C58EF183" "7D1683B2" "C6F34A26" "C1B2EFFA"
296 "886B4238" "611FCFDC" "DE355B3B" "6519035B" "BC34F4DE" "F99C0238"
297 "61B46FC9" "D6E6C907" "7AD91D26" "91F7F7EE" "598CB0FA" "C186D91C"
298 "AEFE1309" "85139270" "B4130C93" "BC437944" "F4FD4452" "E2D74DD3"
299 "64F2E21E" "71F54BFF" "5CAE82AB" "9C9DF69E" "E86D2BC5" "22363A0D"
300 "ABC52197" "9B0DEADA" "1DBF9A42" "D5C4484E" "0ABCD06B" "FA53DDEF"
301 "3C1B20EE" "3FD59D7C" "25E41D2B" "669E1EF1" "6E6F52C3" "164DF4FB"
302 "7930E9E4" "E58857B6" "AC7D5F42" "D69F6D18" "7763CF1D" "55034004"
303 "87F55BA5" "7E31CC7A" "7135C886" "EFB4318A" "ED6A1E01" "2D9E6832"
304 "A907600A" "918130C4" "6DC778F9" "71AD0038" "092999A3" "33CB8B7A"
305 "1A1DB93D" "7140003C" "2A4ECEA9" "F98D0ACC" "0A8291CD" "CEC97DCF"
306 "8EC9B55A" "7F88A46B" "4DB5A851" "F44182E1" "C68A007E" "5E0DD902"
307 "0BFD64B6" "45036C7A" "4E677D2C" "38532A3A" "23BA4442" "CAF53EA6"
308 "3BB45432" "9B7624C8" "917BDD64" "B1C0FD4C" "B38E8C33" "4C701C3A"
309 "CDAD0657" "FCCFEC71" "9B1F5C3E" "4E46041F" "388147FB" "4CFDB477"
310 "A52471F7" "A9A96910" "B855322E" "DB6340D8" "A00EF092" "350511E3"
311 "0ABEC1FF" "F9E3A26E" "7FB29F8C" "183023C3" "587E38DA" "0077D9B4"
312 "763E4E4B" "94B2BBC1" "94C6651E" "77CAF992" "EEAAC023" "2A281BF6"
313 "B3A739C1" "22611682" "0AE8DB58" "47A67CBE" "F9C9091B" "462D538C"
314 "D72B0374" "6AE77F5E" "62292C31" "1562A846" "505DC82D" "B854338A"
315 "E49F5235" "C95B9117" "8CCF2DD5" "CACEF403" "EC9D1810" "C6272B04"
316 "5B3B71F9" "DC6B80D6" "3FDD4A8E" "9ADB1E69" "62A69526" "D43161C1"
317 "A41D570D" "7938DAD4" "A40E329C" "CFF46AAA" "36AD004C" "F600C838"
318 "1E425A31" "D951AE64" "FDB23FCE" "C9509D43" "687FEB69" "EDD1CC5E"
319 "0B8CC3BD" "F64B10EF" "86B63142" "A3AB8829" "555B2F74" "7C932665"
320 "CB2C0F1C" "C01BD702" "29388839" "D2AF05E4" "54504AC7" "8B758282"
321 "2846C0BA" "35C35F5C" "59160CC0" "46FD8251" "541FC68C" "9C86B022"
322 "BB709987" "6A460E74" "51A8A931" "09703FEE" "1C217E6C" "3826E52C"
323 "51AA691E" "0E423CFC" "99E9E316" "50C1217B" "624816CD" "AD9A95F9"
324 "D5B80194" "88D9C0A0" "A1FE3075" "A577E231" "83F81D4A" "3F2FA457"
325 "1EFC8CE0" "BA8A4FE8" "B6855DFE" "72B0A66E" "DED2FBAB" "FBE58A30"
326 "FAFABE1C" "5D71A87E" "2F741EF8" "C1FE86FE" "A6BBFDE5" "30677F0D"
327 "97D11D49" "F7A8443D" "0822E506" "A9F4614E" "011E2A94" "838FF88C"
328 "D68C8BB7" "C5C6424C" "FFFFFFFF" "FFFFFFFF";
329
330#endif /* HAVE_RFC7919_PRIMES */
331
332typedef BIGNUM *(*get_p_fn)(BIGNUM *);
333
334static const struct ffdh_test {
335 const char *name;
336 const char **str;
337 get_p_fn fn;
338} ffdh_tests[] = {
339 {
340 .name = "RFC 2409, 768 bit",
341 .str = &rfc2409_prime_768,
342 .fn = BN_get_rfc2409_prime_768,
343 },
344 {
345 .name = "RFC 2409, 1024 bit",
346 .str = &rfc2409_prime_1024,
347 .fn = BN_get_rfc2409_prime_1024,
348 },
349 {
350 .name = "RFC 3526, 1536 bit",
351 .str = &rfc3526_prime_1536,
352 .fn = BN_get_rfc3526_prime_1536,
353 },
354 {
355 .name = "RFC 3526, 2048 bit",
356 .str = &rfc3526_prime_2048,
357 .fn = BN_get_rfc3526_prime_2048,
358 },
359 {
360 .name = "RFC 3526, 3072 bit",
361 .str = &rfc3526_prime_3072,
362 .fn = BN_get_rfc3526_prime_3072,
363 },
364 {
365 .name = "RFC 3526, 4096 bit",
366 .str = &rfc3526_prime_4096,
367 .fn = BN_get_rfc3526_prime_4096,
368 },
369 {
370 .name = "RFC 3526, 6144 bit",
371 .str = &rfc3526_prime_6144,
372 .fn = BN_get_rfc3526_prime_6144,
373 },
374 {
375 .name = "RFC 3526, 8192 bit",
376 .str = &rfc3526_prime_8192,
377 .fn = BN_get_rfc3526_prime_8192,
378 },
379#if HAVE_RFC7919_PRIMES
380 {
381 .name = "RFC 7919, 2048 bit",
382 .str = &rfc7919_prime_2048,
383 .fn = BN_get_rfc7919_prime_2048,
384 },
385 {
386 .name = "RFC 7919, 3072 bit",
387 .str = &rfc7919_prime_3072,
388 .fn = BN_get_rfc7919_prime_3072,
389 },
390 {
391 .name = "RFC 7919, 4096 bit",
392 .str = &rfc7919_prime_4096,
393 .fn = BN_get_rfc7919_prime_4096,
394 },
395 {
396 .name = "RFC 7919, 6144 bit",
397 .str = &rfc7919_prime_6144,
398 .fn = BN_get_rfc7919_prime_6144,
399 },
400 {
401 .name = "RFC 7919, 8192 bit",
402 .str = &rfc7919_prime_8192,
403 .fn = BN_get_rfc7919_prime_8192,
404 },
405#endif /* HAVE_RFC7919_PRIMES */
406};
407
408#define N_TESTS (sizeof(ffdh_tests) / sizeof(ffdh_tests[0]))
409
410static int
411ffdh_test_case(const struct ffdh_test *t, BN_CTX *ctx)
412{
413 BIGNUM *pstr, *papi;
414 int failed = 1;
415
416 BN_CTX_start(ctx);
417
418 if ((pstr = BN_CTX_get(ctx)) == NULL)
419 errx(1, "BN_CTX_get");
420 if ((papi = BN_CTX_get(ctx)) == NULL)
421 errx(1, "BN_CTX_get");
422
423 if (BN_hex2bn(&pstr, *t->str) == 0)
424 errx(1, "%s: BN_hex2bn", t->name);
425 if (t->fn(papi) == NULL)
426 errx(1, "%s: BN_get_*", t->name);
427
428 if (BN_cmp(pstr, papi) != 0) {
429 fprintf(stderr, "FAIL: %s mismatch\n", t->name);
430 goto failed;
431 }
432
433 failed = 0;
434
435 failed:
436 BN_CTX_end(ctx);
437
438 return failed;
439}
440
441static int
442ffdh_check(const struct ffdh_test *t)
443{
444#if HAVE_SCAPY_SPECIAL
445 DH *dh = NULL;
446 BIGNUM *p = NULL, *g = NULL;
447 int codes = 0;
448 int failed = 1;
449
450 if (BN_hex2bn(&p, *t->str) == 0)
451 errx(1, "BN_hex2bn");
452 if (BN_hex2bn(&g, "2") == 0)
453 errx(1, "BN_hex2bn");
454
455 if ((dh = DH_new()) == NULL)
456 errx(1, "DH_new");
457 if (!DH_set0_pqg(dh, p, NULL, g))
458 errx(1, "DH_set0_pqg");
459 p = NULL;
460 g = NULL;
461
462 if (!DH_check(dh, &codes)) {
463 fprintf(stderr, "FAIL: %s: DH_check\n", t->name);
464 goto failed;
465 }
466 if (codes != 0) {
467 fprintf(stderr, "FAIL: %s: DH_check set %x\n", t->name, codes);
468 goto failed;
469 }
470
471 failed = 0;
472
473 failed:
474 BN_free(p);
475 BN_free(g);
476 DH_free(dh);
477
478 return failed;
479#else
480 return 0;
481#endif /* HAVE_SCAPY_SPECIAL */
482}
483
484int
485main(void)
486{
487 BN_CTX *ctx;
488 size_t i;
489 int failed = 0;
490
491 if ((ctx = BN_CTX_new()) == NULL)
492 errx(1, "BN_CTX_new");
493
494 for (i = 0; i < N_TESTS; i++) {
495 failed |= ffdh_test_case(&ffdh_tests[i], ctx);
496 failed |= ffdh_check(&ffdh_tests[i]);
497 }
498
499 BN_CTX_free(ctx);
500
501 return failed;
502}