trz_gateway_common/x509/
serial_number.rs

1use nameth::NamedEnumValues as _;
2use nameth::nameth;
3use openssl::asn1::Asn1Integer;
4use openssl::bn::BigNum;
5use openssl::error::ErrorStack;
6use openssl::x509::X509Builder;
7
8pub(super) fn set_serial_number(builder: &mut X509Builder) -> Result<(), SetSerialNumberError> {
9    (|| {
10        let mut bytes = vec![0; 20];
11        openssl::rand::rand_bytes(&mut bytes).map_err(SetSerialNumberError::RandBytes)?;
12        let serial_number =
13            BigNum::from_slice(&bytes).map_err(SetSerialNumberError::BigNumFromSlice)?;
14        let serial_number =
15            Asn1Integer::from_bn(&serial_number).map_err(SetSerialNumberError::ToAsn1)?;
16        builder
17            .set_serial_number(&serial_number)
18            .map_err(SetSerialNumberError::Set)?;
19        Ok(())
20    })()
21}
22
23#[nameth]
24#[derive(thiserror::Error, Debug)]
25pub enum SetSerialNumberError {
26    #[error("[{n}] Failed generate a ramdom serial number: {0}", n = self.name())]
27    RandBytes(ErrorStack),
28
29    #[error("[{n}] Failed to convert to BigNum: {0}", n = self.name())]
30    BigNumFromSlice(ErrorStack),
31
32    #[error("[{n}] Failed to convert to Asn1: {0}", n = self.name())]
33    ToAsn1(ErrorStack),
34
35    #[error("[{n}] Failed to set the serial number: {0}", n = self.name())]
36    Set(ErrorStack),
37}