1 // Copyright 2023 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ip_util.h" 6 7 namespace bssl { 8 IsValidNetmask(der::Input mask)9bool IsValidNetmask(der::Input mask) { 10 if (mask.size() != kIPv4AddressSize && mask.size() != kIPv6AddressSize) { 11 return false; 12 } 13 14 for (size_t i = 0; i < mask.size(); i++) { 15 uint8_t b = mask[i]; 16 if (b != 0xff) { 17 // b must be all ones followed by all zeros, so ~b must be all zeros 18 // followed by all ones. 19 uint8_t inv = ~b; 20 if ((inv & (inv + 1)) != 0) { 21 return false; 22 } 23 // The remaining bytes must be all zeros. 24 for (size_t j = i + 1; j < mask.size(); j++) { 25 if (mask[j] != 0) { 26 return false; 27 } 28 } 29 return true; 30 } 31 } 32 33 return true; 34 } 35 IPAddressMatchesWithNetmask(der::Input addr1,der::Input addr2,der::Input mask)36bool IPAddressMatchesWithNetmask(der::Input addr1, der::Input addr2, 37 der::Input mask) { 38 if (addr1.size() != addr2.size() || addr1.size() != mask.size()) { 39 return false; 40 } 41 for (size_t i = 0; i < addr1.size(); i++) { 42 if ((addr1[i] & mask[i]) != (addr2[i] & mask[i])) { 43 return false; 44 } 45 } 46 return true; 47 } 48 49 } // namespace bssl 50