Botan 3.12.0
Crypto and TLS for C&
Botan::IPv4Subnet Class Referencefinal

#include <ipv4_address.h>

Public Member Functions

const IPv4Addressaddress () const
 The network address (host bits already zeroed).
bool contains (const IPv4Address &ip) const
 True iff ip falls within this subnet.
 IPv4Subnet (IPv4Address address, size_t prefix_length)
bool is_host () const
 True iff prefix_length() == 32.
size_t prefix_length () const
 Prefix length in [0, 32].
std::vector< uint8_t > serialize () const
std::string to_string () const
 CIDR-style "10.0.0.0/8".

Static Public Member Functions

static std::optional< IPv4Subnetfrom_address_and_mask (std::span< const uint8_t, 8 > addr_and_mask)
static std::optional< IPv4Subnetfrom_address_and_mask (uint32_t addr, uint32_t mask)
static std::optional< IPv4Subnetfrom_string (std::string_view str)
static IPv4Subnet host (IPv4Address address)

Friends

bool operator== (const IPv4Subnet &, const IPv4Subnet &)=default

Detailed Description

An IPv4 subnet in CIDR form: a network address paired with a prefix length

Definition at line 65 of file ipv4_address.h.

Constructor & Destructor Documentation

◆ IPv4Subnet()

Botan::IPv4Subnet::IPv4Subnet ( IPv4Address address,
size_t prefix_length )

Construct from a network address and a prefix length in [0, 32]. Host bits of address are cleared.

Throws Invalid_Argument if prefix_length > 32.

Definition at line 54 of file ipv4_address.cpp.

54 :
55 m_address(address & IPv4Address::netmask(prefix_length)), m_prefix_length(static_cast<uint8_t>(prefix_length)) {
56 // IPv4Address::netmask validates prefix_length <= 32, so by this point
57 // the static_cast is in range.
58}
static IPv4Address netmask(size_t bits)
size_t prefix_length() const
Prefix length in [0, 32].
const IPv4Address & address() const
The network address (host bits already zeroed).

References address(), and prefix_length().

Referenced by from_address_and_mask(), from_string(), host(), and operator==.

Member Function Documentation

◆ address()

const IPv4Address & Botan::IPv4Subnet::address ( ) const
inline

The network address (host bits already zeroed).

Definition at line 103 of file ipv4_address.h.

103{ return m_address; }

Referenced by host(), and IPv4Subnet().

◆ contains()

bool Botan::IPv4Subnet::contains ( const IPv4Address & ip) const

True iff ip falls within this subnet.

Definition at line 110 of file ipv4_address.cpp.

110 {
111 return (ip & IPv4Address::netmask(m_prefix_length)) == m_address;
112}

References Botan::IPv4Address::netmask().

◆ from_address_and_mask() [1/2]

std::optional< IPv4Subnet > Botan::IPv4Subnet::from_address_and_mask ( std::span< const uint8_t, 8 > addr_and_mask)
static

Construct from a network address and a netmask (4 bytes each) Returns nullopt if netmask is not a valid contiguous CIDR prefix.

Definition at line 69 of file ipv4_address.cpp.

69 {
70 const IPv4Address addr(load_be<uint32_t>(addr_and_mask.data(), 0));
71 const IPv4Address mask(load_be<uint32_t>(addr_and_mask.data(), 1));
72
73 if(const auto plen = mask.prefix_length()) {
74 return IPv4Subnet(addr, *plen);
75 } else {
76 return {};
77 }
78}
IPv4Subnet(IPv4Address address, size_t prefix_length)
constexpr auto load_be(ParamTs &&... params)
Definition loadstor.h:504

References IPv4Subnet(), Botan::load_be(), and Botan::IPv4Address::prefix_length().

Referenced by Botan::GeneralName::decode_from(), from_address_and_mask(), and Botan::GeneralName::ipv4_address().

◆ from_address_and_mask() [2/2]

std::optional< IPv4Subnet > Botan::IPv4Subnet::from_address_and_mask ( uint32_t addr,
uint32_t mask )
static

Construct from a network address and a netmask (4 bytes each) Returns nullopt if netmask is not a valid contiguous CIDR prefix.

Definition at line 61 of file ipv4_address.cpp.

