64 lines
1.5 KiB
Rust
64 lines
1.5 KiB
Rust
use crate::keydata::SPKI_DER;
|
|
|
|
pub fn build_min_cert() -> Vec<u8> {
|
|
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<u8> {
|
|
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<u8> {
|
|
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<u8> {
|
|
der_tlv(0x30, body)
|
|
}
|
|
fn der_oid(bytes: &[u8]) -> Vec<u8> {
|
|
der_tlv(0x06, bytes)
|
|
}
|
|
fn der_int(bytes: &[u8]) -> Vec<u8> {
|
|
let mut b = bytes.to_vec();
|
|
if !b.is_empty() && b[0] & 0x80 != 0 {
|
|
b.insert(0, 0x00);
|
|
}
|
|
der_tlv(0x02, &b)
|
|
}
|