onc_signature.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
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
173// Not supported for policy but for reading network state.
174const OncFieldSignature ipconfig_fields[] = {
175    { ::onc::ipconfig::kGateway, &kStringSignature},
176    { ::onc::ipconfig::kIPAddress, &kStringSignature},
177    { ::onc::ipconfig::kNameServers, &kStringListSignature},
178    { ::onc::ipconfig::kRoutingPrefix, &kIntegerSignature},
179    { ::onc::network_config::kSearchDomains, &kStringListSignature},
180    { ::onc::ipconfig::kType, &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 cellular_provider_fields[] = {
220    { ::onc::cellular_provider::kCode, &kStringSignature},
221    { ::onc::cellular_provider::kCountry, &kStringSignature},
222    { ::onc::cellular_provider::kName, &kStringSignature},
223    {NULL}};
224
225const OncFieldSignature cellular_apn_fields[] = {
226    { ::onc::cellular_apn::kName, &kStringSignature},
227    { ::onc::cellular_apn::kUsername, &kStringSignature},
228    { ::onc::cellular_apn::kPassword, &kStringSignature},
229    { ::onc::cellular_apn::kLocalizedName, &kStringSignature},
230    { ::onc::cellular_apn::kLanguage, &kStringSignature},
231    {NULL}};
232
233const OncFieldSignature cellular_found_network_fields[] = {
234    { ::onc::cellular_found_network::kStatus, &kStringSignature},
235    { ::onc::cellular_found_network::kNetworkId, &kStringSignature},
236    { ::onc::cellular_found_network::kShortName, &kStringSignature},
237    { ::onc::cellular_found_network::kLongName, &kStringSignature},
238    { ::onc::cellular_found_network::kTechnology, &kStringSignature},
239    {NULL}};
240
241const OncFieldSignature sim_lock_status_fields[] = {
242    { ::onc::sim_lock_status::kLockEnabled, &kBoolSignature},
243    { ::onc::sim_lock_status::kLockType, &kStringSignature},
244    { ::onc::sim_lock_status::kRetriesLeft, &kDoubleSignature},
245    {NULL}};
246
247const OncFieldSignature cellular_fields[] = {
248    { ::onc::kRecommended, &kRecommendedSignature},
249    { ::onc::cellular::kAPN, &kCellularApnSignature },
250    { ::onc::cellular::kAPNList, &kCellularApnListSignature},
251    {NULL}};
252
253const OncFieldSignature cellular_with_state_fields[] = {
254    { ::onc::cellular::kActivationType, &kStringSignature},
255    { ::onc::cellular::kActivationState, &kStringSignature},
256    { ::onc::cellular::kAllowRoaming, &kBoolSignature},
257    { ::onc::cellular::kCarrier, &kStringSignature},
258    { ::onc::cellular::kESN, &kStringSignature},
259    { ::onc::cellular::kFamily, &kStringSignature},
260    { ::onc::cellular::kFirmwareRevision, &kStringSignature},
261    { ::onc::cellular::kFoundNetworks, &kCellularFoundNetworkListSignature},
262    { ::onc::cellular::kHardwareRevision, &kStringSignature},
263    { ::onc::cellular::kHomeProvider, &kCellularProviderSignature},
264    { ::onc::cellular::kICCID, &kStringSignature},
265    { ::onc::cellular::kIMEI, &kStringSignature},
266    { ::onc::cellular::kIMSI, &kStringSignature},
267    { ::onc::cellular::kManufacturer, &kStringSignature},
268    { ::onc::cellular::kMDN, &kStringSignature},
269    { ::onc::cellular::kMEID, &kStringSignature},
270    { ::onc::cellular::kMIN, &kStringSignature},
271    { ::onc::cellular::kModelID, &kStringSignature},
272    { ::onc::cellular::kNetworkTechnology, &kStringSignature},
273    { ::onc::cellular::kPRLVersion, &kIntegerSignature},
274    { ::onc::cellular::kProviderRequiresRoaming, &kBoolSignature},
275    { ::onc::cellular::kRoamingState, &kStringSignature},
276    { ::onc::cellular::kSelectedNetwork, &kStringSignature},
277    { ::onc::cellular::kServingOperator, &kCellularProviderSignature},
278    { ::onc::cellular::kSIMLockStatus, &kSIMLockStatusSignature},
279    { ::onc::cellular::kSIMPresent, &kBoolSignature},
280    { ::onc::cellular::kSupportNetworkScan, &kBoolSignature},
281    { ::onc::cellular::kSupportedCarriers, &kStringListSignature},
282    {NULL}};
283
284const OncFieldSignature network_configuration_fields[] = {
285    { ::onc::kRecommended, &kRecommendedSignature},
286    { ::onc::network_config::kEthernet, &kEthernetSignature},
287    { ::onc::network_config::kGUID, &kStringSignature},
288    // Not supported for policy but for reading network state.
289    { ::onc::network_config::kIPConfigs, &kIPConfigListSignature},
290    { ::onc::network_config::kName, &kStringSignature},
291    // Not supported, yet.
292    { ::onc::network_config::kNameServers, &kStringListSignature},
293    { ::onc::network_config::kPriority, &kIntegerSignature},
294    { ::onc::network_config::kProxySettings, &kProxySettingsSignature},
295    { ::onc::kRemove, &kBoolSignature},
296    // Not supported, yet.
297    { ::onc::network_config::kSearchDomains, &kStringListSignature},
298    { ::onc::network_config::kType, &kStringSignature},
299    { ::onc::network_config::kVPN, &kVPNSignature},
300    { ::onc::network_config::kWiFi, &kWiFiSignature},
301    { ::onc::network_config::kCellular, &kCellularSignature},
302    {NULL}};
303
304const OncFieldSignature network_with_state_fields[] = {
305    { ::onc::network_config::kCellular, &kCellularWithStateSignature},
306    { ::onc::network_config::kConnectionState, &kStringSignature},
307    { ::onc::network_config::kConnectable, &kBoolSignature},
308    { ::onc::network_config::kErrorState, &kStringSignature},
309    { ::onc::network_config::kMacAddress, &kStringSignature},
310    { ::onc::network_config::kWiFi, &kWiFiWithStateSignature},
311    {NULL}};
312
313const OncFieldSignature global_network_configuration_fields[] = {
314    { ::onc::global_network_config::kAllowOnlyPolicyNetworksToAutoconnect,
315      &kBoolSignature},
316    {NULL}};
317
318const OncFieldSignature certificate_fields[] = {
319    { ::onc::certificate::kGUID, &kStringSignature},
320    { ::onc::certificate::kPKCS12, &kStringSignature},
321    { ::onc::kRemove, &kBoolSignature},
322    { ::onc::certificate::kTrustBits, &kStringListSignature},
323    { ::onc::certificate::kType, &kStringSignature},
324    { ::onc::certificate::kX509, &kStringSignature},
325    {NULL}};
326
327const OncFieldSignature toplevel_configuration_fields[] = {
328    { ::onc::toplevel_config::kCertificates, &kCertificateListSignature},
329    { ::onc::toplevel_config::kNetworkConfigurations,
330      &kNetworkConfigurationListSignature},
331    { ::onc::toplevel_config::kGlobalNetworkConfiguration,
332      &kGlobalNetworkConfigurationSignature},
333    { ::onc::toplevel_config::kType, &kStringSignature},
334    { ::onc::encrypted::kCipher, &kStringSignature},
335    { ::onc::encrypted::kCiphertext, &kStringSignature},
336    { ::onc::encrypted::kHMAC, &kStringSignature},
337    { ::onc::encrypted::kHMACMethod, &kStringSignature},
338    { ::onc::encrypted::kIV, &kStringSignature},
339    { ::onc::encrypted::kIterations, &kIntegerSignature},
340    { ::onc::encrypted::kSalt, &kStringSignature},
341    { ::onc::encrypted::kStretch, &kStringSignature}, {NULL}};
342
343}  // namespace
344
345const OncValueSignature kRecommendedSignature = {
346  base::Value::TYPE_LIST, NULL, &kStringSignature
347};
348const OncValueSignature kEAPSignature = {
349  base::Value::TYPE_DICTIONARY, eap_fields, NULL
350};
351const OncValueSignature kIssuerSubjectPatternSignature = {
352  base::Value::TYPE_DICTIONARY, issuer_subject_pattern_fields, NULL
353};
354const OncValueSignature kCertificatePatternSignature = {
355  base::Value::TYPE_DICTIONARY, certificate_pattern_fields, NULL
356};
357const OncValueSignature kIPsecSignature = {
358  base::Value::TYPE_DICTIONARY, ipsec_fields, NULL
359};
360const OncValueSignature kXAUTHSignature = {
361  base::Value::TYPE_DICTIONARY, xauth_fields, NULL
362};
363const OncValueSignature kL2TPSignature = {
364  base::Value::TYPE_DICTIONARY, l2tp_fields, NULL
365};
366const OncValueSignature kOpenVPNSignature = {
367  base::Value::TYPE_DICTIONARY, openvpn_fields, NULL
368};
369const OncValueSignature kVerifyX509Signature = {
370  base::Value::TYPE_DICTIONARY, verify_x509_fields, NULL
371};
372const OncValueSignature kVPNSignature = {
373  base::Value::TYPE_DICTIONARY, vpn_fields, NULL
374};
375const OncValueSignature kEthernetSignature = {
376  base::Value::TYPE_DICTIONARY, ethernet_fields, NULL
377};
378const OncValueSignature kIPConfigSignature = {
379  base::Value::TYPE_DICTIONARY, ipconfig_fields, NULL
380};
381const OncValueSignature kProxyLocationSignature = {
382  base::Value::TYPE_DICTIONARY, proxy_location_fields, NULL
383};
384const OncValueSignature kProxyManualSignature = {
385  base::Value::TYPE_DICTIONARY, proxy_manual_fields, NULL
386};
387const OncValueSignature kProxySettingsSignature = {
388  base::Value::TYPE_DICTIONARY, proxy_settings_fields, NULL
389};
390const OncValueSignature kWiFiSignature = {
391  base::Value::TYPE_DICTIONARY, wifi_fields, NULL
392};
393const OncValueSignature kCertificateSignature = {
394  base::Value::TYPE_DICTIONARY, certificate_fields, NULL
395};
396const OncValueSignature kNetworkConfigurationSignature = {
397  base::Value::TYPE_DICTIONARY, network_configuration_fields, NULL
398};
399const OncValueSignature kGlobalNetworkConfigurationSignature = {
400  base::Value::TYPE_DICTIONARY, global_network_configuration_fields, NULL
401};
402const OncValueSignature kCertificateListSignature = {
403  base::Value::TYPE_LIST, NULL, &kCertificateSignature
404};
405const OncValueSignature kNetworkConfigurationListSignature = {
406  base::Value::TYPE_LIST, NULL, &kNetworkConfigurationSignature
407};
408const OncValueSignature kToplevelConfigurationSignature = {
409  base::Value::TYPE_DICTIONARY, toplevel_configuration_fields, NULL
410};
411
412// Derived "ONC with State" signatures.
413const OncValueSignature kNetworkWithStateSignature = {
414  base::Value::TYPE_DICTIONARY, network_with_state_fields, NULL,
415  &kNetworkConfigurationSignature
416};
417const OncValueSignature kWiFiWithStateSignature = {
418  base::Value::TYPE_DICTIONARY, wifi_with_state_fields, NULL, &kWiFiSignature
419};
420const OncValueSignature kCellularSignature = {
421  base::Value::TYPE_DICTIONARY, cellular_fields, NULL
422};
423const OncValueSignature kCellularWithStateSignature = {
424  base::Value::TYPE_DICTIONARY, cellular_with_state_fields, NULL,
425  &kCellularSignature
426};
427const OncValueSignature kCellularProviderSignature = {
428  base::Value::TYPE_DICTIONARY, cellular_provider_fields, NULL
429};
430const OncValueSignature kCellularApnSignature = {
431  base::Value::TYPE_DICTIONARY, cellular_apn_fields, NULL
432};
433const OncValueSignature kCellularFoundNetworkSignature = {
434  base::Value::TYPE_DICTIONARY, cellular_found_network_fields, NULL
435};
436const OncValueSignature kSIMLockStatusSignature = {
437  base::Value::TYPE_DICTIONARY, sim_lock_status_fields, NULL
438};
439
440const OncFieldSignature* GetFieldSignature(const OncValueSignature& signature,
441                                           const std::string& onc_field_name) {
442  if (!signature.fields)
443    return NULL;
444  for (const OncFieldSignature* field_signature = signature.fields;
445       field_signature->onc_field_name != NULL; ++field_signature) {
446    if (onc_field_name == field_signature->onc_field_name)
447      return field_signature;
448  }
449  if (signature.base_signature)
450    return GetFieldSignature(*signature.base_signature, onc_field_name);
451  return NULL;
452}
453
454namespace {
455
456struct CredentialEntry {
457  const OncValueSignature* value_signature;
458  const char* field_name;
459};
460
461const CredentialEntry credentials[] = {
462    {&kEAPSignature, ::onc::eap::kPassword},
463    {&kIPsecSignature, ::onc::ipsec::kPSK},
464    {&kXAUTHSignature, ::onc::vpn::kPassword},
465    {&kL2TPSignature, ::onc::vpn::kPassword},
466    {&kOpenVPNSignature, ::onc::vpn::kPassword},
467    {&kOpenVPNSignature, ::onc::openvpn::kTLSAuthContents},
468    {&kWiFiSignature, ::onc::wifi::kPassphrase},
469    {&kCellularApnSignature, ::onc::cellular_apn::kPassword},
470    {NULL}};
471
472}  // namespace
473
474bool FieldIsCredential(const OncValueSignature& signature,
475                       const std::string& onc_field_name) {
476  for (const CredentialEntry* entry = credentials;
477       entry->value_signature != NULL; ++entry) {
478    if (&signature == entry->value_signature &&
479        onc_field_name == entry->field_name) {
480      return true;
481    }
482  }
483  return false;
484}
485
486}  // namespace onc
487}  // namespace chromeos
488