use crate::keydata::SPKI_DER; pub fn build_min_cert() -> Vec { let sig_alg = der_seq(&der_oid(&[0x2a])); let name = der_seq(&[]); let not_before = der_tlv(0x17, b"000101000000Z"); let not_after = der_tlv(0x17, b"490101000000Z"); let validity = der_seq(&[not_before, not_after].concat()); let cert_spki = SPKI_DER.to_vec(); let tbs = der_seq( &[ der_int(&[1]), sig_alg.clone(), name.clone(), validity, name, cert_spki, ] .concat(), ); let sig_bitstring = der_tlv(0x03, &[0x00]); der_seq(&[tbs, sig_alg, sig_bitstring].concat()) } fn der_len(len: usize) -> Vec { if len < 0x80 { vec![len as u8] } else { let mut b = Vec::new(); let mut l = len; while l > 0 { b.insert(0, (l & 0xff) as u8); l >>= 8; } let mut out = vec![0x80 | b.len() as u8]; out.extend_from_slice(&b); out } } fn der_tlv(tag: u8, body: &[u8]) -> Vec { let mut out = vec![tag]; out.extend_from_slice(&der_len(body.len())); out.extend_from_slice(body); out } fn der_seq(body: &[u8]) -> Vec { der_tlv(0x30, body) } fn der_oid(bytes: &[u8]) -> Vec { der_tlv(0x06, bytes) } fn der_int(bytes: &[u8]) -> Vec { let mut b = bytes.to_vec(); if !b.is_empty() && b[0] & 0x80 != 0 { b.insert(0, 0x00); } der_tlv(0x02, &b) }