use crate::{AlertDescription, handshake::ServerHelloExtension};
use super::extension::signature_scheme::SignatureScheme;
#[repr(u8)]
#[derive(Debug)]
#[allow(non_camel_case_types)]
pub enum CertificateType {
X509 = 0,
OpenPGP_RESERVED = 1,
RawPublicKey = 2,
}
#[derive(Debug)]
pub struct CertificateEntry {
data: Vec<u8>,
extensions: Vec<ServerHelloExtension>,
}
pub struct Certificate {
data: Vec<u8>,
}
pub fn certificate_from_der(public_der: &[u8]) -> Result<Vec<u8>, AlertDescription> {
assert_ne!(public_der.len(), 0);
assert!(public_der.len() < (1 << 24) - 1);
let data_len: u32 = public_der.len().try_into().unwrap();
let certificates_len: u32 = data_len + 5;
let mut ret: Vec<u8> = Vec::with_capacity(public_der.len().saturating_add(15));
ret.push(0); ret.extend_from_slice(&certificates_len.to_be_bytes()[1..]);
ret.extend_from_slice(&data_len.to_be_bytes()[1..]);
ret.extend_from_slice(public_der);
ret.extend_from_slice(&[0, 0]);
Ok(ret)
}
#[derive(Debug)]
pub struct CertificateVerify {
algorithm: SignatureScheme,
signature: Vec<u8>,
}
impl CertificateVerify {
pub fn from_ecdsa_secp256r1_sha256(signature: &[u8]) -> Self {
Self {
algorithm: SignatureScheme::ecdsa_secp256r1_sha256,
signature: signature.to_vec(),
}
}
pub fn ser(&self) -> Vec<u8> {
let mut buf: Vec<u8> = Vec::new();
buf.extend_from_slice(&self.algorithm.to_be_bytes());
let signature_len: u16 = self.signature.len().try_into().unwrap();
buf.extend_from_slice(&signature_len.to_be_bytes());
buf.extend_from_slice(&self.signature);
buf
}
}