Files
APK/cert.rs
T
2026-07-12 19:37:19 +00:00

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)
}