3 * Copyright (c) 2020 Project CHIP Authors
4 * Copyright (c) 2019-2020 Google LLC.
5 * Copyright (c) 2018 Nest Labs, Inc.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 * Defines the public interface for the Device Layer ConfigurationManager object.
29 #include <platform/PersistedStorage.h>
33 struct ChipBLEDeviceIdentificationInfo;
38 namespace DeviceLayer {
40 class PlatformManagerImpl;
41 class ConfigurationManagerImpl;
44 class GenericPlatformManagerImpl;
46 class GenericPlatformManagerImpl_POSIX;
47 } // namespace Internal
50 * Provides access to runtime and build-time configuration information for a chip device.
52 class ConfigurationManager
55 // ===== Members that define the public interface of the ConfigurationManager
59 kMaxPairingCodeLength = 16,
60 kMaxSerialNumberLength = 32,
61 kMaxFirmwareRevisionLength = 32,
64 CHIP_ERROR GetVendorId(uint16_t & vendorId);
65 CHIP_ERROR GetProductId(uint16_t & productId);
66 CHIP_ERROR GetProductRevision(uint16_t & productRev);
67 CHIP_ERROR GetSerialNumber(char * buf, size_t bufSize, size_t & serialNumLen);
68 CHIP_ERROR GetPrimaryWiFiMACAddress(uint8_t * buf);
69 CHIP_ERROR GetPrimary802154MACAddress(uint8_t * buf);
70 CHIP_ERROR GetManufacturingDate(uint16_t & year, uint8_t & month, uint8_t & dayOfMonth);
71 CHIP_ERROR GetFirmwareRevision(char * buf, size_t bufSize, size_t & outLen);
72 CHIP_ERROR GetFirmwareBuildTime(uint16_t & year, uint8_t & month, uint8_t & dayOfMonth, uint8_t & hour, uint8_t & minute,
74 CHIP_ERROR GetDeviceId(uint64_t & deviceId);
75 CHIP_ERROR GetDeviceCertificate(uint8_t * buf, size_t bufSize, size_t & certLen);
76 CHIP_ERROR GetDeviceIntermediateCACerts(uint8_t * buf, size_t bufSize, size_t & certsLen);
77 CHIP_ERROR GetDevicePrivateKey(uint8_t * buf, size_t bufSize, size_t & keyLen);
78 CHIP_ERROR GetManufacturerDeviceId(uint64_t & deviceId);
79 CHIP_ERROR GetManufacturerDeviceCertificate(uint8_t * buf, size_t bufSize, size_t & certLen);
80 CHIP_ERROR GetManufacturerDeviceIntermediateCACerts(uint8_t * buf, size_t bufSize, size_t & certsLen);
81 CHIP_ERROR GetManufacturerDevicePrivateKey(uint8_t * buf, size_t bufSize, size_t & keyLen);
82 CHIP_ERROR GetSetupPinCode(uint32_t & setupPinCode);
83 CHIP_ERROR GetSetupDiscriminator(uint16_t & setupDiscriminator);
84 CHIP_ERROR GetServiceId(uint64_t & serviceId);
85 CHIP_ERROR GetFabricId(uint64_t & fabricId);
86 CHIP_ERROR GetServiceConfig(uint8_t * buf, size_t bufSize, size_t & serviceConfigLen);
87 CHIP_ERROR GetPairedAccountId(char * buf, size_t bufSize, size_t & accountIdLen);
88 #if CHIP_ENABLE_ROTATING_DEVICE_ID
89 // Lifetime counter is monotonic counter that is incremented only in the case of a factory reset
90 CHIP_ERROR GetLifetimeCounter(uint16_t & lifetimeCounter);
92 CHIP_ERROR StoreSerialNumber(const char * serialNum, size_t serialNumLen);
93 CHIP_ERROR StorePrimaryWiFiMACAddress(const uint8_t * buf);
94 CHIP_ERROR StorePrimary802154MACAddress(const uint8_t * buf);
95 CHIP_ERROR StoreManufacturingDate(const char * mfgDate, size_t mfgDateLen);
96 CHIP_ERROR StoreProductRevision(uint16_t productRev);
97 CHIP_ERROR StoreFabricId(uint64_t fabricId);
98 #if CHIP_DEVICE_CONFIG_ENABLE_JUST_IN_TIME_PROVISIONING
99 CHIP_ERROR StoreDeviceId(uint64_t deviceId);
100 CHIP_ERROR StoreDeviceCertificate(const uint8_t * cert, size_t certLen);
101 CHIP_ERROR StoreDeviceIntermediateCACerts(const uint8_t * certs, size_t certsLen);
102 CHIP_ERROR StoreDevicePrivateKey(const uint8_t * key, size_t keyLen);
104 CHIP_ERROR StoreManufacturerDeviceId(uint64_t deviceId);
105 CHIP_ERROR StoreManufacturerDeviceCertificate(const uint8_t * cert, size_t certLen);
106 CHIP_ERROR StoreManufacturerDeviceIntermediateCACerts(const uint8_t * certs, size_t certsLen);
107 CHIP_ERROR StoreManufacturerDevicePrivateKey(const uint8_t * key, size_t keyLen);
108 CHIP_ERROR StoreSetupPinCode(uint32_t setupPinCode);
109 CHIP_ERROR StoreSetupDiscriminator(uint16_t setupDiscriminator);
110 CHIP_ERROR StoreServiceProvisioningData(uint64_t serviceId, const uint8_t * serviceConfig, size_t serviceConfigLen,
111 const char * accountId, size_t accountIdLen);
112 CHIP_ERROR ClearServiceProvisioningData();
113 CHIP_ERROR StoreServiceConfig(const uint8_t * serviceConfig, size_t serviceConfigLen);
114 CHIP_ERROR StorePairedAccountId(const char * accountId, size_t accountIdLen);
116 CHIP_ERROR GetQRCodeString(char * buf, size_t bufSize);
118 CHIP_ERROR GetWiFiAPSSID(char * buf, size_t bufSize);
120 CHIP_ERROR GetBLEDeviceIdentificationInfo(Ble::ChipBLEDeviceIdentificationInfo & deviceIdInfo);
123 CHIP_ERROR RunUnitTests();
126 bool IsServiceProvisioned();
127 bool IsPairedToAccount();
128 bool IsMemberOfFabric();
129 bool IsFullyProvisioned();
130 #if CHIP_DEVICE_CONFIG_ENABLE_JUST_IN_TIME_PROVISIONING
131 bool OperationalDeviceCredentialsProvisioned();
134 void InitiateFactoryReset();
136 CHIP_ERROR ComputeProvisioningHash(uint8_t * hashBuf, size_t hashBufSize);
138 void LogDeviceConfig();
141 // ===== Members for internal use by the following friends.
143 friend class ::chip::DeviceLayer::PlatformManagerImpl;
145 friend class ::chip::DeviceLayer::Internal::GenericPlatformManagerImpl;
147 friend class ::chip::DeviceLayer::Internal::GenericPlatformManagerImpl_POSIX;
148 // Parentheses used to fix clang parsing issue with these declarations
149 friend CHIP_ERROR(::chip::Platform::PersistedStorage::Read)(::chip::Platform::PersistedStorage::Key key, uint32_t & value);
150 friend CHIP_ERROR(::chip::Platform::PersistedStorage::Write)(::chip::Platform::PersistedStorage::Key key, uint32_t value);
152 using ImplClass = ::chip::DeviceLayer::ConfigurationManagerImpl;
155 CHIP_ERROR ConfigureChipStack();
156 bool CanFactoryReset();
157 CHIP_ERROR GetFailSafeArmed(bool & val);
158 CHIP_ERROR SetFailSafeArmed(bool val);
159 CHIP_ERROR ReadPersistedStorageValue(::chip::Platform::PersistedStorage::Key key, uint32_t & value);
160 CHIP_ERROR WritePersistedStorageValue(::chip::Platform::PersistedStorage::Key key, uint32_t value);
161 #if CHIP_DEVICE_CONFIG_ENABLE_JUST_IN_TIME_PROVISIONING
162 CHIP_ERROR ClearOperationalDeviceCredentials(void);
163 void UseManufacturerCredentialsAsOperational(bool val);
167 // Construction/destruction limited to subclasses.
168 ConfigurationManager() = default;
169 ~ConfigurationManager() = default;
171 // No copy, move or assignment.
172 ConfigurationManager(const ConfigurationManager &) = delete;
173 ConfigurationManager(const ConfigurationManager &&) = delete;
174 ConfigurationManager & operator=(const ConfigurationManager &) = delete;
178 * Returns a reference to the public interface of the ConfigurationManager singleton object.
180 * chip application should use this to access features of the ConfigurationManager object
181 * that are common to all platforms.
183 extern ConfigurationManager & ConfigurationMgr();
186 * Returns the platform-specific implementation of the ConfigurationManager singleton object.
188 * chip applications can use this to gain access to features of the ConfigurationManager
189 * that are specific to the selected platform.
191 extern ConfigurationManagerImpl & ConfigurationMgrImpl();
193 } // namespace DeviceLayer
196 /* Include a header file containing the implementation of the ConfigurationManager
197 * object for the selected platform.
199 #ifdef EXTERNAL_CONFIGURATIONMANAGERIMPL_HEADER
200 #include EXTERNAL_CONFIGURATIONMANAGERIMPL_HEADER
201 #elif defined(CHIP_DEVICE_LAYER_TARGET)
202 #define CONFIGURATIONMANAGERIMPL_HEADER <platform/CHIP_DEVICE_LAYER_TARGET/ConfigurationManagerImpl.h>
203 #include CONFIGURATIONMANAGERIMPL_HEADER
204 #endif // defined(CHIP_DEVICE_LAYER_TARGET)
207 namespace DeviceLayer {
210 * Id of the vendor that produced the device.
212 inline CHIP_ERROR ConfigurationManager::GetVendorId(uint16_t & vendorId)
214 return static_cast<ImplClass *>(this)->_GetVendorId(vendorId);
218 * Device product id assigned by the vendor.
220 inline CHIP_ERROR ConfigurationManager::GetProductId(uint16_t & productId)
222 return static_cast<ImplClass *>(this)->_GetProductId(productId);
226 * Product revision number assigned by the vendor.
228 inline CHIP_ERROR ConfigurationManager::GetProductRevision(uint16_t & productRev)
230 return static_cast<ImplClass *>(this)->_GetProductRevision(productRev);
233 inline CHIP_ERROR ConfigurationManager::GetSerialNumber(char * buf, size_t bufSize, size_t & serialNumLen)
235 return static_cast<ImplClass *>(this)->_GetSerialNumber(buf, bufSize, serialNumLen);
238 inline CHIP_ERROR ConfigurationManager::GetPrimaryWiFiMACAddress(uint8_t * buf)
240 return static_cast<ImplClass *>(this)->_GetPrimaryWiFiMACAddress(buf);
243 inline CHIP_ERROR ConfigurationManager::GetPrimary802154MACAddress(uint8_t * buf)
245 return static_cast<ImplClass *>(this)->_GetPrimary802154MACAddress(buf);
248 inline CHIP_ERROR ConfigurationManager::GetManufacturingDate(uint16_t & year, uint8_t & month, uint8_t & dayOfMonth)
250 return static_cast<ImplClass *>(this)->_GetManufacturingDate(year, month, dayOfMonth);
253 inline CHIP_ERROR ConfigurationManager::GetFirmwareRevision(char * buf, size_t bufSize, size_t & outLen)
255 return static_cast<ImplClass *>(this)->_GetFirmwareRevision(buf, bufSize, outLen);
258 inline CHIP_ERROR ConfigurationManager::GetFirmwareBuildTime(uint16_t & year, uint8_t & month, uint8_t & dayOfMonth, uint8_t & hour,
259 uint8_t & minute, uint8_t & second)
261 return static_cast<ImplClass *>(this)->_GetFirmwareBuildTime(year, month, dayOfMonth, hour, minute, second);
264 inline CHIP_ERROR ConfigurationManager::GetDeviceId(uint64_t & deviceId)
266 return static_cast<ImplClass *>(this)->_GetDeviceId(deviceId);
269 inline CHIP_ERROR ConfigurationManager::GetDeviceCertificate(uint8_t * buf, size_t bufSize, size_t & certLen)
271 return static_cast<ImplClass *>(this)->_GetDeviceCertificate(buf, bufSize, certLen);
274 inline CHIP_ERROR ConfigurationManager::GetDeviceIntermediateCACerts(uint8_t * buf, size_t bufSize, size_t & certsLen)
276 return static_cast<ImplClass *>(this)->_GetDeviceIntermediateCACerts(buf, bufSize, certsLen);
279 inline CHIP_ERROR ConfigurationManager::GetDevicePrivateKey(uint8_t * buf, size_t bufSize, size_t & keyLen)
281 return static_cast<ImplClass *>(this)->_GetDevicePrivateKey(buf, bufSize, keyLen);
284 inline CHIP_ERROR ConfigurationManager::GetManufacturerDeviceId(uint64_t & deviceId)
286 return static_cast<ImplClass *>(this)->_GetManufacturerDeviceId(deviceId);
289 inline CHIP_ERROR ConfigurationManager::GetManufacturerDeviceCertificate(uint8_t * buf, size_t bufSize, size_t & certLen)
291 return static_cast<ImplClass *>(this)->_GetManufacturerDeviceCertificate(buf, bufSize, certLen);
294 inline CHIP_ERROR ConfigurationManager::GetManufacturerDeviceIntermediateCACerts(uint8_t * buf, size_t bufSize, size_t & certsLen)
296 return static_cast<ImplClass *>(this)->_GetManufacturerDeviceIntermediateCACerts(buf, bufSize, certsLen);
299 inline CHIP_ERROR ConfigurationManager::GetManufacturerDevicePrivateKey(uint8_t * buf, size_t bufSize, size_t & keyLen)
301 return static_cast<ImplClass *>(this)->_GetManufacturerDevicePrivateKey(buf, bufSize, keyLen);
304 inline CHIP_ERROR ConfigurationManager::GetSetupPinCode(uint32_t & setupPinCode)
306 return static_cast<ImplClass *>(this)->_GetSetupPinCode(setupPinCode);
309 inline CHIP_ERROR ConfigurationManager::GetSetupDiscriminator(uint16_t & setupDiscriminator)
311 return static_cast<ImplClass *>(this)->_GetSetupDiscriminator(setupDiscriminator);
314 inline CHIP_ERROR ConfigurationManager::GetServiceId(uint64_t & serviceId)
316 return static_cast<ImplClass *>(this)->_GetServiceId(serviceId);
319 inline CHIP_ERROR ConfigurationManager::GetFabricId(uint64_t & fabricId)
321 return static_cast<ImplClass *>(this)->_GetFabricId(fabricId);
324 inline CHIP_ERROR ConfigurationManager::GetServiceConfig(uint8_t * buf, size_t bufSize, size_t & serviceConfigLen)
326 return static_cast<ImplClass *>(this)->_GetServiceConfig(buf, bufSize, serviceConfigLen);
329 inline CHIP_ERROR ConfigurationManager::GetPairedAccountId(char * buf, size_t bufSize, size_t & accountIdLen)
331 return static_cast<ImplClass *>(this)->_GetPairedAccountId(buf, bufSize, accountIdLen);
334 #if CHIP_ENABLE_ROTATING_DEVICE_ID
335 inline CHIP_ERROR ConfigurationManager::GetLifetimeCounter(uint16_t & lifetimeCounter)
337 return static_cast<ImplClass *>(this)->_GetLifetimeCounter(lifetimeCounter);
341 inline CHIP_ERROR ConfigurationManager::StoreSerialNumber(const char * serialNum, size_t serialNumLen)
343 return static_cast<ImplClass *>(this)->_StoreSerialNumber(serialNum, serialNumLen);
346 inline CHIP_ERROR ConfigurationManager::StorePrimaryWiFiMACAddress(const uint8_t * buf)
348 return static_cast<ImplClass *>(this)->_StorePrimaryWiFiMACAddress(buf);
351 inline CHIP_ERROR ConfigurationManager::StorePrimary802154MACAddress(const uint8_t * buf)
353 return static_cast<ImplClass *>(this)->_StorePrimary802154MACAddress(buf);
356 inline CHIP_ERROR ConfigurationManager::StoreManufacturingDate(const char * mfgDate, size_t mfgDateLen)
358 return static_cast<ImplClass *>(this)->_StoreManufacturingDate(mfgDate, mfgDateLen);
361 inline CHIP_ERROR ConfigurationManager::StoreProductRevision(uint16_t productRev)
363 return static_cast<ImplClass *>(this)->_StoreProductRevision(productRev);
366 inline CHIP_ERROR ConfigurationManager::StoreFabricId(uint64_t fabricId)
368 return static_cast<ImplClass *>(this)->_StoreFabricId(fabricId);
371 #if CHIP_DEVICE_CONFIG_ENABLE_JUST_IN_TIME_PROVISIONING
373 inline CHIP_ERROR ConfigurationManager::StoreDeviceId(uint64_t deviceId)
375 return static_cast<ImplClass *>(this)->_StoreDeviceId(deviceId);
378 inline CHIP_ERROR ConfigurationManager::StoreDeviceCertificate(const uint8_t * cert, size_t certLen)
380 return static_cast<ImplClass *>(this)->_StoreDeviceCertificate(cert, certLen);
383 inline CHIP_ERROR ConfigurationManager::StoreDeviceIntermediateCACerts(const uint8_t * certs, size_t certsLen)
385 return static_cast<ImplClass *>(this)->_StoreDeviceIntermediateCACerts(certs, certsLen);
388 inline CHIP_ERROR ConfigurationManager::StoreDevicePrivateKey(const uint8_t * key, size_t keyLen)
390 return static_cast<ImplClass *>(this)->_StoreDevicePrivateKey(key, keyLen);
393 #endif // CHIP_DEVICE_CONFIG_ENABLE_JUST_IN_TIME_PROVISIONING
395 inline CHIP_ERROR ConfigurationManager::StoreManufacturerDeviceId(uint64_t deviceId)
397 return static_cast<ImplClass *>(this)->_StoreManufacturerDeviceId(deviceId);
400 inline CHIP_ERROR ConfigurationManager::StoreManufacturerDeviceCertificate(const uint8_t * cert, size_t certLen)
402 return static_cast<ImplClass *>(this)->_StoreManufacturerDeviceCertificate(cert, certLen);
405 inline CHIP_ERROR ConfigurationManager::StoreManufacturerDeviceIntermediateCACerts(const uint8_t * certs, size_t certsLen)
407 return static_cast<ImplClass *>(this)->_StoreManufacturerDeviceIntermediateCACerts(certs, certsLen);
410 inline CHIP_ERROR ConfigurationManager::StoreManufacturerDevicePrivateKey(const uint8_t * key, size_t keyLen)
412 return static_cast<ImplClass *>(this)->_StoreManufacturerDevicePrivateKey(key, keyLen);
415 inline CHIP_ERROR ConfigurationManager::StoreSetupPinCode(uint32_t setupPinCode)
417 return static_cast<ImplClass *>(this)->_StoreSetupPinCode(setupPinCode);
420 inline CHIP_ERROR ConfigurationManager::StoreSetupDiscriminator(uint16_t setupDiscriminator)
422 return static_cast<ImplClass *>(this)->_StoreSetupDiscriminator(setupDiscriminator);
425 inline CHIP_ERROR ConfigurationManager::StoreServiceProvisioningData(uint64_t serviceId, const uint8_t * serviceConfig,
426 size_t serviceConfigLen, const char * accountId,
429 return static_cast<ImplClass *>(this)->_StoreServiceProvisioningData(serviceId, serviceConfig, serviceConfigLen, accountId,
433 inline CHIP_ERROR ConfigurationManager::ClearServiceProvisioningData()
435 return static_cast<ImplClass *>(this)->_ClearServiceProvisioningData();
438 inline CHIP_ERROR ConfigurationManager::StoreServiceConfig(const uint8_t * serviceConfig, size_t serviceConfigLen)
440 return static_cast<ImplClass *>(this)->_StoreServiceConfig(serviceConfig, serviceConfigLen);
443 inline CHIP_ERROR ConfigurationManager::StorePairedAccountId(const char * accountId, size_t accountIdLen)
445 return static_cast<ImplClass *>(this)->_StorePairedAccountId(accountId, accountIdLen);
448 inline CHIP_ERROR ConfigurationManager::ReadPersistedStorageValue(::chip::Platform::PersistedStorage::Key key, uint32_t & value)
450 return static_cast<ImplClass *>(this)->_ReadPersistedStorageValue(key, value);
453 inline CHIP_ERROR ConfigurationManager::WritePersistedStorageValue(::chip::Platform::PersistedStorage::Key key, uint32_t value)
455 return static_cast<ImplClass *>(this)->_WritePersistedStorageValue(key, value);
458 inline CHIP_ERROR ConfigurationManager::GetQRCodeString(char * buf, size_t bufSize)
460 return static_cast<ImplClass *>(this)->_GetQRCodeString(buf, bufSize);
463 inline CHIP_ERROR ConfigurationManager::GetWiFiAPSSID(char * buf, size_t bufSize)
465 return static_cast<ImplClass *>(this)->_GetWiFiAPSSID(buf, bufSize);
468 inline CHIP_ERROR ConfigurationManager::GetBLEDeviceIdentificationInfo(Ble::ChipBLEDeviceIdentificationInfo & deviceIdInfo)
470 return static_cast<ImplClass *>(this)->_GetBLEDeviceIdentificationInfo(deviceIdInfo);
473 inline bool ConfigurationManager::IsServiceProvisioned()
475 return static_cast<ImplClass *>(this)->_IsServiceProvisioned();
478 inline bool ConfigurationManager::IsPairedToAccount()
480 return static_cast<ImplClass *>(this)->_IsPairedToAccount();
483 inline bool ConfigurationManager::IsMemberOfFabric()
485 return static_cast<ImplClass *>(this)->_IsMemberOfFabric();
488 inline bool ConfigurationManager::IsFullyProvisioned()
490 return static_cast<ImplClass *>(this)->_IsFullyProvisioned();
493 inline void ConfigurationManager::InitiateFactoryReset()
495 #if CHIP_ENABLE_ROTATING_DEVICE_ID
496 static_cast<ImplClass *>(this)->_IncrementLifetimeCounter();
498 static_cast<ImplClass *>(this)->_InitiateFactoryReset();
502 inline CHIP_ERROR ConfigurationManager::RunUnitTests()
504 return static_cast<ImplClass *>(this)->_RunUnitTests();
508 inline CHIP_ERROR ConfigurationManager::ComputeProvisioningHash(uint8_t * hashBuf, size_t hashBufSize)
510 return static_cast<ImplClass *>(this)->_ComputeProvisioningHash(hashBuf, hashBufSize);
513 inline CHIP_ERROR ConfigurationManager::Init()
515 return static_cast<ImplClass *>(this)->_Init();
518 inline CHIP_ERROR ConfigurationManager::ConfigureChipStack()
520 return static_cast<ImplClass *>(this)->_ConfigureChipStack();
523 inline bool ConfigurationManager::CanFactoryReset()
525 return static_cast<ImplClass *>(this)->_CanFactoryReset();
528 inline CHIP_ERROR ConfigurationManager::GetFailSafeArmed(bool & val)
530 return static_cast<ImplClass *>(this)->_GetFailSafeArmed(val);
533 inline CHIP_ERROR ConfigurationManager::SetFailSafeArmed(bool val)
535 return static_cast<ImplClass *>(this)->_SetFailSafeArmed(val);
538 #if CHIP_DEVICE_CONFIG_ENABLE_JUST_IN_TIME_PROVISIONING
540 inline bool ConfigurationManager::OperationalDeviceCredentialsProvisioned()
542 return static_cast<ImplClass *>(this)->_OperationalDeviceCredentialsProvisioned();
545 inline CHIP_ERROR ConfigurationManager::ClearOperationalDeviceCredentials(void)
547 return static_cast<ImplClass *>(this)->_ClearOperationalDeviceCredentials();
550 inline void ConfigurationManager::UseManufacturerCredentialsAsOperational(bool val)
552 static_cast<ImplClass *>(this)->_UseManufacturerCredentialsAsOperational(val);
555 #endif // CHIP_DEVICE_CONFIG_ENABLE_JUST_IN_TIME_PROVISIONING
557 inline void ConfigurationManager::LogDeviceConfig()
559 static_cast<ImplClass *>(this)->_LogDeviceConfig();
562 } // namespace DeviceLayer