Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit af53442

Browse files
committedNov 11, 2024·
fixup updates
Signed-off-by: Arthur Gautier <[email protected]>
1 parent 7f4cd92 commit af53442

File tree

9 files changed

+774
-45
lines changed

9 files changed

+774
-45
lines changed
 

‎Cargo.lock

+633-7
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+
pkcs12 = { git = "https://github.com/RustCrypto/formats.git" }
6+
rsa = { path = "../RSA" }

‎cryptoki-rustcrypto/Cargo.toml

+14-13
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,23 @@ repository = "https://github.com/parallaxsecond/rust-cryptoki"
1212

1313
[dependencies]
1414
cryptoki = { path = "../cryptoki", version = "0.7.0" }
15-
der = "=0.8.0-pre.0"
16-
ecdsa = "=0.17.0-pre.5"
17-
p224 = { version = "=0.14.0-pre", features = ["pkcs8"] }
18-
p256 = { version = "=0.14.0-pre.0", features = ["pkcs8"] }
19-
p384 = { version = "=0.14.0-pre", features = ["pkcs8"] }
20-
k256 = { version = "=0.14.0-pre.0", features = ["pkcs8"] }
21-
rsa = "=0.10.0-pre.1"
22-
signature = { version = "=2.3.0-pre.3", features = ["derive", "digest"] }
23-
sha1 = { version = "=0.11.0-pre.3", features = ["oid"] }
24-
sha2 = { version = "=0.11.0-pre.3", features = ["oid"] }
25-
spki = "=0.8.0-pre.0"
26-
x509-cert = "=0.3.0-pre"
15+
der = "=0.8.0-rc.1"
16+
ecdsa = "=0.17.0-pre.9"
17+
#p224 = { version = "=0.14.0-pre.2", features = ["pkcs8"] }
18+
p256 = { version = "=0.14.0-pre.2", features = ["pkcs8"] }
19+
p384 = { version = "=0.14.0-pre.2", features = ["pkcs8"] }
20+
k256 = { version = "=0.14.0-pre.2", features = ["pkcs8"] }
21+
pkcs12 = { version = "=0.2.0-pre" }
22+
rsa = { version = "=0.10.0-pre.3", features = ["sha2"] }
23+
signature = { version = "=2.3.0-pre.4", features = ["derive", "digest"] }
24+
sha1 = { version = "=0.11.0-pre.4", features = ["oid"] }
25+
sha2 = { version = "=0.11.0-pre.4", features = ["oid"] }
26+
spki = "=0.8.0-rc.1"
27+
x509-cert = "=0.3.0-pre.0"
2728
thiserror = "1.0"
2829

2930
[dev-dependencies]
3031
rand = "0.8.5"
3132
serial_test = "0.5.1"
3233
testresult = "0.2.0"
33-
x509-cert = { version = "=0.3.0-pre", features = ["builder"] }
34+
x509-cert = { version = "=0.3.0-pre.0", features = ["builder"] }

‎cryptoki-rustcrypto/src/ecdsa.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ macro_rules! impl_sign_algorithm {
152152
};
153153
}
154154

155-
impl_sign_algorithm!(p224::NistP224);
155+
//impl_sign_algorithm!(p224::NistP224);
156156
impl_sign_algorithm!(p256::NistP256);
157157
impl_sign_algorithm!(p384::NistP384);
158158
impl_sign_algorithm!(k256::Secp256k1);

‎cryptoki-rustcrypto/src/rsa/pkcs1v15.rs

+40-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
// Copyright 2023 Contributors to the Parsec project.
22
// SPDX-License-Identifier: Apache-2.0
33

4-
use cryptoki::object::{Attribute, AttributeType, KeyType, ObjectClass, ObjectHandle};
4+
use cryptoki::{
5+
mechanism::Mechanism,
6+
object::{Attribute, AttributeType, KeyType, ObjectClass, ObjectHandle},
7+
};
58
use rsa::pkcs1v15::{RsaSignatureAssociatedOid, Signature, VerifyingKey};
6-
use spki::{AlgorithmIdentifier, AssociatedAlgorithmIdentifier, SignatureAlgorithmIdentifier};
9+
use spki::{
10+
der::{asn1::OctetString, oid::AssociatedOid, referenced::RefToOwned, AnyRef, Encode},
11+
AlgorithmIdentifier, AlgorithmIdentifierRef, AssociatedAlgorithmIdentifier,
12+
SignatureAlgorithmIdentifier,
13+
};
714
use std::convert::TryFrom;
815

