10#include <botan/assert.h>
11#include <botan/internal/ffi_cert.h>
12#include <botan/internal/ffi_util.h>
14#if defined(BOTAN_HAS_X509_CERTIFICATES)
15 #include <botan/x509_ext.h>
19#if defined(BOTAN_HAS_X509_CERTIFICATES)
21template <Botan::Cert_Extension::IPAddressBlocks::Version V>
28 const auto& choice = std::get<Botan::Cert_Extension::IPAddressBlocks::IPAddressChoice<V>>(family.
addr_choice());
30 if(!choice.ranges().has_value()) {
34 *count = choice.ranges().value().size();
39template <Botan::Cert_Extension::IPAddressBlocks::Version V>
48 const auto& choice = std::get<Botan::Cert_Extension::IPAddressBlocks::IPAddressChoice<V>>(addr_choice);
50 if(!choice.ranges().has_value()) {
53 if(entry >= choice.ranges().value().size()) {
57 const auto& entry_ = choice.ranges().value().at(entry);
77#if defined(BOTAN_HAS_X509_CERTIFICATES)
86 *v6_count = ext->v6_count();
97 botan_x509_cert_t cert,
int ipv6,
size_t i,
int* has_safi, uint8_t* safi,
int* present,
size_t* count) {
101#if defined(BOTAN_HAS_X509_CERTIFICATES)
103 if(ipv6 != 0 && ipv6 != 1) {
113 const size_t limit = ipv6 == 0 ? ext->
v4_count() : ext->v6_count();
118 const size_t index = ipv6 == 0 ? i : ext->v4_count() + i;
119 const auto& addr_blocks = ext->addr_blocks();
120 const auto& family = addr_blocks.at(index);
121 if(family.
safi().has_value()) {
123 *safi = family.
safi().value();
129 return ip_addr_blocks_get_family<Botan::Cert_Extension::IPAddressBlocks::Version::IPv4>(
130 family, present, count);
132 return ip_addr_blocks_get_family<Botan::Cert_Extension::IPAddressBlocks::Version::IPv6>(
133 family, present, count);
143 botan_x509_cert_t cert,
int ipv6,
size_t i,
size_t entry, uint8_t min_out[], uint8_t max_out[],
size_t* out_len) {
144 if(out_len ==
nullptr) {
147#if defined(BOTAN_HAS_X509_CERTIFICATES)
149 if(ipv6 != 0 && ipv6 != 1) {
159 const size_t limit = ipv6 == 0 ? ext->
v4_count() : ext->v6_count();
164 const size_t index = ipv6 == 0 ? i : ext->v4_count() + i;
165 const auto& addr_blocks = ext->addr_blocks();
166 const auto& addr_choice = addr_blocks.at(index).addr_choice();
169 return ip_addr_blocks_get_address<Botan::Cert_Extension::IPAddressBlocks::Version::IPv4>(
170 addr_choice, entry, min_out, max_out, out_len);
172 return ip_addr_blocks_get_address<Botan::Cert_Extension::IPAddressBlocks::Version::IPv6>(
173 addr_choice, entry, min_out, max_out, out_len);
187#if defined(BOTAN_HAS_X509_CERTIFICATES)
189 if(asnum != 0 && asnum != 1) {
198 const auto& asnum_or_rdi = asnum == 1 ? ext->
as_identifiers().
asnum() : ext->as_identifiers().rdi();
200 if(!asnum_or_rdi.has_value()) {
204 const auto& ranges = asnum_or_rdi.value().ranges();
206 if(!ranges.has_value()) {
212 *count = ranges.value().size();
226#if defined(BOTAN_HAS_X509_CERTIFICATES)
228 if(asnum != 0 && asnum != 1) {
237 const auto& asnum_or_rdi = asnum == 1 ? ext->
as_identifiers().
asnum() : ext->as_identifiers().rdi();
238 if(!asnum_or_rdi.has_value() || !asnum_or_rdi.value().ranges().has_value()) {
242 const auto& range = asnum_or_rdi.value().ranges().value();
243 if(i >= range.size()) {
247 *min = range.at(i).min();
248 *max = range.at(i).max();
const std::optional< ASIdentifierChoice > & asnum() const
const ASIdentifiers & as_identifiers() const
std::variant< IPAddressChoice< Version::IPv4 >, IPAddressChoice< Version::IPv6 > > AddrChoice
std::optional< uint8_t > safi() const
const AddrChoice & addr_choice() const
size_t v4_count() const
The number of IPv4 families contained in the extension.
struct botan_x509_cert_struct * botan_x509_cert_t
@ BOTAN_FFI_ERROR_NOT_IMPLEMENTED
@ BOTAN_FFI_ERROR_OUT_OF_RANGE
@ BOTAN_FFI_ERROR_NULL_POINTER
@ BOTAN_FFI_ERROR_NO_VALUE
@ BOTAN_FFI_ERROR_BAD_PARAMETER
int botan_x509_ext_ip_addr_blocks_get_address(botan_x509_cert_t cert, int ipv6, size_t i, size_t entry, uint8_t min_out[], uint8_t max_out[], size_t *out_len)
int botan_x509_ext_as_blocks_get_info(botan_x509_cert_t cert, int asnum, int *present, size_t *count)
int botan_x509_ext_as_blocks_get_entry_at(botan_x509_cert_t cert, int asnum, size_t i, uint32_t *min, uint32_t *max)
int botan_x509_ext_ip_addr_blocks_get_counts(botan_x509_cert_t cert, size_t *v4_count, size_t *v6_count)
int botan_x509_ext_ip_addr_blocks_get_family(botan_x509_cert_t cert, int ipv6, size_t i, int *has_safi, uint8_t *safi, int *present, size_t *count)
T & safe_get(botan_struct< T, M > *p)
int ffi_guard_thunk(const char *func_name, T thunk)
int write_vec_output(uint8_t out[], size_t *out_len, std::span< const uint8_t > buf)
bool any_null_pointers(Ptrs... ptr)