trz_gateway_common/x509/
serial_number.rs1use 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}