key/aziot-key-common-http/src/lib.rs (227 lines of code) (raw):

// Copyright (c) Microsoft. All rights reserved. #![deny(rust_2018_idioms)] #![warn(clippy::all, clippy::pedantic)] #[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)] pub enum ApiVersion { V2020_09_01, V2021_05_01, } impl std::fmt::Display for ApiVersion { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.write_str(match self { ApiVersion::V2020_09_01 => "2020-09-01", ApiVersion::V2021_05_01 => "2021-05-01", }) } } impl std::str::FromStr for ApiVersion { type Err = (); fn from_str(s: &str) -> Result<Self, Self::Err> { match s { "2020-09-01" => Ok(ApiVersion::V2020_09_01), "2021-05-01" => Ok(ApiVersion::V2021_05_01), _ => Err(()), } } } pub mod create_derived_key { #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Request { #[serde(rename = "baseKeyHandle")] pub base_handle: aziot_key_common::KeyHandle, #[serde(rename = "derivationData")] pub derivation_data: http_common::ByteString, } #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Response { #[serde(rename = "keyHandle")] pub handle: aziot_key_common::KeyHandle, } } pub mod create_key_if_not_exists { #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Request { #[serde(rename = "keyId")] pub id: String, #[serde(rename = "keyBytes")] pub import_key_bytes: Option<http_common::ByteString>, #[serde(rename = "usage", with = "crate::key_usage")] pub usage: Vec<aziot_key_common::KeyUsage>, } #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Response { #[serde(rename = "keyHandle")] pub handle: aziot_key_common::KeyHandle, } } pub mod create_key_pair_if_not_exists { #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Request { #[serde(rename = "keyId")] pub id: String, #[serde(rename = "preferredAlgorithms")] pub preferred_algorithms: Option<String>, } #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Response { #[serde(rename = "keyHandle")] pub handle: aziot_key_common::KeyHandle, } } pub mod decrypt { #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Request { #[serde(rename = "keyHandle")] pub key_handle: aziot_key_common::KeyHandle, #[serde(flatten)] pub parameters: crate::encrypt::Parameters, pub ciphertext: http_common::ByteString, } #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Response { pub plaintext: http_common::ByteString, } } pub mod encrypt { #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Request { #[serde(rename = "keyHandle")] pub key_handle: aziot_key_common::KeyHandle, #[serde(flatten)] pub parameters: Parameters, pub plaintext: http_common::ByteString, } #[derive(Debug, serde::Deserialize, serde::Serialize)] #[serde(tag = "algorithm", content = "parameters")] pub enum Parameters { #[serde(rename = "AEAD")] Aead { iv: http_common::ByteString, aad: http_common::ByteString, }, #[serde(rename = "RSA-PKCS1")] RsaPkcs1, #[serde(rename = "RSA-NO-PADDING")] RsaNoPadding, } #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Response { pub ciphertext: http_common::ByteString, } } pub mod export_derived_key { #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Request { #[serde(rename = "keyHandle")] pub handle: aziot_key_common::KeyHandle, } #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Response { #[serde(rename = "key")] pub key: http_common::ByteString, } } pub mod get_key_pair_public_parameter { #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Request { #[serde(rename = "keyHandle")] pub key_handle: aziot_key_common::KeyHandle, } #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Response { pub value: String, } } pub mod load { #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Response { #[serde(rename = "keyHandle")] pub handle: aziot_key_common::KeyHandle, } } pub mod delete { #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Request { #[serde(rename = "keyHandle")] pub key_handle: aziot_key_common::KeyHandle, } } pub mod r#move { #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Request { pub from: String, } } pub mod sign { #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Request { #[serde(rename = "keyHandle")] pub key_handle: aziot_key_common::KeyHandle, #[serde(flatten)] pub parameters: Parameters, } #[derive(Debug, serde::Deserialize, serde::Serialize)] #[serde(tag = "algorithm", content = "parameters")] pub enum Parameters { #[serde(rename = "ECDSA")] Ecdsa { digest: http_common::ByteString }, #[serde(rename = "HMAC-SHA256")] HmacSha256 { message: http_common::ByteString }, } #[derive(Debug, serde::Deserialize, serde::Serialize)] pub struct Response { pub signature: http_common::ByteString, } } mod key_usage { pub(crate) fn deserialize<'de, D>( deserializer: D, ) -> Result<Vec<aziot_key_common::KeyUsage>, D::Error> where D: serde::Deserializer<'de>, { struct Visitor; impl<'de> serde::de::Visitor<'de> for Visitor { type Value = Vec<aziot_key_common::KeyUsage>; fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.write_str("KeyUsage") } fn visit_str<E>(self, s: &str) -> Result<Self::Value, E> where E: serde::de::Error, { s.split(',') .map(|usage| match usage { "derive" => Ok(aziot_key_common::KeyUsage::Derive), "encrypt" => Ok(aziot_key_common::KeyUsage::Encrypt), "sign" => Ok(aziot_key_common::KeyUsage::Sign), usage => Err(serde::de::Error::invalid_value( serde::de::Unexpected::Str(usage), &self, )), }) .collect() } } deserializer.deserialize_str(Visitor) } pub(crate) fn serialize<S>( value: &[aziot_key_common::KeyUsage], serializer: S, ) -> Result<S::Ok, S::Error> where S: serde::Serializer, { let mut s = String::new(); for usage in value { if !s.is_empty() { s.push(','); } s.push_str(match usage { aziot_key_common::KeyUsage::Derive => "derive", aziot_key_common::KeyUsage::Encrypt => "encrypt", aziot_key_common::KeyUsage::Sign => "sign", }); } serializer.serialize_str(&s) } }