916
use super::{read_key, DigestSigning, Error};
@@ -110,3 +117,34 @@ where
110117
const SIGNATURE_ALGORITHM_IDENTIFIER: AlgorithmIdentifier<Self::Params> =
111118
<VerifyingKey<D> as SignatureAlgorithmIdentifier>::SIGNATURE_ALGORITHM_IDENTIFIER;
112119
}
120+
121+
impl<D, S> signature::hazmat::PrehashSigner<Signature> for Signer<D, S>
122+
where
123+
S: SessionLike,
124+
D: DigestSigning + RsaSignatureAssociatedOid,
125+
{
126+
fn sign_prehash(&self, prehash: &[u8]) -> Result<Signature, signature::Error> {
127+
let payload = pkcs12::DigestInfo {
128+
algorithm: (AlgorithmIdentifierRef {
129+
oid: <D as AssociatedOid>::OID,
130+
parameters: Some(AnyRef::NULL),
131+
})
132+
.ref_to_owned(),
133+
digest: OctetString::new(prehash).unwrap(),
134+
};
135+
136+
let msg = payload.to_der().unwrap();
137+
println!("msg: {msg:x?}");
138+
139+
let bytes = self
140+
.session
141+
.sign(&Mechanism::RsaPkcs, self.private_key, &msg)
142+
.map_err(Error::Cryptoki)
143+
.map_err(Box::new)
144+
.map_err(signature::Error::from_source)?;
145+
146+
let signature = Signature::try_from(bytes.as_slice())?;
147+
148+
Ok(signature)
149+
}
150+
}

