Botan 3.13.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 90 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 139 of file ipv4_address.cpp.

139 :
140 m_address(address & IPv4Address::netmask(prefix_length)), m_prefix_length(static_cast<uint8_t>(prefix_length)) {
141 // IPv4Address::netmask validates prefix_length <= 32, so by this point
142 // the static_cast is in range.
143}
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 132 of file ipv4_address.h.

132{ return m_address; }

Referenced by host(), IPv4Subnet(), and serialize().

◆ contains()

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

True iff ip falls within this subnet.

Definition at line 197 of file ipv4_address.cpp.

197 {
198 return (ip & IPv4Address::netmask(m_prefix_length)) == m_address;
199}

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 154 of file ipv4_address.cpp.

154 {
155 const IPv4Address addr(load_be<uint32_t>(addr_and_mask.data(), 0));
156 const IPv4Address mask(load_be<uint32_t>(addr_and_mask.data(), 1));
157
158 if(const auto plen = mask.prefix_length()) {
159 return IPv4Subnet(addr, *plen);
160 } else {
161 return {};
162 }
163}
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 146 of file ipv4_address.cpp.

146 {
147 std::array<uint8_t, 8> addr_and_mask{};
148 store_be(&addr_and_mask[0], addr); // NOLINT(*-container-data-pointer)
149 store_be(&addr_and_mask[4], mask);
150 return IPv4Subnet::from_address_and_mask(addr_and_mask);
151}
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. The input must already be canonical, such that from_string and to_string are exact inverses: the prefix length is canonical decimal ("/8", not "/08") and the host bits are clear ("10.0.0.0/8", not "10.1.2.3/8").

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

Definition at line 166 of file ipv4_address.cpp.

166 {
167 const auto slash = str.find('/');
168 if(slash == std::string_view::npos) {
169 return std::nullopt;
170 }
171
172 auto addr = IPv4Address::from_string(str.substr(0, slash));
173 if(!addr.has_value()) {
174 return std::nullopt;
175 }
176
177 // Parse the prefix length as a canonical decimal integer in [0, 32]
178 const auto plen_str = str.substr(slash + 1);
179
180 const auto plen = parse_sz(plen_str, /*require_canonical=*/true);
181
182 if(!plen.has_value() || plen.value() > 32) {
183 return std::nullopt;
184 }
185
186 const IPv4Subnet subnet(*addr, plen.value());
187
188 // Require the input to already be canonical: from_string and to_string
189 // are exact inverses, so a set host bit is rejected rather than masked away
190 if(subnet.to_string() != str) {
191 return std::nullopt;
192 }
193
194 return subnet;
195}
static std::optional< IPv4Address > from_string(std::string_view str)
std::optional< size_t > parse_sz(std::string_view input, bool require_canonical)
Definition parsing.cpp:72

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

◆ host()

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

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

Definition at line 129 of file ipv4_address.h.

129{ 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 138 of file ipv4_address.h.

138{ 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 135 of file ipv4_address.h.

135{ 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.

If this is an address (is_host returns true) the output is 4 bytes (the address in network order) Otherwise it is a subnet and the output is 8 bytes (address || netmask)

Definition at line 205 of file ipv4_address.cpp.

205 {
206 std::vector<uint8_t> out;
207 if(is_host()) {
208 out.resize(4);
209 store_be(m_address.address(), out.data());
210 return out;
211 }
212 out.resize(8);
213 store_be(m_address.address(), out.data());
214 store_be(IPv4Address::netmask(m_prefix_length).address(), out.data() + 4);
215 return out;
216}
bool is_host() const
True iff prefix_length() == 32.

References address(), 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 201 of file ipv4_address.cpp.

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

References Botan::fmt().

Referenced by from_string().

◆ operator==

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

References IPv4Subnet().


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