xref: /aosp_15_r20/external/openthread/src/posix/platform/settings.cpp (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker  *  Copyright (c) 2016, The OpenThread Authors.
3*cfb92d14SAndroid Build Coastguard Worker  *  All rights reserved.
4*cfb92d14SAndroid Build Coastguard Worker  *
5*cfb92d14SAndroid Build Coastguard Worker  *  Redistribution and use in source and binary forms, with or without
6*cfb92d14SAndroid Build Coastguard Worker  *  modification, are permitted provided that the following conditions are met:
7*cfb92d14SAndroid Build Coastguard Worker  *  1. Redistributions of source code must retain the above copyright
8*cfb92d14SAndroid Build Coastguard Worker  *     notice, this list of conditions and the following disclaimer.
9*cfb92d14SAndroid Build Coastguard Worker  *  2. Redistributions in binary form must reproduce the above copyright
10*cfb92d14SAndroid Build Coastguard Worker  *     notice, this list of conditions and the following disclaimer in the
11*cfb92d14SAndroid Build Coastguard Worker  *     documentation and/or other materials provided with the distribution.
12*cfb92d14SAndroid Build Coastguard Worker  *  3. Neither the name of the copyright holder nor the
13*cfb92d14SAndroid Build Coastguard Worker  *     names of its contributors may be used to endorse or promote products
14*cfb92d14SAndroid Build Coastguard Worker  *     derived from this software without specific prior written permission.
15*cfb92d14SAndroid Build Coastguard Worker  *
16*cfb92d14SAndroid Build Coastguard Worker  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*cfb92d14SAndroid Build Coastguard Worker  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*cfb92d14SAndroid Build Coastguard Worker  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*cfb92d14SAndroid Build Coastguard Worker  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20*cfb92d14SAndroid Build Coastguard Worker  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*cfb92d14SAndroid Build Coastguard Worker  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*cfb92d14SAndroid Build Coastguard Worker  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*cfb92d14SAndroid Build Coastguard Worker  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*cfb92d14SAndroid Build Coastguard Worker  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*cfb92d14SAndroid Build Coastguard Worker  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*cfb92d14SAndroid Build Coastguard Worker  *  POSSIBILITY OF SUCH DAMAGE.
27*cfb92d14SAndroid Build Coastguard Worker  */
28*cfb92d14SAndroid Build Coastguard Worker 
29*cfb92d14SAndroid Build Coastguard Worker /**
30*cfb92d14SAndroid Build Coastguard Worker  * @file
31*cfb92d14SAndroid Build Coastguard Worker  *   This file implements the OpenThread platform abstraction for non-volatile storage of settings.
32*cfb92d14SAndroid Build Coastguard Worker  *
33*cfb92d14SAndroid Build Coastguard Worker  */
34*cfb92d14SAndroid Build Coastguard Worker 
35*cfb92d14SAndroid Build Coastguard Worker #include "openthread-posix-config.h"
36*cfb92d14SAndroid Build Coastguard Worker #include "platform-posix.h"
37*cfb92d14SAndroid Build Coastguard Worker 
38*cfb92d14SAndroid Build Coastguard Worker #include <assert.h>
39*cfb92d14SAndroid Build Coastguard Worker #include <fcntl.h>
40*cfb92d14SAndroid Build Coastguard Worker #include <inttypes.h>
41*cfb92d14SAndroid Build Coastguard Worker #include <stddef.h>
42*cfb92d14SAndroid Build Coastguard Worker #include <stdio.h>
43*cfb92d14SAndroid Build Coastguard Worker #include <string.h>
44*cfb92d14SAndroid Build Coastguard Worker #include <sys/stat.h>
45*cfb92d14SAndroid Build Coastguard Worker #include <unistd.h>
46*cfb92d14SAndroid Build Coastguard Worker 
47*cfb92d14SAndroid Build Coastguard Worker #include <openthread/logging.h>
48*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/misc.h>
49*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/radio.h>
50*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/settings.h>
51*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_SECURE_SETTINGS_ENABLE
52*cfb92d14SAndroid Build Coastguard Worker #include <openthread/platform/secure_settings.h>
53*cfb92d14SAndroid Build Coastguard Worker #endif
54*cfb92d14SAndroid Build Coastguard Worker 
55*cfb92d14SAndroid Build Coastguard Worker #include "common/code_utils.hpp"
56*cfb92d14SAndroid Build Coastguard Worker #include "common/encoding.hpp"
57*cfb92d14SAndroid Build Coastguard Worker #include "posix/platform/settings.hpp"
58*cfb92d14SAndroid Build Coastguard Worker 
59*cfb92d14SAndroid Build Coastguard Worker #include "system.hpp"
60*cfb92d14SAndroid Build Coastguard Worker 
61*cfb92d14SAndroid Build Coastguard Worker static const size_t kMaxFileNameSize = sizeof(OPENTHREAD_CONFIG_POSIX_SETTINGS_PATH) + 32;
62*cfb92d14SAndroid Build Coastguard Worker 
63*cfb92d14SAndroid Build Coastguard Worker static int sSettingsFd = -1;
64*cfb92d14SAndroid Build Coastguard Worker 
65*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_SECURE_SETTINGS_ENABLE
66*cfb92d14SAndroid Build Coastguard Worker static const uint16_t *sSensitiveKeys       = nullptr;
67*cfb92d14SAndroid Build Coastguard Worker static uint16_t        sSensitiveKeysLength = 0;
68*cfb92d14SAndroid Build Coastguard Worker 
isSensitiveKey(uint16_t aKey)69*cfb92d14SAndroid Build Coastguard Worker static bool isSensitiveKey(uint16_t aKey)
70*cfb92d14SAndroid Build Coastguard Worker {
71*cfb92d14SAndroid Build Coastguard Worker     bool ret = false;
72*cfb92d14SAndroid Build Coastguard Worker 
73*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(sSensitiveKeys != nullptr);
74*cfb92d14SAndroid Build Coastguard Worker 
75*cfb92d14SAndroid Build Coastguard Worker     for (uint16_t i = 0; i < sSensitiveKeysLength; i++)
76*cfb92d14SAndroid Build Coastguard Worker     {
77*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(aKey != sSensitiveKeys[i], ret = true);
78*cfb92d14SAndroid Build Coastguard Worker     }
79*cfb92d14SAndroid Build Coastguard Worker 
80*cfb92d14SAndroid Build Coastguard Worker exit:
81*cfb92d14SAndroid Build Coastguard Worker     return ret;
82*cfb92d14SAndroid Build Coastguard Worker }
83*cfb92d14SAndroid Build Coastguard Worker #endif
84*cfb92d14SAndroid Build Coastguard Worker 
getSettingsFileName(otInstance * aInstance,char aFileName[kMaxFileNameSize],bool aSwap)85*cfb92d14SAndroid Build Coastguard Worker static void getSettingsFileName(otInstance *aInstance, char aFileName[kMaxFileNameSize], bool aSwap)
86*cfb92d14SAndroid Build Coastguard Worker {
87*cfb92d14SAndroid Build Coastguard Worker     const char *offset = getenv("PORT_OFFSET");
88*cfb92d14SAndroid Build Coastguard Worker     uint64_t    nodeId;
89*cfb92d14SAndroid Build Coastguard Worker 
90*cfb92d14SAndroid Build Coastguard Worker     otPlatRadioGetIeeeEui64(aInstance, reinterpret_cast<uint8_t *>(&nodeId));
91*cfb92d14SAndroid Build Coastguard Worker     nodeId = ot::BigEndian::HostSwap64(nodeId);
92*cfb92d14SAndroid Build Coastguard Worker     snprintf(aFileName, kMaxFileNameSize, OPENTHREAD_CONFIG_POSIX_SETTINGS_PATH "/%s_%" PRIx64 ".%s",
93*cfb92d14SAndroid Build Coastguard Worker              offset == nullptr ? "0" : offset, nodeId, (aSwap ? "swap" : "data"));
94*cfb92d14SAndroid Build Coastguard Worker }
95*cfb92d14SAndroid Build Coastguard Worker 
swapOpen(otInstance * aInstance)96*cfb92d14SAndroid Build Coastguard Worker static int swapOpen(otInstance *aInstance)
97*cfb92d14SAndroid Build Coastguard Worker {
98*cfb92d14SAndroid Build Coastguard Worker     char fileName[kMaxFileNameSize];
99*cfb92d14SAndroid Build Coastguard Worker     int  fd;
100*cfb92d14SAndroid Build Coastguard Worker 
101*cfb92d14SAndroid Build Coastguard Worker     getSettingsFileName(aInstance, fileName, true);
102*cfb92d14SAndroid Build Coastguard Worker 
103*cfb92d14SAndroid Build Coastguard Worker     fd = open(fileName, O_RDWR | O_CREAT | O_TRUNC | O_CLOEXEC, 0600);
104*cfb92d14SAndroid Build Coastguard Worker     VerifyOrDie(fd != -1, OT_EXIT_ERROR_ERRNO);
105*cfb92d14SAndroid Build Coastguard Worker 
106*cfb92d14SAndroid Build Coastguard Worker     return fd;
107*cfb92d14SAndroid Build Coastguard Worker }
108*cfb92d14SAndroid Build Coastguard Worker 
109*cfb92d14SAndroid Build Coastguard Worker /**
110*cfb92d14SAndroid Build Coastguard Worker  * Reads @p aLength bytes from the data file and appends to the swap file.
111*cfb92d14SAndroid Build Coastguard Worker  *
112*cfb92d14SAndroid Build Coastguard Worker  * @param[in]   aFd     The file descriptor of the current swap file.
113*cfb92d14SAndroid Build Coastguard Worker  * @param[in]   aLength Number of bytes to copy.
114*cfb92d14SAndroid Build Coastguard Worker  *
115*cfb92d14SAndroid Build Coastguard Worker  */
swapWrite(otInstance * aInstance,int aFd,uint16_t aLength)116*cfb92d14SAndroid Build Coastguard Worker static void swapWrite(otInstance *aInstance, int aFd, uint16_t aLength)
117*cfb92d14SAndroid Build Coastguard Worker {
118*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
119*cfb92d14SAndroid Build Coastguard Worker 
120*cfb92d14SAndroid Build Coastguard Worker     const size_t kBlockSize = 512;
121*cfb92d14SAndroid Build Coastguard Worker     uint8_t      buffer[kBlockSize];
122*cfb92d14SAndroid Build Coastguard Worker 
123*cfb92d14SAndroid Build Coastguard Worker     while (aLength > 0)
124*cfb92d14SAndroid Build Coastguard Worker     {
125*cfb92d14SAndroid Build Coastguard Worker         uint16_t count = aLength >= sizeof(buffer) ? sizeof(buffer) : aLength;
126*cfb92d14SAndroid Build Coastguard Worker         ssize_t  rval  = read(sSettingsFd, buffer, count);
127*cfb92d14SAndroid Build Coastguard Worker 
128*cfb92d14SAndroid Build Coastguard Worker         VerifyOrDie(rval > 0, OT_EXIT_FAILURE);
129*cfb92d14SAndroid Build Coastguard Worker         count = static_cast<uint16_t>(rval);
130*cfb92d14SAndroid Build Coastguard Worker         rval  = write(aFd, buffer, count);
131*cfb92d14SAndroid Build Coastguard Worker         assert(rval == count);
132*cfb92d14SAndroid Build Coastguard Worker         VerifyOrDie(rval == count, OT_EXIT_FAILURE);
133*cfb92d14SAndroid Build Coastguard Worker         aLength -= count;
134*cfb92d14SAndroid Build Coastguard Worker     }
135*cfb92d14SAndroid Build Coastguard Worker }
136*cfb92d14SAndroid Build Coastguard Worker 
swapPersist(otInstance * aInstance,int aFd)137*cfb92d14SAndroid Build Coastguard Worker static void swapPersist(otInstance *aInstance, int aFd)
138*cfb92d14SAndroid Build Coastguard Worker {
139*cfb92d14SAndroid Build Coastguard Worker     char swapFile[kMaxFileNameSize];
140*cfb92d14SAndroid Build Coastguard Worker     char dataFile[kMaxFileNameSize];
141*cfb92d14SAndroid Build Coastguard Worker 
142*cfb92d14SAndroid Build Coastguard Worker     getSettingsFileName(aInstance, swapFile, true);
143*cfb92d14SAndroid Build Coastguard Worker     getSettingsFileName(aInstance, dataFile, false);
144*cfb92d14SAndroid Build Coastguard Worker 
145*cfb92d14SAndroid Build Coastguard Worker     VerifyOrDie(0 == close(sSettingsFd), OT_EXIT_ERROR_ERRNO);
146*cfb92d14SAndroid Build Coastguard Worker     VerifyOrDie(0 == fsync(aFd), OT_EXIT_ERROR_ERRNO);
147*cfb92d14SAndroid Build Coastguard Worker     VerifyOrDie(0 == rename(swapFile, dataFile), OT_EXIT_ERROR_ERRNO);
148*cfb92d14SAndroid Build Coastguard Worker 
149*cfb92d14SAndroid Build Coastguard Worker     sSettingsFd = aFd;
150*cfb92d14SAndroid Build Coastguard Worker }
151*cfb92d14SAndroid Build Coastguard Worker 
swapDiscard(otInstance * aInstance,int aFd)152*cfb92d14SAndroid Build Coastguard Worker static void swapDiscard(otInstance *aInstance, int aFd)
153*cfb92d14SAndroid Build Coastguard Worker {
154*cfb92d14SAndroid Build Coastguard Worker     char swapFileName[kMaxFileNameSize];
155*cfb92d14SAndroid Build Coastguard Worker 
156*cfb92d14SAndroid Build Coastguard Worker     VerifyOrDie(0 == close(aFd), OT_EXIT_ERROR_ERRNO);
157*cfb92d14SAndroid Build Coastguard Worker     getSettingsFileName(aInstance, swapFileName, true);
158*cfb92d14SAndroid Build Coastguard Worker     VerifyOrDie(0 == unlink(swapFileName), OT_EXIT_ERROR_ERRNO);
159*cfb92d14SAndroid Build Coastguard Worker }
160*cfb92d14SAndroid Build Coastguard Worker 
otPlatSettingsInit(otInstance * aInstance,const uint16_t * aSensitiveKeys,uint16_t aSensitiveKeysLength)161*cfb92d14SAndroid Build Coastguard Worker void otPlatSettingsInit(otInstance *aInstance, const uint16_t *aSensitiveKeys, uint16_t aSensitiveKeysLength)
162*cfb92d14SAndroid Build Coastguard Worker {
163*cfb92d14SAndroid Build Coastguard Worker #if !OPENTHREAD_POSIX_CONFIG_SECURE_SETTINGS_ENABLE
164*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aSensitiveKeys);
165*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aSensitiveKeysLength);
166*cfb92d14SAndroid Build Coastguard Worker #endif
167*cfb92d14SAndroid Build Coastguard Worker 
168*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
169*cfb92d14SAndroid Build Coastguard Worker 
170*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_SECURE_SETTINGS_ENABLE
171*cfb92d14SAndroid Build Coastguard Worker     sSensitiveKeys       = aSensitiveKeys;
172*cfb92d14SAndroid Build Coastguard Worker     sSensitiveKeysLength = aSensitiveKeysLength;
173*cfb92d14SAndroid Build Coastguard Worker #endif
174*cfb92d14SAndroid Build Coastguard Worker 
175*cfb92d14SAndroid Build Coastguard Worker     // Don't touch the settings file the system runs in dry-run mode.
176*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(!IsSystemDryRun());
177*cfb92d14SAndroid Build Coastguard Worker 
178*cfb92d14SAndroid Build Coastguard Worker     {
179*cfb92d14SAndroid Build Coastguard Worker         struct stat st;
180*cfb92d14SAndroid Build Coastguard Worker 
181*cfb92d14SAndroid Build Coastguard Worker         if (stat(OPENTHREAD_CONFIG_POSIX_SETTINGS_PATH, &st) == -1)
182*cfb92d14SAndroid Build Coastguard Worker         {
183*cfb92d14SAndroid Build Coastguard Worker             VerifyOrDie(mkdir(OPENTHREAD_CONFIG_POSIX_SETTINGS_PATH, 0755) == 0, OT_EXIT_ERROR_ERRNO);
184*cfb92d14SAndroid Build Coastguard Worker         }
185*cfb92d14SAndroid Build Coastguard Worker     }
186*cfb92d14SAndroid Build Coastguard Worker 
187*cfb92d14SAndroid Build Coastguard Worker     {
188*cfb92d14SAndroid Build Coastguard Worker         char fileName[kMaxFileNameSize];
189*cfb92d14SAndroid Build Coastguard Worker 
190*cfb92d14SAndroid Build Coastguard Worker         getSettingsFileName(aInstance, fileName, false);
191*cfb92d14SAndroid Build Coastguard Worker         sSettingsFd = open(fileName, O_RDWR | O_CREAT | O_CLOEXEC, 0600);
192*cfb92d14SAndroid Build Coastguard Worker     }
193*cfb92d14SAndroid Build Coastguard Worker 
194*cfb92d14SAndroid Build Coastguard Worker     VerifyOrDie(sSettingsFd != -1, OT_EXIT_ERROR_ERRNO);
195*cfb92d14SAndroid Build Coastguard Worker 
196*cfb92d14SAndroid Build Coastguard Worker     for (off_t size = lseek(sSettingsFd, 0, SEEK_END), offset = lseek(sSettingsFd, 0, SEEK_SET); offset < size;)
197*cfb92d14SAndroid Build Coastguard Worker     {
198*cfb92d14SAndroid Build Coastguard Worker         uint16_t key;
199*cfb92d14SAndroid Build Coastguard Worker         uint16_t length;
200*cfb92d14SAndroid Build Coastguard Worker         ssize_t  rval;
201*cfb92d14SAndroid Build Coastguard Worker 
202*cfb92d14SAndroid Build Coastguard Worker         rval = read(sSettingsFd, &key, sizeof(key));
203*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(rval == sizeof(key), error = OT_ERROR_PARSE);
204*cfb92d14SAndroid Build Coastguard Worker 
205*cfb92d14SAndroid Build Coastguard Worker         rval = read(sSettingsFd, &length, sizeof(length));
206*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(rval == sizeof(length), error = OT_ERROR_PARSE);
207*cfb92d14SAndroid Build Coastguard Worker 
208*cfb92d14SAndroid Build Coastguard Worker         offset += sizeof(key) + sizeof(length) + length;
209*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(offset == lseek(sSettingsFd, length, SEEK_CUR), error = OT_ERROR_PARSE);
210*cfb92d14SAndroid Build Coastguard Worker     }
211*cfb92d14SAndroid Build Coastguard Worker 
212*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_SECURE_SETTINGS_ENABLE
213*cfb92d14SAndroid Build Coastguard Worker     otPosixSecureSettingsInit(aInstance);
214*cfb92d14SAndroid Build Coastguard Worker #endif
215*cfb92d14SAndroid Build Coastguard Worker 
216*cfb92d14SAndroid Build Coastguard Worker exit:
217*cfb92d14SAndroid Build Coastguard Worker     if (error == OT_ERROR_PARSE)
218*cfb92d14SAndroid Build Coastguard Worker     {
219*cfb92d14SAndroid Build Coastguard Worker         VerifyOrDie(ftruncate(sSettingsFd, 0) == 0, OT_EXIT_ERROR_ERRNO);
220*cfb92d14SAndroid Build Coastguard Worker     }
221*cfb92d14SAndroid Build Coastguard Worker }
222*cfb92d14SAndroid Build Coastguard Worker 
otPlatSettingsDeinit(otInstance * aInstance)223*cfb92d14SAndroid Build Coastguard Worker void otPlatSettingsDeinit(otInstance *aInstance)
224*cfb92d14SAndroid Build Coastguard Worker {
225*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
226*cfb92d14SAndroid Build Coastguard Worker 
227*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(!IsSystemDryRun());
228*cfb92d14SAndroid Build Coastguard Worker 
229*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_SECURE_SETTINGS_ENABLE
230*cfb92d14SAndroid Build Coastguard Worker     otPosixSecureSettingsDeinit(aInstance);
231*cfb92d14SAndroid Build Coastguard Worker #endif
232*cfb92d14SAndroid Build Coastguard Worker 
233*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(sSettingsFd != -1);
234*cfb92d14SAndroid Build Coastguard Worker     VerifyOrDie(close(sSettingsFd) == 0, OT_EXIT_ERROR_ERRNO);
235*cfb92d14SAndroid Build Coastguard Worker     sSettingsFd = -1;
236*cfb92d14SAndroid Build Coastguard Worker 
237*cfb92d14SAndroid Build Coastguard Worker exit:
238*cfb92d14SAndroid Build Coastguard Worker     return;
239*cfb92d14SAndroid Build Coastguard Worker }
240*cfb92d14SAndroid Build Coastguard Worker 
otPlatSettingsGet(otInstance * aInstance,uint16_t aKey,int aIndex,uint8_t * aValue,uint16_t * aValueLength)241*cfb92d14SAndroid Build Coastguard Worker otError otPlatSettingsGet(otInstance *aInstance, uint16_t aKey, int aIndex, uint8_t *aValue, uint16_t *aValueLength)
242*cfb92d14SAndroid Build Coastguard Worker {
243*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
244*cfb92d14SAndroid Build Coastguard Worker 
245*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NOT_FOUND;
246*cfb92d14SAndroid Build Coastguard Worker 
247*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(!IsSystemDryRun());
248*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_SECURE_SETTINGS_ENABLE
249*cfb92d14SAndroid Build Coastguard Worker     if (isSensitiveKey(aKey))
250*cfb92d14SAndroid Build Coastguard Worker     {
251*cfb92d14SAndroid Build Coastguard Worker         error = otPosixSecureSettingsGet(aInstance, aKey, aIndex, aValue, aValueLength);
252*cfb92d14SAndroid Build Coastguard Worker     }
253*cfb92d14SAndroid Build Coastguard Worker     else
254*cfb92d14SAndroid Build Coastguard Worker #endif
255*cfb92d14SAndroid Build Coastguard Worker     {
256*cfb92d14SAndroid Build Coastguard Worker         error = ot::Posix::PlatformSettingsGet(aInstance, aKey, aIndex, aValue, aValueLength);
257*cfb92d14SAndroid Build Coastguard Worker     }
258*cfb92d14SAndroid Build Coastguard Worker 
259*cfb92d14SAndroid Build Coastguard Worker exit:
260*cfb92d14SAndroid Build Coastguard Worker     VerifyOrDie(error != OT_ERROR_PARSE, OT_EXIT_FAILURE);
261*cfb92d14SAndroid Build Coastguard Worker     return error;
262*cfb92d14SAndroid Build Coastguard Worker }
263*cfb92d14SAndroid Build Coastguard Worker 
otPlatSettingsSet(otInstance * aInstance,uint16_t aKey,const uint8_t * aValue,uint16_t aValueLength)264*cfb92d14SAndroid Build Coastguard Worker otError otPlatSettingsSet(otInstance *aInstance, uint16_t aKey, const uint8_t *aValue, uint16_t aValueLength)
265*cfb92d14SAndroid Build Coastguard Worker {
266*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
267*cfb92d14SAndroid Build Coastguard Worker 
268*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_SECURE_SETTINGS_ENABLE
269*cfb92d14SAndroid Build Coastguard Worker     if (isSensitiveKey(aKey))
270*cfb92d14SAndroid Build Coastguard Worker     {
271*cfb92d14SAndroid Build Coastguard Worker         error = otPosixSecureSettingsSet(aInstance, aKey, aValue, aValueLength);
272*cfb92d14SAndroid Build Coastguard Worker     }
273*cfb92d14SAndroid Build Coastguard Worker     else
274*cfb92d14SAndroid Build Coastguard Worker #endif
275*cfb92d14SAndroid Build Coastguard Worker     {
276*cfb92d14SAndroid Build Coastguard Worker         ot::Posix::PlatformSettingsSet(aInstance, aKey, aValue, aValueLength);
277*cfb92d14SAndroid Build Coastguard Worker     }
278*cfb92d14SAndroid Build Coastguard Worker 
279*cfb92d14SAndroid Build Coastguard Worker     return error;
280*cfb92d14SAndroid Build Coastguard Worker }
281*cfb92d14SAndroid Build Coastguard Worker 
otPlatSettingsAdd(otInstance * aInstance,uint16_t aKey,const uint8_t * aValue,uint16_t aValueLength)282*cfb92d14SAndroid Build Coastguard Worker otError otPlatSettingsAdd(otInstance *aInstance, uint16_t aKey, const uint8_t *aValue, uint16_t aValueLength)
283*cfb92d14SAndroid Build Coastguard Worker {
284*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
285*cfb92d14SAndroid Build Coastguard Worker 
286*cfb92d14SAndroid Build Coastguard Worker     otError error = OT_ERROR_NONE;
287*cfb92d14SAndroid Build Coastguard Worker 
288*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_SECURE_SETTINGS_ENABLE
289*cfb92d14SAndroid Build Coastguard Worker     if (isSensitiveKey(aKey))
290*cfb92d14SAndroid Build Coastguard Worker     {
291*cfb92d14SAndroid Build Coastguard Worker         error = otPosixSecureSettingsAdd(aInstance, aKey, aValue, aValueLength);
292*cfb92d14SAndroid Build Coastguard Worker     }
293*cfb92d14SAndroid Build Coastguard Worker     else
294*cfb92d14SAndroid Build Coastguard Worker #endif
295*cfb92d14SAndroid Build Coastguard Worker     {
296*cfb92d14SAndroid Build Coastguard Worker         ot::Posix::PlatformSettingsAdd(aInstance, aKey, aValue, aValueLength);
297*cfb92d14SAndroid Build Coastguard Worker     }
298*cfb92d14SAndroid Build Coastguard Worker 
299*cfb92d14SAndroid Build Coastguard Worker     return error;
300*cfb92d14SAndroid Build Coastguard Worker }
301*cfb92d14SAndroid Build Coastguard Worker 
otPlatSettingsDelete(otInstance * aInstance,uint16_t aKey,int aIndex)302*cfb92d14SAndroid Build Coastguard Worker otError otPlatSettingsDelete(otInstance *aInstance, uint16_t aKey, int aIndex)
303*cfb92d14SAndroid Build Coastguard Worker {
304*cfb92d14SAndroid Build Coastguard Worker     otError error;
305*cfb92d14SAndroid Build Coastguard Worker 
306*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_SECURE_SETTINGS_ENABLE
307*cfb92d14SAndroid Build Coastguard Worker     if (isSensitiveKey(aKey))
308*cfb92d14SAndroid Build Coastguard Worker     {
309*cfb92d14SAndroid Build Coastguard Worker         error = otPosixSecureSettingsDelete(aInstance, aKey, aIndex);
310*cfb92d14SAndroid Build Coastguard Worker     }
311*cfb92d14SAndroid Build Coastguard Worker     else
312*cfb92d14SAndroid Build Coastguard Worker #endif
313*cfb92d14SAndroid Build Coastguard Worker     {
314*cfb92d14SAndroid Build Coastguard Worker         error = ot::Posix::PlatformSettingsDelete(aInstance, aKey, aIndex, nullptr);
315*cfb92d14SAndroid Build Coastguard Worker     }
316*cfb92d14SAndroid Build Coastguard Worker 
317*cfb92d14SAndroid Build Coastguard Worker     return error;
318*cfb92d14SAndroid Build Coastguard Worker }
319*cfb92d14SAndroid Build Coastguard Worker 
otPlatSettingsWipe(otInstance * aInstance)320*cfb92d14SAndroid Build Coastguard Worker void otPlatSettingsWipe(otInstance *aInstance)
321*cfb92d14SAndroid Build Coastguard Worker {
322*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
323*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_SECURE_SETTINGS_ENABLE
324*cfb92d14SAndroid Build Coastguard Worker     otPosixSecureSettingsWipe(aInstance);
325*cfb92d14SAndroid Build Coastguard Worker #endif
326*cfb92d14SAndroid Build Coastguard Worker 
327*cfb92d14SAndroid Build Coastguard Worker     VerifyOrDie(0 == ftruncate(sSettingsFd, 0), OT_EXIT_ERROR_ERRNO);
328*cfb92d14SAndroid Build Coastguard Worker }
329*cfb92d14SAndroid Build Coastguard Worker 
330*cfb92d14SAndroid Build Coastguard Worker namespace ot {
331*cfb92d14SAndroid Build Coastguard Worker namespace Posix {
332*cfb92d14SAndroid Build Coastguard Worker 
PlatformSettingsGet(otInstance * aInstance,uint16_t aKey,int aIndex,uint8_t * aValue,uint16_t * aValueLength)333*cfb92d14SAndroid Build Coastguard Worker otError PlatformSettingsGet(otInstance *aInstance, uint16_t aKey, int aIndex, uint8_t *aValue, uint16_t *aValueLength)
334*cfb92d14SAndroid Build Coastguard Worker {
335*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
336*cfb92d14SAndroid Build Coastguard Worker 
337*cfb92d14SAndroid Build Coastguard Worker     otError     error  = OT_ERROR_NOT_FOUND;
338*cfb92d14SAndroid Build Coastguard Worker     const off_t size   = lseek(sSettingsFd, 0, SEEK_END);
339*cfb92d14SAndroid Build Coastguard Worker     off_t       offset = lseek(sSettingsFd, 0, SEEK_SET);
340*cfb92d14SAndroid Build Coastguard Worker 
341*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(offset == 0 && size >= 0, error = OT_ERROR_PARSE);
342*cfb92d14SAndroid Build Coastguard Worker 
343*cfb92d14SAndroid Build Coastguard Worker     while (offset < size)
344*cfb92d14SAndroid Build Coastguard Worker     {
345*cfb92d14SAndroid Build Coastguard Worker         uint16_t key;
346*cfb92d14SAndroid Build Coastguard Worker         uint16_t length;
347*cfb92d14SAndroid Build Coastguard Worker         ssize_t  rval;
348*cfb92d14SAndroid Build Coastguard Worker 
349*cfb92d14SAndroid Build Coastguard Worker         rval = read(sSettingsFd, &key, sizeof(key));
350*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(rval == sizeof(key), error = OT_ERROR_PARSE);
351*cfb92d14SAndroid Build Coastguard Worker 
352*cfb92d14SAndroid Build Coastguard Worker         rval = read(sSettingsFd, &length, sizeof(length));
353*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(rval == sizeof(length), error = OT_ERROR_PARSE);
354*cfb92d14SAndroid Build Coastguard Worker 
355*cfb92d14SAndroid Build Coastguard Worker         if (key == aKey)
356*cfb92d14SAndroid Build Coastguard Worker         {
357*cfb92d14SAndroid Build Coastguard Worker             if (aIndex == 0)
358*cfb92d14SAndroid Build Coastguard Worker             {
359*cfb92d14SAndroid Build Coastguard Worker                 error = OT_ERROR_NONE;
360*cfb92d14SAndroid Build Coastguard Worker 
361*cfb92d14SAndroid Build Coastguard Worker                 if (aValueLength)
362*cfb92d14SAndroid Build Coastguard Worker                 {
363*cfb92d14SAndroid Build Coastguard Worker                     if (aValue)
364*cfb92d14SAndroid Build Coastguard Worker                     {
365*cfb92d14SAndroid Build Coastguard Worker                         uint16_t readLength = (length <= *aValueLength ? length : *aValueLength);
366*cfb92d14SAndroid Build Coastguard Worker 
367*cfb92d14SAndroid Build Coastguard Worker                         VerifyOrExit(read(sSettingsFd, aValue, readLength) == readLength, error = OT_ERROR_PARSE);
368*cfb92d14SAndroid Build Coastguard Worker                     }
369*cfb92d14SAndroid Build Coastguard Worker 
370*cfb92d14SAndroid Build Coastguard Worker                     *aValueLength = length;
371*cfb92d14SAndroid Build Coastguard Worker                 }
372*cfb92d14SAndroid Build Coastguard Worker 
373*cfb92d14SAndroid Build Coastguard Worker                 break;
374*cfb92d14SAndroid Build Coastguard Worker             }
375*cfb92d14SAndroid Build Coastguard Worker             else
376*cfb92d14SAndroid Build Coastguard Worker             {
377*cfb92d14SAndroid Build Coastguard Worker                 --aIndex;
378*cfb92d14SAndroid Build Coastguard Worker             }
379*cfb92d14SAndroid Build Coastguard Worker         }
380*cfb92d14SAndroid Build Coastguard Worker 
381*cfb92d14SAndroid Build Coastguard Worker         offset += sizeof(key) + sizeof(length) + length;
382*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(offset == lseek(sSettingsFd, length, SEEK_CUR), error = OT_ERROR_PARSE);
383*cfb92d14SAndroid Build Coastguard Worker     }
384*cfb92d14SAndroid Build Coastguard Worker 
385*cfb92d14SAndroid Build Coastguard Worker exit:
386*cfb92d14SAndroid Build Coastguard Worker     return error;
387*cfb92d14SAndroid Build Coastguard Worker }
388*cfb92d14SAndroid Build Coastguard Worker 
PlatformSettingsSet(otInstance * aInstance,uint16_t aKey,const uint8_t * aValue,uint16_t aValueLength)389*cfb92d14SAndroid Build Coastguard Worker void PlatformSettingsSet(otInstance *aInstance, uint16_t aKey, const uint8_t *aValue, uint16_t aValueLength)
390*cfb92d14SAndroid Build Coastguard Worker {
391*cfb92d14SAndroid Build Coastguard Worker     int swapFd = -1;
392*cfb92d14SAndroid Build Coastguard Worker 
393*cfb92d14SAndroid Build Coastguard Worker     switch (PlatformSettingsDelete(aInstance, aKey, -1, &swapFd))
394*cfb92d14SAndroid Build Coastguard Worker     {
395*cfb92d14SAndroid Build Coastguard Worker     case OT_ERROR_NONE:
396*cfb92d14SAndroid Build Coastguard Worker     case OT_ERROR_NOT_FOUND:
397*cfb92d14SAndroid Build Coastguard Worker         break;
398*cfb92d14SAndroid Build Coastguard Worker 
399*cfb92d14SAndroid Build Coastguard Worker     default:
400*cfb92d14SAndroid Build Coastguard Worker         assert(false);
401*cfb92d14SAndroid Build Coastguard Worker         break;
402*cfb92d14SAndroid Build Coastguard Worker     }
403*cfb92d14SAndroid Build Coastguard Worker 
404*cfb92d14SAndroid Build Coastguard Worker     VerifyOrDie(write(swapFd, &aKey, sizeof(aKey)) == sizeof(aKey) &&
405*cfb92d14SAndroid Build Coastguard Worker                     write(swapFd, &aValueLength, sizeof(aValueLength)) == sizeof(aValueLength) &&
406*cfb92d14SAndroid Build Coastguard Worker                     write(swapFd, aValue, aValueLength) == aValueLength,
407*cfb92d14SAndroid Build Coastguard Worker                 OT_EXIT_FAILURE);
408*cfb92d14SAndroid Build Coastguard Worker 
409*cfb92d14SAndroid Build Coastguard Worker     swapPersist(aInstance, swapFd);
410*cfb92d14SAndroid Build Coastguard Worker }
411*cfb92d14SAndroid Build Coastguard Worker 
PlatformSettingsAdd(otInstance * aInstance,uint16_t aKey,const uint8_t * aValue,uint16_t aValueLength)412*cfb92d14SAndroid Build Coastguard Worker void PlatformSettingsAdd(otInstance *aInstance, uint16_t aKey, const uint8_t *aValue, uint16_t aValueLength)
413*cfb92d14SAndroid Build Coastguard Worker {
414*cfb92d14SAndroid Build Coastguard Worker     off_t size   = lseek(sSettingsFd, 0, SEEK_END);
415*cfb92d14SAndroid Build Coastguard Worker     int   swapFd = swapOpen(aInstance);
416*cfb92d14SAndroid Build Coastguard Worker 
417*cfb92d14SAndroid Build Coastguard Worker     if (size > 0)
418*cfb92d14SAndroid Build Coastguard Worker     {
419*cfb92d14SAndroid Build Coastguard Worker         VerifyOrDie(0 == lseek(sSettingsFd, 0, SEEK_SET), OT_EXIT_ERROR_ERRNO);
420*cfb92d14SAndroid Build Coastguard Worker         swapWrite(aInstance, swapFd, static_cast<uint16_t>(size));
421*cfb92d14SAndroid Build Coastguard Worker     }
422*cfb92d14SAndroid Build Coastguard Worker 
423*cfb92d14SAndroid Build Coastguard Worker     VerifyOrDie(write(swapFd, &aKey, sizeof(aKey)) == sizeof(aKey) &&
424*cfb92d14SAndroid Build Coastguard Worker                     write(swapFd, &aValueLength, sizeof(aValueLength)) == sizeof(aValueLength) &&
425*cfb92d14SAndroid Build Coastguard Worker                     write(swapFd, aValue, aValueLength) == aValueLength,
426*cfb92d14SAndroid Build Coastguard Worker                 OT_EXIT_FAILURE);
427*cfb92d14SAndroid Build Coastguard Worker 
428*cfb92d14SAndroid Build Coastguard Worker     swapPersist(aInstance, swapFd);
429*cfb92d14SAndroid Build Coastguard Worker }
430*cfb92d14SAndroid Build Coastguard Worker 
PlatformSettingsDelete(otInstance * aInstance,uint16_t aKey,int aIndex,int * aSwapFd)431*cfb92d14SAndroid Build Coastguard Worker otError PlatformSettingsDelete(otInstance *aInstance, uint16_t aKey, int aIndex, int *aSwapFd)
432*cfb92d14SAndroid Build Coastguard Worker {
433*cfb92d14SAndroid Build Coastguard Worker     otError error  = OT_ERROR_NOT_FOUND;
434*cfb92d14SAndroid Build Coastguard Worker     off_t   size   = lseek(sSettingsFd, 0, SEEK_END);
435*cfb92d14SAndroid Build Coastguard Worker     off_t   offset = lseek(sSettingsFd, 0, SEEK_SET);
436*cfb92d14SAndroid Build Coastguard Worker     int     swapFd = swapOpen(aInstance);
437*cfb92d14SAndroid Build Coastguard Worker 
438*cfb92d14SAndroid Build Coastguard Worker     assert(swapFd != -1);
439*cfb92d14SAndroid Build Coastguard Worker     assert(offset == 0);
440*cfb92d14SAndroid Build Coastguard Worker     VerifyOrExit(offset == 0 && size >= 0, error = OT_ERROR_FAILED);
441*cfb92d14SAndroid Build Coastguard Worker 
442*cfb92d14SAndroid Build Coastguard Worker     while (offset < size)
443*cfb92d14SAndroid Build Coastguard Worker     {
444*cfb92d14SAndroid Build Coastguard Worker         uint16_t key;
445*cfb92d14SAndroid Build Coastguard Worker         uint16_t length;
446*cfb92d14SAndroid Build Coastguard Worker         ssize_t  rval;
447*cfb92d14SAndroid Build Coastguard Worker 
448*cfb92d14SAndroid Build Coastguard Worker         rval = read(sSettingsFd, &key, sizeof(key));
449*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(rval == sizeof(key), error = OT_ERROR_FAILED);
450*cfb92d14SAndroid Build Coastguard Worker 
451*cfb92d14SAndroid Build Coastguard Worker         rval = read(sSettingsFd, &length, sizeof(length));
452*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(rval == sizeof(length), error = OT_ERROR_FAILED);
453*cfb92d14SAndroid Build Coastguard Worker 
454*cfb92d14SAndroid Build Coastguard Worker         offset += sizeof(key) + sizeof(length) + length;
455*cfb92d14SAndroid Build Coastguard Worker 
456*cfb92d14SAndroid Build Coastguard Worker         if (aKey == key)
457*cfb92d14SAndroid Build Coastguard Worker         {
458*cfb92d14SAndroid Build Coastguard Worker             if (aIndex == 0)
459*cfb92d14SAndroid Build Coastguard Worker             {
460*cfb92d14SAndroid Build Coastguard Worker                 VerifyOrExit(offset == lseek(sSettingsFd, length, SEEK_CUR), error = OT_ERROR_FAILED);
461*cfb92d14SAndroid Build Coastguard Worker                 swapWrite(aInstance, swapFd, static_cast<uint16_t>(size - offset));
462*cfb92d14SAndroid Build Coastguard Worker                 error = OT_ERROR_NONE;
463*cfb92d14SAndroid Build Coastguard Worker                 break;
464*cfb92d14SAndroid Build Coastguard Worker             }
465*cfb92d14SAndroid Build Coastguard Worker             else if (aIndex == -1)
466*cfb92d14SAndroid Build Coastguard Worker             {
467*cfb92d14SAndroid Build Coastguard Worker                 VerifyOrExit(offset == lseek(sSettingsFd, length, SEEK_CUR), error = OT_ERROR_FAILED);
468*cfb92d14SAndroid Build Coastguard Worker                 error = OT_ERROR_NONE;
469*cfb92d14SAndroid Build Coastguard Worker                 continue;
470*cfb92d14SAndroid Build Coastguard Worker             }
471*cfb92d14SAndroid Build Coastguard Worker             else
472*cfb92d14SAndroid Build Coastguard Worker             {
473*cfb92d14SAndroid Build Coastguard Worker                 --aIndex;
474*cfb92d14SAndroid Build Coastguard Worker             }
475*cfb92d14SAndroid Build Coastguard Worker         }
476*cfb92d14SAndroid Build Coastguard Worker 
477*cfb92d14SAndroid Build Coastguard Worker         rval = write(swapFd, &key, sizeof(key));
478*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(rval == sizeof(key), error = OT_ERROR_FAILED);
479*cfb92d14SAndroid Build Coastguard Worker 
480*cfb92d14SAndroid Build Coastguard Worker         rval = write(swapFd, &length, sizeof(length));
481*cfb92d14SAndroid Build Coastguard Worker         VerifyOrExit(rval == sizeof(length), error = OT_ERROR_FAILED);
482*cfb92d14SAndroid Build Coastguard Worker 
483*cfb92d14SAndroid Build Coastguard Worker         swapWrite(aInstance, swapFd, length);
484*cfb92d14SAndroid Build Coastguard Worker     }
485*cfb92d14SAndroid Build Coastguard Worker 
486*cfb92d14SAndroid Build Coastguard Worker exit:
487*cfb92d14SAndroid Build Coastguard Worker     if (aSwapFd != nullptr)
488*cfb92d14SAndroid Build Coastguard Worker     {
489*cfb92d14SAndroid Build Coastguard Worker         *aSwapFd = swapFd;
490*cfb92d14SAndroid Build Coastguard Worker     }
491*cfb92d14SAndroid Build Coastguard Worker     else if (error == OT_ERROR_NONE)
492*cfb92d14SAndroid Build Coastguard Worker     {
493*cfb92d14SAndroid Build Coastguard Worker         swapPersist(aInstance, swapFd);
494*cfb92d14SAndroid Build Coastguard Worker     }
495*cfb92d14SAndroid Build Coastguard Worker     else if (error == OT_ERROR_NOT_FOUND)
496*cfb92d14SAndroid Build Coastguard Worker     {
497*cfb92d14SAndroid Build Coastguard Worker         swapDiscard(aInstance, swapFd);
498*cfb92d14SAndroid Build Coastguard Worker     }
499*cfb92d14SAndroid Build Coastguard Worker     else if (error == OT_ERROR_FAILED)
500*cfb92d14SAndroid Build Coastguard Worker     {
501*cfb92d14SAndroid Build Coastguard Worker         swapDiscard(aInstance, swapFd);
502*cfb92d14SAndroid Build Coastguard Worker         DieNow(error);
503*cfb92d14SAndroid Build Coastguard Worker     }
504*cfb92d14SAndroid Build Coastguard Worker 
505*cfb92d14SAndroid Build Coastguard Worker     return error;
506*cfb92d14SAndroid Build Coastguard Worker }
507*cfb92d14SAndroid Build Coastguard Worker 
508*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_POSIX_CONFIG_SECURE_SETTINGS_ENABLE
PlatformSettingsGetSensitiveKeys(otInstance * aInstance,const uint16_t ** aKeys,uint16_t * aKeysLength)509*cfb92d14SAndroid Build Coastguard Worker void PlatformSettingsGetSensitiveKeys(otInstance *aInstance, const uint16_t **aKeys, uint16_t *aKeysLength)
510*cfb92d14SAndroid Build Coastguard Worker {
511*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
512*cfb92d14SAndroid Build Coastguard Worker 
513*cfb92d14SAndroid Build Coastguard Worker     assert(aKeys != nullptr);
514*cfb92d14SAndroid Build Coastguard Worker     assert(aKeysLength != nullptr);
515*cfb92d14SAndroid Build Coastguard Worker 
516*cfb92d14SAndroid Build Coastguard Worker     *aKeys       = sSensitiveKeys;
517*cfb92d14SAndroid Build Coastguard Worker     *aKeysLength = sSensitiveKeysLength;
518*cfb92d14SAndroid Build Coastguard Worker }
519*cfb92d14SAndroid Build Coastguard Worker #endif
520*cfb92d14SAndroid Build Coastguard Worker 
521*cfb92d14SAndroid Build Coastguard Worker } // namespace Posix
522*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
523*cfb92d14SAndroid Build Coastguard Worker 
524*cfb92d14SAndroid Build Coastguard Worker #ifndef SELF_TEST
525*cfb92d14SAndroid Build Coastguard Worker #define SELF_TEST 0
526*cfb92d14SAndroid Build Coastguard Worker #endif
527*cfb92d14SAndroid Build Coastguard Worker 
528*cfb92d14SAndroid Build Coastguard Worker #if SELF_TEST
529*cfb92d14SAndroid Build Coastguard Worker 
otLogCritPlat(const char * aFormat,...)530*cfb92d14SAndroid Build Coastguard Worker void otLogCritPlat(const char *aFormat, ...) { OT_UNUSED_VARIABLE(aFormat); }
531*cfb92d14SAndroid Build Coastguard Worker 
otExitCodeToString(uint8_t aExitCode)532*cfb92d14SAndroid Build Coastguard Worker const char *otExitCodeToString(uint8_t aExitCode)
533*cfb92d14SAndroid Build Coastguard Worker {
534*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aExitCode);
535*cfb92d14SAndroid Build Coastguard Worker     return "";
536*cfb92d14SAndroid Build Coastguard Worker }
537*cfb92d14SAndroid Build Coastguard Worker 
otPlatRadioGetIeeeEui64(otInstance * aInstance,uint8_t * aIeeeEui64)538*cfb92d14SAndroid Build Coastguard Worker void otPlatRadioGetIeeeEui64(otInstance *aInstance, uint8_t *aIeeeEui64)
539*cfb92d14SAndroid Build Coastguard Worker {
540*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aInstance);
541*cfb92d14SAndroid Build Coastguard Worker 
542*cfb92d14SAndroid Build Coastguard Worker     memset(aIeeeEui64, 0, sizeof(uint64_t));
543*cfb92d14SAndroid Build Coastguard Worker }
544*cfb92d14SAndroid Build Coastguard Worker 
545*cfb92d14SAndroid Build Coastguard Worker // Stub implementation for testing
IsSystemDryRun(void)546*cfb92d14SAndroid Build Coastguard Worker bool IsSystemDryRun(void) { return false; }
547*cfb92d14SAndroid Build Coastguard Worker 
main()548*cfb92d14SAndroid Build Coastguard Worker int main()
549*cfb92d14SAndroid Build Coastguard Worker {
550*cfb92d14SAndroid Build Coastguard Worker     otInstance *instance = nullptr;
551*cfb92d14SAndroid Build Coastguard Worker     uint8_t     data[60];
552*cfb92d14SAndroid Build Coastguard Worker 
553*cfb92d14SAndroid Build Coastguard Worker     for (uint8_t i = 0; i < sizeof(data); ++i)
554*cfb92d14SAndroid Build Coastguard Worker     {
555*cfb92d14SAndroid Build Coastguard Worker         data[i] = i;
556*cfb92d14SAndroid Build Coastguard Worker     }
557*cfb92d14SAndroid Build Coastguard Worker 
558*cfb92d14SAndroid Build Coastguard Worker     otPlatSettingsInit(instance, nullptr, 0);
559*cfb92d14SAndroid Build Coastguard Worker 
560*cfb92d14SAndroid Build Coastguard Worker     // verify empty situation
561*cfb92d14SAndroid Build Coastguard Worker     otPlatSettingsWipe(instance);
562*cfb92d14SAndroid Build Coastguard Worker     {
563*cfb92d14SAndroid Build Coastguard Worker         uint8_t  value[sizeof(data)];
564*cfb92d14SAndroid Build Coastguard Worker         uint16_t length = sizeof(value);
565*cfb92d14SAndroid Build Coastguard Worker 
566*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsGet(instance, 0, 0, value, &length) == OT_ERROR_NOT_FOUND);
567*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsDelete(instance, 0, 0) == OT_ERROR_NOT_FOUND);
568*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsDelete(instance, 0, -1) == OT_ERROR_NOT_FOUND);
569*cfb92d14SAndroid Build Coastguard Worker     }
570*cfb92d14SAndroid Build Coastguard Worker 
571*cfb92d14SAndroid Build Coastguard Worker     // verify write one record
572*cfb92d14SAndroid Build Coastguard Worker     assert(otPlatSettingsSet(instance, 0, data, sizeof(data) / 2) == OT_ERROR_NONE);
573*cfb92d14SAndroid Build Coastguard Worker     {
574*cfb92d14SAndroid Build Coastguard Worker         uint8_t  value[sizeof(data)];
575*cfb92d14SAndroid Build Coastguard Worker         uint16_t length = sizeof(value);
576*cfb92d14SAndroid Build Coastguard Worker 
577*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsGet(instance, 0, 0, nullptr, nullptr) == OT_ERROR_NONE);
578*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsGet(instance, 0, 0, nullptr, &length) == OT_ERROR_NONE);
579*cfb92d14SAndroid Build Coastguard Worker         assert(length == sizeof(data) / 2);
580*cfb92d14SAndroid Build Coastguard Worker 
581*cfb92d14SAndroid Build Coastguard Worker         length = sizeof(value);
582*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsGet(instance, 0, 0, value, &length) == OT_ERROR_NONE);
583*cfb92d14SAndroid Build Coastguard Worker         assert(length == sizeof(data) / 2);
584*cfb92d14SAndroid Build Coastguard Worker         assert(0 == memcmp(value, data, length));
585*cfb92d14SAndroid Build Coastguard Worker 
586*cfb92d14SAndroid Build Coastguard Worker         // insufficient buffer
587*cfb92d14SAndroid Build Coastguard Worker         length -= 1;
588*cfb92d14SAndroid Build Coastguard Worker         value[length] = 0;
589*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsGet(instance, 0, 0, value, &length) == OT_ERROR_NONE);
590*cfb92d14SAndroid Build Coastguard Worker         // verify length becomes the actual length of the record
591*cfb92d14SAndroid Build Coastguard Worker         assert(length == sizeof(data) / 2);
592*cfb92d14SAndroid Build Coastguard Worker         // verify this byte is not changed
593*cfb92d14SAndroid Build Coastguard Worker         assert(value[length] == 0);
594*cfb92d14SAndroid Build Coastguard Worker 
595*cfb92d14SAndroid Build Coastguard Worker         // wrong index
596*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsGet(instance, 0, 1, nullptr, nullptr) == OT_ERROR_NOT_FOUND);
597*cfb92d14SAndroid Build Coastguard Worker         // wrong key
598*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsGet(instance, 1, 0, nullptr, nullptr) == OT_ERROR_NOT_FOUND);
599*cfb92d14SAndroid Build Coastguard Worker     }
600*cfb92d14SAndroid Build Coastguard Worker     otPlatSettingsWipe(instance);
601*cfb92d14SAndroid Build Coastguard Worker 
602*cfb92d14SAndroid Build Coastguard Worker     // verify write two records
603*cfb92d14SAndroid Build Coastguard Worker     assert(otPlatSettingsSet(instance, 0, data, sizeof(data)) == OT_ERROR_NONE);
604*cfb92d14SAndroid Build Coastguard Worker     assert(otPlatSettingsAdd(instance, 0, data, sizeof(data) / 2) == OT_ERROR_NONE);
605*cfb92d14SAndroid Build Coastguard Worker     {
606*cfb92d14SAndroid Build Coastguard Worker         uint8_t  value[sizeof(data)];
607*cfb92d14SAndroid Build Coastguard Worker         uint16_t length = sizeof(value);
608*cfb92d14SAndroid Build Coastguard Worker 
609*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsGet(instance, 0, 1, value, &length) == OT_ERROR_NONE);
610*cfb92d14SAndroid Build Coastguard Worker         assert(length == sizeof(data) / 2);
611*cfb92d14SAndroid Build Coastguard Worker         assert(0 == memcmp(value, data, length));
612*cfb92d14SAndroid Build Coastguard Worker 
613*cfb92d14SAndroid Build Coastguard Worker         length = sizeof(value);
614*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsGet(instance, 0, 0, value, &length) == OT_ERROR_NONE);
615*cfb92d14SAndroid Build Coastguard Worker         assert(length == sizeof(data));
616*cfb92d14SAndroid Build Coastguard Worker         assert(0 == memcmp(value, data, length));
617*cfb92d14SAndroid Build Coastguard Worker     }
618*cfb92d14SAndroid Build Coastguard Worker     otPlatSettingsWipe(instance);
619*cfb92d14SAndroid Build Coastguard Worker 
620*cfb92d14SAndroid Build Coastguard Worker     // verify write two records of different keys
621*cfb92d14SAndroid Build Coastguard Worker     assert(otPlatSettingsSet(instance, 0, data, sizeof(data)) == OT_ERROR_NONE);
622*cfb92d14SAndroid Build Coastguard Worker     assert(otPlatSettingsAdd(instance, 1, data, sizeof(data) / 2) == OT_ERROR_NONE);
623*cfb92d14SAndroid Build Coastguard Worker     {
624*cfb92d14SAndroid Build Coastguard Worker         uint8_t  value[sizeof(data)];
625*cfb92d14SAndroid Build Coastguard Worker         uint16_t length = sizeof(value);
626*cfb92d14SAndroid Build Coastguard Worker 
627*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsGet(instance, 1, 0, value, &length) == OT_ERROR_NONE);
628*cfb92d14SAndroid Build Coastguard Worker         assert(length == sizeof(data) / 2);
629*cfb92d14SAndroid Build Coastguard Worker         assert(0 == memcmp(value, data, length));
630*cfb92d14SAndroid Build Coastguard Worker 
631*cfb92d14SAndroid Build Coastguard Worker         length = sizeof(value);
632*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsGet(instance, 0, 0, value, &length) == OT_ERROR_NONE);
633*cfb92d14SAndroid Build Coastguard Worker         assert(length == sizeof(data));
634*cfb92d14SAndroid Build Coastguard Worker         assert(0 == memcmp(value, data, length));
635*cfb92d14SAndroid Build Coastguard Worker     }
636*cfb92d14SAndroid Build Coastguard Worker     otPlatSettingsWipe(instance);
637*cfb92d14SAndroid Build Coastguard Worker 
638*cfb92d14SAndroid Build Coastguard Worker     // verify delete record
639*cfb92d14SAndroid Build Coastguard Worker     assert(otPlatSettingsAdd(instance, 0, data, sizeof(data)) == OT_ERROR_NONE);
640*cfb92d14SAndroid Build Coastguard Worker     assert(otPlatSettingsAdd(instance, 0, data, sizeof(data) / 2) == OT_ERROR_NONE);
641*cfb92d14SAndroid Build Coastguard Worker     assert(otPlatSettingsAdd(instance, 0, data, sizeof(data) / 3) == OT_ERROR_NONE);
642*cfb92d14SAndroid Build Coastguard Worker     {
643*cfb92d14SAndroid Build Coastguard Worker         uint8_t  value[sizeof(data)];
644*cfb92d14SAndroid Build Coastguard Worker         uint16_t length = sizeof(value);
645*cfb92d14SAndroid Build Coastguard Worker 
646*cfb92d14SAndroid Build Coastguard Worker         // wrong key
647*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsDelete(instance, 1, 0) == OT_ERROR_NOT_FOUND);
648*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsDelete(instance, 1, -1) == OT_ERROR_NOT_FOUND);
649*cfb92d14SAndroid Build Coastguard Worker 
650*cfb92d14SAndroid Build Coastguard Worker         // wrong index
651*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsDelete(instance, 0, 3) == OT_ERROR_NOT_FOUND);
652*cfb92d14SAndroid Build Coastguard Worker 
653*cfb92d14SAndroid Build Coastguard Worker         // delete one record
654*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsDelete(instance, 0, 1) == OT_ERROR_NONE);
655*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsGet(instance, 0, 1, value, &length) == OT_ERROR_NONE);
656*cfb92d14SAndroid Build Coastguard Worker         assert(length == sizeof(data) / 3);
657*cfb92d14SAndroid Build Coastguard Worker         assert(0 == memcmp(value, data, length));
658*cfb92d14SAndroid Build Coastguard Worker 
659*cfb92d14SAndroid Build Coastguard Worker         // delete all records
660*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsDelete(instance, 0, -1) == OT_ERROR_NONE);
661*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsGet(instance, 0, 0, nullptr, nullptr) == OT_ERROR_NOT_FOUND);
662*cfb92d14SAndroid Build Coastguard Worker     }
663*cfb92d14SAndroid Build Coastguard Worker     otPlatSettingsWipe(instance);
664*cfb92d14SAndroid Build Coastguard Worker 
665*cfb92d14SAndroid Build Coastguard Worker     // verify delete all records of a type
666*cfb92d14SAndroid Build Coastguard Worker     assert(otPlatSettingsAdd(instance, 0, data, sizeof(data)) == OT_ERROR_NONE);
667*cfb92d14SAndroid Build Coastguard Worker     assert(otPlatSettingsAdd(instance, 1, data, sizeof(data) / 2) == OT_ERROR_NONE);
668*cfb92d14SAndroid Build Coastguard Worker     assert(otPlatSettingsAdd(instance, 0, data, sizeof(data) / 3) == OT_ERROR_NONE);
669*cfb92d14SAndroid Build Coastguard Worker     {
670*cfb92d14SAndroid Build Coastguard Worker         uint8_t  value[sizeof(data)];
671*cfb92d14SAndroid Build Coastguard Worker         uint16_t length = sizeof(value);
672*cfb92d14SAndroid Build Coastguard Worker 
673*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsDelete(instance, 0, -1) == OT_ERROR_NONE);
674*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsGet(instance, 0, 0, value, &length) == OT_ERROR_NOT_FOUND);
675*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsGet(instance, 1, 0, value, &length) == OT_ERROR_NONE);
676*cfb92d14SAndroid Build Coastguard Worker         assert(length == sizeof(data) / 2);
677*cfb92d14SAndroid Build Coastguard Worker         assert(0 == memcmp(value, data, length));
678*cfb92d14SAndroid Build Coastguard Worker 
679*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsDelete(instance, 0, 0) == OT_ERROR_NOT_FOUND);
680*cfb92d14SAndroid Build Coastguard Worker         assert(otPlatSettingsGet(instance, 0, 0, nullptr, nullptr) == OT_ERROR_NOT_FOUND);
681*cfb92d14SAndroid Build Coastguard Worker     }
682*cfb92d14SAndroid Build Coastguard Worker     otPlatSettingsWipe(instance);
683*cfb92d14SAndroid Build Coastguard Worker     otPlatSettingsDeinit(instance);
684*cfb92d14SAndroid Build Coastguard Worker 
685*cfb92d14SAndroid Build Coastguard Worker     return 0;
686*cfb92d14SAndroid Build Coastguard Worker }
687*cfb92d14SAndroid Build Coastguard Worker #endif
688