Skip to content

Commit a5240ff

Browse files
committed
demo x509 builder usage
Signed-off-by: Arthur Gautier <baloo@superbaloo.net>
1 parent b0b4811 commit a5240ff

File tree

4 files changed

+122
-2
lines changed

4 files changed

+122
-2
lines changed

Cargo.lock

Lines changed: 34 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,6 @@
11
[workspace]
22
members = ["cryptoki", "cryptoki-sys", "cryptoki-rustcrypto"]
3+
4+
[patch.crates-io]
5+
# https://github.com/RustCrypto/formats/pull/1269
6+
spki = { git = "https://github.com/baloo/formats.git", branch = "baloo/spki/from_key" }

cryptoki-rustcrypto/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,4 @@ thiserror = "1.0"
2525
[dev-dependencies]
2626
serial_test = "0.5.1"
2727
testresult = "0.2.0"
28+
x509-cert = { version = "0.2.4", features = ["builder"] }

cryptoki-rustcrypto/tests/x509-ca.rs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// Copyright 2023 Contributors to the Parsec project.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
mod common;
5+
6+
use crate::common::USER_PIN;
7+
use common::init_pins;
8+
use cryptoki::{mechanism::Mechanism, object::Attribute, session::UserType, types::AuthPin};
9+
use cryptoki_rustcrypto::rsa::pss;
10+
use der::{pem::LineEnding, EncodePem};
11+
use serial_test::serial;
12+
use signature::Keypair;
13+
use spki::SubjectPublicKeyInfoOwned;
14+
use std::{str::FromStr, time::Duration};
15+
use testresult::TestResult;
16+
use x509_cert::{
17+
builder::{Builder, CertificateBuilder, Profile},
18+
name::Name,
19+
serial_number::SerialNumber,
20+
time::Validity,
21+
};
22+
23+
#[test]
24+
#[serial]
25+
fn pss_create_ca() -> TestResult {
26+
let (pkcs11, slot) = init_pins();
27+
28+
// open a session
29+
let session = pkcs11.open_rw_session(slot)?;
30+
31+
// log in the session
32+
session.login(UserType::User, Some(&AuthPin::new(USER_PIN.into())))?;
33+
34+
// get mechanism
35+
let mechanism = Mechanism::RsaPkcsKeyPairGen;
36+
37+
let public_exponent: Vec<u8> = vec![0x01, 0x00, 0x01];
38+
let modulus_bits = 1024;
39+
40+
let label = b"demo-signer";
41+
42+
// pub key template
43+
let pub_key_template = vec![
44+
Attribute::Token(true),
45+
Attribute::Private(false),
46+
Attribute::Label(label.to_vec()),
47+
Attribute::PublicExponent(public_exponent),
48+
Attribute::ModulusBits(modulus_bits.into()),
49+
];
50+
51+
// priv key template
52+
let priv_key_template = vec![Attribute::Token(true), Attribute::Label(label.to_vec())];
53+
54+
// generate a key pair
55+
let (public, private) =
56+
session.generate_key_pair(&mechanism, &pub_key_template, &priv_key_template)?;
57+
58+
let signer = pss::Signer::<sha2::Sha256>::new(session, label).expect("Lookup keys from HSM");
59+
60+
let serial_number = SerialNumber::from(42u32);
61+
let validity = Validity::from_now(Duration::new(5, 0)).unwrap();
62+
let profile = Profile::Root;
63+
let subject =
64+
Name::from_str("CN=World domination corporation,O=World domination Inc,C=US").unwrap();
65+
let pub_key = SubjectPublicKeyInfoOwned::from_key(signer.verifying_key()).unwrap();
66+
67+
let builder =
68+
CertificateBuilder::new(profile, serial_number, validity, subject, pub_key, &signer)
69+
.expect("Create certificate");
70+
71+
let certificate = builder.build().unwrap();
72+
73+
let pem = certificate.to_pem(LineEnding::LF).expect("generate pem");
74+
println!("{}", pem);
75+
76+
let session = signer.into_session();
77+
78+
// delete keys
79+
session.destroy_object(public)?;
80+
session.destroy_object(private)?;
81+
82+
Ok(())
83+
}

0 commit comments

Comments
 (0)