onc_signature.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
1600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// Use of this source code is governed by a BSD-style license that can be
3600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// found in the LICENSE file.
4600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
5600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang#include "chromeos/network/onc/onc_signature.h"
6600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
7600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang#include "components/onc/onc_constants.h"
8600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang#include "third_party/cros_system_api/dbus/service_constants.h"
9600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
10600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangusing base::Value;
11600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
12600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangnamespace chromeos {
13600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangnamespace onc {
14600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangnamespace {
15600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
16600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangconst OncValueSignature kBoolSignature = {
17600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  Value::TYPE_BOOLEAN, NULL
18600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang};
19600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangconst OncValueSignature kStringSignature = {
20600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  Value::TYPE_STRING, NULL
21600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang};
22600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangconst OncValueSignature kIntegerSignature = {
23600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  Value::TYPE_INTEGER, NULL
24600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang};
25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangconst OncValueSignature kStringListSignature = {
26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  Value::TYPE_LIST, NULL, &kStringSignature
27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang};
28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangconst OncValueSignature kIntegerListSignature = {
29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  Value::TYPE_LIST, NULL, &kIntegerSignature
30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang};
31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangconst OncValueSignature kIPConfigListSignature = {
32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  Value::TYPE_LIST, NULL, &kIPConfigSignature
33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang};
34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangconst OncValueSignature kCellularApnListSignature = {
35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  Value::TYPE_LIST, NULL, &kCellularApnSignature
36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang};
37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangconst OncFieldSignature issuer_subject_pattern_fields[] = {
39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::certificate::kCommonName, &kStringSignature},
40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::certificate::kLocality, &kStringSignature},
41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::certificate::kOrganization, &kStringSignature},
42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::certificate::kOrganizationalUnit, &kStringSignature},
43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    {NULL}};
44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangconst OncFieldSignature certificate_pattern_fields[] = {
46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::kRecommended, &kRecommendedSignature},
47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::certificate::kEnrollmentURI, &kStringListSignature},
48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::certificate::kIssuer, &kIssuerSubjectPatternSignature},
49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::certificate::kIssuerCARef, &kStringListSignature},
50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::certificate::kIssuerCAPEMs, &kStringListSignature},
51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::certificate::kSubject, &kIssuerSubjectPatternSignature},
52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    {NULL}};
53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangconst OncFieldSignature eap_fields[] = {
55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::kRecommended, &kRecommendedSignature},
56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::eap::kAnonymousIdentity, &kStringSignature},
57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::eap::kClientCertPattern, &kCertificatePatternSignature},
58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::eap::kClientCertRef, &kStringSignature},
59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::eap::kClientCertType, &kStringSignature},
60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::eap::kIdentity, &kStringSignature},
61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::eap::kInner, &kStringSignature},
62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::eap::kOuter, &kStringSignature},
63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::eap::kPassword, &kStringSignature},
64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::eap::kSaveCredentials, &kBoolSignature},
65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::eap::kServerCAPEMs, &kStringListSignature},
66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::eap::kServerCARef, &kStringSignature},
67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::eap::kUseSystemCAs, &kBoolSignature},
68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    {NULL}};
69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangconst OncFieldSignature ipsec_fields[] = {
71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::kRecommended, &kRecommendedSignature},
72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::ipsec::kAuthenticationType, &kStringSignature},
73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::vpn::kClientCertPattern, &kCertificatePatternSignature},
74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::vpn::kClientCertRef, &kStringSignature},
75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::vpn::kClientCertType, &kStringSignature},
76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::ipsec::kGroup, &kStringSignature},
77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::ipsec::kIKEVersion, &kIntegerSignature},
78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::ipsec::kPSK, &kStringSignature},
79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::vpn::kSaveCredentials, &kBoolSignature},
80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::ipsec::kServerCAPEMs, &kStringSignature},
81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::ipsec::kServerCARef, &kStringSignature},
82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    // Not yet supported.
83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    //  { ipsec::kEAP, &kEAPSignature },
84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    //  { ipsec::kXAUTH, &kXAUTHSignature },
85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    {NULL}};
86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangconst OncFieldSignature l2tp_fields[] = {
88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::kRecommended, &kRecommendedSignature},
89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::vpn::kPassword, &kStringSignature},
90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::vpn::kSaveCredentials, &kBoolSignature},
91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::vpn::kUsername, &kStringSignature},
92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    {NULL}};
93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangconst OncFieldSignature openvpn_fields[] = {
95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::kRecommended, &kRecommendedSignature},
96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::openvpn::kAuth, &kStringSignature},
97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::openvpn::kAuthNoCache, &kBoolSignature},
98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::openvpn::kAuthRetry, &kStringSignature},
99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang    { ::onc::openvpn::kCipher, &kStringSignature},
100    { ::onc::vpn::kClientCertPattern, &kCertificatePatternSignature},
101    { ::onc::vpn::kClientCertRef, &kStringSignature},
102    { ::onc::vpn::kClientCertType, &kStringSignature},
103    { ::onc::openvpn::kCompLZO, &kStringSignature},
104    { ::onc::openvpn::kCompNoAdapt, &kBoolSignature},
105    { ::onc::openvpn::kKeyDirection, &kStringSignature},
106    { ::onc::openvpn::kNsCertType, &kStringSignature},
107    { ::onc::vpn::kPassword, &kStringSignature},
108    { ::onc::openvpn::kPort, &kIntegerSignature},
109    { ::onc::openvpn::kProto, &kStringSignature},
110    { ::onc::openvpn::kPushPeerInfo, &kBoolSignature},
111    { ::onc::openvpn::kRemoteCertEKU, &kStringSignature},
112    { ::onc::openvpn::kRemoteCertKU, &kStringListSignature},
113    { ::onc::openvpn::kRemoteCertTLS, &kStringSignature},
114    { ::onc::openvpn::kRenegSec, &kIntegerSignature},
115    { ::onc::vpn::kSaveCredentials, &kBoolSignature},
116    { ::onc::openvpn::kServerCAPEMs, &kStringListSignature},
117    { ::onc::openvpn::kServerCARef, &kStringSignature},
118    // Not supported, yet.
119    { ::onc::openvpn::kServerCertPEM, &kStringSignature},
120    { ::onc::openvpn::kServerCertRef, &kStringSignature},
121    { ::onc::openvpn::kServerPollTimeout, &kIntegerSignature},
122    { ::onc::openvpn::kShaper, &kIntegerSignature},
123    { ::onc::openvpn::kStaticChallenge, &kStringSignature},
124    { ::onc::openvpn::kTLSAuthContents, &kStringSignature},
125    { ::onc::openvpn::kTLSRemote, &kStringSignature},
126    { ::onc::vpn::kUsername, &kStringSignature},
127    // Not supported, yet.
128    { ::onc::openvpn::kVerb, &kStringSignature},
129    {NULL}};
130
131const OncFieldSignature vpn_fields[] = {
132    { ::onc::kRecommended, &kRecommendedSignature},
133    { ::onc::vpn::kAutoConnect, &kBoolSignature},
134    { ::onc::vpn::kHost, &kStringSignature},
135    { ::onc::vpn::kIPsec, &kIPsecSignature},
136    { ::onc::vpn::kL2TP, &kL2TPSignature},
137    { ::onc::vpn::kOpenVPN, &kOpenVPNSignature},
138    { ::onc::vpn::kType, &kStringSignature},
139    {NULL}};
140
141const OncFieldSignature ethernet_fields[] = {
142    { ::onc::kRecommended, &kRecommendedSignature},
143    { ::onc::ethernet::kAuthentication, &kStringSignature},
144    { ::onc::ethernet::kEAP, &kEAPSignature},
145    {NULL}};
146
147// Not supported, yet.
148const OncFieldSignature ipconfig_fields[] = {
149    { ::onc::ipconfig::kGateway, &kStringSignature},
150    { ::onc::ipconfig::kIPAddress, &kStringSignature},
151    { ::onc::network_config::kNameServers, &kStringSignature},
152    { ::onc::ipconfig::kRoutingPrefix, &kIntegerSignature},
153    { ::onc::network_config::kSearchDomains, &kStringListSignature},
154    { ::onc::ipconfig::kType, &kStringSignature},
155    {NULL}};
156
157const OncFieldSignature proxy_location_fields[] = {
158    { ::onc::proxy::kHost, &kStringSignature},
159    { ::onc::proxy::kPort, &kIntegerSignature}, {NULL}};
160
161const OncFieldSignature proxy_manual_fields[] = {
162    { ::onc::proxy::kFtp, &kProxyLocationSignature},
163    { ::onc::proxy::kHttp, &kProxyLocationSignature},
164    { ::onc::proxy::kHttps, &kProxyLocationSignature},
165    { ::onc::proxy::kSocks, &kProxyLocationSignature},
166    {NULL}};
167
168const OncFieldSignature proxy_settings_fields[] = {
169    { ::onc::kRecommended, &kRecommendedSignature},
170    { ::onc::proxy::kExcludeDomains, &kStringListSignature},
171    { ::onc::proxy::kManual, &kProxyManualSignature},
172    { ::onc::proxy::kPAC, &kStringSignature},
173    { ::onc::proxy::kType, &kStringSignature},
174    {NULL}};
175
176const OncFieldSignature wifi_fields[] = {
177    { ::onc::kRecommended, &kRecommendedSignature},
178    { ::onc::wifi::kAutoConnect, &kBoolSignature},
179    { ::onc::wifi::kEAP, &kEAPSignature},
180    { ::onc::wifi::kHiddenSSID, &kBoolSignature},
181    { ::onc::wifi::kPassphrase, &kStringSignature},
182    { ::onc::wifi::kSSID, &kStringSignature},
183    { ::onc::wifi::kSecurity, &kStringSignature},
184    {NULL}};
185
186const OncFieldSignature wifi_with_state_fields[] = {
187    { ::onc::wifi::kBSSID, &kStringSignature},
188    { ::onc::wifi::kFrequency, &kIntegerSignature},
189    { ::onc::wifi::kFrequencyList, &kIntegerListSignature},
190    { ::onc::wifi::kSignalStrength, &kIntegerSignature},
191    {NULL}};
192
193const OncFieldSignature cellular_provider_fields[] = {
194    { ::onc::cellular_provider::kCode, &kStringSignature},
195    { ::onc::cellular_provider::kCountry, &kStringSignature},
196    { ::onc::cellular_provider::kName, &kStringSignature},
197    {NULL}};
198
199const OncFieldSignature cellular_apn_fields[] = {
200    { ::onc::cellular_apn::kName, &kStringSignature},
201    { ::onc::cellular_apn::kUsername, &kStringSignature},
202    { ::onc::cellular_apn::kPassword, &kStringSignature},
203    {NULL}};
204
205const OncFieldSignature cellular_fields[] = {
206    { ::onc::kRecommended, &kRecommendedSignature},
207    { ::onc::cellular::kAPN, &kCellularApnSignature },
208    { ::onc::cellular::kAPNList, &kCellularApnListSignature}, {NULL}};
209
210const OncFieldSignature cellular_with_state_fields[] = {
211    { ::onc::cellular::kActivateOverNonCellularNetwork, &kBoolSignature},
212    { ::onc::cellular::kActivationState, &kStringSignature},
213    { ::onc::cellular::kAllowRoaming, &kStringSignature},
214    { ::onc::cellular::kCarrier, &kStringSignature},
215    { ::onc::cellular::kESN, &kStringSignature},
216    { ::onc::cellular::kFamily, &kStringSignature},
217    { ::onc::cellular::kFirmwareRevision, &kStringSignature},
218    { ::onc::cellular::kFoundNetworks, &kStringSignature},
219    { ::onc::cellular::kHardwareRevision, &kStringSignature},
220    { ::onc::cellular::kHomeProvider, &kCellularProviderSignature},
221    { ::onc::cellular::kICCID, &kStringSignature},
222    { ::onc::cellular::kIMEI, &kStringSignature},
223    { ::onc::cellular::kIMSI, &kStringSignature},
224    { ::onc::cellular::kManufacturer, &kStringSignature},
225    { ::onc::cellular::kMDN, &kStringSignature},
226    { ::onc::cellular::kMEID, &kStringSignature},
227    { ::onc::cellular::kMIN, &kStringSignature},
228    { ::onc::cellular::kModelID, &kStringSignature},
229    { ::onc::cellular::kNetworkTechnology, &kStringSignature},
230    { ::onc::cellular::kPRLVersion, &kStringSignature},
231    { ::onc::cellular::kProviderRequiresRoaming, &kStringSignature},
232    { ::onc::cellular::kRoamingState, &kStringSignature},
233    { ::onc::cellular::kSelectedNetwork, &kStringSignature},
234    { ::onc::cellular::kServingOperator, &kCellularProviderSignature},
235    { ::onc::cellular::kSIMLockStatus, &kStringSignature},
236    { ::onc::cellular::kSIMPresent, &kStringSignature},
237    { ::onc::cellular::kSupportedCarriers, &kStringSignature},
238    { ::onc::cellular::kSupportNetworkScan, &kStringSignature},
239    {NULL}};
240
241const OncFieldSignature network_configuration_fields[] = {
242    { ::onc::kRecommended, &kRecommendedSignature},
243    { ::onc::network_config::kEthernet, &kEthernetSignature},
244    { ::onc::network_config::kGUID, &kStringSignature},
245    // Not supported, yet.
246    { ::onc::network_config::kIPConfigs, &kIPConfigListSignature},
247    { ::onc::network_config::kName, &kStringSignature},
248    // Not supported, yet.
249    { ::onc::network_config::kNameServers, &kStringListSignature},
250    { ::onc::network_config::kProxySettings, &kProxySettingsSignature},
251    { ::onc::kRemove, &kBoolSignature},
252    // Not supported, yet.
253    { ::onc::network_config::kSearchDomains, &kStringListSignature},
254    { ::onc::network_config::kType, &kStringSignature},
255    { ::onc::network_config::kVPN, &kVPNSignature},
256    { ::onc::network_config::kWiFi, &kWiFiSignature},
257    { ::onc::network_config::kCellular, &kCellularSignature},
258    {NULL}};
259
260const OncFieldSignature network_with_state_fields[] = {
261    { ::onc::network_config::kCellular, &kCellularWithStateSignature},
262    { ::onc::network_config::kConnectionState, &kStringSignature},
263    { ::onc::network_config::kWiFi, &kWiFiWithStateSignature},
264    {NULL}};
265
266const OncFieldSignature certificate_fields[] = {
267    { ::onc::certificate::kGUID, &kStringSignature},
268    { ::onc::certificate::kPKCS12, &kStringSignature},
269    { ::onc::kRemove, &kBoolSignature},
270    { ::onc::certificate::kTrustBits, &kStringListSignature},
271    { ::onc::certificate::kType, &kStringSignature},
272    { ::onc::certificate::kX509, &kStringSignature},
273    {NULL}};
274
275const OncFieldSignature toplevel_configuration_fields[] = {
276    { ::onc::toplevel_config::kCertificates, &kCertificateListSignature},
277    { ::onc::toplevel_config::kNetworkConfigurations,
278      &kNetworkConfigurationListSignature},
279    { ::onc::toplevel_config::kType, &kStringSignature},
280    { ::onc::encrypted::kCipher, &kStringSignature},
281    { ::onc::encrypted::kCiphertext, &kStringSignature},
282    { ::onc::encrypted::kHMAC, &kStringSignature},
283    { ::onc::encrypted::kHMACMethod, &kStringSignature},
284    { ::onc::encrypted::kIV, &kStringSignature},
285    { ::onc::encrypted::kIterations, &kIntegerSignature},
286    { ::onc::encrypted::kSalt, &kStringSignature},
287    { ::onc::encrypted::kStretch, &kStringSignature}, {NULL}};
288
289}  // namespace
290
291const OncValueSignature kRecommendedSignature = {
292  Value::TYPE_LIST, NULL, &kStringSignature
293};
294const OncValueSignature kEAPSignature = {
295  Value::TYPE_DICTIONARY, eap_fields, NULL
296};
297const OncValueSignature kIssuerSubjectPatternSignature = {
298  Value::TYPE_DICTIONARY, issuer_subject_pattern_fields, NULL
299};
300const OncValueSignature kCertificatePatternSignature = {
301  Value::TYPE_DICTIONARY, certificate_pattern_fields, NULL
302};
303const OncValueSignature kIPsecSignature = {
304  Value::TYPE_DICTIONARY, ipsec_fields, NULL
305};
306const OncValueSignature kL2TPSignature = {
307  Value::TYPE_DICTIONARY, l2tp_fields, NULL
308};
309const OncValueSignature kOpenVPNSignature = {
310  Value::TYPE_DICTIONARY, openvpn_fields, NULL
311};
312const OncValueSignature kVPNSignature = {
313  Value::TYPE_DICTIONARY, vpn_fields, NULL
314};
315const OncValueSignature kEthernetSignature = {
316  Value::TYPE_DICTIONARY, ethernet_fields, NULL
317};
318const OncValueSignature kIPConfigSignature = {
319  Value::TYPE_DICTIONARY, ipconfig_fields, NULL
320};
321const OncValueSignature kProxyLocationSignature = {
322  Value::TYPE_DICTIONARY, proxy_location_fields, NULL
323};
324const OncValueSignature kProxyManualSignature = {
325  Value::TYPE_DICTIONARY, proxy_manual_fields, NULL
326};
327const OncValueSignature kProxySettingsSignature = {
328  Value::TYPE_DICTIONARY, proxy_settings_fields, NULL
329};
330const OncValueSignature kWiFiSignature = {
331  Value::TYPE_DICTIONARY, wifi_fields, NULL
332};
333const OncValueSignature kCertificateSignature = {
334  Value::TYPE_DICTIONARY, certificate_fields, NULL
335};
336const OncValueSignature kNetworkConfigurationSignature = {
337  Value::TYPE_DICTIONARY, network_configuration_fields, NULL
338};
339const OncValueSignature kCertificateListSignature = {
340  Value::TYPE_LIST, NULL, &kCertificateSignature
341};
342const OncValueSignature kNetworkConfigurationListSignature = {
343  Value::TYPE_LIST, NULL, &kNetworkConfigurationSignature
344};
345const OncValueSignature kToplevelConfigurationSignature = {
346  Value::TYPE_DICTIONARY, toplevel_configuration_fields, NULL
347};
348
349// Derived "ONC with State" signatures.
350const OncValueSignature kNetworkWithStateSignature = {
351  Value::TYPE_DICTIONARY, network_with_state_fields, NULL,
352  &kNetworkConfigurationSignature
353};
354const OncValueSignature kWiFiWithStateSignature = {
355  Value::TYPE_DICTIONARY, wifi_with_state_fields, NULL, &kWiFiSignature
356};
357const OncValueSignature kCellularSignature = {
358  Value::TYPE_DICTIONARY, cellular_fields, NULL
359};
360const OncValueSignature kCellularWithStateSignature = {
361  Value::TYPE_DICTIONARY, cellular_with_state_fields, NULL, &kCellularSignature
362};
363const OncValueSignature kCellularProviderSignature = {
364  Value::TYPE_DICTIONARY, cellular_provider_fields, NULL
365};
366const OncValueSignature kCellularApnSignature = {
367  Value::TYPE_DICTIONARY, cellular_apn_fields, NULL
368};
369
370const OncFieldSignature* GetFieldSignature(const OncValueSignature& signature,
371                                           const std::string& onc_field_name) {
372  if (!signature.fields)
373    return NULL;
374  for (const OncFieldSignature* field_signature = signature.fields;
375       field_signature->onc_field_name != NULL; ++field_signature) {
376    if (onc_field_name == field_signature->onc_field_name)
377      return field_signature;
378  }
379  if (signature.base_signature)
380    return GetFieldSignature(*signature.base_signature, onc_field_name);
381  return NULL;
382}
383
384namespace {
385
386struct CredentialEntry {
387  const OncValueSignature* value_signature;
388  const char* field_name;
389};
390
391const CredentialEntry credentials[] = {
392    {&kEAPSignature, ::onc::eap::kPassword},
393    {&kIPsecSignature, ::onc::ipsec::kPSK},
394    {&kL2TPSignature, ::onc::vpn::kPassword},
395    {&kOpenVPNSignature, ::onc::vpn::kPassword},
396    {&kOpenVPNSignature, ::onc::openvpn::kTLSAuthContents},
397    {&kWiFiSignature, ::onc::wifi::kPassphrase},
398    {&kCellularApnSignature, ::onc::cellular_apn::kPassword},
399    {NULL}};
400
401}  // namespace
402
403bool FieldIsCredential(const OncValueSignature& signature,
404                       const std::string& onc_field_name) {
405  for (const CredentialEntry* entry = credentials;
406       entry->value_signature != NULL; ++entry) {
407    if (&signature == entry->value_signature &&
408        onc_field_name == entry->field_name) {
409      return true;
410    }
411  }
412  return false;
413}
414
415}  // namespace onc
416}  // namespace chromeos
417