blob: 4d90e0a3edfdcca92f0d30a6253612b6c5ab37fe [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/developer/forensics/utils/redact/redactor.h"
#include <lib/inspect/cpp/vmo/types.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "src/lib/json_parser/json_parser.h"
namespace forensics {
namespace {
class IdentityRedactorTest : public ::testing::Test {
protected:
std::string Redact(std::string text) { return redactor_.Redact(text); }
private:
IdentityRedactor redactor_{inspect::BoolProperty()};
};
TEST_F(IdentityRedactorTest, Check) {
EXPECT_EQ(Redact("Email: alice@website.tld"), "Email: alice@website.tld");
}
class RedactorTest : public ::testing::Test {
protected:
std::string Redact(std::string text) { return redactor_.Redact(text); }
std::string RedactJson(std::string text) { return redactor_.RedactJson(text); }
const Redactor& redactor() const { return redactor_; }
private:
Redactor redactor_{0u, inspect::UintProperty(), inspect::BoolProperty()};
};
TEST_F(RedactorTest, RedactsEmail) {
EXPECT_EQ(Redact("Email: alice@website.tld"), "Email: <REDACTED-EMAIL>");
}
TEST_F(RedactorTest, RedactsIpv4) {
EXPECT_EQ(Redact("IPv4: 8.8.8.8"), "IPv4: <REDACTED-IPV4: 1>");
}
TEST_F(RedactorTest, RedactsIpv4InIpv6) {
EXPECT_EQ(Redact("IPv46: ::ffff:12.34.56.78"), "IPv46: ::ffff:<REDACTED-IPV4: 1>");
}
TEST_F(RedactorTest, RedactsIpv4InIpv6Hex) {
EXPECT_EQ(Redact("IPv46h: ::ffff:ab12:34cd"), "IPv46h: ::ffff:<REDACTED-IPV4: 1>");
}
TEST_F(RedactorTest, RedactsIpv6) {
EXPECT_EQ(Redact("not_IPv46h: ::ffff:ab12:34cd:5"), "not_IPv46h: <REDACTED-IPV6: 1>");
EXPECT_EQ(Redact("IPv6: 2001:503:eEa3:0:0:0:0:30"), "IPv6: <REDACTED-IPV6: 2>");
}
TEST_F(RedactorTest, RedactsIpv6Complex) {
EXPECT_EQ(Redact("IPv6C: [::/0 via 2082::7d84:c1dc:ab34:656a nic 4]"),
"IPv6C: [::/0 via <REDACTED-IPV6: 1> nic 4]");
}
TEST_F(RedactorTest, RedactsIpv6LinkLocal) {
EXPECT_EQ(Redact("IPv6LL: fe80::7d84:c1dc:ab34:656a"), "IPv6LL: fe80:<REDACTED-IPV6-LL: 1>");
}
TEST_F(RedactorTest, RedactsUuid) {
EXPECT_EQ(Redact("UUID: ddd0fA34-1016-11eb-adc1-0242ac120002"), "UUID: <REDACTED-UUID>");
}
TEST_F(RedactorTest, RedactsMacAddress) {
EXPECT_EQ(Redact("MAC address: 00:0a:95:9F:68:16 12-34-95-9F-68-16"),
"MAC address: 00:0a:95:<REDACTED-MAC: 1> 12-34-95-<REDACTED-MAC: 2>");
}
TEST_F(RedactorTest, RedactsSsid) {
EXPECT_EQ(Redact("SSID: <ssid-666F6F> <ssid-77696669>"),
"SSID: <REDACTED-SSID: 1> <REDACTED-SSID: 2>");
}
TEST_F(RedactorTest, RedactsHttpUrl) {
EXPECT_EQ(Redact("HTTP: http://fuchsia.dev/"), "HTTP: <REDACTED-URL>");
}
TEST_F(RedactorTest, RedactsHttpsUrl) {
EXPECT_EQ(Redact("HTTPS: https://fuchsia.dev/"), "HTTPS: <REDACTED-URL>");
}
TEST_F(RedactorTest, RedactsUrlWithSemicolon) {
EXPECT_EQ(Redact("URL with semicolon: https://fuchsia.dev?query=a;b"),
"URL with semicolon: <REDACTED-URL>");
}
TEST_F(RedactorTest, RedactsUrlWithUuid) {
EXPECT_EQ(
Redact("URL with UUID: https://fuchsia.dev/ddd0fA34-1016-11eb-adc1-0242ac120002?query=a;b"),
"URL with UUID: <REDACTED-URL>");
}
TEST_F(RedactorTest, RedactsCombined) {
EXPECT_EQ(Redact("Combined: Email alice@website.tld, IPv4 8.8.8.8"),
"Combined: Email <REDACTED-EMAIL>, IPv4 <REDACTED-IPV4: 1>");
}
TEST_F(RedactorTest, DoesNotRedactFidlService) {
EXPECT_EQ(Redact("service::fidl service:fidl"), "service::fidl service:fidl");
}
TEST_F(RedactorTest, RedactsHexAndIpv4) {
EXPECT_EQ(Redact("456 1234567890abcdefABCDEF0123456789 1.2.3.4"),
"456 <REDACTED-HEX: 2> <REDACTED-IPV4: 1>");
}
TEST_F(RedactorTest, DoesNotRedactPartialIpv4) {
EXPECT_EQ(Redact("current: 0.8.8.8"), "current: 0.8.8.8");
}
TEST_F(RedactorTest, DoesNotRedactLoopbackIpv4) {
EXPECT_EQ(Redact("loopback: 127.8.8.8"), "loopback: 127.8.8.8");
}
TEST_F(RedactorTest, DoesNotRedactLinkLocalIpv4) {
EXPECT_EQ(Redact("link_local: 169.254.8.8"), "link_local: 169.254.8.8");
}
TEST_F(RedactorTest, DoesNotRedactLinkLocalMulticastIpv4) {
EXPECT_EQ(Redact("link_local_multicast: 224.0.0.8"), "link_local_multicast: 224.0.0.8");
}
TEST_F(RedactorTest, DoesNotRedactBroadcastIpv4) {
EXPECT_EQ(Redact("broadcast: 255.255.255.255"), "broadcast: 255.255.255.255");
}
TEST_F(RedactorTest, RedactsNonBroadcastIpv4) {
EXPECT_EQ(Redact("not_broadcast: 255.255.255.254"), "not_broadcast: <REDACTED-IPV4: 1>");
}
TEST_F(RedactorTest, RedactsNonLinkLocalMulticastIpv4) {
EXPECT_EQ(Redact("not_link_local_multicast: 224.0.1.8"),
"not_link_local_multicast: <REDACTED-IPV4: 1>");
}
TEST_F(RedactorTest, DoesNotRedactLocalMulticastIpv6) {
EXPECT_EQ(Redact("local_multicast_1: fF41::1234:5678:9aBc"),
"local_multicast_1: fF41::1234:5678:9aBc");
EXPECT_EQ(Redact("local_multicast_2: Ffe2:1:2:33:abcd:ef0:6789:456"),
"local_multicast_2: Ffe2:1:2:33:abcd:ef0:6789:456");
}
TEST_F(RedactorTest, RedactsMulticastIpv6) {
EXPECT_EQ(Redact("multicast: fF43:abcd::ef0:6789:456"),
"multicast: fF43:<REDACTED-IPV6-MULTI: 1>");
}
TEST_F(RedactorTest, RedactsLinkLocalIpv6) {
EXPECT_EQ(Redact("link_local_8: fe89:123::4567:8:90"),
"link_local_8: fe89:<REDACTED-IPV6-LL: 1>");
EXPECT_EQ(Redact("link_local_b: FEB2:123::4567:8:90"),
"link_local_b: FEB2:<REDACTED-IPV6-LL: 2>");
}
TEST_F(RedactorTest, RedactsNonLinkLocalIpv6) {
EXPECT_EQ(Redact("not_link_local: fec1:123::4567:8:90"), "not_link_local: <REDACTED-IPV6: 1>");
EXPECT_EQ(Redact("not_link_local_2: fe71:123::4567:8:90"),
"not_link_local_2: <REDACTED-IPV6: 2>");
}
TEST_F(RedactorTest, DoesNotRedactInvalidIpv6) {
EXPECT_EQ(Redact("not_address_1: 12:34::"), "not_address_1: 12:34::");
EXPECT_EQ(Redact("not_address_2: ::12:34"), "not_address_2: ::12:34");
}
TEST_F(RedactorTest, RedactsValidIpv6WithEdgeCaseColons) {
EXPECT_EQ(Redact("v6_colons_3_fields: ::12:34:5"), "v6_colons_3_fields: <REDACTED-IPV6: 1>");
EXPECT_EQ(Redact("v6_3_fields_colons: 12:34:5::"), "v6_3_fields_colons: <REDACTED-IPV6: 2>");
EXPECT_EQ(Redact("v6_colons_7_fields: ::12:234:35:46:5:6:7"),
"v6_colons_7_fields: <REDACTED-IPV6: 3>");
EXPECT_EQ(Redact("v6_7_fields_colons: 12:234:35:46:5:6:7::"),
"v6_7_fields_colons: <REDACTED-IPV6: 4>");
EXPECT_EQ(Redact("v6_colons_8_fields: ::12:234:35:46:5:6:7:8"),
"v6_colons_8_fields: <REDACTED-IPV6: 3>:8");
EXPECT_EQ(Redact("v6_8_fields_colons: 12:234:35:46:5:6:7:8::"),
"v6_8_fields_colons: <REDACTED-IPV6: 5>::");
}
TEST_F(RedactorTest, RedactsObfuscatedGaiaId) {
EXPECT_EQ(Redact("obfuscated_gaia_id: 106986199446298680449"),
"obfuscated_gaia_id: <REDACTED-OBFUSCATED-GAIA-ID: 1>");
}
TEST_F(RedactorTest, Redacts32ByteHex) {
EXPECT_EQ(
Redact("32_hex: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 33_hex: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"),
"32_hex: <REDACTED-HEX: 1> 33_hex: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
}
TEST_F(RedactorTest, Redacts16ByteHex) {
EXPECT_EQ(Redact("456 1234567890abcdef 789"), "456 <REDACTED-HEX: 1> 789");
}
TEST_F(RedactorTest, DoesNotRedactHexWithElfPrefix) {
EXPECT_EQ(Redact("456 elf:1234567890abcdef 789"), "456 elf:1234567890abcdef 789");
EXPECT_EQ(Redact("456 elf:1234567890abcdefABCDEF0123456789 789"),
"456 elf:1234567890abcdefABCDEF0123456789 789");
}
TEST_F(RedactorTest, DoesNotRedactBuildId) {
EXPECT_EQ(Redact("456 build_id: '5f2c0ede0fa479b9b997c4fce6d4cf24' 789"),
"456 build_id: '5f2c0ede0fa479b9b997c4fce6d4cf24' 789");
}
TEST_F(RedactorTest, RedactsIpv4InFidl) {
EXPECT_EQ(Redact("ipv4 fidl debug: Ipv4Address { addr: [1, 255, FF, FF] }"),
"ipv4 fidl debug: Ipv4Address { <REDACTED-IPV4: 1> }");
}
TEST_F(RedactorTest, RedactsIpv6InFidl) {
EXPECT_EQ(
Redact(
"ipv6 fidl debug: Ipv6Address { addr: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 255, FF, FF] }"),
"ipv6 fidl debug: Ipv6Address { <REDACTED-IPV6: 1> }");
}
TEST_F(RedactorTest, RedactsMacInFidl) {
EXPECT_EQ(Redact("mac fidl debug: MacAddress { octets: [1, 2, 3, 255, FF, FF] }"),
"mac fidl debug: MacAddress { <REDACTED-MAC: 1> }");
}
TEST_F(RedactorTest, Canary) {
EXPECT_EQ(Redact(redactor().UnredactedCanary()), redactor().RedactedCanary());
}
TEST_F(RedactorTest, JsonDoesNotRedactEmail) {
EXPECT_EQ(RedactJson("Email: alice@website.tld"), "Email: alice@website.tld");
}
TEST_F(RedactorTest, JsonRedactsIpv4) {
EXPECT_EQ(RedactJson("IPv4: 8.8.8.8"), "IPv4: <REDACTED-IPV4: 1>");
}
TEST_F(RedactorTest, JsonRedactsIpv4InIpv6) {
EXPECT_EQ(RedactJson("IPv46: ::ffff:12.34.56.78"), "IPv46: ::ffff:<REDACTED-IPV4: 1>");
}
TEST_F(RedactorTest, JsonRedactsIpv4InIpv6Hex) {
EXPECT_EQ(RedactJson("IPv46h: ::ffff:ab12:34cd"), "IPv46h: ::ffff:<REDACTED-IPV4: 1>");
}
TEST_F(RedactorTest, JsonRedactsIpv6) {
EXPECT_EQ(RedactJson("not_IPv46h: ::ffff:ab12:34cd:5"), "not_IPv46h: <REDACTED-IPV6: 1>");
EXPECT_EQ(RedactJson("IPv6: 2001:503:eEa3:0:0:0:0:30"), "IPv6: <REDACTED-IPV6: 2>");
}
TEST_F(RedactorTest, JsonRedactsIpv6Complex) {
EXPECT_EQ(RedactJson("IPv6C: [::/0 via 2082::7d84:c1dc:ab34:656a nic 4]"),
"IPv6C: [::/0 via <REDACTED-IPV6: 1> nic 4]");
}
TEST_F(RedactorTest, JsonRedactsIpv6LinkLocal) {
EXPECT_EQ(RedactJson("IPv6LL: fe80::7d84:c1dc:ab34:656a"), "IPv6LL: fe80:<REDACTED-IPV6-LL: 1>");
}
TEST_F(RedactorTest, JsonDoesNotRedactUuid) {
EXPECT_EQ(RedactJson("UUID: ddd0fA34-1016-11eb-adc1-0242ac120002"),
"UUID: ddd0fA34-1016-11eb-adc1-0242ac120002");
}
TEST_F(RedactorTest, JsonDoesNotRedactHttp) {
EXPECT_EQ(RedactJson("HTTP: http://fuchsia.dev/"), "HTTP: http://fuchsia.dev/");
}
TEST_F(RedactorTest, JsonDoesNotRedactHttps) {
EXPECT_EQ(RedactJson("HTTPS: https://fuchsia.dev/"), "HTTPS: https://fuchsia.dev/");
}
TEST_F(RedactorTest, JsonDoesNotRedactUrlWithSemicolon) {
EXPECT_EQ(RedactJson("URL with semicolon: https://fuchsia.dev?query=a;b"),
"URL with semicolon: https://fuchsia.dev?query=a;b");
}
TEST_F(RedactorTest, JsonDoesNotRedactUrlWithUuid) {
EXPECT_EQ(
RedactJson(
"URL with UUID: https://fuchsia.dev/ddd0fA34-1016-11eb-adc1-0242ac120002?query=a;b"),
"URL with UUID: https://fuchsia.dev/ddd0fA34-1016-11eb-adc1-0242ac120002?query=a;b");
}
TEST_F(RedactorTest, JsonRedactsCombined) {
EXPECT_EQ(RedactJson("Combined: Email alice@website.tld, IPv4 8.8.8.8"),
"Combined: Email alice@website.tld, IPv4 <REDACTED-IPV4: 1>");
}
TEST_F(RedactorTest, JsonDoesNotRedactFidlService) {
EXPECT_EQ(RedactJson("service::fidl service:fidl"), "service::fidl service:fidl");
}
TEST_F(RedactorTest, JsonRedactsIpv4ButNotHex) {
EXPECT_EQ(RedactJson("456 1234567890abcdefABCDEF0123456789 1.2.3.4"),
"456 1234567890abcdefABCDEF0123456789 <REDACTED-IPV4: 1>");
}
TEST_F(RedactorTest, JsonDoesNotRedactPartialIpv4) {
EXPECT_EQ(RedactJson("current: 0.8.8.8"), "current: 0.8.8.8");
}
TEST_F(RedactorTest, JsonDoesNotRedactLoopbackIpv4) {
EXPECT_EQ(RedactJson("loopback: 127.8.8.8"), "loopback: 127.8.8.8");
}
TEST_F(RedactorTest, JsonDoesNotRedactLinkLocalIpv4) {
EXPECT_EQ(RedactJson("link_local: 169.254.8.8"), "link_local: 169.254.8.8");
}
TEST_F(RedactorTest, JsonDoesNotRedactLinkLocalMulticastIpv4) {
EXPECT_EQ(RedactJson("link_local_multicast: 224.0.0.8"), "link_local_multicast: 224.0.0.8");
}
TEST_F(RedactorTest, JsonDoesNotRedactBroadcastIpv4) {
EXPECT_EQ(RedactJson("broadcast: 255.255.255.255"), "broadcast: 255.255.255.255");
}
TEST_F(RedactorTest, JsonRedactsNonBroadcastIpv4) {
EXPECT_EQ(RedactJson("not_broadcast: 255.255.255.254"), "not_broadcast: <REDACTED-IPV4: 1>");
}
TEST_F(RedactorTest, JsonRedactsNonLinkLocalMulticastIpv4) {
EXPECT_EQ(RedactJson("not_link_local_multicast: 224.0.1.8"),
"not_link_local_multicast: <REDACTED-IPV4: 1>");
}
TEST_F(RedactorTest, JsonDoesNotRedactLocalMulticastIpv6) {
EXPECT_EQ(RedactJson("local_multicast_1: fF41::1234:5678:9aBc"),
"local_multicast_1: fF41::1234:5678:9aBc");
EXPECT_EQ(RedactJson("local_multicast_2: Ffe2:1:2:33:abcd:ef0:6789:456"),
"local_multicast_2: Ffe2:1:2:33:abcd:ef0:6789:456");
}
TEST_F(RedactorTest, JsonRedactsMulticastIpv6) {
EXPECT_EQ(RedactJson("multicast: fF43:abcd::ef0:6789:456"),
"multicast: fF43:<REDACTED-IPV6-MULTI: 1>");
}
TEST_F(RedactorTest, JsonRedactsLinkLocalIpv6) {
EXPECT_EQ(RedactJson("link_local_8: fe89:123::4567:8:90"),
"link_local_8: fe89:<REDACTED-IPV6-LL: 1>");
EXPECT_EQ(RedactJson("link_local_b: FEB2:123::4567:8:90"),
"link_local_b: FEB2:<REDACTED-IPV6-LL: 2>");
}
TEST_F(RedactorTest, JsonRedactsNonLinkLocalIpv6) {
EXPECT_EQ(RedactJson("not_link_local: fec1:123::4567:8:90"),
"not_link_local: <REDACTED-IPV6: 1>");
EXPECT_EQ(RedactJson("not_link_local_2: fe71:123::4567:8:90"),
"not_link_local_2: <REDACTED-IPV6: 2>");
}
TEST_F(RedactorTest, JsonDoesNotRedactInvalidIpv6) {
EXPECT_EQ(RedactJson("not_address_1: 12:34::"), "not_address_1: 12:34::");
EXPECT_EQ(RedactJson("not_address_2: ::12:34"), "not_address_2: ::12:34");
}
TEST_F(RedactorTest, JsonRedactsValidIpv6WithEdgeCaseColons) {
EXPECT_EQ(RedactJson("v6_colons_3_fields: ::12:34:5"), "v6_colons_3_fields: <REDACTED-IPV6: 1>");
EXPECT_EQ(RedactJson("v6_3_fields_colons: 12:34:5::"), "v6_3_fields_colons: <REDACTED-IPV6: 2>");
EXPECT_EQ(RedactJson("v6_colons_7_fields: ::12:234:35:46:5:6:7"),
"v6_colons_7_fields: <REDACTED-IPV6: 3>");
EXPECT_EQ(RedactJson("v6_7_fields_colons: 12:234:35:46:5:6:7::"),
"v6_7_fields_colons: <REDACTED-IPV6: 4>");
EXPECT_EQ(RedactJson("v6_colons_8_fields: ::12:234:35:46:5:6:7:8"),
"v6_colons_8_fields: <REDACTED-IPV6: 3>:8");
EXPECT_EQ(RedactJson("v6_8_fields_colons: 12:234:35:46:5:6:7:8::"),
"v6_8_fields_colons: <REDACTED-IPV6: 5>::");
}
TEST_F(RedactorTest, JsonDoesNotRedactObfuscatedGaiaId) {
EXPECT_EQ(RedactJson("obfuscated_gaia_id: 106986199446298680449"),
"obfuscated_gaia_id: 106986199446298680449");
}
TEST_F(RedactorTest, JsonRedactsMacAddress) {
EXPECT_EQ(RedactJson("MAC address: 00:0a:95:9F:68:16 12-34-95-9F-68-16"),
"MAC address: 00:0a:95:<REDACTED-MAC: 1> 12-34-95-<REDACTED-MAC: 2>");
}
TEST_F(RedactorTest, JsonRedactsSsid) {
EXPECT_EQ(RedactJson("SSID: <ssid-666F6F> <ssid-77696669>"),
"SSID: <REDACTED-SSID: 1> <REDACTED-SSID: 2>");
}
TEST_F(RedactorTest, RedactedJsonStillValid) {
std::string json = R"(
{
"addresses" : {
"ipv4_addrs" : [
"1.2.3.4",
"5.6.7.8"
],
"ipv6_addrs" : [
"2001::1",
"2001::2"
],
"mac_addrs" : [
"AA:BB:CC:DD:EE:FF",
"11-22-33-44-55-66"
],
"ssids" : [
"<ssid-0123abcdef>",
"<ssid-4567fedcba>"
]
},
"hex_id" : "1234567890abcdefABCDEF0123456789",
"gaia_id" : 106986199446298680449,
"log_message" : "hex 1234567890abcdefABCDEF0123456789 associated with gaia 106986199446298680449"
}
)";
json_parser::JSONParser unredacted_parser;
unredacted_parser.ParseFromString(json, "unredacted");
ASSERT_EQ(unredacted_parser.HasError(), false) << unredacted_parser.error_str();
json_parser::JSONParser redacted_parser;
auto redacted_json = RedactJson(json);
redacted_parser.ParseFromString(redacted_json, "redacted");
ASSERT_EQ(redacted_parser.HasError(), false) << redacted_parser.error_str();
ASSERT_EQ(redacted_json, R"(
{
"addresses" : {
"ipv4_addrs" : [
"<REDACTED-IPV4: 1>",
"<REDACTED-IPV4: 2>"
],
"ipv6_addrs" : [
"<REDACTED-IPV6: 3>",
"<REDACTED-IPV6: 4>"
],
"mac_addrs" : [
"AA:BB:CC:<REDACTED-MAC: 5>",
"11-22-33-<REDACTED-MAC: 6>"
],
"ssids" : [
"<REDACTED-SSID: 7>",
"<REDACTED-SSID: 8>"
]
},
"hex_id" : "1234567890abcdefABCDEF0123456789",
"gaia_id" : 106986199446298680449,
"log_message" : "hex 1234567890abcdefABCDEF0123456789 associated with gaia 106986199446298680449"
}
)");
}
TEST_F(RedactorTest, CachePersistsAcrossTextAndJson) {
std::string text = R"(
IPv4: 1.2.3.4 5.6.7.8
IPv6: 2001::1 2001::2
MAC address: 00-0a-95-9F-68-16 12:34:95:9F:68:16
SSID: <ssid-0123abcdef> <ssid-4567fedcba>
)";
std::string json = R"(
{
"addresses" : {
"ipv4_addrs" : [
"5.6.7.8",
"1.2.3.4"
],
"ipv6_addrs" : [
"2001::2",
"2001::1"
],
"mac_addrs" : [
"12-34-95-9F-68-16",
"00:0a:95:9F:68:16"
],
"ssids" : [
"<ssid-4567fedcba>",
"<ssid-0123abcdef>"
]
}
}
)";
EXPECT_EQ(Redact(text), R"(
IPv4: <REDACTED-IPV4: 1> <REDACTED-IPV4: 2>
IPv6: <REDACTED-IPV6: 3> <REDACTED-IPV6: 4>
MAC address: 00-0a-95-<REDACTED-MAC: 5> 12:34:95:<REDACTED-MAC: 6>
SSID: <REDACTED-SSID: 7> <REDACTED-SSID: 8>
)");
EXPECT_EQ(Redact(json), R"(
{
"addresses" : {
"ipv4_addrs" : [
"<REDACTED-IPV4: 2>",
"<REDACTED-IPV4: 1>"
],
"ipv6_addrs" : [
"<REDACTED-IPV6: 4>",
"<REDACTED-IPV6: 3>"
],
"mac_addrs" : [
"12-34-95-<REDACTED-MAC: 6>",
"00:0a:95:<REDACTED-MAC: 5>"
],
"ssids" : [
"<REDACTED-SSID: 8>",
"<REDACTED-SSID: 7>"
]
}
}
)");
}
} // namespace
} // namespace forensics