use clap::Parser;
use cosmian_kms_client::{
KmsClient,
kmip_2_1::{kmip_types::UniqueIdentifier, requests::create_rsa_key_pair_request},
};
use crate::{
actions::kms::console,
error::result::{KmsCliResult, KmsCliResultHelper},
};
#[derive(Parser)]
#[clap(verbatim_doc_comment)]
pub struct CreateKeyPairAction {
#[clap(
long = "size_in_bits",
short = 's',
value_name = "SIZE_IN_BITS",
default_value = "4096"
)]
pub key_size: usize,
#[clap(long = "tag", short = 't', value_name = "TAG")]
pub tags: Vec<String>,
#[clap(required = false)]
pub private_key_id: Option<String>,
#[clap(long = "sensitive", default_value = "false")]
pub sensitive: bool,
#[clap(
long = "wrapping-key-id",
short = 'w',
required = false,
verbatim_doc_comment
)]
pub wrapping_key_id: Option<String>,
}
impl Default for CreateKeyPairAction {
fn default() -> Self {
Self {
key_size: 4096,
tags: Vec::new(),
private_key_id: None,
sensitive: false,
wrapping_key_id: None,
}
}
}
impl CreateKeyPairAction {
pub async fn run(
&self,
kms_rest_client: KmsClient,
) -> KmsCliResult<(UniqueIdentifier, UniqueIdentifier)> {
let private_key_id = self
.private_key_id
.as_ref()
.map(|id| UniqueIdentifier::TextString(id.clone()));
let create_key_pair_request = create_rsa_key_pair_request(
kms_rest_client.config.vendor_id.as_str(),
private_key_id,
&self.tags,
self.key_size,
self.sensitive,
self.wrapping_key_id.as_ref(),
)?;
let create_key_pair_response = kms_rest_client
.create_key_pair(create_key_pair_request)
.await
.with_context(|| "failed creating a RSA key pair")?;
let private_key_unique_identifier = &create_key_pair_response.private_key_unique_identifier;
let public_key_unique_identifier = &create_key_pair_response.public_key_unique_identifier;
let mut stdout = console::Stdout::new("The RSA key pair has been created.");
stdout.set_tags(Some(&self.tags));
stdout.set_key_pair_unique_identifier(
private_key_unique_identifier,
public_key_unique_identifier,
);
stdout.write()?;
Ok((
private_key_unique_identifier.to_owned(),
public_key_unique_identifier.to_owned(),
))
}
}