/src/gnutls/lib/x509/ip-in-cidr.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (C) 2014-2016 Free Software Foundation, Inc. |
3 | | * Copyright (C) 2016 Red Hat, Inc. |
4 | | * |
5 | | * Authors: Nikos Mavrogiannopoulos, Daiki Ueno, Martin Ukrop |
6 | | * |
7 | | * This file is part of GnuTLS. |
8 | | * |
9 | | * The GnuTLS is free software; you can redistribute it and/or |
10 | | * modify it under the terms of the GNU Lesser General Public License |
11 | | * as published by the Free Software Foundation; either version 2.1 of |
12 | | * the License, or (at your option) any later version. |
13 | | * |
14 | | * This library is distributed in the hope that it will be useful, but |
15 | | * WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
17 | | * Lesser General Public License for more details. |
18 | | * |
19 | | * You should have received a copy of the GNU Lesser General Public License |
20 | | * along with this program. If not, see <https://www.gnu.org/licenses/> |
21 | | * |
22 | | */ |
23 | | |
24 | | #ifndef GNUTLS_LIB_X509_IP_IN_CIDR_H |
25 | | #define GNUTLS_LIB_X509_IP_IN_CIDR_H |
26 | | |
27 | | /*- |
28 | | * ip_in_cidr: |
29 | | * @ip: IP datum (IPv4 or IPv6) |
30 | | * @cidr: CIDR datum (IPv4 or IPv6) |
31 | | * |
32 | | * Check if @ip lies in the given @cidr range. |
33 | | * The @ip version must match the @cidr version (v4/v6), |
34 | | * (this is not checked). |
35 | | * |
36 | | * Returns: 1 if @ip lies within @cidr, 0 otherwise |
37 | | -*/ |
38 | | static unsigned ip_in_cidr(const gnutls_datum_t *ip, const gnutls_datum_t *cidr) |
39 | 0 | { |
40 | 0 | unsigned byte; |
41 | 0 | #ifndef BUILD_IN_TESTS |
42 | 0 | char str_ip[48]; |
43 | 0 | char str_cidr[97]; |
44 | |
|
45 | 0 | _gnutls_hard_log("matching %.*s with CIDR constraint %.*s\n", |
46 | 0 | (int)sizeof(str_ip), |
47 | 0 | _gnutls_ip_to_string(ip->data, ip->size, str_ip, |
48 | 0 | sizeof(str_ip)), |
49 | 0 | (int)sizeof(str_cidr), |
50 | 0 | _gnutls_cidr_to_string(cidr->data, cidr->size, |
51 | 0 | str_cidr, sizeof(str_cidr))); |
52 | 0 | #endif |
53 | 0 | for (byte = 0; byte < ip->size; byte++) |
54 | 0 | if (((ip->data[byte] ^ cidr->data[byte]) & |
55 | 0 | cidr->data[ip->size + byte]) != 0) |
56 | 0 | return 0; |
57 | | |
58 | 0 | return 1; /* match */ |
59 | 0 | } |
60 | | |
61 | | #endif /* GNUTLS_LIB_X509_IP_IN_CIDR_H */ |