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