MySQL 26.7.0
Source Code Documentation
dh_ecdh_config.h
Go to the documentation of this file.
1/*
2 Copyright (c) 2018, 2026, Oracle and/or its affiliates.
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License, version 2.0,
6 as published by the Free Software Foundation.
7
8 This program is designed to work with certain software (including
9 but not limited to OpenSSL) that is licensed under separate terms,
10 as designated in a particular file or component or in included license
11 documentation. The authors of MySQL hereby grant you an additional
12 permission to link the program and your derivative works with the
13 separately licensed software that they have either included with
14 the program or referenced in the documentation.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24*/
25
26#ifndef DH_KEYS_INCLUDED
27#define DH_KEYS_INCLUDED
28
29#ifdef MYSQL_SERVER
30#include "my_dbug.h"
31#endif /* MYSQL_SERVER */
32
33#include <openssl/dh.h>
34#include <openssl/err.h>
35#include <openssl/evp.h>
36#include <openssl/ssl.h>
37
38#include <algorithm>
39#include <string>
40#include <string_view>
41#include <vector>
42
43#if OPENSSL_VERSION_NUMBER < 0x10002000L
44#include <openssl/ec.h>
45#endif /* OPENSSL_VERSION_NUMBER < 0x10002000L */
46
47namespace {
48[[maybe_unused]] constexpr bool tls_pqc_sign_supported() {
49#if defined(HAVE_TLSv13) && OPENSSL_VERSION_NUMBER >= 0x30500000L
50 return true;
51#else
52 return false;
53#endif
54}
55
56#if OPENSSL_VERSION_NUMBER < 0x10100000L
57/* Following primes are from https://www.rfc-editor.org/rfc/rfc7919#appendix-A
58 */
59
60const unsigned char rfc7919_ffdhe2048_p[] = {
61 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xF8, 0x54, 0x58,
62 0xA2, 0xBB, 0x4A, 0x9A, 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1,
63 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95, 0xA9, 0xE1, 0x36, 0x41,
64 0x14, 0x64, 0x33, 0xFB, 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9,
65 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8, 0xF6, 0x81, 0xB2, 0x02,
66 0xAE, 0xC4, 0x61, 0x7A, 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61,
67 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0, 0x85, 0x63, 0x65, 0x55,
68 0x3D, 0xED, 0x1A, 0xF3, 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35,
69 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77, 0xE2, 0xA6, 0x89, 0xDA,
70 0xF3, 0xEF, 0xE8, 0x72, 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35,
71 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, 0xBC, 0x0A, 0xB1, 0x82,
72 0xB3, 0x24, 0xFB, 0x61, 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB,
73 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68, 0x1D, 0x4F, 0x42, 0xA3,
74 0xDE, 0x39, 0x4D, 0xF4, 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19,
75 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70, 0x9E, 0x02, 0xFC, 0xE1,
76 0xCD, 0xF7, 0xE2, 0xEC, 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61,
77 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF, 0x8E, 0x4F, 0x12, 0x32,
78 0xEE, 0xF2, 0x81, 0x83, 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73,
79 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05, 0xC5, 0x8E, 0xF1, 0x83,
80 0x7D, 0x16, 0x83, 0xB2, 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA,
81 0x88, 0x6B, 0x42, 0x38, 0x61, 0x28, 0x5C, 0x97, 0xFF, 0xFF, 0xFF, 0xFF,
82 0xFF, 0xFF, 0xFF, 0xFF};
83
84const unsigned char rfc7919_ffdhe3072_p[] = {
85 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xF8, 0x54, 0x58,
86 0xA2, 0xBB, 0x4A, 0x9A, 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1,
87 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95, 0xA9, 0xE1, 0x36, 0x41,
88 0x14, 0x64, 0x33, 0xFB, 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9,
89 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8, 0xF6, 0x81, 0xB2, 0x02,
90 0xAE, 0xC4, 0x61, 0x7A, 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61,
91 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0, 0x85, 0x63, 0x65, 0x55,
92 0x3D, 0xED, 0x1A, 0xF3, 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35,
93 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77, 0xE2, 0xA6, 0x89, 0xDA,
94 0xF3, 0xEF, 0xE8, 0x72, 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35,
95 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, 0xBC, 0x0A, 0xB1, 0x82,
96 0xB3, 0x24, 0xFB, 0x61, 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB,
97 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68, 0x1D, 0x4F, 0x42, 0xA3,
98 0xDE, 0x39, 0x4D, 0xF4, 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19,
99 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70, 0x9E, 0x02, 0xFC, 0xE1,
100 0xCD, 0xF7, 0xE2, 0xEC, 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61,
101 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF, 0x8E, 0x4F, 0x12, 0x32,
102 0xEE, 0xF2, 0x81, 0x83, 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73,
103 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05, 0xC5, 0x8E, 0xF1, 0x83,
104 0x7D, 0x16, 0x83, 0xB2, 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA,
105 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC, 0xDE, 0x35, 0x5B, 0x3B,
106 0x65, 0x19, 0x03, 0x5B, 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38,
107 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07, 0x7A, 0xD9, 0x1D, 0x26,
108 0x91, 0xF7, 0xF7, 0xEE, 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C,
109 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70, 0xB4, 0x13, 0x0C, 0x93,
110 0xBC, 0x43, 0x79, 0x44, 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3,
111 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF, 0x5C, 0xAE, 0x82, 0xAB,
112 0x9C, 0x9D, 0xF6, 0x9E, 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D,
113 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA, 0x1D, 0xBF, 0x9A, 0x42,
114 0xD5, 0xC4, 0x48, 0x4E, 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF,
115 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C, 0x25, 0xE4, 0x1D, 0x2B,
116 0x66, 0xC6, 0x2E, 0x37, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
117
118const unsigned char rfc7919_ffdhe8192_p[] = {
119 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xF8, 0x54, 0x58,
120 0xA2, 0xBB, 0x4A, 0x9A, 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, 0x3C, 0xF1,
121 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95, 0xA9, 0xE1, 0x36, 0x41,
122 0x14, 0x64, 0x33, 0xFB, 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9,
123 0x7D, 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8, 0xF6, 0x81, 0xB2, 0x02,
124 0xAE, 0xC4, 0x61, 0x7A, 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61,
125 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0, 0x85, 0x63, 0x65, 0x55,
126 0x3D, 0xED, 0x1A, 0xF3, 0xB5, 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35,
127 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, 0x8B, 0x77, 0xE2, 0xA6, 0x89, 0xDA,
128 0xF3, 0xEF, 0xE8, 0x72, 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35,
129 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, 0xBC, 0x0A, 0xB1, 0x82,
130 0xB3, 0x24, 0xFB, 0x61, 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, 0xE3, 0xFB,
131 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68, 0x1D, 0x4F, 0x42, 0xA3,
132 0xDE, 0x39, 0x4D, 0xF4, 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19,
133 0x0B, 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70, 0x9E, 0x02, 0xFC, 0xE1,
134 0xCD, 0xF7, 0xE2, 0xEC, 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61,
135 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF, 0x8E, 0x4F, 0x12, 0x32,
136 0xEE, 0xF2, 0x81, 0x83, 0xC3, 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73,
137 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, 0x20, 0x05, 0xC5, 0x8E, 0xF1, 0x83,
138 0x7D, 0x16, 0x83, 0xB2, 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA,
139 0x88, 0x6B, 0x42, 0x38, 0x61, 0x1F, 0xCF, 0xDC, 0xDE, 0x35, 0x5B, 0x3B,
140 0x65, 0x19, 0x03, 0x5B, 0xBC, 0x34, 0xF4, 0xDE, 0xF9, 0x9C, 0x02, 0x38,
141 0x61, 0xB4, 0x6F, 0xC9, 0xD6, 0xE6, 0xC9, 0x07, 0x7A, 0xD9, 0x1D, 0x26,
142 0x91, 0xF7, 0xF7, 0xEE, 0x59, 0x8C, 0xB0, 0xFA, 0xC1, 0x86, 0xD9, 0x1C,
143 0xAE, 0xFE, 0x13, 0x09, 0x85, 0x13, 0x92, 0x70, 0xB4, 0x13, 0x0C, 0x93,
144 0xBC, 0x43, 0x79, 0x44, 0xF4, 0xFD, 0x44, 0x52, 0xE2, 0xD7, 0x4D, 0xD3,
145 0x64, 0xF2, 0xE2, 0x1E, 0x71, 0xF5, 0x4B, 0xFF, 0x5C, 0xAE, 0x82, 0xAB,
146 0x9C, 0x9D, 0xF6, 0x9E, 0xE8, 0x6D, 0x2B, 0xC5, 0x22, 0x36, 0x3A, 0x0D,
147 0xAB, 0xC5, 0x21, 0x97, 0x9B, 0x0D, 0xEA, 0xDA, 0x1D, 0xBF, 0x9A, 0x42,
148 0xD5, 0xC4, 0x48, 0x4E, 0x0A, 0xBC, 0xD0, 0x6B, 0xFA, 0x53, 0xDD, 0xEF,
149 0x3C, 0x1B, 0x20, 0xEE, 0x3F, 0xD5, 0x9D, 0x7C, 0x25, 0xE4, 0x1D, 0x2B,
150 0x66, 0x9E, 0x1E, 0xF1, 0x6E, 0x6F, 0x52, 0xC3, 0x16, 0x4D, 0xF4, 0xFB,
151 0x79, 0x30, 0xE9, 0xE4, 0xE5, 0x88, 0x57, 0xB6, 0xAC, 0x7D, 0x5F, 0x42,
152 0xD6, 0x9F, 0x6D, 0x18, 0x77, 0x63, 0xCF, 0x1D, 0x55, 0x03, 0x40, 0x04,
153 0x87, 0xF5, 0x5B, 0xA5, 0x7E, 0x31, 0xCC, 0x7A, 0x71, 0x35, 0xC8, 0x86,
154 0xEF, 0xB4, 0x31, 0x8A, 0xED, 0x6A, 0x1E, 0x01, 0x2D, 0x9E, 0x68, 0x32,
155 0xA9, 0x07, 0x60, 0x0A, 0x91, 0x81, 0x30, 0xC4, 0x6D, 0xC7, 0x78, 0xF9,
156 0x71, 0xAD, 0x00, 0x38, 0x09, 0x29, 0x99, 0xA3, 0x33, 0xCB, 0x8B, 0x7A,
157 0x1A, 0x1D, 0xB9, 0x3D, 0x71, 0x40, 0x00, 0x3C, 0x2A, 0x4E, 0xCE, 0xA9,
158 0xF9, 0x8D, 0x0A, 0xCC, 0x0A, 0x82, 0x91, 0xCD, 0xCE, 0xC9, 0x7D, 0xCF,
159 0x8E, 0xC9, 0xB5, 0x5A, 0x7F, 0x88, 0xA4, 0x6B, 0x4D, 0xB5, 0xA8, 0x51,
160 0xF4, 0x41, 0x82, 0xE1, 0xC6, 0x8A, 0x00, 0x7E, 0x5E, 0x0D, 0xD9, 0x02,
161 0x0B, 0xFD, 0x64, 0xB6, 0x45, 0x03, 0x6C, 0x7A, 0x4E, 0x67, 0x7D, 0x2C,
162 0x38, 0x53, 0x2A, 0x3A, 0x23, 0xBA, 0x44, 0x42, 0xCA, 0xF5, 0x3E, 0xA6,
163 0x3B, 0xB4, 0x54, 0x32, 0x9B, 0x76, 0x24, 0xC8, 0x91, 0x7B, 0xDD, 0x64,
164 0xB1, 0xC0, 0xFD, 0x4C, 0xB3, 0x8E, 0x8C, 0x33, 0x4C, 0x70, 0x1C, 0x3A,
165 0xCD, 0xAD, 0x06, 0x57, 0xFC, 0xCF, 0xEC, 0x71, 0x9B, 0x1F, 0x5C, 0x3E,
166 0x4E, 0x46, 0x04, 0x1F, 0x38, 0x81, 0x47, 0xFB, 0x4C, 0xFD, 0xB4, 0x77,
167 0xA5, 0x24, 0x71, 0xF7, 0xA9, 0xA9, 0x69, 0x10, 0xB8, 0x55, 0x32, 0x2E,
168 0xDB, 0x63, 0x40, 0xD8, 0xA0, 0x0E, 0xF0, 0x92, 0x35, 0x05, 0x11, 0xE3,
169 0x0A, 0xBE, 0xC1, 0xFF, 0xF9, 0xE3, 0xA2, 0x6E, 0x7F, 0xB2, 0x9F, 0x8C,
170 0x18, 0x30, 0x23, 0xC3, 0x58, 0x7E, 0x38, 0xDA, 0x00, 0x77, 0xD9, 0xB4,
171 0x76, 0x3E, 0x4E, 0x4B, 0x94, 0xB2, 0xBB, 0xC1, 0x94, 0xC6, 0x65, 0x1E,
172 0x77, 0xCA, 0xF9, 0x92, 0xEE, 0xAA, 0xC0, 0x23, 0x2A, 0x28, 0x1B, 0xF6,
173 0xB3, 0xA7, 0x39, 0xC1, 0x22, 0x61, 0x16, 0x82, 0x0A, 0xE8, 0xDB, 0x58,
174 0x47, 0xA6, 0x7C, 0xBE, 0xF9, 0xC9, 0x09, 0x1B, 0x46, 0x2D, 0x53, 0x8C,
175 0xD7, 0x2B, 0x03, 0x74, 0x6A, 0xE7, 0x7F, 0x5E, 0x62, 0x29, 0x2C, 0x31,
176 0x15, 0x62, 0xA8, 0x46, 0x50, 0x5D, 0xC8, 0x2D, 0xB8, 0x54, 0x33, 0x8A,
177 0xE4, 0x9F, 0x52, 0x35, 0xC9, 0x5B, 0x91, 0x17, 0x8C, 0xCF, 0x2D, 0xD5,
178 0xCA, 0xCE, 0xF4, 0x03, 0xEC, 0x9D, 0x18, 0x10, 0xC6, 0x27, 0x2B, 0x04,
179 0x5B, 0x3B, 0x71, 0xF9, 0xDC, 0x6B, 0x80, 0xD6, 0x3F, 0xDD, 0x4A, 0x8E,
180 0x9A, 0xDB, 0x1E, 0x69, 0x62, 0xA6, 0x95, 0x26, 0xD4, 0x31, 0x61, 0xC1,
181 0xA4, 0x1D, 0x57, 0x0D, 0x79, 0x38, 0xDA, 0xD4, 0xA4, 0x0E, 0x32, 0x9C,
182 0xCF, 0xF4, 0x6A, 0xAA, 0x36, 0xAD, 0x00, 0x4C, 0xF6, 0x00, 0xC8, 0x38,
183 0x1E, 0x42, 0x5A, 0x31, 0xD9, 0x51, 0xAE, 0x64, 0xFD, 0xB2, 0x3F, 0xCE,
184 0xC9, 0x50, 0x9D, 0x43, 0x68, 0x7F, 0xEB, 0x69, 0xED, 0xD1, 0xCC, 0x5E,
185 0x0B, 0x8C, 0xC3, 0xBD, 0xF6, 0x4B, 0x10, 0xEF, 0x86, 0xB6, 0x31, 0x42,
186 0xA3, 0xAB, 0x88, 0x29, 0x55, 0x5B, 0x2F, 0x74, 0x7C, 0x93, 0x26, 0x65,
187 0xCB, 0x2C, 0x0F, 0x1C, 0xC0, 0x1B, 0xD7, 0x02, 0x29, 0x38, 0x88, 0x39,
188 0xD2, 0xAF, 0x05, 0xE4, 0x54, 0x50, 0x4A, 0xC7, 0x8B, 0x75, 0x82, 0x82,
189 0x28, 0x46, 0xC0, 0xBA, 0x35, 0xC3, 0x5F, 0x5C, 0x59, 0x16, 0x0C, 0xC0,
190 0x46, 0xFD, 0x82, 0x51, 0x54, 0x1F, 0xC6, 0x8C, 0x9C, 0x86, 0xB0, 0x22,
191 0xBB, 0x70, 0x99, 0x87, 0x6A, 0x46, 0x0E, 0x74, 0x51, 0xA8, 0xA9, 0x31,
192 0x09, 0x70, 0x3F, 0xEE, 0x1C, 0x21, 0x7E, 0x6C, 0x38, 0x26, 0xE5, 0x2C,
193 0x51, 0xAA, 0x69, 0x1E, 0x0E, 0x42, 0x3C, 0xFC, 0x99, 0xE9, 0xE3, 0x16,
194 0x50, 0xC1, 0x21, 0x7B, 0x62, 0x48, 0x16, 0xCD, 0xAD, 0x9A, 0x95, 0xF9,
195 0xD5, 0xB8, 0x01, 0x94, 0x88, 0xD9, 0xC0, 0xA0, 0xA1, 0xFE, 0x30, 0x75,
196 0xA5, 0x77, 0xE2, 0x31, 0x83, 0xF8, 0x1D, 0x4A, 0x3F, 0x2F, 0xA4, 0x57,
197 0x1E, 0xFC, 0x8C, 0xE0, 0xBA, 0x8A, 0x4F, 0xE8, 0xB6, 0x85, 0x5D, 0xFE,
198 0x72, 0xB0, 0xA6, 0x6E, 0xDE, 0xD2, 0xFB, 0xAB, 0xFB, 0xE5, 0x8A, 0x30,
199 0xFA, 0xFA, 0xBE, 0x1C, 0x5D, 0x71, 0xA8, 0x7E, 0x2F, 0x74, 0x1E, 0xF8,
200 0xC1, 0xFE, 0x86, 0xFE, 0xA6, 0xBB, 0xFD, 0xE5, 0x30, 0x67, 0x7F, 0x0D,
201 0x97, 0xD1, 0x1D, 0x49, 0xF7, 0xA8, 0x44, 0x3D, 0x08, 0x22, 0xE5, 0x06,
202 0xA9, 0xF4, 0x61, 0x4E, 0x01, 0x1E, 0x2A, 0x94, 0x83, 0x8F, 0xF8, 0x8C,
203 0xD6, 0x8C, 0x8B, 0xB7, 0xC5, 0xC6, 0x42, 0x4C, 0xFF, 0xFF, 0xFF, 0xFF,
204 0xFF, 0xFF, 0xFF, 0xFF};
205
206const unsigned char rfc7919_g[] = {0x02};
207
208#endif /* OPENSSL_VERSION_NUMBER < 0x10100000L */
209
210/**
211 Set DH paramenter for given SSL context
212
213 @param [in] ctx SSL context
214
215 @return status of operation
216 @retval false Success
217 @retval true Failure
218*/
219[[maybe_unused]] bool set_dh(SSL_CTX *ctx) {
220 int security_level = 2;
221#if OPENSSL_VERSION_NUMBER >= 0x10100000L
222 security_level = SSL_CTX_get_security_level(ctx);
223#ifdef MYSQL_SERVER
224 assert(security_level <= 5);
225#endif /* MYSQL_SERVER */
226 if (security_level < 2) security_level = 2;
227#endif /* OPENSSL_VERSION_NUMBER >= 0x10100000L */
228#ifdef MYSQL_SERVER
229 DBUG_EXECUTE_IF("crypto_policy_3", security_level = 3;);
230#endif /* MYSQL_SERVER */
231
232#if OPENSSL_VERSION_NUMBER >= 0x30000000L
233 if (SSL_CTX_set_dh_auto(ctx, 1) == 0) {
234 return true;
235 }
236#else /* OPENSSL_VERSION_NUMBER >= 0x30000000L */
237
238 DH *dh = nullptr;
239#if OPENSSL_VERSION_NUMBER >= 0x10100000L
240 switch (security_level) {
241 case 1:
242 [[fallthrough]];
243 case 2:
244 dh = DH_new_by_nid(NID_ffdhe2048);
245 break;
246 case 3:
247 dh = DH_new_by_nid(NID_ffdhe3072);
248 break;
249 case 4:
250 dh = DH_new_by_nid(NID_ffdhe8192);
251 break;
252 case 5:
253 /* there is no RFC7919 approved prime for sec level 5 */
254 [[fallthrough]];
255 default:
256 break;
257 };
258#else /* OPENSSL_VERSION_NUMBER >= 0x10100000L */
259 dh = DH_new();
260 if (!dh) return true;
261
262 switch (security_level) {
263 case 1:
264 [[fallthrough]];
265 case 2:
266 dh->p =
267 BN_bin2bn(rfc7919_ffdhe2048_p, sizeof(rfc7919_ffdhe2048_p), nullptr);
268 break;
269 case 3:
270 dh->p =
271 BN_bin2bn(rfc7919_ffdhe3072_p, sizeof(rfc7919_ffdhe3072_p), nullptr);
272 break;
273 case 4:
274 dh->p =
275 BN_bin2bn(rfc7919_ffdhe8192_p, sizeof(rfc7919_ffdhe8192_p), nullptr);
276 break;
277 case 5:
278 /* There is no RFC7919 approved prime for sec level 5 */
279 [[fallthrough]];
280 default:
281 DH_free(dh);
282 return true;
283 };
284
285 dh->g = BN_bin2bn(rfc7919_g, sizeof(rfc7919_g), nullptr);
286 if (!dh->p || !dh->g) {
287 DH_free(dh);
288 return true;
289 }
290#endif /* OPENSSL_VERSION_NUMBER >= 0x10100000L */
291 if (SSL_CTX_set_tmp_dh(ctx, dh) == 0) {
292 if (dh) DH_free(dh);
293 return true;
294 }
295 DH_free(dh);
296
297#endif /* OPENSSL_VERSION_NUMBER >= 0x30000000L */
298 return false;
299}
300
301/**
302 Filter a user-configured TLS key exchange list against the internal
303 allowlist and optional PQC-only restriction. Duplicate groups are ignored.
304
305 @param [in] tls_kex Colon-delimited TLS key exchange group list
306 @param [in] force_pqc Require only PQC-capable groups
307 @param [out] filtered Sanitized TLS key exchange group list
308
309 @returns status of operation
310 @retval false Success
311 @retval true Rejected group supplied or no allowlisted groups remain
312*/
313bool sanitize_tls_kex_list(const char *tls_kex, bool force_pqc,
314 std::string *filtered) {
315 filtered->clear();
316 if (tls_kex == nullptr || tls_kex[0] == '\0') return false;
317
318 static constexpr const char *classic_groups[] = {
319#ifdef NID_X25519
320 "X25519",
321#endif
322 "secp384r1", "secp256r1", "secp521r1"};
323#if OPENSSL_VERSION_NUMBER >= 0x30500000L
324 static constexpr const char *pqc_groups[] = {
325 "X25519MLKEM768", "secp384r1MLKEM1024", "secp256r1MLKEM768", "MLKEM512",
326 "MLKEM768"};
327#endif
328
329 auto is_allowed = [](std::string_view group, bool &is_pqc_capable) {
330#if OPENSSL_VERSION_NUMBER >= 0x30500000L
331 for (const char *candidate : pqc_groups) {
332 if (group == candidate) {
333 is_pqc_capable = true;
334 return true;
335 }
336 }
337#endif
338 is_pqc_capable = false;
339 for (const char *candidate : classic_groups) {
340 if (group == candidate) return true;
341 }
342 return false;
343 };
344
345 std::string groups(tls_kex);
346 std::vector<std::string_view> seen_groups;
347 size_t begin = 0;
348 while (begin <= groups.length()) {
349 const size_t end = groups.find(':', begin);
350 const std::string_view token{
351 groups.data() + begin,
352 end == std::string::npos ? groups.length() - begin : end - begin};
353
354 bool is_pqc_capable;
355 if (token.empty() || !is_allowed(token, is_pqc_capable) ||
356 (force_pqc && !is_pqc_capable))
357 return true;
358
359 if (std::find(seen_groups.begin(), seen_groups.end(), token) ==
360 seen_groups.end()) {
361 seen_groups.push_back(token);
362 if (!filtered->empty()) filtered->append(":");
363 filtered->append(token);
364 }
365
366 if (end == std::string::npos) break;
367 begin = end + 1;
368 }
369
370 return false;
371}
372
373/**
374 Set EC curve details
375
376 @param [in] ctx SSL Context
377 @param force_pqc Force Post-Quantum Crypto KEX algorithms
378 @param tls_kex Explicit TLS key exchange group list
379
380 @returns status of operation
381 @retval false Success
382 @retval true Error
383*/
384[[maybe_unused]] bool set_ecdh(SSL_CTX *ctx, bool force_pqc = false,
385 const char *tls_kex = nullptr) {
386#if OPENSSL_VERSION_NUMBER < 0x10002000L
387 if (tls_kex != nullptr && tls_kex[0] != '\0') return true;
388 EC_KEY *eckey = nullptr;
389 /* We choose NID_X9_62_prime256v1 curve. */
390 eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
391 if (SSL_CTX_set_tmp_ecdh(ctx, eckey) != 1) {
392 if (eckey) EC_KEY_free(eckey);
393 return true;
394 }
395 if (eckey) EC_KEY_free(eckey);
396#else /* OPENSSL_VERSION_NUMBER < 0x10002000L */
397 std::string filtered_tls_kex;
398 if (sanitize_tls_kex_list(tls_kex, force_pqc, &filtered_tls_kex)) return true;
399
400 if (!filtered_tls_kex.empty()) {
401#if OPENSSL_VERSION_NUMBER >= 0x30500000L
402 if (SSL_CTX_set1_groups_list(
403 ctx, const_cast<char *>(filtered_tls_kex.c_str())) == 0)
404 return true;
405#else /* OPENSSL_VERSION_NUMBER >= 0x30500000L */
406 auto group_name_to_nid = [](const std::string &group) {
407#ifdef NID_X25519
408 if (group == "X25519") return NID_X25519;
409#endif
410 if (group == "secp384r1") return NID_secp384r1;
411 if (group == "secp256r1") return NID_X9_62_prime256v1;
412 if (group == "secp521r1") return NID_secp521r1;
413 return NID_undef;
414 };
415
416 std::vector<int> groups;
417 groups.reserve(4);
418 size_t begin = 0;
419 while (begin <= filtered_tls_kex.length()) {
420 const size_t end = filtered_tls_kex.find(':', begin);
421 const std::string token =
422 end == std::string::npos
423 ? filtered_tls_kex.substr(begin)
424 : filtered_tls_kex.substr(begin, end - begin);
425 const int nid = group_name_to_nid(token);
426 if (nid != NID_undef) groups.push_back(nid);
427 if (end == std::string::npos) break;
428 begin = end + 1;
429 }
430
431 if (groups.empty()) return true;
432
433#if OPENSSL_VERSION_NUMBER >= 0x10100000L
434 if (SSL_CTX_set1_groups(ctx, groups.data(),
435 static_cast<int>(groups.size())) == 0)
436 return true;
437#else /* OPENSSL_VERSION_NUMBER >= 0x10100000L */
438 if (SSL_CTX_set1_curves(ctx, groups.data(),
439 static_cast<int>(groups.size())) == 0)
440 return true;
441 if (SSL_CTX_set_ecdh_auto(ctx, 1) == 0) return true;
442#endif /* OPENSSL_VERSION_NUMBER >= 0x10100000L */
443#endif /* OPENSSL_VERSION_NUMBER >= 0x30500000L */
444
445 return false;
446 }
447
448#if OPENSSL_VERSION_NUMBER >= 0x30500000L
449 /* Add support for Post-Quantum Cryptography (PQC) TLS 1.3
450 * key exchange algorithms (introduced with OpenSSL >= 3.5.0).
451 *
452 * The configuration must work for both standard and FIPS mode
453 * (FIPS provider does not implement PQC yet), so all entries
454 * here are prefixed with ? to auto-ignore missing implementations.
455 *
456 * It must also work with TLS 1.2, i.e. PQC is currently optional,
457 * we do not enforce strict compliance yet to make the server work
458 * with legacy clients.
459 * At some point, we may enforce strict PQC mode compliance, phasing
460 * out the legacy, less secure protocols.
461 *
462 * The cryptographic groups list below (used for key exchange) favors
463 * hybrid PQC groups (vs pure PQC) for better compatibility and
464 * performance, with fallback to classical groups for legacy clients.
465 * The '/' tuple separator keeps the classical fallback below the PQC
466 * tuple, even when a TLS 1.3 client predicts only a classical key share. */
467 static constexpr char force_pqc_groups[] =
468 "X25519MLKEM768:" /* hybrid X25519 + ML-KEM-768 */
469 "secp384r1MLKEM1024:" /* hybrid P-384 + ML-KEM-1024 */
470 "secp256r1MLKEM768:" /* hybrid P-256 + ML-KEM-768 */
471 "MLKEM512:MLKEM768"; /* pure ML-KEM */
472 static constexpr char default_groups[] =
473 "?X25519MLKEM768:" /* hybrid X25519 + ML-KEM-768 (if available) */
474 "?secp384r1MLKEM1024:" /* hybrid P-384 + ML-KEM-1024 */
475 "?secp256r1MLKEM768:" /* hybrid P-256 + ML-KEM-768 */
476 "?MLKEM512:?MLKEM768/" /* pure ML-KEM */
477#ifdef NID_X25519
478 "?X25519:" /* classical groups as fallback */
479#endif
480 "?secp384r1:"
481 "?secp256r1:"
482 "?secp521r1";
483 static constexpr char fallback_groups[] =
484#ifdef NID_X25519
485 "?X25519:"
486#endif
487 "?secp384r1:"
488 "?secp256r1:"
489 "?secp521r1";
490
491 const char *const selected_groups =
492 force_pqc ? force_pqc_groups : default_groups;
493 const char *const selected_fallback_groups =
494 force_pqc ? nullptr : fallback_groups;
495
496 if (SSL_CTX_set1_groups_list(ctx, const_cast<char *>(selected_groups)) == 0) {
497 if (selected_fallback_groups != nullptr) {
498 ERR_clear_error();
499 if (SSL_CTX_set1_groups_list(
500 ctx, const_cast<char *>(selected_fallback_groups)) != 0)
501 return false;
502 }
503 return true;
504 }
505#else /* OPENSSL_VERSION_NUMBER >= 0x30500000L */
506 if (force_pqc) return true;
507
508 int groups[] = {
509#ifdef NID_X25519
510 NID_X25519,
511#endif
512 NID_secp384r1, NID_X9_62_prime256v1, NID_secp521r1};
513 int group_size = sizeof(groups) / sizeof(int);
514#if OPENSSL_VERSION_NUMBER >= 0x10100000L
515 if (SSL_CTX_set1_groups(ctx, groups, group_size) == 0) return true;
516#else /* OPENSSL_VERSION_NUMBER >= 0x10100000L */
517 if (SSL_CTX_set1_curves(ctx, groups, group_size) == 0) return true;
518 if (SSL_CTX_set_ecdh_auto(ctx, 1) == 0) return true;
519#endif /* OPENSSL_VERSION_NUMBER >= 0x10100000L */
520#endif /* OPENSSL_VERSION_NUMBER >= 0x30500000L */
521
522#endif /* OPENSSL_VERSION_NUMBER < 0x10002000L */
523
524 return false;
525}
526
527} // namespace
528
529#endif /* DH_KEYS_INCLUDED */
Kerberos Client Authentication nullptr
Definition: auth_kerberos_client_plugin.cc:247
#define DBUG_EXECUTE_IF(keyword, a1)
Definition: my_dbug.h:171
const unsigned char rfc7919_ffdhe2048_p[]
Definition: dh_ecdh_config.h:60
bool set_dh(SSL_CTX *ctx)
Set DH paramenter for given SSL context.
Definition: dh_ecdh_config.h:219
constexpr bool tls_pqc_sign_supported()
Definition: dh_ecdh_config.h:48
const unsigned char rfc7919_ffdhe8192_p[]
Definition: dh_ecdh_config.h:118
const unsigned char rfc7919_g[]
Definition: dh_ecdh_config.h:206
bool sanitize_tls_kex_list(const char *tls_kex, bool force_pqc, std::string *filtered)
Filter a user-configured TLS key exchange list against the internal allowlist and optional PQC-only r...
Definition: dh_ecdh_config.h:313
const unsigned char rfc7919_ffdhe3072_p[]
Definition: dh_ecdh_config.h:84
bool set_ecdh(SSL_CTX *ctx, bool force_pqc=false, const char *tls_kex=nullptr)
Set EC curve details.
Definition: dh_ecdh_config.h:384
Container::const_iterator find(const Container &c, Value &&value)
Definition: generic.h:40
const char * begin(const char *const c)
Definition: base64.h:44
Cursor end()
A past-the-end Cursor.
Definition: rules_table_service.cc:192
int security_level(void)
Definition: sql_authentication.cc:1291