OpenVPN 3 Core Library
Loading...
Searching...
No Matches
randaddr.hpp
Go to the documentation of this file.
1// OpenVPN -- An application to securely tunnel IP networks
2// over a single port, with support for SSL/TLS-based
3// session authentication and key exchange,
4// packet encryption, packet authentication, and
5// packet compression.
6//
7// Copyright (C) 2012- OpenVPN Inc.
8//
9// SPDX-License-Identifier: MPL-2.0 OR AGPL-3.0-only WITH openvpn3-openssl-exception
10//
11
12#pragma once
13
17
18namespace openvpn::IP {
19
21{
22 return IPv4::Addr::from_uint32(prng.rand_get<std::uint32_t>());
23}
24
26{
27 unsigned char bytes[16];
28 prng.rand_fill(bytes);
29 return IPv6::Addr::from_byte_string(bytes);
30}
31
33{
34 switch (v)
35 {
36 case Addr::V4:
37 return Addr::from_ipv4(random_addr_v4(prng));
38 case Addr::V6:
39 return Addr::from_ipv6(random_addr_v6(prng));
40 default:
41 OPENVPN_IP_THROW("random_addr: address unspecified");
42 }
43}
44
45// bit positions between templ.prefix_len and prefix_len are randomized
46inline Route random_subnet(const Route &templ,
47 const unsigned int prefix_len,
48 RandomAPI &prng)
49{
50 if (!templ.is_canonical())
51 throw Exception("IP::random_subnet: template route not canonical: " + templ.to_string());
52 return Route(((random_addr(templ.addr.version(), prng) & ~templ.netmask()) | templ.addr)
55}
56} // namespace openvpn::IP
static Addr netmask_from_prefix_len(Version v, const unsigned int prefix_len)
Definition ip.hpp:502
static Addr from_ipv6(IPv6::Addr addr)
Definition ip.hpp:268
static Addr from_ipv4(IPv4::Addr addr)
Definition ip.hpp:260
std::string to_string() const
Definition route.hpp:237
ADDR netmask() const
Definition route.hpp:159
bool is_canonical() const
Definition route.hpp:169
static Addr from_uint32(const base_type addr)
Definition ipv4.hpp:100
static Addr from_byte_string(const unsigned char *bytestr)
Definition ipv6.hpp:254
Abstract base class for random number generators.
Definition randapi.hpp:39
T rand_get()
Create a data object filled with random bytes.
Definition randapi.hpp:86
void rand_fill(T &obj)
Fill a data object with random bytes.
Definition randapi.hpp:75
#define OPENVPN_IP_THROW(ERR)
Definition ip.hpp:29
IPv6::Addr random_addr_v6(RandomAPI &prng)
Definition randaddr.hpp:25
RouteType< IP::Addr > Route
Definition route.hpp:357
Route random_subnet(const Route &templ, const unsigned int prefix_len, RandomAPI &prng)
Definition randaddr.hpp:46
Addr random_addr(const Addr::Version v, RandomAPI &prng)
Definition randaddr.hpp:32
IPv4::Addr random_addr_v4(RandomAPI &prng)
Definition randaddr.hpp:20
Implementation of the base classes for random number generators.
int prefix_len(const IPv4::Addr::base_type mask)