Skip to content

Commit 713ab62

Browse files
committedNov 25, 2023
demo x509 builder usage
Signed-off-by: Arthur Gautier <[email protected]>
1 parent 57a2332 commit 713ab62

File tree

4 files changed

+121
-2
lines changed

4 files changed

+121
-2
lines changed
 

‎Cargo.lock

+34-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Cargo.toml

+4
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

+1
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

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

0 commit comments

Comments
 (0)