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