Skip to content

Commit 68d2fee

Browse files
committed
Use pki-playground API instead of shelling out to the binary
1 parent e181b3e commit 68d2fee

7 files changed

Lines changed: 53 additions & 59 deletions

File tree

.github/buildomat/jobs/build-and-test.sh

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,7 @@ set -o xtrace
1212
cargo --version
1313
rustc --version
1414

15-
# dependencies used by `build.rs` to build test PKI, measurement log, & corpus
16-
cargo install --locked \
17-
--git https://github.com/oxidecomputer/pki-playground \
18-
--rev 0c121f9c1e84868e2331173107c2b7ed6f59b13a
19-
15+
# dependency used by `build.rs` to build measurement log & corpus
2016
cargo install --locked \
2117
--git https://github.com/oxidecomputer/dice-util \
2218
--rev 4b408edc1d00f108ddf635415d783e6f12fe9641 \

.github/workflows/rust.yml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,6 @@ jobs:
4343
run: cargo --version
4444
- name: Report rustc version
4545
run: rustc --version
46-
- name: Install pki-playground
47-
run: |
48-
cargo install --locked \
49-
--git https://github.com/oxidecomputer/pki-playground \
50-
--rev 0c121f9c1e84868e2331173107c2b7ed6f59b13a
5146
- name: Install attest-mock
5247
run: |
5348
cargo install --locked \

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tls/Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,11 @@ zeroize.workspace = true
3232

3333
[build-dependencies]
3434
anyhow.workspace = true
35+
camino = { workspace = true, optional = true }
36+
pki-playground = { workspace = true, optional = true }
3537

3638
[features]
37-
unittest = []
39+
unittest = ["camino", "pki-playground"]
3840

3941
[dev-dependencies]
4042
sprockets-tls = { path = ".", features = ["unittest"] }

tls/build.rs

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,16 @@
55
use anyhow::Result;
66
#[cfg(feature = "unittest")]
77
use anyhow::{anyhow, Context};
8+
#[cfg(feature = "unittest")]
9+
use camino::Utf8PathBuf;
10+
#[cfg(feature = "unittest")]
11+
use pki_playground::{config, OutputFileExistsBehavior};
812

913
/// This path is where Oxide specific libraries live on helios systems.
1014
/// This is needed for linking with libipcc
1115
#[cfg(target_os = "illumos")]
1216
static OXIDE_PLATFORM: &str = "/usr/platform/oxide/lib/amd64/";
1317

