Hi @carlos_o
Thank you for your reply.
The general flow is as follows.
* The programming language is Rust.
Error handling and other details have been omitted.
// load providers
let def_pv = CString::new("default")?;
SSL_PROVIDER_load(ptr::null_mut(), def_pv.as_ptr());
let sss_pv = CString::new("sssProvider")?;
SSL_PROVIDER_load(ptr::null_mut(), sss_pv.as_ptr());
// uri for get private key from SE050
let uri = CString::new("nxp:0xXXXXXXXX".to_string())?;
// get store
let store = OSSL_STORE_open(
c_uri.as_ptr(),
std::ptr::null(),
std::ptr::null_mut(),
None,
std::ptr::null_mut(),
);
// got a pkey
let mut pkey: *mut openssl_bindings::EVP_PKEY = ptr::null_mut();
loop {
let info = openssl_bindings::OSSL_STORE_load(store);
let info_type = openssl_bindings::OSSL_STORE_INFO_get_type(info);
let got = openssl_bindings::OSSL_STORE_INFO_get1_PKEY(info);
pkey = got;
break;
}
}
// Generate PKey<Private> from EVP_PKEY*
let pkey_ptr: *mut openssl_sys::EVP_PKEY = pkey as *mut openssl_sys::EVP_PKEY;
let private_key = PKey::from_ptr(pkey_ptr);
// The end entity is obtained via PKCS#11 (cryptoki crate + libsss_pkcs11.so).
// [0]: End Entity [1]: Intermediate CA [2]: Root CA
let certs = ...;
let client_cert = certs[0];
// Generate a CA chain from certificates
let cert_chain = ...;
let flags = CMS_BINARY | CMS_STREAM | CMS_DETACHED;
// Generate CMS
let cms = CMS_sign(
ptr::null_mut(),
ptr::null_mut(),
cert_chain,
ptr::null_mut(),
flags | CMS_PARTIAL,
);
// Add SignerInfo
let signer = CMS_add1_signer(
cms,
client_cert,
private_key,
EVP_sha384(),
0,
);
// Implement the signature
// input_bio is generated from the file to be signed
CMS_final(cms, input_bio, ptr::null_mut(), flags);
// Output CMS signed data
....
Signature data generated using SoftHSM2 or a file (PKCS#12 file) for key and certificate acquisition can be successfully verified without adding the ‘-no_attr_verify’ option to the openssl command.
Are there any additional steps required when using data obtained from SE050?
Thanks.