‎cryptoki-rustcrypto/src/x509.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,10 @@ where
5454
template.push(Attribute::CertificateType(CertificateType::X_509));
5555
template.push(Attribute::Token(true));
5656
template.push(Attribute::Value(self.to_der()?));
57-
if !self.tbs_certificate.subject.is_empty() {
58-
template.push(Attribute::Subject(self.tbs_certificate.subject.to_der()?));
57+
if !self.tbs_certificate().subject().is_empty() {
58+
template.push(Attribute::Subject(
59+
self.tbs_certificate().subject().to_der()?,
60+
));
5961
}
6062

6163
Ok(session.create_object(&template)?)

‎cryptoki-rustcrypto/tests/ecdsa.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,9 @@ fn test_import() -> TestResult {
9595

9696
let template = vec![Attribute::Token(false), Attribute::Label(label.to_vec())];
9797

98-
let private_handle = private.put_key(&session, template.clone())?;
99-
let public_handle = private.verifying_key().put_key(&session, template)?;
98+
let private_handle = p256::SecretKey::from(&private).put_key(&session, template.clone())?;
99+
let public_handle =
100+
p256::PublicKey::from(private.verifying_key()).put_key(&session, template)?;
100101

101102
// data to sign
102103
let data = [0xFF, 0x55, 0xDD];

‎cryptoki-rustcrypto/tests/rsa.rs

+62-5
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ use crate::common::USER_PIN;
77
use common::init_pins;
88
use cryptoki::{mechanism::Mechanism, object::Attribute, session::UserType, types::AuthPin};
99
use cryptoki_rustcrypto::rsa::{pkcs1v15, pss};
10+
use rand::{thread_rng, RngCore};
1011
use serial_test::serial;
11-
use signature::{Keypair, Signer, Verifier};
12+
use sha2::{Digest, Sha256};
13+
use signature::{hazmat::PrehashSigner, Keypair, Signer, Verifier};
1214
use testresult::TestResult;
1315

1416
#[test]
@@ -49,8 +51,7 @@ fn pkcs1v15_sign_verify() -> TestResult {
4951
// data to sign
5052
let data = [0xFF, 0x55, 0xDD];
5153

52-
let signer =
53-
pkcs1v15::Signer::<sha2::Sha256, _>::new(&session, label).expect("Lookup keys from HSM");
54+
let signer = pkcs1v15::Signer::<Sha256, _>::new(&session, label).expect("Lookup keys from HSM");
5455

5556
let signature = signer.sign(&data);
5657

@@ -102,8 +103,7 @@ fn pss_sign_verify() -> TestResult {
102103
// data to sign
103104
let data = [0xFF, 0x55, 0xDD];
104105

105-
let signer =
106-
pss::Signer::<sha2::Sha256, _>::new(&session, label).expect("Lookup keys from HSM");
106+
let signer = pss::Signer::<Sha256, _>::new(&session, label).expect("Lookup keys from HSM");
107107

108108
let signature = signer.sign(&data);
109109

@@ -116,3 +116,60 @@ fn pss_sign_verify() -> TestResult {
116116

117117
Ok(())
118118
}
119+
120+
#[test]
121+
#[serial]
122+
fn pkcs1v15_sign_verify_prehashed() -> TestResult {
123+
let (pkcs11, slot) = init_pins();
124+
125+
// open a session
126+
let session = pkcs11.open_rw_session(slot)?;
127+
128+
// log in the session
129+
session.login(UserType::User, Some(&AuthPin::new(USER_PIN.into())))?;
130+
131+
// get mechanism
132+
let mechanism = Mechanism::RsaPkcsKeyPairGen;
133+
134+
let public_exponent: Vec<u8> = vec![0x01, 0x00, 0x01];
135+
let modulus_bits = 1024;
136+
137+
let label = b"demo-signer";
138+
139+
// pub key template
140+
let pub_key_template = vec![
141+
Attribute::Token(true),
142+
Attribute::Private(false),
143+
Attribute::Label(label.to_vec()),
144+
Attribute::PublicExponent(public_exponent),
145+
Attribute::ModulusBits(modulus_bits.into()),
146+
];
147+
148+
// priv key template
149+
let priv_key_template = vec![Attribute::Token(true), Attribute::Label(label.to_vec())];
150+
151+
// generate a key pair
152+
let (public, private) =
153+
session.generate_key_pair(&mechanism, &pub_key_template, &priv_key_template)?;
154+
155+
// data to sign
156+
let mut data = [0u8; 7123];
157+
thread_rng().fill_bytes(&mut data[..]);
158+
159+
let prehashed = Sha256::digest(&data[..]);
160+
161+
let signer = pkcs1v15::Signer::<Sha256, _>::new(&session, label).expect("Lookup keys from HSM");
162+
163+
let signature1 = signer.sign(&data);
164+
let signature2 = signer.sign_prehash(&prehashed).expect("Sign prehash");
165+
166+
let verifying_key = signer.verifying_key();
167+
verifying_key.verify(&data, &signature1)?;
168+
verifying_key.verify(&data, &signature2)?;
169+
170+
// delete keys
171+
session.destroy_object(public)?;
172+
session.destroy_object(private)?;
173+
174+
Ok(())
175+
}

‎cryptoki-rustcrypto/tests/x509-ca.rs

+13-13
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use spki::SubjectPublicKeyInfoOwned;
2020
use std::{str::FromStr, time::Duration};
2121
use testresult::TestResult;
2222
use x509_cert::{
23-
builder::{Builder, CertificateBuilder, Profile},
23+
builder::{profile::cabf, Builder, CertificateBuilder},
2424
name::Name,
2525
serial_number::SerialNumber,
2626
time::Validity,
@@ -66,16 +66,15 @@ fn pss_create_ca() -> TestResult {
6666

6767
let serial_number = SerialNumber::from(42u32);
6868
let validity = Validity::from_now(Duration::new(5, 0)).unwrap();
69-
let profile = Profile::Root;
7069
let subject =
7170
Name::from_str("CN=World domination corporation,O=World domination Inc,C=US").unwrap();
72-
let pub_key = SubjectPublicKeyInfoOwned::from_key(signer.verifying_key()).unwrap();
71+
let profile = cabf::Root::new(false, subject).expect("Create root profile");
72+
let pub_key = SubjectPublicKeyInfoOwned::from_key(&signer.verifying_key()).unwrap();
7373

74-
let builder =
75-
CertificateBuilder::new(profile, serial_number, validity, subject, pub_key, &signer)
76-
.expect("Create certificate");
74+
let builder = CertificateBuilder::new(profile, serial_number, validity, pub_key)
75+
.expect("Create certificate");
7776

78-
let certificate = builder.build().unwrap();
77+
let certificate = builder.build(&signer).unwrap();
7978

8079
let pem = certificate.to_pem(LineEnding::LF).expect("generate pem");
8180
println!("{}", pem);
@@ -132,16 +131,17 @@ fn ecdsa_create_ca() -> TestResult {
132131

133132
let serial_number = SerialNumber::from(42u32);
134133
let validity = Validity::from_now(Duration::new(5, 0)).unwrap();
135-
let profile = Profile::Root;
136134
let subject =
137135
Name::from_str("CN=World domination corporation,O=World domination Inc,C=US").unwrap();
138-
let pub_key = SubjectPublicKeyInfoOwned::from_key(signer.verifying_key()).unwrap();
136+
let profile = cabf::Root::new(false, subject).expect("create root profile");
137+
let pub_key = SubjectPublicKeyInfoOwned::from_key(&signer.verifying_key()).unwrap();
139138

140-
let builder =
141-
CertificateBuilder::new(profile, serial_number, validity, subject, pub_key, &signer)
142-
.expect("Create certificate");
139+
let builder = CertificateBuilder::new(profile, serial_number, validity, pub_key)
140+
.expect("Create certificate");
143141

144-
let certificate = builder.build::<p256::ecdsa::DerSignature>().unwrap();
142+
let certificate = builder
143+
.build::<_, p256::ecdsa::DerSignature>(&signer)
144+
.unwrap();
145145

146146
let pem = certificate.to_pem(LineEnding::LF).expect("generate pem");
147147
println!("{}", pem);

0 commit comments

Comments
 (0)
Please sign in to comment.