Skip to content

Commit c4d7585

Browse files
committed
Added: TLSGroupInfo
Added: New Entrypoint to build Added: New NIDs
1 parent 9de9757 commit c4d7585

File tree

5 files changed

+191
-7
lines changed

5 files changed

+191
-7
lines changed

MATRIX.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@
384384
| `SSL_get_version` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
385385
| `SSL_get_wbio` | | :white_check_mark: | :white_check_mark: | :white_check_mark: |
386386
| `SSL_get_wfd` | | | | |
387-
| `SSL_group_to_name` | | | | |
387+
| `SSL_group_to_name` | | | | :white_check_mark: |
388388
| `SSL_has_matching_session_id` | | | | |
389389
| `SSL_has_pending` | | | | :white_check_mark: |
390390
| `SSL_in_before` | | | | :white_check_mark: |

build.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ const ENTRYPOINTS: &[&str] = &[
193193
"SSL_get_verify_result",
194194
"SSL_get_version",
195195
"SSL_get_wbio",
196+
"SSL_group_to_name",
196197
"SSL_has_pending",
197198
"SSL_in_before",
198199
"SSL_in_init",

src/constants.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,17 +123,21 @@ pub fn sig_scheme_to_type_nid(scheme: SignatureScheme) -> Option<c_int> {
123123
pub fn named_group_to_nid(group: NamedGroup) -> Option<c_int> {
124124
use NamedGroup::*;
125125

126+
// See TLSEXT_nid_unknown from tls1.h - openssl-sys does not
127+
// have a constant for this to import.
128+
const TLSEXT_NID_UNKNOWN: c_int = 0x1000000;
126129
// See NID_ffhdhe* from obj_mac.h - openssl-sys does not have
127130
// constants for these to import.
128131
const NID_FFDHE2048: c_int = 1126;
129132
const NID_FFDHE3072: c_int = 1127;
130133
const NID_FFDHE4096: c_int = 1128;
131134
const NID_FFDHE6144: c_int = 1129;
132135
const NID_FFDHE8192: c_int = 1130;
133-
134-
// See TLSEXT_nid_unknown from tls1.h - openssl-sys does not
135-
// have a constant for this to import.
136-
const TLSEXT_NID_UNKNOWN: c_int = 0x1000000;
136+
// See NID_ML_KEM_* from obj_mac.h - openssl-sys does not have
137+
// constants for these to import.
138+
const NID_ML_KEM_512: c_int = 1454;
139+
const NID_ML_KEM_768: c_int = 1455;
140+
const NID_ML_KEM_1024: c_int = 1456;
137141

138142
match group {
139143
secp256r1 => Some(NID_X9_62_prime256v1),
@@ -146,6 +150,9 @@ pub fn named_group_to_nid(group: NamedGroup) -> Option<c_int> {
146150
FFDHE4096 => Some(NID_FFDHE4096),
147151
FFDHE6144 => Some(NID_FFDHE6144),
148152
FFDHE8192 => Some(NID_FFDHE8192),
153+
MLKEM512 => Some(NID_ML_KEM_512),
154+
MLKEM768 => Some(NID_ML_KEM_768),
155+
MLKEM1024 => Some(NID_ML_KEM_1024),
149156
other => Some(TLSEXT_NID_UNKNOWN | u16::from(other) as c_int),
150157
}
151158
}

src/entry.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1475,6 +1475,20 @@ entry! {
14751475
}
14761476
}
14771477

1478+
entry! {
1479+
pub fn _SSL_group_to_name(ssl: *const SSL, id: c_int) -> *const c_char {
1480+
try_clone_arc!(ssl)
1481+
.get()
1482+
.get_groups()
1483+
.iter()
1484+
.find(|group| named_group_to_nid(group.name()) == Some(id))
1485+
.map(|group| group.name())
1486+
.and_then(crate::TlsGroupInfo::find_by_id)
1487+
.map(|group| group.tls_name.as_ptr())
1488+
.unwrap_or_else(ptr::null)
1489+
}
1490+
}
1491+
14781492
entry! {
14791493
pub fn _SSL_version(ssl: *const SSL) -> c_int {
14801494
try_clone_arc!(ssl)

src/lib.rs

Lines changed: 164 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@ use openssl_sys::{
1111
EVP_PKEY, SSL_ERROR_NONE, SSL_ERROR_SSL, SSL_ERROR_WANT_READ, SSL_ERROR_WANT_WRITE, X509,
1212
X509_STORE, X509_V_ERR_UNSPECIFIED,
1313
};
14+
1415
use rustls::client::Resumption;
1516
use rustls::crypto::{aws_lc_rs as provider, SupportedKxGroup};
1617
use rustls::pki_types::{CertificateDer, ServerName};
1718
use rustls::server::{Accepted, Acceptor, ProducesTickets};
1819
use rustls::{
1920
AlertDescription, CipherSuite, ClientConfig, ClientConnection, Connection, HandshakeKind,
20-
ProtocolVersion, ServerConfig, SignatureScheme, SupportedProtocolVersion,
21+
NamedGroup, ProtocolVersion, ServerConfig, SignatureScheme, SupportedProtocolVersion,
2122
};
2223

2324
use not_thread_safe::NotThreadSafe;
@@ -239,6 +240,158 @@ static TLS13_CHACHA20_POLY1305_SHA256: SslCipher = SslCipher {
239240
description: c"TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any Au=any Enc=CHACHA20/POLY1305(256) Mac=AEAD\n",
240241
};
241242

243+
#[allow(dead_code)]
244+
struct TlsGroupInfo {
245+
pub tls_name: &'static CStr,
246+
pub standard_name: &'static CStr,
247+
pub algorithm: &'static CStr,
248+
pub secbits: usize,
249+
pub group_id: NamedGroup,
250+
}
251+
252+
impl TlsGroupInfo {
253+
pub fn find_by_id(id: NamedGroup) -> Option<&'static Self> {
254+
match id {
255+
NamedGroup::secp256r1 => Some(&SECP256R1),
256+
NamedGroup::secp384r1 => Some(&SECP384R1),
257+
NamedGroup::secp521r1 => Some(&SECP521R1),
258+
NamedGroup::X25519 => Some(&X25519),
259+
NamedGroup::X448 => Some(&X448),
260+
NamedGroup::FFDHE2048 => Some(&FFDHE2048),
261+
NamedGroup::FFDHE3072 => Some(&FFDHE3072),
262+
NamedGroup::FFDHE4096 => Some(&FFDHE4096),
263+
NamedGroup::FFDHE6144 => Some(&FFDHE6144),
264+
NamedGroup::FFDHE8192 => Some(&FFDHE8192),
265+
NamedGroup::MLKEM512 => Some(&MLKEM512),
266+
NamedGroup::MLKEM768 => Some(&MLKEM768),
267+
NamedGroup::MLKEM1024 => Some(&MLKEM1024),
268+
NamedGroup::X25519MLKEM768 => Some(&X25519MLKEM768),
269+
NamedGroup::secp256r1MLKEM768 => Some(&SECP256R1_MLKEM768),
270+
_ => None,
271+
}
272+
}
273+
}
274+
275+
static SECP256R1: TlsGroupInfo = TlsGroupInfo {
276+
tls_name: c"secp256r1",
277+
standard_name: c"prime256v1",
278+
algorithm: c"EC",
279+
secbits: 128,
280+
group_id: NamedGroup::secp256r1,
281+
};
282+
283+
static SECP384R1: TlsGroupInfo = TlsGroupInfo {
284+
tls_name: c"secp384r1",
285+
standard_name: c"secp384r1",
286+
algorithm: c"EC",
287+
secbits: 192,
288+
group_id: NamedGroup::secp384r1,
289+
};
290+
291+
static SECP521R1: TlsGroupInfo = TlsGroupInfo {
292+
tls_name: c"secp521r1",
293+
standard_name: c"secp521r1",
294+
algorithm: c"EC",
295+
secbits: 256,
296+
group_id: NamedGroup::secp521r1,
297+
};
298+
299+
static X25519: TlsGroupInfo = TlsGroupInfo {
300+
tls_name: c"x25519",
301+
standard_name: c"X25519",
302+
algorithm: c"X25519",
303+
secbits: 128,
304+
group_id: NamedGroup::X25519,
305+
};
306+
307+
static X448: TlsGroupInfo = TlsGroupInfo {
308+
tls_name: c"x448",
309+
standard_name: c"X448",
310+
algorithm: c"X448",
311+
secbits: 224,
312+
group_id: NamedGroup::X448,
313+
};
314+
315+
static FFDHE2048: TlsGroupInfo = TlsGroupInfo {
316+
tls_name: c"ffdhe2048",
317+
standard_name: c"ffdhe2048",
318+
algorithm: c"DH",
319+
secbits: 112,
320+
group_id: NamedGroup::FFDHE2048,
321+
};
322+
323+
static FFDHE3072: TlsGroupInfo = TlsGroupInfo {
324+
tls_name: c"ffdhe3072",
325+
standard_name: c"ffdhe3072",
326+
algorithm: c"DH",
327+
secbits: 128,
328+
group_id: NamedGroup::FFDHE3072,
329+
};
330+
331+
static FFDHE4096: TlsGroupInfo = TlsGroupInfo {
332+
tls_name: c"ffdhe4096",
333+
standard_name: c"ffdhe4096",
334+
algorithm: c"DH",
335+
secbits: 128,
336+
group_id: NamedGroup::FFDHE4096,
337+
};
338+
339+
static FFDHE6144: TlsGroupInfo = TlsGroupInfo {
340+
tls_name: c"ffdhe6144",
341+
standard_name: c"ffdhe6144",
342+
algorithm: c"DH",
343+
secbits: 128,
344+
group_id: NamedGroup::FFDHE6144,
345+
};
346+
347+
static FFDHE8192: TlsGroupInfo = TlsGroupInfo {
348+
tls_name: c"ffdhe8192",
349+
standard_name: c"ffdhe8192",
350+
algorithm: c"DH",
351+
secbits: 192,
352+
group_id: NamedGroup::FFDHE8192,
353+
};
354+
355+
static MLKEM512: TlsGroupInfo = TlsGroupInfo {
356+
tls_name: c"MLKEM512",
357+
standard_name: c"",
358+
algorithm: c"ML-KEM-512",
359+
secbits: 128,
360+
group_id: NamedGroup::MLKEM512,
361+
};
362+
363+
static MLKEM768: TlsGroupInfo = TlsGroupInfo {
364+
tls_name: c"MLKEM768",
365+
standard_name: c"",
366+
algorithm: c"ML-KEM-768",
367+
secbits: 192,
368+
group_id: NamedGroup::MLKEM768,
369+
};
370+
371+
static MLKEM1024: TlsGroupInfo = TlsGroupInfo {
372+
tls_name: c"MLKEM1024",
373+
standard_name: c"",
374+
algorithm: c"ML-KEM-1024",
375+
secbits: 256,
376+
group_id: NamedGroup::MLKEM1024,
377+
};
378+
379+
static X25519MLKEM768: TlsGroupInfo = TlsGroupInfo {
380+
tls_name: c"X25519MLKEM768",
381+
standard_name: c"",
382+
algorithm: c"X25519MLKEM768",
383+
secbits: 192,
384+
group_id: NamedGroup::X25519MLKEM768,
385+
};
386+
387+
static SECP256R1_MLKEM768: TlsGroupInfo = TlsGroupInfo {
388+
tls_name: c"SecP256r1MLKEM768",
389+
standard_name: c"",
390+
algorithm: c"SecP256r1MLKEM768",
391+
secbits: 192,
392+
group_id: NamedGroup::secp256r1MLKEM768,
393+
};
394+
242395
/// Backs a server-side SSL_SESSION object
243396
///
244397
/// Note that this has equality and ordering entirely based on the `id` field.
@@ -459,6 +612,7 @@ pub struct SslContext {
459612
info_callback: callbacks::InfoCallbackConfig,
460613
client_hello_callback: callbacks::ClientHelloCallbackConfig,
461614
auth_keys: sign::CertifiedKeySet,
615+
groups: Vec<&'static dyn SupportedKxGroup>,
462616
max_early_data: u32,
463617
}
464618

@@ -491,6 +645,7 @@ impl SslContext {
491645
info_callback: callbacks::InfoCallbackConfig::default(),
492646
client_hello_callback: callbacks::ClientHelloCallbackConfig::default(),
493647
auth_keys: sign::CertifiedKeySet::default(),
648+
groups: provider::default_provider().kx_groups.clone(),
494649
max_early_data: 0,
495650
}
496651
}
@@ -521,6 +676,10 @@ impl SslContext {
521676
self.raw_options
522677
}
523678

679+
fn get_groups(&self) -> &Vec<&'static dyn SupportedKxGroup> {
680+
&self.groups
681+
}
682+
524683
fn get_num_tickets(&self) -> usize {
525684
self.num_tickets
526685
}
@@ -880,6 +1039,10 @@ impl Ssl {
8801039
self.raw_options
8811040
}
8821041

1042+
fn get_groups(&self) -> &Vec<&'static dyn SupportedKxGroup> {
1043+
self.ctx.get().get_groups()
1044+
}
1045+
8831046
fn get_num_tickets(&self) -> usize {
8841047
self.num_tickets
8851048
}
@@ -1098,7 +1261,6 @@ impl Ssl {
10981261
if let ConnMode::Unknown = self.mode {
10991262
self.set_client_mode();
11001263
}
1101-
11021264
if matches!(self.conn, ConnState::Nothing) {
11031265
self.init_client_conn()?;
11041266
}

0 commit comments

Comments
 (0)