Home | History | Annotate | Download | only in onc
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      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 "chromeos/network/onc/onc_signature.h"
      6 
      7 #include "components/onc/onc_constants.h"
      8 #include "third_party/cros_system_api/dbus/service_constants.h"
      9 
     10 using base::Value;
     11 
     12 namespace chromeos {
     13 namespace onc {
     14 namespace {
     15 
     16 const OncValueSignature kBoolSignature = {
     17   base::Value::TYPE_BOOLEAN, NULL
     18 };
     19 const OncValueSignature kStringSignature = {
     20   base::Value::TYPE_STRING, NULL
     21 };
     22 const OncValueSignature kIntegerSignature = {
     23   base::Value::TYPE_INTEGER, NULL
     24 };
     25 const OncValueSignature kStringListSignature = {
     26   base::Value::TYPE_LIST, NULL, &kStringSignature
     27 };
     28 const OncValueSignature kIntegerListSignature = {
     29   base::Value::TYPE_LIST, NULL, &kIntegerSignature
     30 };
     31 const OncValueSignature kIPConfigListSignature = {
     32   base::Value::TYPE_LIST, NULL, &kIPConfigSignature
     33 };
     34 const OncValueSignature kCellularApnListSignature = {
     35   base::Value::TYPE_LIST, NULL, &kCellularApnSignature
     36 };
     37 
     38 const OncFieldSignature issuer_subject_pattern_fields[] = {
     39     { ::onc::certificate::kCommonName, &kStringSignature},
     40     { ::onc::certificate::kLocality, &kStringSignature},
     41     { ::onc::certificate::kOrganization, &kStringSignature},
     42     { ::onc::certificate::kOrganizationalUnit, &kStringSignature},
     43     {NULL}};
     44 
     45 const OncFieldSignature certificate_pattern_fields[] = {
     46     { ::onc::kRecommended, &kRecommendedSignature},
     47     { ::onc::certificate::kEnrollmentURI, &kStringListSignature},
     48     { ::onc::certificate::kIssuer, &kIssuerSubjectPatternSignature},
     49     { ::onc::certificate::kIssuerCARef, &kStringListSignature},
     50     // Used internally. Not officially supported.
     51     { ::onc::certificate::kIssuerCAPEMs, &kStringListSignature},
     52     { ::onc::certificate::kSubject, &kIssuerSubjectPatternSignature},
     53     {NULL}};
     54 
     55 const OncFieldSignature eap_fields[] = {
     56     { ::onc::kRecommended, &kRecommendedSignature},
     57     { ::onc::eap::kAnonymousIdentity, &kStringSignature},
     58     { ::onc::eap::kClientCertPattern, &kCertificatePatternSignature},
     59     { ::onc::eap::kClientCertRef, &kStringSignature},
     60     { ::onc::eap::kClientCertType, &kStringSignature},
     61     { ::onc::eap::kIdentity, &kStringSignature},
     62     { ::onc::eap::kInner, &kStringSignature},
     63     { ::onc::eap::kOuter, &kStringSignature},
     64     { ::onc::eap::kPassword, &kStringSignature},
     65     { ::onc::eap::kSaveCredentials, &kBoolSignature},
     66     // Used internally. Not officially supported.
     67     { ::onc::eap::kServerCAPEMs, &kStringListSignature},
     68     { ::onc::eap::kServerCARef, &kStringSignature},
     69     { ::onc::eap::kServerCARefs, &kStringListSignature},
     70     { ::onc::eap::kUseSystemCAs, &kBoolSignature},
     71     {NULL}};
     72 
     73 const OncFieldSignature ipsec_fields[] = {
     74     { ::onc::kRecommended, &kRecommendedSignature},
     75     { ::onc::ipsec::kAuthenticationType, &kStringSignature},
     76     { ::onc::vpn::kClientCertPattern, &kCertificatePatternSignature},
     77     { ::onc::vpn::kClientCertRef, &kStringSignature},
     78     { ::onc::vpn::kClientCertType, &kStringSignature},
     79     { ::onc::ipsec::kGroup, &kStringSignature},
     80     { ::onc::ipsec::kIKEVersion, &kIntegerSignature},
     81     { ::onc::ipsec::kPSK, &kStringSignature},
     82     { ::onc::vpn::kSaveCredentials, &kBoolSignature},
     83     // Used internally. Not officially supported.
     84     { ::onc::ipsec::kServerCAPEMs, &kStringListSignature},
     85     { ::onc::ipsec::kServerCARef, &kStringSignature},
     86     { ::onc::ipsec::kServerCARefs, &kStringListSignature},
     87     { ::onc::ipsec::kXAUTH, &kXAUTHSignature},
     88     // Not yet supported.
     89     //  { ipsec::kEAP, &kEAPSignature },
     90     {NULL}};
     91 
     92 const OncFieldSignature xauth_fields[] = {
     93     { ::onc::vpn::kPassword, &kStringSignature},
     94     { ::onc::vpn::kUsername, &kStringSignature},
     95     {NULL}};
     96 
     97 const OncFieldSignature l2tp_fields[] = {
     98     { ::onc::kRecommended, &kRecommendedSignature},
     99     { ::onc::vpn::kPassword, &kStringSignature},
    100     { ::onc::vpn::kSaveCredentials, &kBoolSignature},
    101     { ::onc::vpn::kUsername, &kStringSignature},
    102     {NULL}};
    103 
    104 const OncFieldSignature openvpn_fields[] = {
    105     { ::onc::kRecommended, &kRecommendedSignature},
    106     { ::onc::openvpn::kAuth, &kStringSignature},
    107     { ::onc::openvpn::kAuthNoCache, &kBoolSignature},
    108     { ::onc::openvpn::kAuthRetry, &kStringSignature},
    109     { ::onc::openvpn::kCipher, &kStringSignature},
    110     { ::onc::vpn::kClientCertPattern, &kCertificatePatternSignature},
    111     { ::onc::vpn::kClientCertRef, &kStringSignature},
    112     { ::onc::vpn::kClientCertType, &kStringSignature},
    113     { ::onc::openvpn::kCompLZO, &kStringSignature},
    114     { ::onc::openvpn::kCompNoAdapt, &kBoolSignature},
    115     { ::onc::openvpn::kIgnoreDefaultRoute, &kBoolSignature},
    116     { ::onc::openvpn::kKeyDirection, &kStringSignature},
    117     { ::onc::openvpn::kNsCertType, &kStringSignature},
    118     { ::onc::vpn::kPassword, &kStringSignature},
    119     { ::onc::openvpn::kPort, &kIntegerSignature},
    120     { ::onc::openvpn::kProto, &kStringSignature},
    121     { ::onc::openvpn::kPushPeerInfo, &kBoolSignature},
    122     { ::onc::openvpn::kRemoteCertEKU, &kStringSignature},
    123     { ::onc::openvpn::kRemoteCertKU, &kStringListSignature},
    124     { ::onc::openvpn::kRemoteCertTLS, &kStringSignature},
    125     { ::onc::openvpn::kRenegSec, &kIntegerSignature},
    126     { ::onc::vpn::kSaveCredentials, &kBoolSignature},
    127     // Used internally. Not officially supported.
    128     { ::onc::openvpn::kServerCAPEMs, &kStringListSignature},
    129     { ::onc::openvpn::kServerCARef, &kStringSignature},
    130     { ::onc::openvpn::kServerCARefs, &kStringListSignature},
    131     // Not supported, yet.
    132     { ::onc::openvpn::kServerCertPEM, &kStringSignature},
    133     { ::onc::openvpn::kServerCertRef, &kStringSignature},
    134     { ::onc::openvpn::kServerPollTimeout, &kIntegerSignature},
    135     { ::onc::openvpn::kShaper, &kIntegerSignature},
    136     { ::onc::openvpn::kStaticChallenge, &kStringSignature},
    137     { ::onc::openvpn::kTLSAuthContents, &kStringSignature},
    138     { ::onc::openvpn::kTLSRemote, &kStringSignature},
    139     { ::onc::vpn::kUsername, &kStringSignature},
    140     // Not supported, yet.
    141     { ::onc::openvpn::kVerb, &kStringSignature},
    142     { ::onc::openvpn::kVerifyHash, &kStringSignature},
    143     { ::onc::openvpn::kVerifyX509, &kVerifyX509Signature},
    144     {NULL}};
    145 
    146 const OncFieldSignature verify_x509_fields[] = {
    147     { ::onc::verify_x509::kName, &kStringSignature},
    148     { ::onc::verify_x509::kType, &kStringSignature},
    149     {NULL}};
    150 
    151 const OncFieldSignature vpn_fields[] = {
    152     { ::onc::kRecommended, &kRecommendedSignature},
    153     { ::onc::vpn::kAutoConnect, &kBoolSignature},
    154     { ::onc::vpn::kHost, &kStringSignature},
    155     { ::onc::vpn::kIPsec, &kIPsecSignature},
    156     { ::onc::vpn::kL2TP, &kL2TPSignature},
    157     { ::onc::vpn::kOpenVPN, &kOpenVPNSignature},
    158     { ::onc::vpn::kType, &kStringSignature},
    159     {NULL}};
    160 
    161 const OncFieldSignature ethernet_fields[] = {
    162     { ::onc::kRecommended, &kRecommendedSignature},
    163     { ::onc::ethernet::kAuthentication, &kStringSignature},
    164     { ::onc::ethernet::kEAP, &kEAPSignature},
    165     {NULL}};
    166 
    167 // Not supported for policy but for reading network state.
    168 const OncFieldSignature ipconfig_fields[] = {
    169     { ::onc::ipconfig::kGateway, &kStringSignature},
    170     { ::onc::ipconfig::kIPAddress, &kStringSignature},
    171     { ::onc::ipconfig::kNameServers, &kStringListSignature},
    172     { ::onc::ipconfig::kRoutingPrefix, &kIntegerSignature},
    173     { ::onc::network_config::kSearchDomains, &kStringListSignature},
    174     { ::onc::ipconfig::kType, &kStringSignature},
    175     {NULL}};
    176 
    177 const OncFieldSignature proxy_location_fields[] = {
    178     { ::onc::proxy::kHost, &kStringSignature},
    179     { ::onc::proxy::kPort, &kIntegerSignature}, {NULL}};
    180 
    181 const OncFieldSignature proxy_manual_fields[] = {
    182     { ::onc::proxy::kFtp, &kProxyLocationSignature},
    183     { ::onc::proxy::kHttp, &kProxyLocationSignature},
    184     { ::onc::proxy::kHttps, &kProxyLocationSignature},
    185     { ::onc::proxy::kSocks, &kProxyLocationSignature},
    186     {NULL}};
    187 
    188 const OncFieldSignature proxy_settings_fields[] = {
    189     { ::onc::kRecommended, &kRecommendedSignature},
    190     { ::onc::proxy::kExcludeDomains, &kStringListSignature},
    191     { ::onc::proxy::kManual, &kProxyManualSignature},
    192     { ::onc::proxy::kPAC, &kStringSignature},
    193     { ::onc::proxy::kType, &kStringSignature},
    194     {NULL}};
    195 
    196 const OncFieldSignature wifi_fields[] = {
    197     { ::onc::kRecommended, &kRecommendedSignature},
    198     { ::onc::wifi::kAutoConnect, &kBoolSignature},
    199     { ::onc::wifi::kEAP, &kEAPSignature},
    200     { ::onc::wifi::kHiddenSSID, &kBoolSignature},
    201     { ::onc::wifi::kPassphrase, &kStringSignature},
    202     { ::onc::wifi::kSSID, &kStringSignature},
    203     { ::onc::wifi::kSecurity, &kStringSignature},
    204     {NULL}};
    205 
    206 const OncFieldSignature wifi_with_state_fields[] = {
    207     { ::onc::wifi::kBSSID, &kStringSignature},
    208     { ::onc::wifi::kFrequency, &kIntegerSignature},
    209     { ::onc::wifi::kFrequencyList, &kIntegerListSignature},
    210     { ::onc::wifi::kSignalStrength, &kIntegerSignature},
    211     {NULL}};
    212 
    213 const OncFieldSignature cellular_provider_fields[] = {
    214     { ::onc::cellular_provider::kCode, &kStringSignature},
    215     { ::onc::cellular_provider::kCountry, &kStringSignature},
    216     { ::onc::cellular_provider::kName, &kStringSignature},
    217     {NULL}};
    218 
    219 const OncFieldSignature cellular_apn_fields[] = {
    220     { ::onc::cellular_apn::kName, &kStringSignature},
    221     { ::onc::cellular_apn::kUsername, &kStringSignature},
    222     { ::onc::cellular_apn::kPassword, &kStringSignature},
    223     {NULL}};
    224 
    225 const OncFieldSignature cellular_fields[] = {
    226     { ::onc::kRecommended, &kRecommendedSignature},
    227     { ::onc::cellular::kAPN, &kCellularApnSignature },
    228     { ::onc::cellular::kAPNList, &kCellularApnListSignature},
    229     {NULL}};
    230 
    231 const OncFieldSignature cellular_with_state_fields[] = {
    232     { ::onc::cellular::kActivateOverNonCellularNetwork, &kBoolSignature},
    233     { ::onc::cellular::kActivationState, &kStringSignature},
    234     { ::onc::cellular::kAllowRoaming, &kBoolSignature},
    235     { ::onc::cellular::kCarrier, &kStringSignature},
    236     { ::onc::cellular::kESN, &kStringSignature},
    237     { ::onc::cellular::kFamily, &kStringSignature},
    238     { ::onc::cellular::kFirmwareRevision, &kStringSignature},
    239     { ::onc::cellular::kFoundNetworks, &kStringSignature},
    240     { ::onc::cellular::kHardwareRevision, &kStringSignature},
    241     { ::onc::cellular::kHomeProvider, &kCellularProviderSignature},
    242     { ::onc::cellular::kICCID, &kStringSignature},
    243     { ::onc::cellular::kIMEI, &kStringSignature},
    244     { ::onc::cellular::kIMSI, &kStringSignature},
    245     { ::onc::cellular::kManufacturer, &kStringSignature},
    246     { ::onc::cellular::kMDN, &kStringSignature},
    247     { ::onc::cellular::kMEID, &kStringSignature},
    248     { ::onc::cellular::kMIN, &kStringSignature},
    249     { ::onc::cellular::kModelID, &kStringSignature},
    250     { ::onc::cellular::kNetworkTechnology, &kStringSignature},
    251     { ::onc::cellular::kPRLVersion, &kStringSignature},
    252     { ::onc::cellular::kProviderRequiresRoaming, &kBoolSignature},
    253     { ::onc::cellular::kRoamingState, &kStringSignature},
    254     { ::onc::cellular::kSelectedNetwork, &kStringSignature},
    255     { ::onc::cellular::kServingOperator, &kCellularProviderSignature},
    256     { ::onc::cellular::kSIMLockEnabled, &kBoolSignature},
    257     { ::onc::cellular::kSIMLockStatus, &kStringSignature},
    258     { ::onc::cellular::kSIMLockType, &kStringSignature},
    259     { ::onc::cellular::kSIMPresent, &kStringSignature},
    260     { ::onc::cellular::kSupportedCarriers, &kStringSignature},
    261     { ::onc::cellular::kSupportNetworkScan, &kStringSignature},
    262     {NULL}};
    263 
    264 const OncFieldSignature network_configuration_fields[] = {
    265     { ::onc::kRecommended, &kRecommendedSignature},
    266     { ::onc::network_config::kEthernet, &kEthernetSignature},
    267     { ::onc::network_config::kGUID, &kStringSignature},
    268     // Not supported for policy but for reading network state.
    269     { ::onc::network_config::kIPConfigs, &kIPConfigListSignature},
    270     { ::onc::network_config::kName, &kStringSignature},
    271     // Not supported, yet.
    272     { ::onc::network_config::kNameServers, &kStringListSignature},
    273     { ::onc::network_config::kProxySettings, &kProxySettingsSignature},
    274     { ::onc::kRemove, &kBoolSignature},
    275     // Not supported, yet.
    276     { ::onc::network_config::kSearchDomains, &kStringListSignature},
    277     { ::onc::network_config::kType, &kStringSignature},
    278     { ::onc::network_config::kVPN, &kVPNSignature},
    279     { ::onc::network_config::kWiFi, &kWiFiSignature},
    280     { ::onc::network_config::kCellular, &kCellularSignature},
    281     {NULL}};
    282 
    283 const OncFieldSignature network_with_state_fields[] = {
    284     { ::onc::network_config::kCellular, &kCellularWithStateSignature},
    285     { ::onc::network_config::kConnectionState, &kStringSignature},
    286     { ::onc::network_config::kConnectable, &kBoolSignature},
    287     { ::onc::network_config::kErrorState, &kStringSignature},
    288     { ::onc::network_config::kMacAddress, &kStringSignature},
    289     { ::onc::network_config::kWiFi, &kWiFiWithStateSignature},
    290     {NULL}};
    291 
    292 const OncFieldSignature global_network_configuration_fields[] = {
    293     { ::onc::global_network_config::kAllowOnlyPolicyNetworksToAutoconnect,
    294       &kBoolSignature},
    295     {NULL}};
    296 
    297 const OncFieldSignature certificate_fields[] = {
    298     { ::onc::certificate::kGUID, &kStringSignature},
    299     { ::onc::certificate::kPKCS12, &kStringSignature},
    300     { ::onc::kRemove, &kBoolSignature},
    301     { ::onc::certificate::kTrustBits, &kStringListSignature},
    302     { ::onc::certificate::kType, &kStringSignature},
    303     { ::onc::certificate::kX509, &kStringSignature},
    304     {NULL}};
    305 
    306 const OncFieldSignature toplevel_configuration_fields[] = {
    307     { ::onc::toplevel_config::kCertificates, &kCertificateListSignature},
    308     { ::onc::toplevel_config::kNetworkConfigurations,
    309       &kNetworkConfigurationListSignature},
    310     { ::onc::toplevel_config::kGlobalNetworkConfiguration,
    311       &kGlobalNetworkConfigurationSignature},
    312     { ::onc::toplevel_config::kType, &kStringSignature},
    313     { ::onc::encrypted::kCipher, &kStringSignature},
    314     { ::onc::encrypted::kCiphertext, &kStringSignature},
    315     { ::onc::encrypted::kHMAC, &kStringSignature},
    316     { ::onc::encrypted::kHMACMethod, &kStringSignature},
    317     { ::onc::encrypted::kIV, &kStringSignature},
    318     { ::onc::encrypted::kIterations, &kIntegerSignature},
    319     { ::onc::encrypted::kSalt, &kStringSignature},
    320     { ::onc::encrypted::kStretch, &kStringSignature}, {NULL}};
    321 
    322 }  // namespace
    323 
    324 const OncValueSignature kRecommendedSignature = {
    325   base::Value::TYPE_LIST, NULL, &kStringSignature
    326 };
    327 const OncValueSignature kEAPSignature = {
    328   base::Value::TYPE_DICTIONARY, eap_fields, NULL
    329 };
    330 const OncValueSignature kIssuerSubjectPatternSignature = {
    331   base::Value::TYPE_DICTIONARY, issuer_subject_pattern_fields, NULL
    332 };
    333 const OncValueSignature kCertificatePatternSignature = {
    334   base::Value::TYPE_DICTIONARY, certificate_pattern_fields, NULL
    335 };
    336 const OncValueSignature kIPsecSignature = {
    337   base::Value::TYPE_DICTIONARY, ipsec_fields, NULL
    338 };
    339 const OncValueSignature kXAUTHSignature = {
    340   base::Value::TYPE_DICTIONARY, xauth_fields, NULL
    341 };
    342 const OncValueSignature kL2TPSignature = {
    343   base::Value::TYPE_DICTIONARY, l2tp_fields, NULL
    344 };
    345 const OncValueSignature kOpenVPNSignature = {
    346   base::Value::TYPE_DICTIONARY, openvpn_fields, NULL
    347 };
    348 const OncValueSignature kVerifyX509Signature = {
    349   base::Value::TYPE_DICTIONARY, verify_x509_fields, NULL
    350 };
    351 const OncValueSignature kVPNSignature = {
    352   base::Value::TYPE_DICTIONARY, vpn_fields, NULL
    353 };
    354 const OncValueSignature kEthernetSignature = {
    355   base::Value::TYPE_DICTIONARY, ethernet_fields, NULL
    356 };
    357 const OncValueSignature kIPConfigSignature = {
    358   base::Value::TYPE_DICTIONARY, ipconfig_fields, NULL
    359 };
    360 const OncValueSignature kProxyLocationSignature = {
    361   base::Value::TYPE_DICTIONARY, proxy_location_fields, NULL
    362 };
    363 const OncValueSignature kProxyManualSignature = {
    364   base::Value::TYPE_DICTIONARY, proxy_manual_fields, NULL
    365 };
    366 const OncValueSignature kProxySettingsSignature = {
    367   base::Value::TYPE_DICTIONARY, proxy_settings_fields, NULL
    368 };
    369 const OncValueSignature kWiFiSignature = {
    370   base::Value::TYPE_DICTIONARY, wifi_fields, NULL
    371 };
    372 const OncValueSignature kCertificateSignature = {
    373   base::Value::TYPE_DICTIONARY, certificate_fields, NULL
    374 };
    375 const OncValueSignature kNetworkConfigurationSignature = {
    376   base::Value::TYPE_DICTIONARY, network_configuration_fields, NULL
    377 };
    378 const OncValueSignature kGlobalNetworkConfigurationSignature = {
    379   base::Value::TYPE_DICTIONARY, global_network_configuration_fields, NULL
    380 };
    381 const OncValueSignature kCertificateListSignature = {
    382   base::Value::TYPE_LIST, NULL, &kCertificateSignature
    383 };
    384 const OncValueSignature kNetworkConfigurationListSignature = {
    385   base::Value::TYPE_LIST, NULL, &kNetworkConfigurationSignature
    386 };
    387 const OncValueSignature kToplevelConfigurationSignature = {
    388   base::Value::TYPE_DICTIONARY, toplevel_configuration_fields, NULL
    389 };
    390 
    391 // Derived "ONC with State" signatures.
    392 const OncValueSignature kNetworkWithStateSignature = {
    393   base::Value::TYPE_DICTIONARY, network_with_state_fields, NULL,
    394   &kNetworkConfigurationSignature
    395 };
    396 const OncValueSignature kWiFiWithStateSignature = {
    397   base::Value::TYPE_DICTIONARY, wifi_with_state_fields, NULL, &kWiFiSignature
    398 };
    399 const OncValueSignature kCellularSignature = {
    400   base::Value::TYPE_DICTIONARY, cellular_fields, NULL
    401 };
    402 const OncValueSignature kCellularWithStateSignature = {
    403   base::Value::TYPE_DICTIONARY, cellular_with_state_fields, NULL,
    404   &kCellularSignature
    405 };
    406 const OncValueSignature kCellularProviderSignature = {
    407   base::Value::TYPE_DICTIONARY, cellular_provider_fields, NULL
    408 };
    409 const OncValueSignature kCellularApnSignature = {
    410   base::Value::TYPE_DICTIONARY, cellular_apn_fields, NULL
    411 };
    412 
    413 const OncFieldSignature* GetFieldSignature(const OncValueSignature& signature,
    414                                            const std::string& onc_field_name) {
    415   if (!signature.fields)
    416     return NULL;
    417   for (const OncFieldSignature* field_signature = signature.fields;
    418        field_signature->onc_field_name != NULL; ++field_signature) {
    419     if (onc_field_name == field_signature->onc_field_name)
    420       return field_signature;
    421   }
    422   if (signature.base_signature)
    423     return GetFieldSignature(*signature.base_signature, onc_field_name);
    424   return NULL;
    425 }
    426 
    427 namespace {
    428 
    429 struct CredentialEntry {
    430   const OncValueSignature* value_signature;
    431   const char* field_name;
    432 };
    433 
    434 const CredentialEntry credentials[] = {
    435     {&kEAPSignature, ::onc::eap::kPassword},
    436     {&kIPsecSignature, ::onc::ipsec::kPSK},
    437     {&kXAUTHSignature, ::onc::vpn::kPassword},
    438     {&kL2TPSignature, ::onc::vpn::kPassword},
    439     {&kOpenVPNSignature, ::onc::vpn::kPassword},
    440     {&kOpenVPNSignature, ::onc::openvpn::kTLSAuthContents},
    441     {&kWiFiSignature, ::onc::wifi::kPassphrase},
    442     {&kCellularApnSignature, ::onc::cellular_apn::kPassword},
    443     {NULL}};
    444 
    445 }  // namespace
    446 
    447 bool FieldIsCredential(const OncValueSignature& signature,
    448                        const std::string& onc_field_name) {
    449   for (const CredentialEntry* entry = credentials;
    450        entry->value_signature != NULL; ++entry) {
    451     if (&signature == entry->value_signature &&
    452         onc_field_name == entry->field_name) {
    453       return true;
    454     }
    455   }
    456   return false;
    457 }
    458 
    459 }  // namespace onc
    460 }  // namespace chromeos
    461