Skip to content

Commit

Permalink
Initial implementation of server side POW enforcement.
Browse files Browse the repository at this point in the history
  • Loading branch information
davidv1992 committed Aug 8, 2024
1 parent 8253408 commit 14b49a6
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 4 deletions.
7 changes: 5 additions & 2 deletions rustls/src/server/hs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ use crate::msgs::enums::{Compression, ExtensionType, NamedGroup};
#[cfg(feature = "tls12")]
use crate::msgs::handshake::SessionId;
use crate::msgs::handshake::{
ClientHelloPayload, ConvertProtocolNameList, ConvertServerNameList, HandshakePayload,
KeyExchangeAlgorithm, Random, ServerExtension,
ClientHelloPayload, ClientPuzzleChallenge, ConvertProtocolNameList, ConvertServerNameList,
HandshakePayload, KeyExchangeAlgorithm, Random, ServerExtension,
};
use crate::msgs::message::{Message, MessagePayload};
use crate::msgs::persist;
Expand Down Expand Up @@ -213,6 +213,7 @@ pub(super) struct ExpectClientHello {
#[cfg(feature = "tls12")]
pub(super) using_ems: bool,
pub(super) done_retry: bool,
pub(super) challenge: Option<ClientPuzzleChallenge>,
pub(super) send_tickets: usize,
}

Expand All @@ -233,6 +234,7 @@ impl ExpectClientHello {
#[cfg(feature = "tls12")]
using_ems: false,
done_retry: false,
challenge: None,
send_tickets: 0,
}
}
Expand Down Expand Up @@ -383,6 +385,7 @@ impl ExpectClientHello {
suite,
randoms,
done_retry: self.done_retry,
challenge: self.challenge,
send_tickets: self.send_tickets,
extra_exts: self.extra_exts,
}
Expand Down
30 changes: 28 additions & 2 deletions rustls/src/server/tls13.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@ mod client_hello {
use crate::msgs::enums::{Compression, NamedGroup, PSKKeyExchangeMode};
use crate::msgs::handshake::{
CertReqExtension, CertificatePayloadTls13, CertificateRequestPayloadTls13,
ClientHelloPayload, HelloRetryExtension, HelloRetryRequest, KeyShareEntry, Random,
ServerExtension, ServerHelloPayload, SessionId,
ClientHelloPayload, ClientPuzzleChallenge, ClientPuzzleExtension, HelloRetryExtension,
HelloRetryRequest, KeyShareEntry, Random, ServerExtension, ServerHelloPayload, SessionId,
};
use crate::server::common::ActiveCertifiedKey;
use crate::sign;
Expand All @@ -66,6 +66,7 @@ mod client_hello {
pub(in crate::server) suite: &'static Tls13CipherSuite,
pub(in crate::server) randoms: ConnectionRandoms,
pub(in crate::server) done_retry: bool,
pub(in crate::server) challenge: Option<ClientPuzzleChallenge>,
pub(in crate::server) send_tickets: usize,
pub(in crate::server) extra_exts: Vec<ServerExtension>,
}
Expand Down Expand Up @@ -195,6 +196,19 @@ mod client_hello {
(share.group == selected_kxg.name()).then_some((share, selected_kxg))
});

// Force hrr if the client hasn't solved a required puzzle yet
let chosen_share_and_kxg = if let (Some(challenge), Some(solution)) =
(&self.challenge, client_hello.puzzle_solution())
{
if challenge.check(&solution) {
chosen_share_and_kxg
} else {
None
}
} else {
None
};

let chosen_share_and_kxg = match chosen_share_and_kxg {
Some(s) => s,
None => {
Expand All @@ -209,12 +223,16 @@ mod client_hello {
));
}

let challenge =
ClientPuzzleChallenge::new_cookie(self.config.provider.secure_random)?;

emit_hello_retry_request(
&mut self.transcript,
self.suite,
client_hello.session_id,
cx.common,
selected_kxg.name(),
Some(challenge.clone()),
);
emit_fake_ccs(cx.common);

Expand All @@ -228,6 +246,7 @@ mod client_hello {
#[cfg(feature = "tls12")]
using_ems: false,
done_retry: true,
challenge: Some(challenge),
send_tickets: self.send_tickets,
extra_exts: self.extra_exts,
});
Expand Down Expand Up @@ -582,6 +601,7 @@ mod client_hello {
session_id: SessionId,
common: &mut CommonState,
group: NamedGroup,
challenge: Option<ClientPuzzleChallenge>,
) {
let mut req = HelloRetryRequest {
legacy_version: ProtocolVersion::TLSv1_2,
Expand All @@ -596,6 +616,12 @@ mod client_hello {
.push(HelloRetryExtension::SupportedVersions(
ProtocolVersion::TLSv1_3,
));
if let Some(challenge) = challenge {
req.extensions
.push(HelloRetryExtension::ClientPuzzle(
ClientPuzzleExtension::from_challenge(challenge),
));
}

let m = Message {
version: ProtocolVersion::TLSv1_2,
Expand Down

0 comments on commit 14b49a6

Please sign in to comment.