Skip to content

Key schedule security #145

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 34 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
1a1705a
move key scheduling to seperate file
cmester0 Nov 5, 2024
e296d9a
Use xpd instead of derive_server
cmester0 Nov 6, 2024
7d046d3
Working xpd and xtr
cmester0 Nov 6, 2024
e9f370e
Use key struct
cmester0 Nov 6, 2024
c52f5e6
Working with TagKey
cmester0 Nov 6, 2024
69134a0
WIP on packages/games for KeySchedule
cmester0 Nov 13, 2024
665b72d
Filling in SSP package definitions
cmester0 Nov 27, 2024
c0ab4a3
Restructure proof
cmester0 Nov 29, 2024
911b913
Update proof
cmester0 Jan 7, 2025
9a2c613
Minor progress on proof
cmester0 Jan 12, 2025
551a5a7
Fixing extraction
cmester0 Jan 13, 2025
ff069c6
Build up to Core theorem statement
cmester0 Jan 18, 2025
f4477fe
Restructure to a dependency struct/class
cmester0 Jan 18, 2025
300463b
Restructure
cmester0 Jan 18, 2025
e322862
Restructure
cmester0 Jan 18, 2025
9ba00c8
Put d into dependencies
cmester0 Jan 18, 2025
4946f94
Cleanup extra files, and add more definitions
cmester0 Jan 19, 2025
6065f94
WIP on fixing key schedule impl
cmester0 Jan 21, 2025
a132369
WIP going to handles and key maps instead of directly using keys
cmester0 Jan 22, 2025
bcf16ae
Switch to using handlers
cmester0 Jan 23, 2025
3e79eac
Cleanup use of handles
cmester0 Jan 24, 2025
bc658e0
Add and fix issues for PSK?
cmester0 Jan 27, 2025
cbe7d75
Cleanup
cmester0 Jan 27, 2025
7933bbd
Update proof
cmester0 Jan 27, 2025
37f6064
Setup of key package hiearchy
cmester0 Jan 30, 2025
e20cc16
WIP on main theorem
cmester0 Jan 31, 2025
45a1aca
Make proof for multi-dimensioned hybrid proof easier
cmester0 Feb 10, 2025
9a3b214
Workaround extraction issues
jschneider-bensch Feb 11, 2025
539c262
Update
cmester0 Feb 11, 2025
072eca8
update actions
franziskuskiefer Feb 11, 2025
3a0de9f
`cargo fmt`
jschneider-bensch Feb 11, 2025
760e9bf
Update nix flake to main branch state
jschneider-bensch Feb 12, 2025
02cd040
Remove nix workflow
jschneider-bensch Feb 12, 2025
0caee30
Merge pull request #139 from cryspen/jonas/proverif-key-schedule
jschneider-bensch Feb 12, 2025
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
4 changes: 2 additions & 2 deletions .github/workflows/gh-pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ jobs:
done

- name: Upload Documentation Artifact
uses: actions/upload-pages-artifact@v2
uses: actions/upload-pages-artifact@v3
with:
path: "target/doc"

Expand All @@ -56,4 +56,4 @@ jobs:
steps:
- name: Deploy Documentation to GitHub Pages
id: deployment
uses: actions/deploy-pages@v2
uses: actions/deploy-pages@v4
20 changes: 0 additions & 20 deletions .github/workflows/nix.yml

This file was deleted.

2 changes: 1 addition & 1 deletion .github/workflows/scheduled.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- uses: EmbarkStudios/cargo-deny-action@v1
# TODO: Check licenses, too.
with:
Expand Down
18 changes: 12 additions & 6 deletions benches/client.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#![allow(dead_code)]

use std::collections::HashMap;
use std::time::{Duration, Instant};

use bertie::{
Expand All @@ -21,7 +22,7 @@ use bertie::{
SignatureScheme,
},
tls13utils::Bytes,
Client, Server,
Client, Server, TLSkeyscheduler,
};
use libcrux::{digest, drbg::Drbg};