61 {
62 std::array<uint8_t, 8> addr_and_mask{};
63 store_be(&addr_and_mask[0], addr); // NOLINT(*-container-data-pointer)
64 store_be(&addr_and_mask[4], mask);
65 return IPv4Subnet::from_address_and_mask(addr_and_mask);
66}
static std::optional< IPv4Subnet > from_address_and_mask(std::span< const uint8_t, 8 > addr_and_mask)
constexpr auto store_be(ParamTs &&... params)
Definition loadstor.h:745

References from_address_and_mask(), and Botan::store_be().

◆ from_string()

std::optional< IPv4Subnet > Botan::IPv4Subnet::from_string ( std::string_view str)
static

Parse CIDR-style form "10.0.0.0/8".

The "/N" suffix is required: bare addresses should be parsed via IPv4Address::from_string and wrapped with IPv4Subnet::host if needed.

Returns nullopt on parse failure or out-of-range prefix length.

Definition at line 81 of file ipv4_address.cpp.

81 {
82 const auto slash = str.find('/');
83 if(slash == std::string_view::npos) {
84 return std::nullopt;
85 }
86
87 auto addr = IPv4Address::from_string(str.substr(0, slash));
88 if(!addr.has_value()) {
89 return std::nullopt;
90 }
91
92 const auto plen_str = str.substr(slash + 1);
93 if(plen_str.empty() || plen_str.size() > 2) {
94 return std::nullopt;
95 }
96 size_t plen = 0;
97 for(const char c : plen_str) {
98 if(c < '0' || c > '9') {
99 return std::nullopt;
100 }
101 plen = plen * 10 + static_cast<size_t>(c - '0');
102 }
103 if(plen > 32) {
104 return std::nullopt;
105 }
106
107 return IPv4Subnet(*addr, plen);
108}
static std::optional< IPv4Address > from_string(std::string_view str)

References Botan::IPv4Address::from_string(), and IPv4Subnet().

◆ host()

IPv4Subnet Botan::IPv4Subnet::host ( IPv4Address address)
inlinestatic

A single-host subnet (prefix length 32) covering exactly address.

Definition at line 100 of file ipv4_address.h.

100{ return IPv4Subnet(address, 32); }

References address(), and IPv4Subnet().

Referenced by Botan::GeneralName::ipv4_address().

◆ is_host()

bool Botan::IPv4Subnet::is_host ( ) const
inline

True iff prefix_length() == 32.

Definition at line 109 of file ipv4_address.h.

109{ return m_prefix_length == 32; }

Referenced by serialize().

◆ prefix_length()

size_t Botan::IPv4Subnet::prefix_length ( ) const
inline

Prefix length in [0, 32].

Definition at line 106 of file ipv4_address.h.

106{ return m_prefix_length; }

Referenced by IPv4Subnet().

◆ serialize()

std::vector< uint8_t > Botan::IPv4Subnet::serialize ( ) const

Bytes for use in a DER-encoded GeneralName iPAddress field:

  • 4 bytes (the address) if is_host() — SAN form per RFC 5280 4.2.1.6.
  • 8 bytes (address || netmask) otherwise — name constraint form per RFC 5280 4.2.1.10.

Definition at line 118 of file ipv4_address.cpp.

118 {
119 std::vector<uint8_t> out;
120 if(is_host()) {
121 out.resize(4);
122 store_be(m_address.value(), out.data());
123 return out;
124 }
125 out.resize(8);
126 store_be(m_address.value(), out.data());
127 store_be(IPv4Address::netmask(m_prefix_length).value(), out.data() + 4);
128 return out;
129}
bool is_host() const
True iff prefix_length() == 32.

References is_host(), Botan::IPv4Address::netmask(), and Botan::store_be().

◆ to_string()

std::string Botan::IPv4Subnet::to_string ( ) const

CIDR-style "10.0.0.0/8".

Definition at line 114 of file ipv4_address.cpp.

114 {
115 return fmt("{}/{}", m_address.to_string(), static_cast<size_t>(m_prefix_length));
116}
std::string fmt(std::string_view format, const T &... args)
Definition fmt.h:53

References Botan::fmt().

◆ operator==

bool operator== ( const IPv4Subnet & ,
const IPv4Subnet &  )
friend

References IPv4Subnet().


The documentation for this class was generated from the following files: