7#include <botan/pkix_types.h>
9#include <botan/assert.h>
10#include <botan/ber_dec.h>
11#include <botan/bigint.h>
12#include <botan/der_enc.h>
15#include <botan/internal/asn1_utils.h>
23 while(!bytes.empty() && bytes.front() == 0x00) {
24 bytes = bytes.subspan(1);
32 sn.m_contents.clear();
33 if((bytes.front() & 0x80) == 0x80) {
34 sn.m_contents.push_back(0x00);
36 sn.m_contents.insert(sn.m_contents.end(), bytes.begin(), bytes.end());
41 if(contents.empty()) {
42 throw Decoding_Error(
"Serial number INTEGER encoding has no contents octets");
47 while(offset + 1 < contents.size() && ((contents[offset] == 0x00 && (contents[offset + 1] & 0x80) == 0x00) ||
48 (contents[offset] == 0xFF && (contents[offset + 1] & 0x80) == 0x80))) {
53 sn.m_contents.assign(contents.begin() + offset, contents.end());
58 std::array<uint8_t, 16> bytes{};
67 return (m_contents[0] & 0x80) == 0x80;
71 return m_contents.size() == 1 && m_contents[0] == 0x00;
81 }
else if(m_contents[0] == 0x00) {
83 return {m_contents.begin() + 1, m_contents.end()};
122 return neg ? std::strong_ordering::less : std::strong_ordering::greater;
127 if(m_contents.size() != other.m_contents.size()) {
128 const bool shorter = m_contents.size() < other.m_contents.size();
129 return (shorter != neg) ? std::strong_ordering::less : std::strong_ordering::greater;
137 const int cmp = std::memcmp(m_contents.data(), other.m_contents.data(), m_contents.size());
139 return std::strong_ordering::less;
141 return std::strong_ordering::greater;
143 return std::strong_ordering::equal;
#define BOTAN_STATE_CHECK(expr)
BER_Decoder & decode(bool &out)
T serialize(size_t len) const
DER_Encoder & add_object(ASN1_Type type_tag, ASN1_Class class_tag, const uint8_t rep[], size_t length)
void randomize(std::span< uint8_t > output)
std::string to_string() const
std::strong_ordering operator<=>(const X509_Serial_Number &other) const
static X509_Serial_Number random(RandomNumberGenerator &rng)
static X509_Serial_Number from_bytes(std::span< const uint8_t > bytes)
void decode_from(BER_Decoder &from) override
std::vector< uint8_t > magnitude() const
static X509_Serial_Number from_der_contents(std::span< const uint8_t > contents)
void encode_into(DER_Encoder &to) const override
BigInt integer_from_contents(std::span< const uint8_t > contents)
void hex_encode(char output[], const uint8_t input[], size_t input_length, bool uppercase)