Update src/cert.rs
This commit is contained in:
+63
@@ -0,0 +1,63 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user