14-
/// Execute one of the `pki-playground` commands to generate part of the PKI
15-
/// used for testing.
16-
#[cfg(feature = "unittest")]
17-
fn pki_gen_cmd(command: &str) -> Result<()> {
18-
let mut cmd = std::process::Command::new("pki-playground");
19-
cmd.arg(command);
20-
let output = cmd
21-
.output()
22-
.context("executing command \"pki-playground\"")?;
23-
24-
if !output.status.success() {
25-
let stdout = String::from_utf8(output.stdout)
26-
.context("String from pki-playground stdout")?;
27-
println!("stdout: {stdout}");
28-
let stderr = String::from_utf8(output.stderr)
29-
.context("String from pki-playground stderr")?;
30-
println!("stderr: {stderr}");
31-
32-
return Err(anyhow!("cmd failed: {cmd:?}"));
33-
}
34-
35-
Ok(())
36-
}
37-
3818
/// Execute one of the `attest-mock` commands to generate attestation
3919
/// artifacts used in testing.
4020
#[cfg(feature = "unittest")]
@@ -65,15 +45,29 @@ fn main() -> Result<()> {
6545

6646
#[cfg(feature = "unittest")]
6747
{
48+
// output directory where we put data generated test inputs
49+
let out = Utf8PathBuf::from(
50+
std::env::var("OUT_DIR")
51+
.context("Get OUT_DIR from the environment")?,
52+
);
53+
54+
let config_path = "test-keys/config.kdl";
55+
let doc =
56+
config::load_and_validate(config_path.as_ref()).map_err(|e| {
57+
anyhow!("Loading config from \"{}\" failed: {e:?}", config_path)
58+
})?;
59+
60+
doc.write_key_pairs(out.clone(), OutputFileExistsBehavior::Skip)
61+
.map_err(|e| anyhow!("writing key pairs failed: {e:?}"))?;
62+
doc.write_certificates(out.clone(), OutputFileExistsBehavior::Skip)
63+
.map_err(|e| anyhow!("writing certificates failed: {e:?}"))?;
64+
doc.write_certificate_lists(out, OutputFileExistsBehavior::Skip)
65+
.map_err(|e| anyhow!("writing cert chains failed: {e:?}"))?;
66+
6867
let start_dir = std::env::current_dir().context("get current dir")?;
6968
std::env::set_current_dir("test-keys/")
7069
.context("chdir to test keys")?;
7170

72-
// generate keys, certs, and cert chains / lists used by `cargo test`
73-
pki_gen_cmd("generate-key-pairs")?;
74-
pki_gen_cmd("generate-certificates")?;
75-
pki_gen_cmd("generate-certificate-lists")?;
76-
7771
// generate measurement log used by `cargo test`
7872
attest_gen_cmd("log", "log.kdl", "log.bin")?;
7973

tls/src/client.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -449,8 +449,7 @@ mod tests {
449449
#[test]
450450
// Ensure the test certs can be loaded and verified
451451
fn test_client_verifier() {
452-
let mut pki_keydir = Utf8PathBuf::from(env!("CARGO_MANIFEST_DIR"));
453-
pki_keydir.push("test-keys");
452+
let pki_keydir = Utf8PathBuf::from(env!("OUT_DIR"));
454453
let root =
455454
load_root_cert(&pki_keydir.join("test-root-a.cert.pem")).unwrap();
456455
let verifier = RotCertVerifier::new(vec![root], logger()).unwrap();

tls/src/lib.rs

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -344,9 +344,13 @@ mod tests {
344344
}
345345

346346
pub fn pki_keydir() -> Utf8PathBuf {
347-
let mut pki_keydir = Utf8PathBuf::from(env!("CARGO_MANIFEST_DIR"));
348-
pki_keydir.push("test-keys");
349-
pki_keydir
347+
Utf8PathBuf::from(env!("OUT_DIR"))
348+
}
349+
350+
pub fn mock_datadir() -> Utf8PathBuf {
351+
let mut mock_datadir = Utf8PathBuf::from(env!("CARGO_MANIFEST_DIR"));
352+
mock_datadir.push("test-keys");
353+
mock_datadir
350354
}
351355

352356
fn local_config(
@@ -364,11 +368,13 @@ mod tests {
364368
let resolve_cert_chain =
365369
pki_keydir.join(format!("test-sprockets-auth-{n}.certlist.pem"));
366370

371+
let mock_datadir = mock_datadir();
372+
367373
keys::SprocketsConfig {
368374
attest: keys::AttestConfig::Local {
369375
priv_key: attest_priv_key,
370376
cert_chain: attest_cert_chain,
371-
log: pki_keydir.join("log.bin"),
377+
log: mock_datadir.join("log.bin"),
372378
test_corpus: vec![],
373379
},
374380
roots: vec![pki_keydir.join("test-root-a.cert.pem")],
@@ -470,7 +476,7 @@ mod tests {
470476
#[tokio::test]
471477
async fn basic() {
472478
let log = logger();
473-
let pki_keydir = pki_keydir();
479+
let mock_datadir = mock_datadir();
474480
let addr: SocketAddrV6 = SocketAddrV6::from_str("[::1]:46456").unwrap();
475481
let server_config =
476482
local_config(1, MeasurementConnectionPolicy::Enforced);
@@ -481,8 +487,8 @@ mod tests {
481487
let (done_tx, done_rx) = tokio::sync::oneshot::channel();
482488
let log2 = log.clone();
483489
let corpus = vec![
484-
pki_keydir.join("corim-rot.cbor"),
485-
pki_keydir.join("corim-sp.cbor"),
490+
mock_datadir.join("corim-rot.cbor"),
491+
mock_datadir.join("corim-sp.cbor"),
486492
];
487493

488494
tokio::spawn(async move {
@@ -512,8 +518,8 @@ mod tests {
512518
local_config(2, MeasurementConnectionPolicy::Enforced);
513519

514520
let corpus = vec![
515-
pki_keydir.join("corim-rot.cbor"),
516-
pki_keydir.join("corim-sp.cbor"),
521+
mock_datadir.join("corim-rot.cbor"),
522+
mock_datadir.join("corim-sp.cbor"),
517523
];
518524

519525
if let Ok(stream) =
@@ -539,6 +545,7 @@ mod tests {
539545
async fn unattested_client() {
540546
let log = logger();
541547
let pki_keydir = pki_keydir();
548+
let mock_datadir = mock_datadir();
542549
let addr: SocketAddrV6 = SocketAddrV6::from_str("[::1]:46459").unwrap();
543550

544551
let server_config =
@@ -550,8 +557,8 @@ mod tests {
550557
let (done_tx, done_rx) = tokio::sync::oneshot::channel::<()>();
551558
let log2 = log.clone();
552559
let corpus = vec![
553-
pki_keydir.join("corim-rot.cbor"),
554-
pki_keydir.join("corim-sp.cbor"),
560+
mock_datadir.join("corim-rot.cbor"),
561+
mock_datadir.join("corim-sp.cbor"),
555562
];
556563

557564
let handle = tokio::spawn(async move {
@@ -611,7 +618,7 @@ mod tests {
611618
#[tokio::test]
612619
async fn spawn_accept() {
613620
let log = logger();
614-
let pki_keydir = pki_keydir();
621+
let mock_datadir = mock_datadir();
615622

616623
let addr: SocketAddrV6 = SocketAddrV6::from_str("[::1]:46466").unwrap();
617624

@@ -623,8 +630,8 @@ mod tests {
623630

624631
let log2 = log.clone();
625632
let corpus = vec![
626-
pki_keydir.join("corim-rot.cbor"),
627-
pki_keydir.join("corim-sp.cbor"),
633+
mock_datadir.join("corim-rot.cbor"),
634+
mock_datadir.join("corim-sp.cbor"),
628635
];
629636

630637
// Accept connections from `max_connections` clients in different tasks
@@ -656,17 +663,17 @@ mod tests {
656663

657664
// Spawn `max_connections` tasks to concurrently connect
658665
for _ in 0..max_connections {
659-
let pki_keydir = pki_keydir.clone();
660666
let log = log.clone();
667+
let mock_datadir = mock_datadir.clone();
661668
tokio::spawn(async move {
662669
// Loop until we succesfully connect
663670
let mut stream = loop {
664671
let client_config =
665672
local_config(2, MeasurementConnectionPolicy::Enforced);
666673

667674
let corpus = vec![
668-
pki_keydir.join("corim-rot.cbor"),
669-
pki_keydir.join("corim-sp.cbor"),
675+
mock_datadir.join("corim-rot.cbor"),
676+
mock_datadir.join("corim-sp.cbor"),
670677
];
671678

672679
if let Ok(stream) = Client::connect(

0 commit comments

Comments
 (0)