onc_signature.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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 kStringListSignature = {
26  base::Value::TYPE_LIST, NULL, &kStringSignature
27};
28const OncValueSignature kIntegerListSignature = {
29  base::Value::TYPE_LIST, NULL, &kIntegerSignature
30};
31const OncValueSignature kIPConfigListSignature = {
32  base::Value::TYPE_LIST, NULL, &kIPConfigSignature
33};
34const OncValueSignature kCellularApnListSignature = {
35  base::Value::TYPE_LIST, NULL, &kCellularApnSignature
36};
37
38const 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
45const 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
55const 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
73const 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
92const OncFieldSignature xauth_fields[] = {
93    { ::onc::vpn::kPassword, &kStringSignature},
94    { ::onc::vpn::kUsername, &kStringSignature},
95    {NULL}};
96
97const 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
104const 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
146const OncFieldSignature verify_x509_fields[] = {
147    { ::onc::verify_x509::kName, &kStringSignature},
148    { ::onc::verify_x509::kType, &kStringSignature},
149    {NULL}};
150
151const 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
161const 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.
168const 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
177const OncFieldSignature proxy_location_fields[] = {
178    { ::onc::proxy::kHost, &kStringSignature},
179    { ::onc::proxy::kPort, &kIntegerSignature}, {NULL}};
180
181const 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
188const 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
196const 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
206const 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
213const 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
219const 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
225const OncFieldSignature cellular_fields[] = {
226    { ::onc::kRecommended, &kRecommendedSignature},
227    { ::onc::cellular::kAPN, &kCellularApnSignature },
228    { ::onc::cellular::kAPNList, &kCellularApnListSignature},
229    {NULL}};
230
231const 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
264const 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
283const 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
292const OncFieldSignature global_network_configuration_fields[] = {
293    { ::onc::global_network_config::kAllowOnlyPolicyNetworksToAutoconnect,
294      &kBoolSignature},
295    {NULL}};
296
297const 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
306const 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
324const OncValueSignature kRecommendedSignature = {
325  base::Value::TYPE_LIST, NULL, &kStringSignature
326};
327const OncValueSignature kEAPSignature = {
328  base::Value::TYPE_DICTIONARY, eap_fields, NULL
329};
330const OncValueSignature kIssuerSubjectPatternSignature = {
331  base::Value::TYPE_DICTIONARY, issuer_subject_pattern_fields, NULL
332};
333const OncValueSignature kCertificatePatternSignature = {
334  base::Value::TYPE_DICTIONARY, certificate_pattern_fields, NULL
335};
336const OncValueSignature kIPsecSignature = {
337  base::Value::TYPE_DICTIONARY, ipsec_fields, NULL
338};
339const OncValueSignature kXAUTHSignature = {
340  base::Value::TYPE_DICTIONARY, xauth_fields, NULL
341};
342const OncValueSignature kL2TPSignature = {
343  base::Value::TYPE_DICTIONARY, l2tp_fields, NULL
344};
345const OncValueSignature kOpenVPNSignature = {
346  base::Value::TYPE_DICTIONARY, openvpn_fields, NULL
347};
348const OncValueSignature kVerifyX509Signature = {
349  base::Value::TYPE_DICTIONARY, verify_x509_fields, NULL
350};
351const OncValueSignature kVPNSignature = {
352  base::Value::TYPE_DICTIONARY, vpn_fields, NULL
353};
354const OncValueSignature kEthernetSignature = {
355  base::Value::TYPE_DICTIONARY, ethernet_fields, NULL
356};
357const OncValueSignature kIPConfigSignature = {
358  base::Value::TYPE_DICTIONARY, ipconfig_fields, NULL
359};
360const OncValueSignature kProxyLocationSignature = {
361  base::Value::TYPE_DICTIONARY, proxy_location_fields, NULL
362};
363const OncValueSignature kProxyManualSignature = {
364  base::Value::TYPE_DICTIONARY, proxy_manual_fields, NULL
365};
366const OncValueSignature kProxySettingsSignature = {
367  base::Value::TYPE_DICTIONARY, proxy_settings_fields, NULL
368};
369const OncValueSignature kWiFiSignature = {
370  base::Value::TYPE_DICTIONARY, wifi_fields, NULL
371};
372const OncValueSignature kCertificateSignature = {
373  base::Value::TYPE_DICTIONARY, certificate_fields, NULL
374};
375const OncValueSignature kNetworkConfigurationSignature = {
376  base::Value::TYPE_DICTIONARY, network_configuration_fields, NULL
377};
378const OncValueSignature kGlobalNetworkConfigurationSignature = {
379  base::Value::TYPE_DICTIONARY, global_network_configuration_fields, NULL
380};
381const OncValueSignature kCertificateListSignature = {
382  base::Value::TYPE_LIST, NULL, &kCertificateSignature
383};
384const OncValueSignature kNetworkConfigurationListSignature = {
385  base::Value::TYPE_LIST, NULL, &kNetworkConfigurationSignature
386};
387const OncValueSignature kToplevelConfigurationSignature = {
388  base::Value::TYPE_DICTIONARY, toplevel_configuration_fields, NULL
389};
390
391// Derived "ONC with State" signatures.
392const OncValueSignature kNetworkWithStateSignature = {
393  base::Value::TYPE_DICTIONARY, network_with_state_fields, NULL,
394  &kNetworkConfigurationSignature
395};
396const OncValueSignature kWiFiWithStateSignature = {
397  base::Value::TYPE_DICTIONARY, wifi_with_state_fields, NULL, &kWiFiSignature
398};
399const OncValueSignature kCellularSignature = {
400  base::Value::TYPE_DICTIONARY, cellular_fields, NULL
401};
402const OncValueSignature kCellularWithStateSignature = {
403  base::Value::TYPE_DICTIONARY, cellular_with_state_fields, NULL,
404  &kCellularSignature
405};
406const OncValueSignature kCellularProviderSignature = {
407  base::Value::TYPE_DICTIONARY, cellular_provider_fields, NULL
408};
409const OncValueSignature kCellularApnSignature = {
410  base::Value::TYPE_DICTIONARY, cellular_apn_fields, NULL
411};
412
413const 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
427namespace {
428
429struct CredentialEntry {
430  const OncValueSignature* value_signature;
431  const char* field_name;
432};
433
434const 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
447bool 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