#![deny(missing_docs)]
#[cfg(feature = "file_io")]
use std::path::Path;
use crate::{
crypto::raw_signature::{signer_from_cert_chain_and_private_key, SigningAlg},
error::Result,
signer::RawSignerWrapper,
BoxedSigner,
};
pub fn from_keys(
signcert: &[u8],
pkey: &[u8],
alg: SigningAlg,
tsa_url: Option<String>,
) -> Result<BoxedSigner> {
Ok(Box::new(RawSignerWrapper(
signer_from_cert_chain_and_private_key(signcert, pkey, alg, tsa_url)?,
)))
}
#[cfg(feature = "file_io")]
pub fn from_files<P: AsRef<Path>>(
signcert_path: P,
pkey_path: P,
alg: SigningAlg,
tsa_url: Option<String>,
) -> Result<BoxedSigner> {
let cert_chain = std::fs::read(signcert_path)?;
let private_key = std::fs::read(pkey_path)?;
from_keys(&cert_chain, &private_key, alg, tsa_url)
}
pub fn from_x509_identity(
c2pa_signer: BoxedSigner,
identity_signer: BoxedSigner,
referenced_assertions: &[&str],
roles: &[&str],
) -> BoxedSigner {
Box::new(
crate::settings::signer::CawgX509IdentitySigner::from_signer(
c2pa_signer,
identity_signer,
referenced_assertions,
roles,
),
)
}
#[cfg(test)]
mod tests {
#![allow(clippy::unwrap_used)]
use std::io::{Cursor, Seek};
use c2pa_macros::c2pa_test_async;
#[cfg(all(target_arch = "wasm32", not(target_os = "wasi")))]
use wasm_bindgen_test::wasm_bindgen_test;
use crate::{
crypto::raw_signature::SigningAlg,
identity::tests::fixtures::{manifest_json, parent_json},
utils::test_signer::test_signer,
Builder, Reader,
};
const TEST_IMAGE: &[u8] = include_bytes!("../tests/fixtures/CA.jpg");
const TEST_THUMBNAIL: &[u8] = include_bytes!("../tests/fixtures/thumbnail.jpg");
#[c2pa_test_async]
async fn from_x509_identity_signs_and_validates() {
let format = "image/jpeg";
let mut source = Cursor::new(TEST_IMAGE);
let mut dest = Cursor::new(Vec::new());
let mut builder = Builder::default().with_definition(manifest_json()).unwrap();
builder
.add_ingredient_from_stream(parent_json(), format, &mut source)
.unwrap();
builder
.add_resource("thumbnail.jpg", Cursor::new(TEST_THUMBNAIL))
.unwrap();
let c2pa_signer = test_signer(SigningAlg::Ps256);
let identity_signer = test_signer(SigningAlg::Ed25519);
let signer =
super::from_x509_identity(c2pa_signer, identity_signer, &["c2pa.actions"], &[]);
builder
.sign(signer.as_ref(), format, &mut source, &mut dest)
.unwrap();
dest.rewind().unwrap();
let manifest_store = Reader::default().with_stream(format, &mut dest).unwrap();
assert_eq!(
manifest_store.validation_state(),
crate::ValidationState::Trusted
);
let manifest = manifest_store.active_manifest().unwrap();
assert!(manifest
.assertions()
.iter()
.any(|a| a.label().contains("cawg.identity")));
}
}