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
10using base::Value;
11
12namespace chromeos {
13namespace onc {
14namespace {
15
16const OncValueSignature kBoolSignature = {
17  base::Value::TYPE_BOOLEAN, NULL
18};
19const OncValueSignature kStringSignature = {
20  base::Value::TYPE_STRING, NULL
21};
22const OncValueSignature kIntegerSignature = {
23  base::Value::TYPE_INTEGER, NULL
24};
25const OncValueSignature kDoubleSignature = {
26  base::Value::TYPE_DOUBLE, NULL
27};
28const OncValueSignature kStringListSignature = {
29  base::Value::TYPE_LIST, NULL, &kStringSignature
30};
31const OncValueSignature kIntegerListSignature = {
32  base::Value::TYPE_LIST, NULL, &kIntegerSignature
33};
34const OncValueSignature kIPConfigListSignature = {
35  base::Value::TYPE_LIST, NULL, &kIPConfigSignature
36};
37const OncValueSignature kCellularApnListSignature = {
38  base::Value::TYPE_LIST, NULL, &kCellularApnSignature
39};
40const OncValueSignature kCellularFoundNetworkListSignature = {
41  base::Value::TYPE_LIST, NULL, &kCellularFoundNetworkSignature
42};
43
44const 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
51const 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
61const 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
79const 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
98const OncFieldSignature xauth_fields[] = {
99    { ::onc::vpn::kPassword, &kStringSignature},
100    { ::onc::vpn::kUsername, &kStringSignature},
101    {NULL}};
102
103const 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
110const 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
152const OncFieldSignature verify_x509_fields[] = {
153    { ::onc::verify_x509::kName, &kStringSignature},
154    { ::onc::verify_x509::kType, &kStringSignature},
155    {NULL}};
156
157const 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
167const OncFieldSignature ethernet_fields[] = {
168    { ::onc::kRecommended, &kRecommendedSignature},
169    { ::onc::ethernet::kAuthentication, &kStringSignature},
170    { ::onc::ethernet::kEAP, &kEAPSignature},
171    {NULL}};
172
173const 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
183const OncFieldSignature proxy_location_fields[] = {
184    { ::onc::proxy::kHost, &kStringSignature},
185    { ::onc::proxy::kPort, &kIntegerSignature}, {NULL}};
186
187const 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
194const 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
202const 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
212const 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
219const OncFieldSignature wimax_fields[] = {
220    { ::onc::kRecommended, &kRecommendedSignature},
221    { ::onc::wimax::kAutoConnect, &kBoolSignature},
222    { ::onc::wimax::kEAP, &kEAPSignature},
223    {NULL}};
224
225const OncFieldSignature wimax_with_state_fields[] = {
226    { ::onc::wimax::kSignalStrength, &kIntegerSignature},
227    {NULL}};
228
229const 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
235const 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
244const 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
252const 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
258const 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
265const 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
296const 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
321const 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
335const OncFieldSignature global_network_configuration_fields[] = {
336    { ::onc::global_network_config::kAllowOnlyPolicyNetworksToAutoconnect,
337      &kBoolSignature},
338    {NULL}};
339
340const 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
349const 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
367const OncValueSignature kRecommendedSignature = {
368  base::Value::TYPE_LIST, NULL, &kStringSignature
369};
370const OncValueSignature kEAPSignature = {
371  base::Value::TYPE_DICTIONARY, eap_fields, NULL
372};
373const OncValueSignature kIssuerSubjectPatternSignature = {
374  base::Value::TYPE_DICTIONARY, issuer_subject_pattern_fields, NULL
375};
376const OncValueSignature kCertificatePatternSignature = {
377  base::Value::TYPE_DICTIONARY, certificate_pattern_fields, NULL
378};
379const OncValueSignature kIPsecSignature = {
380  base::Value::TYPE_DICTIONARY, ipsec_fields, NULL
381};
382const OncValueSignature kXAUTHSignature = {
383  base::Value::TYPE_DICTIONARY, xauth_fields, NULL
384};
385const OncValueSignature kL2TPSignature = {
386  base::Value::TYPE_DICTIONARY, l2tp_fields, NULL
387};
388const OncValueSignature kOpenVPNSignature = {
389  base::Value::TYPE_DICTIONARY, openvpn_fields, NULL
390};
391const OncValueSignature kVerifyX509Signature = {
392  base::Value::TYPE_DICTIONARY, verify_x509_fields, NULL
393};
394const OncValueSignature kVPNSignature = {
395  base::Value::TYPE_DICTIONARY, vpn_fields, NULL
396};
397const OncValueSignature kEthernetSignature = {
398  base::Value::TYPE_DICTIONARY, ethernet_fields, NULL
399};
400const OncValueSignature kIPConfigSignature = {
401  base::Value::TYPE_DICTIONARY, ipconfig_fields, NULL
402};
403const OncValueSignature kSavedIPConfigSignature = {
404  base::Value::TYPE_DICTIONARY, ipconfig_fields, NULL
405};
406const OncValueSignature kStaticIPConfigSignature = {
407  base::Value::TYPE_DICTIONARY, ipconfig_fields, NULL
408};
409const OncValueSignature kProxyLocationSignature = {
410  base::Value::TYPE_DICTIONARY, proxy_location_fields, NULL
411};
412const OncValueSignature kProxyManualSignature = {
413  base::Value::TYPE_DICTIONARY, proxy_manual_fields, NULL
414};
415const OncValueSignature kProxySettingsSignature = {
416  base::Value::TYPE_DICTIONARY, proxy_settings_fields, NULL
417};
418const OncValueSignature kWiFiSignature = {
419  base::Value::TYPE_DICTIONARY, wifi_fields, NULL
420};
421const OncValueSignature kWiMAXSignature = {
422  base::Value::TYPE_DICTIONARY, wimax_fields, NULL
423};
424const OncValueSignature kCertificateSignature = {
425  base::Value::TYPE_DICTIONARY, certificate_fields, NULL
426};
427const OncValueSignature kNetworkConfigurationSignature = {
428  base::Value::TYPE_DICTIONARY, network_configuration_fields, NULL
429};
430const OncValueSignature kGlobalNetworkConfigurationSignature = {
431  base::Value::TYPE_DICTIONARY, global_network_configuration_fields, NULL
432};
433const OncValueSignature kCertificateListSignature = {
434  base::Value::TYPE_LIST, NULL, &kCertificateSignature
435};
436const OncValueSignature kNetworkConfigurationListSignature = {
437  base::Value::TYPE_LIST, NULL, &kNetworkConfigurationSignature
438};
439const OncValueSignature kToplevelConfigurationSignature = {
440  base::Value::TYPE_DICTIONARY, toplevel_configuration_fields, NULL
441};
442
443// Derived "ONC with State" signatures.
444const OncValueSignature kNetworkWithStateSignature = {
445  base::Value::TYPE_DICTIONARY, network_with_state_fields, NULL,
446  &kNetworkConfigurationSignature
447};
448const OncValueSignature kWiFiWithStateSignature = {
449  base::Value::TYPE_DICTIONARY, wifi_with_state_fields, NULL, &kWiFiSignature
450};
451const OncValueSignature kWiMAXWithStateSignature = {
452  base::Value::TYPE_DICTIONARY, wimax_with_state_fields, NULL, &kWiMAXSignature
453};
454const OncValueSignature kCellularSignature = {
455  base::Value::TYPE_DICTIONARY, cellular_fields, NULL
456};
457const OncValueSignature kCellularWithStateSignature = {
458  base::Value::TYPE_DICTIONARY, cellular_with_state_fields, NULL,
459  &kCellularSignature
460};
461const OncValueSignature kCellularProviderSignature = {
462  base::Value::TYPE_DICTIONARY, cellular_provider_fields, NULL
463};
464const OncValueSignature kCellularApnSignature = {
465  base::Value::TYPE_DICTIONARY, cellular_apn_fields, NULL
466};
467const OncValueSignature kCellularFoundNetworkSignature = {
468  base::Value::TYPE_DICTIONARY, cellular_found_network_fields, NULL
469};
470const OncValueSignature kSIMLockStatusSignature = {
471  base::Value::TYPE_DICTIONARY, sim_lock_status_fields, NULL
472};
473
474const 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
488namespace {
489
490struct CredentialEntry {
491  const OncValueSignature* value_signature;
492  const char* field_name;
493};
494
495const 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
508bool 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