Expand Down Expand Up @@ -156,6 +157,9 @@ fn protocol() {

for ciphersuite in CIPHERSUITES {
let mut rng = Drbg::new(digest::Algorithm::Sha256).unwrap();
let mut ks: TLSkeyscheduler = TLSkeyscheduler {
keys: HashMap::new(),
};

// Server
let server_name_str = "localhost";
Expand All @@ -182,24 +186,26 @@ fn protocol() {
for _ in 0..ITERATIONS {
let start_time = Instant::now();
let (client_hello, client) =
Client::connect(ciphersuite, &server_name, None, None, &mut rng).unwrap();
Client::connect(ciphersuite, &server_name, None, None, &mut rng, &mut ks).unwrap();
let end_time = Instant::now();
handshake_time += end_time.duration_since(start_time);
size1 += client_hello.declassify().len();

let (server_hello, server_finished, server) =
Server::accept(ciphersuite, db.clone(), &client_hello, &mut rng).unwrap();
Server::accept(ciphersuite, db.clone(), &client_hello, &mut rng, &mut ks).unwrap();
size2 += server_hello.declassify().len();
size2 += server_finished.declassify().len();

let start_time = Instant::now();
let (_client_msg, client) = client.read_handshake(&server_hello).unwrap();
let (client_msg, client) = client.read_handshake(&server_finished).unwrap();
let (_client_msg, client) = client.read_handshake(&server_hello, &mut ks).unwrap();
let (client_msg, client) = client.read_handshake(&server_finished, &mut ks).unwrap();
let end_time = Instant::now();
handshake_time += end_time.duration_since(start_time);
size3 += client_msg.as_ref().unwrap().declassify().len();

let server = server.read_handshake(&client_msg.unwrap()).unwrap();
let server = server
.read_handshake(&client_msg.unwrap(), &mut ks)
.unwrap();

let application_data = payload.clone().into();

Expand Down
42 changes: 34 additions & 8 deletions benches/server.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use std::collections::HashMap;
use std::time::{Duration, Instant};

use bertie::{
Expand All @@ -19,7 +20,7 @@ use bertie::{
SignatureScheme,
},
tls13utils::Bytes,
Client, Server,
Client, Server, TLSkeyscheduler,
};
use libcrux::{digest, drbg::Drbg};

Expand Down Expand Up @@ -100,6 +101,12 @@ fn protocol() {

for ciphersuite in CIPHERSUITES {
let mut rng = Drbg::new(digest::Algorithm::Sha256).unwrap();
let mut client_ks: TLSkeyscheduler = TLSkeyscheduler {
keys: HashMap::new(),
};
let mut server_ks: TLSkeyscheduler = TLSkeyscheduler {
keys: HashMap::new(),
};

// Server
let server_name_str = "localhost";
Expand All @@ -121,20 +128,39 @@ fn protocol() {
let payload = rng.generate_vec(NUM_PAYLOAD_BYTES).unwrap();

for _ in 0..ITERATIONS {
let (client_hello, client) =
Client::connect(ciphersuite, &server_name, None, None, &mut rng).unwrap();
let (client_hello, client) = Client::connect(
ciphersuite,
&server_name,
None,
None,
&mut rng,
&mut client_ks,
)
.unwrap();

let start_time = Instant::now();
let (server_hello, server_finished, server) =
Server::accept(ciphersuite, db.clone(), &client_hello, &mut rng).unwrap();
let (server_hello, server_finished, server) = Server::accept(
ciphersuite,
db.clone(),
&client_hello,
&mut rng,
&mut server_ks,
)
.unwrap();
let end_time = Instant::now();
handshake_time += end_time.duration_since(start_time);

let (_client_msg, client) = client.read_handshake(&server_hello).unwrap();
let (client_msg, client) = client.read_handshake(&server_finished).unwrap();
let (_client_msg, client) = client
.read_handshake(&server_hello, &mut client_ks)
.unwrap();
let (client_msg, client) = client
.read_handshake(&server_finished, &mut client_ks)
.unwrap();

let start_time = Instant::now();
let server = server.read_handshake(&client_msg.unwrap()).unwrap();
let server = server
.read_handshake(&client_msg.unwrap(), &mut server_ks)
.unwrap();
let end_time = Instant::now();
handshake_time += end_time.duration_since(start_time);

Expand Down
42 changes: 25 additions & 17 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,25 @@
};
hax.url = "github:hacspec/hax";
};
outputs =
inputs:
inputs.flake-utils.lib.eachDefaultSystem (
system:
let
hax = inputs.hax.packages.${system}.default;
pkgs = import inputs.nixpkgs { inherit system; };
craneLib = inputs.crane.mkLib pkgs;
src = ./.;
cargoArtifacts = craneLib.buildDepsOnly { inherit src; };
bertie = craneLib.buildPackage {
outputs = inputs: inputs.flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import inputs.nixpkgs { inherit system; };
# Make an overrideable package.
bertie = { python3, craneLib, hax, runCommand, cargoLock }:
let
src = runCommand "bertie-src" { } ''
cp -r ${./.} $out
chmod u+w $out
rm -f $out/Cargo.lock
cp ${cargoLock} $out/Cargo.lock
'';
cargoArtifacts = craneLib.buildDepsOnly { inherit src; };
in
craneLib.buildPackage {
inherit src cargoArtifacts;
buildInputs = [
hax
pkgs.python3
python3
];
buildPhase = ''
python hax-driver.py extract-fstar
Expand All @@ -31,9 +35,13 @@
installPhase = "cp -r . $out";
doCheck = false;
};
in
{
packages.default = bertie;
}
);
hax = inputs.hax.packages.${system}.default;
craneLib = inputs.crane.mkLib pkgs;
in
{
# Takes the lockfile as input.
packages.default = cargoLock: pkgs.callPackage bertie { inherit hax craneLib cargoLock; };
devShells.default = craneLib.devShell { };
}
);
}
40 changes: 40 additions & 0 deletions hax-driver.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ def shell(command, expect=0, cwd=None, env={}):
help="Extract and typecheck F* etc. from the Bertie Rust code.",
)
extract_parser = sub_parser.add_parser("extract-fstar")
extract_parser = sub_parser.add_parser("extract-ssprove")
extract_parser = sub_parser.add_parser("extract-coq")
extract_proverif_parser = sub_parser.add_parser("extract-proverif")
typecheck_parser = sub_parser.add_parser("typecheck")
patch_proverif_parser = sub_parser.add_parser("patch-proverif")
Expand Down Expand Up @@ -102,6 +104,44 @@ def shell(command, expect=0, cwd=None, env={}):
cwd=".",
env=hax_env,
)
elif options.sub == "extract-ssprove":
# The extract sub command.
shell(
cargo_hax_into_pv
+ [
"-i",
" ".join([
"-**",
"+~**::tls13handshake::**",
"+~**::server::lookup_db", # to include transitive dependency on tls13utils
"+~**::tls13keyscheduler::**",
"+~**::tls13utils::parse_failed", # transitive dependencies required
"+~**::tls13crypto::zero_key", # transitive dependencies required
]),
"ssprove",
],
cwd=".",
env=hax_env,
)
elif options.sub == "extract-coq":
# The extract sub command.
shell(
cargo_hax_into_pv
+ [
"-i",
" ".join([
"-**",
"+~**::tls13handshake::**",
"+~**::server::lookup_db", # to include transitive dependency on tls13utils
"+~**::tls13keyscheduler::**",
"+~**::tls13utils::parse_failed", # transitive dependencies required
"+~**::tls13crypto::zero_key", # transitive dependencies required
]),
"coq",
],
cwd=".",
env=hax_env,
)
elif options.sub == "extract-handshake":
# The extract sub command.
shell(
Expand Down
62 changes: 62 additions & 0 deletions proofs/ssprove/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
.hidden
*.tmp

##Coq
*.vo
*.vok
*.vos
*.glob
*.v.d
*~
CoqMakefile
CoqMakefile.conf
Makefile.coq
Makefile.coq.conf
*.a
*.cma
*.cmi
*.cmo
*.cmx
*.cmxa
*.cmxs
*.ml.d
*.mllib.d
*.ml4.d
*.mli.d
*.mlpack.d
*.native
*.o
*.aux
*.d
*.lia.cache
doc/
docs/
_opam/
.merlin
META.*

.coq-native/
.csdp.cache
.lia.cache
.nia.cache
.nlia.cache
.nra.cache
csdp.cache
lia.cache
nia.cache
nlia.cache
nra.cache



## Editors

### VisualStudioCode ###
.vscode/*
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json

### VisualStudioCode Patch ###
# Ignore all local history of files
.history
Loading