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.
5 #include "chromeos/network/onc/onc_signature.h"
7 #include "chromeos/network/onc/onc_constants.h"
8 #include "third_party/cros_system_api/dbus/service_constants.h"
16 const OncValueSignature kBoolSignature
= {
17 Value::TYPE_BOOLEAN
, NULL
19 const OncValueSignature kStringSignature
= {
20 Value::TYPE_STRING
, NULL
22 const OncValueSignature kIntegerSignature
= {
23 Value::TYPE_INTEGER
, NULL
25 const OncValueSignature kStringListSignature
= {
26 Value::TYPE_LIST
, NULL
, &kStringSignature
28 const OncValueSignature kIntegerListSignature
= {
29 Value::TYPE_LIST
, NULL
, &kIntegerSignature
31 const OncValueSignature kIPConfigListSignature
= {
32 Value::TYPE_LIST
, NULL
, &kIPConfigSignature
35 const OncFieldSignature issuer_subject_pattern_fields
[] = {
36 { certificate::kCommonName
, &kStringSignature
},
37 { certificate::kLocality
, &kStringSignature
},
38 { certificate::kOrganization
, &kStringSignature
},
39 { certificate::kOrganizationalUnit
, &kStringSignature
},
43 const 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
},
53 const 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
},
70 const 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
},
83 // { ipsec::kEAP, &kEAPSignature },
84 // { ipsec::kXAUTH, &kXAUTHSignature },
88 const OncFieldSignature l2tp_fields
[] = {
89 { kRecommended
, &kRecommendedSignature
},
90 { vpn::kPassword
, &kStringSignature
},
91 { vpn::kSaveCredentials
, &kBoolSignature
},
92 { vpn::kUsername
, &kStringSignature
},
96 const 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
},
134 const 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
},
145 const OncFieldSignature ethernet_fields
[] = {
146 { kRecommended
, &kRecommendedSignature
},
147 // Not supported, yet.
148 { ethernet::kAuthentication
, &kStringSignature
},
149 { ethernet::kEAP
, &kEAPSignature
},
153 // Not supported, yet.
154 const 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
},
164 const OncFieldSignature proxy_location_fields
[] = {
165 { proxy::kHost
, &kStringSignature
},
166 { proxy::kPort
, &kIntegerSignature
},
170 const OncFieldSignature proxy_manual_fields
[] = {
171 { proxy::kFtp
, &kProxyLocationSignature
},
172 { proxy::kHttp
, &kProxyLocationSignature
},
173 { proxy::kHttps
, &kProxyLocationSignature
},
174 { proxy::kSocks
, &kProxyLocationSignature
},
178 const OncFieldSignature proxy_settings_fields
[] = {
179 { kRecommended
, &kRecommendedSignature
},
180 { proxy::kExcludeDomains
, &kStringListSignature
},
181 { proxy::kManual
, &kProxyManualSignature
},
182 { proxy::kPAC
, &kStringSignature
},
183 { proxy::kType
, &kStringSignature
},
187 const 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
},
198 const OncFieldSignature wifi_with_state_fields
[] = {
199 { wifi::kBSSID
, &kStringSignature
},
200 { wifi::kFrequency
, &kIntegerSignature
},
201 { wifi::kFrequencyList
, &kIntegerListSignature
},
202 { wifi::kSignalStrength
, &kIntegerSignature
},
206 const OncFieldSignature cellular_provider_fields
[] = {
207 { cellular_provider::kCode
, &kStringSignature
},
208 { cellular_provider::kCountry
, &kStringSignature
},
209 { cellular_provider::kName
, &kStringSignature
},
213 const OncFieldSignature cellular_with_state_fields
[] = {
214 { kRecommended
, &kRecommendedSignature
},
215 { cellular::kActivateOverNonCellularNetwork
, &kBoolSignature
},
216 { cellular::kActivationState
, &kStringSignature
},
217 { cellular::kAllowRoaming
, &kStringSignature
},
218 { cellular::kAPN
, &kStringSignature
},
219 { cellular::kCarrier
, &kStringSignature
},
220 { cellular::kESN
, &kStringSignature
},
221 { cellular::kFamily
, &kStringSignature
},
222 { cellular::kFirmwareRevision
, &kStringSignature
},
223 { cellular::kFoundNetworks
, &kStringSignature
},
224 { cellular::kHardwareRevision
, &kStringSignature
},
225 { cellular::kHomeProvider
, &kCellularProviderSignature
},
226 { cellular::kICCID
, &kStringSignature
},
227 { cellular::kIMEI
, &kStringSignature
},
228 { cellular::kIMSI
, &kStringSignature
},
229 { cellular::kManufacturer
, &kStringSignature
},
230 { cellular::kMDN
, &kStringSignature
},
231 { cellular::kMEID
, &kStringSignature
},
232 { cellular::kMIN
, &kStringSignature
},
233 { cellular::kModelID
, &kStringSignature
},
234 { cellular::kNetworkTechnology
, &kStringSignature
},
235 { cellular::kPRLVersion
, &kStringSignature
},
236 { cellular::kProviderRequiresRoaming
, &kStringSignature
},
237 { cellular::kRoamingState
, &kStringSignature
},
238 { cellular::kSelectedNetwork
, &kStringSignature
},
239 { cellular::kServingOperator
, &kCellularProviderSignature
},
240 { cellular::kSIMLockStatus
, &kStringSignature
},
241 { cellular::kSIMPresent
, &kStringSignature
},
242 { cellular::kSupportedCarriers
, &kStringSignature
},
243 { cellular::kSupportNetworkScan
, &kStringSignature
},
247 const OncFieldSignature network_configuration_fields
[] = {
248 { kRecommended
, &kRecommendedSignature
},
249 { network_config::kEthernet
, &kEthernetSignature
},
250 { network_config::kGUID
, &kStringSignature
},
251 // Not supported, yet.
252 { network_config::kIPConfigs
, &kIPConfigListSignature
},
253 { network_config::kName
, &kStringSignature
},
254 // Not supported, yet.
255 { network_config::kNameServers
, &kStringListSignature
},
256 { network_config::kProxySettings
, &kProxySettingsSignature
},
257 { kRemove
, &kBoolSignature
},
258 // Not supported, yet.
259 { network_config::kSearchDomains
, &kStringListSignature
},
260 { network_config::kType
, &kStringSignature
},
261 { network_config::kVPN
, &kVPNSignature
},
262 { network_config::kWiFi
, &kWiFiSignature
},
266 const OncFieldSignature network_with_state_fields
[] = {
267 { network_config::kCellular
, &kCellularWithStateSignature
},
268 { network_config::kConnectionState
, &kStringSignature
},
269 { network_config::kWiFi
, &kWiFiWithStateSignature
},
273 const OncFieldSignature certificate_fields
[] = {
274 { certificate::kGUID
, &kStringSignature
},
275 { certificate::kPKCS12
, &kStringSignature
},
276 { kRemove
, &kBoolSignature
},
277 { certificate::kTrustBits
, &kStringListSignature
},
278 { certificate::kType
, &kStringSignature
},
279 { certificate::kX509
, &kStringSignature
},
283 const OncFieldSignature toplevel_configuration_fields
[] = {
284 { toplevel_config::kCertificates
, &kCertificateListSignature
},
285 { toplevel_config::kNetworkConfigurations
,
286 &kNetworkConfigurationListSignature
},
287 { toplevel_config::kType
, &kStringSignature
},
288 { encrypted::kCipher
, &kStringSignature
},
289 { encrypted::kCiphertext
, &kStringSignature
},
290 { encrypted::kHMAC
, &kStringSignature
},
291 { encrypted::kHMACMethod
, &kStringSignature
},
292 { encrypted::kIV
, &kStringSignature
},
293 { encrypted::kIterations
, &kIntegerSignature
},
294 { encrypted::kSalt
, &kStringSignature
},
295 { encrypted::kStretch
, &kStringSignature
},
301 const OncValueSignature kRecommendedSignature
= {
302 Value::TYPE_LIST
, NULL
, &kStringSignature
304 const OncValueSignature kEAPSignature
= {
305 Value::TYPE_DICTIONARY
, eap_fields
, NULL
307 const OncValueSignature kIssuerSubjectPatternSignature
= {
308 Value::TYPE_DICTIONARY
, issuer_subject_pattern_fields
, NULL
310 const OncValueSignature kCertificatePatternSignature
= {
311 Value::TYPE_DICTIONARY
, certificate_pattern_fields
, NULL
313 const OncValueSignature kIPsecSignature
= {
314 Value::TYPE_DICTIONARY
, ipsec_fields
, NULL
316 const OncValueSignature kL2TPSignature
= {
317 Value::TYPE_DICTIONARY
, l2tp_fields
, NULL
319 const OncValueSignature kOpenVPNSignature
= {
320 Value::TYPE_DICTIONARY
, openvpn_fields
, NULL
322 const OncValueSignature kVPNSignature
= {
323 Value::TYPE_DICTIONARY
, vpn_fields
, NULL
325 const OncValueSignature kEthernetSignature
= {
326 Value::TYPE_DICTIONARY
, ethernet_fields
, NULL
328 const OncValueSignature kIPConfigSignature
= {
329 Value::TYPE_DICTIONARY
, ipconfig_fields
, NULL
331 const OncValueSignature kProxyLocationSignature
= {
332 Value::TYPE_DICTIONARY
, proxy_location_fields
, NULL
334 const OncValueSignature kProxyManualSignature
= {
335 Value::TYPE_DICTIONARY
, proxy_manual_fields
, NULL
337 const OncValueSignature kProxySettingsSignature
= {
338 Value::TYPE_DICTIONARY
, proxy_settings_fields
, NULL
340 const OncValueSignature kWiFiSignature
= {
341 Value::TYPE_DICTIONARY
, wifi_fields
, NULL
343 const OncValueSignature kCertificateSignature
= {
344 Value::TYPE_DICTIONARY
, certificate_fields
, NULL
346 const OncValueSignature kNetworkConfigurationSignature
= {
347 Value::TYPE_DICTIONARY
, network_configuration_fields
, NULL
349 const OncValueSignature kCertificateListSignature
= {
350 Value::TYPE_LIST
, NULL
, &kCertificateSignature
352 const OncValueSignature kNetworkConfigurationListSignature
= {
353 Value::TYPE_LIST
, NULL
, &kNetworkConfigurationSignature
355 const OncValueSignature kToplevelConfigurationSignature
= {
356 Value::TYPE_DICTIONARY
, toplevel_configuration_fields
, NULL
359 // Derived "ONC with State" signatures.
360 const OncValueSignature kNetworkWithStateSignature
= {
361 Value::TYPE_DICTIONARY
, network_with_state_fields
, NULL
,
362 &kNetworkConfigurationSignature
364 const OncValueSignature kWiFiWithStateSignature
= {
365 Value::TYPE_DICTIONARY
, wifi_with_state_fields
, NULL
, &kWiFiSignature
367 const OncValueSignature kCellularWithStateSignature
= {
368 Value::TYPE_DICTIONARY
, cellular_with_state_fields
, NULL
370 const OncValueSignature kCellularProviderSignature
= {
371 Value::TYPE_DICTIONARY
, cellular_provider_fields
, NULL
374 const OncFieldSignature
* GetFieldSignature(const OncValueSignature
& signature
,
375 const std::string
& onc_field_name
) {
376 if (!signature
.fields
)
378 for (const OncFieldSignature
* field_signature
= signature
.fields
;
379 field_signature
->onc_field_name
!= NULL
; ++field_signature
) {
380 if (onc_field_name
== field_signature
->onc_field_name
)
381 return field_signature
;
383 if (signature
.base_signature
)
384 return GetFieldSignature(*signature
.base_signature
, onc_field_name
);
390 struct CredentialEntry
{
391 const OncValueSignature
* value_signature
;
392 const char* field_name
;
395 const CredentialEntry credentials
[] = {
396 { &kEAPSignature
, onc::eap::kPassword
},
397 { &kIPsecSignature
, onc::ipsec::kPSK
},
398 { &kL2TPSignature
, onc::vpn::kPassword
},
399 { &kOpenVPNSignature
, onc::vpn::kPassword
},
400 { &kOpenVPNSignature
, onc::openvpn::kTLSAuthContents
},
401 { &kWiFiSignature
, onc::wifi::kPassphrase
},
407 bool FieldIsCredential(const OncValueSignature
& signature
,
408 const std::string
& onc_field_name
) {
409 for (const CredentialEntry
* entry
= credentials
;
410 entry
->value_signature
!= NULL
; ++entry
) {
411 if (&signature
== entry
->value_signature
&&
412 onc_field_name
== entry
->field_name
) {
420 } // namespace chromeos