use std::path::PathBuf;
use clap::Parser;
use cosmian_kmip::{
kmip_0::kmip_types::HashingAlgorithm,
kmip_2_1::kmip_types::{CryptographicParameters, DigitalSignatureAlgorithm},
};
use cosmian_kms_client::KmsClient;
use crate::{
actions::kms::{labels::KEY_ID, shared::sign::run_sign},
error::result::KmsCliResult,
};
#[derive(Parser, Debug)]
#[clap(verbatim_doc_comment)]
pub struct SignAction {
#[clap(required = true, name = "FILE")]
pub(crate) input_file: PathBuf,
#[clap(long = KEY_ID, short = 'k', group = "key-tags")]
pub(crate) key_id: Option<String>,
#[clap(long = "tag", short = 't', value_name = "TAG", group = "key-tags")]
pub(crate) tags: Option<Vec<String>>,
#[clap(required = false, long, short = 'o')]
pub(crate) output_file: Option<PathBuf>,
#[clap(long = "digested", action)]
pub(crate) digested: bool,
}
impl SignAction {
pub async fn run(&self, kms_rest_client: KmsClient) -> KmsCliResult<()> {
let cryptographic_parameters = Some(CryptographicParameters {
digital_signature_algorithm: Some(DigitalSignatureAlgorithm::RSASSAPSS),
hashing_algorithm: Some(HashingAlgorithm::SHA256),
mask_generator_hashing_algorithm: Some(HashingAlgorithm::SHA256),
..CryptographicParameters::default()
});
run_sign(
kms_rest_client,
self.input_file.clone(),
self.key_id.clone(),
self.tags.clone(),
self.output_file.clone(),
cryptographic_parameters,
self.digested,
)
.await
}
}