Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions librustls/src/rustls.h
Original file line number Diff line number Diff line change
Expand Up @@ -2392,6 +2392,15 @@ void rustls_server_config_builder_free(struct rustls_server_config_builder *conf
rustls_result rustls_server_config_builder_set_ignore_client_order(struct rustls_server_config_builder *builder,
bool ignore);

/**
* Set the number of TLS 1.3 NewSessionTickets sent after a full handshake.
*
* Setting this to 0 disables session ticket issuance entirely.
* <https://docs.rs/rustls/latest/rustls/server/struct.ServerConfig.html#structfield.send_tls13_tickets>
*/
rustls_result rustls_server_config_builder_set_send_tls13_tickets(struct rustls_server_config_builder *builder,
size_t n);

/**
* Set the ALPN protocol list to the given protocols.
*
Expand Down
85 changes: 85 additions & 0 deletions librustls/src/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ pub(crate) struct ServerConfigBuilder {
session_storage: Option<Arc<dyn StoresServerSessions + Send + Sync>>,
alpn_protocols: Vec<Vec<u8>>,
ignore_client_order: Option<bool>,
send_tls13_tickets: Option<usize>,
key_log: Option<Arc<dyn KeyLog>>,
}

Expand Down Expand Up @@ -98,6 +99,7 @@ impl rustls_server_config_builder {
session_storage: None,
alpn_protocols: vec![],
ignore_client_order: None,
send_tls13_tickets: None,
key_log: None,
};
to_boxed_mut_ptr(builder)
Expand Down Expand Up @@ -153,6 +155,7 @@ impl rustls_server_config_builder {
session_storage: None,
alpn_protocols: vec![],
ignore_client_order: None,
send_tls13_tickets: None,
key_log: None,
};
set_boxed_mut_ptr(builder_out, builder);
Expand Down Expand Up @@ -271,6 +274,22 @@ impl rustls_server_config_builder {
}
}

/// Set the number of TLS 1.3 NewSessionTickets sent after a full handshake.
///
/// Setting this to 0 disables session ticket issuance entirely.
/// <https://docs.rs/rustls/latest/rustls/server/struct.ServerConfig.html#structfield.send_tls13_tickets>
#[no_mangle]
pub extern "C" fn rustls_server_config_builder_set_send_tls13_tickets(
builder: *mut rustls_server_config_builder,
n: usize,
) -> rustls_result {
ffi_panic_boundary! {
let config = try_mut_from_ptr!(builder);
config.send_tls13_tickets = Some(n);
rustls_result::Ok
}
}

/// Set the ALPN protocol list to the given protocols.
///
/// `protocols` must point to a buffer of `rustls_slice_bytes` (built by the caller)
Expand Down Expand Up @@ -376,6 +395,9 @@ impl rustls_server_config_builder {
if let Some(ignore_client_order) = builder.ignore_client_order {
config.ignore_client_order = ignore_client_order;
}
if let Some(send_tls13_tickets) = builder.send_tls13_tickets {
config.send_tls13_tickets = send_tls13_tickets;
}

if let Some(key_log) = builder.key_log {
config.key_log = key_log;
Expand Down Expand Up @@ -820,6 +842,69 @@ mod tests {
rustls_server_config::rustls_server_config_free(config);
}

#[test]
#[cfg_attr(miri, ignore)]
fn test_server_config_builder_set_send_tls13_tickets() {
let builder = rustls_server_config_builder::rustls_server_config_builder_new();

let cert_pem = include_str!("../testdata/localhost/cert.pem").as_bytes();
let key_pem = include_str!("../testdata/localhost/key.pem").as_bytes();
let mut certified_key = null();
let result = rustls_certified_key::rustls_certified_key_build(
cert_pem.as_ptr(),
cert_pem.len(),
key_pem.as_ptr(),
key_pem.len(),
&mut certified_key,
);
if !matches!(result, rustls_result::Ok) {
panic!("expected RUSTLS_RESULT_OK from rustls_certified_key_build, got {result:?}");
}
rustls_server_config_builder::rustls_server_config_builder_set_certified_keys(
builder,
&certified_key,
1,
);

// 0 disables ticket issuance.
rustls_server_config_builder::rustls_server_config_builder_set_send_tls13_tickets(
builder, 0,
);

let mut config = null();
let result =
rustls_server_config_builder::rustls_server_config_builder_build(builder, &mut config);
assert_eq!(result, rustls_result::Ok);
assert!(!config.is_null());
{
let config2 = try_ref_from_ptr!(config);
assert_eq!(config2.send_tls13_tickets, 0);
}
rustls_server_config::rustls_server_config_free(config);

// A non-zero value flows through too.
let builder = rustls_server_config_builder::rustls_server_config_builder_new();
rustls_server_config_builder::rustls_server_config_builder_set_certified_keys(
builder,
&certified_key,
1,
);
rustls_server_config_builder::rustls_server_config_builder_set_send_tls13_tickets(
builder, 4,
);
let mut config = null();
let result =
rustls_server_config_builder::rustls_server_config_builder_build(builder, &mut config);
assert_eq!(result, rustls_result::Ok);
assert!(!config.is_null());
{
Comment thread
cpu marked this conversation as resolved.
let config2 = try_ref_from_ptr!(config);
assert_eq!(config2.send_tls13_tickets, 4);
}
rustls_server_config::rustls_server_config_free(config);
rustls_certified_key::rustls_certified_key_free(certified_key);
}

// Build a server connection and test the getters and initial values.
#[test]
fn test_server_config_builder_new_empty() {
Expand Down
8 changes: 8 additions & 0 deletions website/static/api.json
Original file line number Diff line number Diff line change
Expand Up @@ -1106,6 +1106,14 @@
"name": "rustls_server_config_builder_set_ignore_client_order",
"text": "```c\nrustls_result rustls_server_config_builder_set_ignore_client_order(struct rustls_server_config_builder *builder,\n bool ignore);\n```"
},
{
"anchor": "rustls-server-config-builder-set-send-tls13-tickets",
"comment": "Set the number of TLS 1.3 NewSessionTickets sent after a full handshake.\n\n Setting this to 0 disables session ticket issuance entirely.\n <https://docs.rs/rustls/latest/rustls/server/struct.ServerConfig.html#structfield.send_tls13_tickets>",
"feature": null,
"deprecation": null,
"name": "rustls_server_config_builder_set_send_tls13_tickets",
"text": "```c\nrustls_result rustls_server_config_builder_set_send_tls13_tickets(struct rustls_server_config_builder *builder,\n size_t n);\n```"
},
{
"anchor": "rustls-server-config-builder-set-alpn-protocols",
"comment": "Set the ALPN protocol list to the given protocols.\n\n `protocols` must point to a buffer of [`rustls_slice_bytes`](#rustls-slice-bytes) (built by the caller)\n with `len` elements. Each element of the buffer must point to a slice of bytes that\n contains a single ALPN protocol from\n <https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids>.\n\n This function makes a copy of the data in `protocols` and does not retain\n any pointers, so the caller can free the pointed-to memory after calling.\n\n <https://docs.rs/rustls/latest/rustls/server/struct.ServerConfig.html#structfield.alpn_protocols>",
Expand Down
Loading