1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker * Copyright (c) 2018, 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 a simple CLI for the CoAP Secure service.
32*cfb92d14SAndroid Build Coastguard Worker */
33*cfb92d14SAndroid Build Coastguard Worker
34*cfb92d14SAndroid Build Coastguard Worker #include "cli_coap_secure.hpp"
35*cfb92d14SAndroid Build Coastguard Worker
36*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_SECURE_API_ENABLE
37*cfb92d14SAndroid Build Coastguard Worker
38*cfb92d14SAndroid Build Coastguard Worker #include <mbedtls/debug.h>
39*cfb92d14SAndroid Build Coastguard Worker #include <openthread/random_noncrypto.h>
40*cfb92d14SAndroid Build Coastguard Worker
41*cfb92d14SAndroid Build Coastguard Worker #include "cli/cli.hpp"
42*cfb92d14SAndroid Build Coastguard Worker
43*cfb92d14SAndroid Build Coastguard Worker // header for place your x509 certificate and private key
44*cfb92d14SAndroid Build Coastguard Worker #include "x509_cert_key.hpp"
45*cfb92d14SAndroid Build Coastguard Worker
46*cfb92d14SAndroid Build Coastguard Worker namespace ot {
47*cfb92d14SAndroid Build Coastguard Worker namespace Cli {
48*cfb92d14SAndroid Build Coastguard Worker
CoapSecure(otInstance * aInstance,OutputImplementer & aOutputImplementer)49*cfb92d14SAndroid Build Coastguard Worker CoapSecure::CoapSecure(otInstance *aInstance, OutputImplementer &aOutputImplementer)
50*cfb92d14SAndroid Build Coastguard Worker : Utils(aInstance, aOutputImplementer)
51*cfb92d14SAndroid Build Coastguard Worker , mShutdownFlag(false)
52*cfb92d14SAndroid Build Coastguard Worker , mUseCertificate(false)
53*cfb92d14SAndroid Build Coastguard Worker , mPskLength(0)
54*cfb92d14SAndroid Build Coastguard Worker , mPskIdLength(0)
55*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
56*cfb92d14SAndroid Build Coastguard Worker , mBlockCount(1)
57*cfb92d14SAndroid Build Coastguard Worker #endif
58*cfb92d14SAndroid Build Coastguard Worker {
59*cfb92d14SAndroid Build Coastguard Worker ClearAllBytes(mResource);
60*cfb92d14SAndroid Build Coastguard Worker ClearAllBytes(mPsk);
61*cfb92d14SAndroid Build Coastguard Worker ClearAllBytes(mPskId);
62*cfb92d14SAndroid Build Coastguard Worker ClearAllBytes(mUriPath);
63*cfb92d14SAndroid Build Coastguard Worker strncpy(mResourceContent, "0", sizeof(mResourceContent));
64*cfb92d14SAndroid Build Coastguard Worker mResourceContent[sizeof(mResourceContent) - 1] = '\0';
65*cfb92d14SAndroid Build Coastguard Worker }
66*cfb92d14SAndroid Build Coastguard Worker
PrintPayload(otMessage * aMessage)67*cfb92d14SAndroid Build Coastguard Worker void CoapSecure::PrintPayload(otMessage *aMessage)
68*cfb92d14SAndroid Build Coastguard Worker {
69*cfb92d14SAndroid Build Coastguard Worker uint8_t buf[kMaxBufferSize];
70*cfb92d14SAndroid Build Coastguard Worker uint16_t bytesToPrint;
71*cfb92d14SAndroid Build Coastguard Worker uint16_t bytesPrinted = 0;
72*cfb92d14SAndroid Build Coastguard Worker uint16_t length = otMessageGetLength(aMessage) - otMessageGetOffset(aMessage);
73*cfb92d14SAndroid Build Coastguard Worker
74*cfb92d14SAndroid Build Coastguard Worker if (length > 0)
75*cfb92d14SAndroid Build Coastguard Worker {
76*cfb92d14SAndroid Build Coastguard Worker OutputFormat(" with payload: ");
77*cfb92d14SAndroid Build Coastguard Worker
78*cfb92d14SAndroid Build Coastguard Worker while (length > 0)
79*cfb92d14SAndroid Build Coastguard Worker {
80*cfb92d14SAndroid Build Coastguard Worker bytesToPrint = Min(length, static_cast<uint16_t>(sizeof(buf)));
81*cfb92d14SAndroid Build Coastguard Worker otMessageRead(aMessage, otMessageGetOffset(aMessage) + bytesPrinted, buf, bytesToPrint);
82*cfb92d14SAndroid Build Coastguard Worker
83*cfb92d14SAndroid Build Coastguard Worker OutputBytes(buf, static_cast<uint8_t>(bytesToPrint));
84*cfb92d14SAndroid Build Coastguard Worker
85*cfb92d14SAndroid Build Coastguard Worker length -= bytesToPrint;
86*cfb92d14SAndroid Build Coastguard Worker bytesPrinted += bytesToPrint;
87*cfb92d14SAndroid Build Coastguard Worker }
88*cfb92d14SAndroid Build Coastguard Worker }
89*cfb92d14SAndroid Build Coastguard Worker
90*cfb92d14SAndroid Build Coastguard Worker OutputNewLine();
91*cfb92d14SAndroid Build Coastguard Worker }
92*cfb92d14SAndroid Build Coastguard Worker
93*cfb92d14SAndroid Build Coastguard Worker /**
94*cfb92d14SAndroid Build Coastguard Worker * @cli coaps resource (get,set)
95*cfb92d14SAndroid Build Coastguard Worker * @code
96*cfb92d14SAndroid Build Coastguard Worker * coaps resource test-resource
97*cfb92d14SAndroid Build Coastguard Worker * Done
98*cfb92d14SAndroid Build Coastguard Worker * @endcode
99*cfb92d14SAndroid Build Coastguard Worker * @code
100*cfb92d14SAndroid Build Coastguard Worker * coaps resource
101*cfb92d14SAndroid Build Coastguard Worker * test-resource
102*cfb92d14SAndroid Build Coastguard Worker * Done
103*cfb92d14SAndroid Build Coastguard Worker * @endcode
104*cfb92d14SAndroid Build Coastguard Worker * @cparam coaps resource [@ca{uri-path}]
105*cfb92d14SAndroid Build Coastguard Worker * @par
106*cfb92d14SAndroid Build Coastguard Worker * Gets or sets the URI path of the CoAPS server resource. @moreinfo{@coaps}.
107*cfb92d14SAndroid Build Coastguard Worker * @sa otCoapSecureAddBlockWiseResource
108*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])109*cfb92d14SAndroid Build Coastguard Worker template <> otError CoapSecure::Process<Cmd("resource")>(Arg aArgs[])
110*cfb92d14SAndroid Build Coastguard Worker {
111*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
112*cfb92d14SAndroid Build Coastguard Worker
113*cfb92d14SAndroid Build Coastguard Worker if (!aArgs[0].IsEmpty())
114*cfb92d14SAndroid Build Coastguard Worker {
115*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(aArgs[0].GetLength() < kMaxUriLength, error = OT_ERROR_INVALID_ARGS);
116*cfb92d14SAndroid Build Coastguard Worker
117*cfb92d14SAndroid Build Coastguard Worker mResource.mUriPath = mUriPath;
118*cfb92d14SAndroid Build Coastguard Worker mResource.mContext = this;
119*cfb92d14SAndroid Build Coastguard Worker mResource.mHandler = &CoapSecure::HandleRequest;
120*cfb92d14SAndroid Build Coastguard Worker
121*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
122*cfb92d14SAndroid Build Coastguard Worker mResource.mReceiveHook = &CoapSecure::BlockwiseReceiveHook;
123*cfb92d14SAndroid Build Coastguard Worker mResource.mTransmitHook = &CoapSecure::BlockwiseTransmitHook;
124*cfb92d14SAndroid Build Coastguard Worker
125*cfb92d14SAndroid Build Coastguard Worker if (!aArgs[1].IsEmpty())
126*cfb92d14SAndroid Build Coastguard Worker {
127*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = aArgs[1].ParseAsUint32(mBlockCount));
128*cfb92d14SAndroid Build Coastguard Worker }
129*cfb92d14SAndroid Build Coastguard Worker #endif
130*cfb92d14SAndroid Build Coastguard Worker
131*cfb92d14SAndroid Build Coastguard Worker strncpy(mUriPath, aArgs[0].GetCString(), sizeof(mUriPath) - 1);
132*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
133*cfb92d14SAndroid Build Coastguard Worker otCoapSecureAddBlockWiseResource(GetInstancePtr(), &mResource);
134*cfb92d14SAndroid Build Coastguard Worker #else
135*cfb92d14SAndroid Build Coastguard Worker otCoapSecureAddResource(GetInstancePtr(), &mResource);
136*cfb92d14SAndroid Build Coastguard Worker #endif
137*cfb92d14SAndroid Build Coastguard Worker }
138*cfb92d14SAndroid Build Coastguard Worker else
139*cfb92d14SAndroid Build Coastguard Worker {
140*cfb92d14SAndroid Build Coastguard Worker OutputLine("%s", mResource.mUriPath != nullptr ? mResource.mUriPath : "");
141*cfb92d14SAndroid Build Coastguard Worker }
142*cfb92d14SAndroid Build Coastguard Worker
143*cfb92d14SAndroid Build Coastguard Worker exit:
144*cfb92d14SAndroid Build Coastguard Worker return error;
145*cfb92d14SAndroid Build Coastguard Worker }
146*cfb92d14SAndroid Build Coastguard Worker
147*cfb92d14SAndroid Build Coastguard Worker /**
148*cfb92d14SAndroid Build Coastguard Worker * @cli coaps set
149*cfb92d14SAndroid Build Coastguard Worker * @code
150*cfb92d14SAndroid Build Coastguard Worker * coaps set Testing123
151*cfb92d14SAndroid Build Coastguard Worker * Done
152*cfb92d14SAndroid Build Coastguard Worker * @endcode
153*cfb92d14SAndroid Build Coastguard Worker * @cparam coaps set @ca{new-content}
154*cfb92d14SAndroid Build Coastguard Worker * @par
155*cfb92d14SAndroid Build Coastguard Worker * Sets the content sent by the resource on the CoAPS server. @moreinfo{@coaps}.
156*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])157*cfb92d14SAndroid Build Coastguard Worker template <> otError CoapSecure::Process<Cmd("set")>(Arg aArgs[])
158*cfb92d14SAndroid Build Coastguard Worker {
159*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
160*cfb92d14SAndroid Build Coastguard Worker
161*cfb92d14SAndroid Build Coastguard Worker if (!aArgs[0].IsEmpty())
162*cfb92d14SAndroid Build Coastguard Worker {
163*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(aArgs[0].GetLength() < sizeof(mResourceContent), error = OT_ERROR_INVALID_ARGS);
164*cfb92d14SAndroid Build Coastguard Worker strncpy(mResourceContent, aArgs[0].GetCString(), sizeof(mResourceContent));
165*cfb92d14SAndroid Build Coastguard Worker mResourceContent[sizeof(mResourceContent) - 1] = '\0';
166*cfb92d14SAndroid Build Coastguard Worker }
167*cfb92d14SAndroid Build Coastguard Worker else
168*cfb92d14SAndroid Build Coastguard Worker {
169*cfb92d14SAndroid Build Coastguard Worker OutputLine("%s", mResourceContent);
170*cfb92d14SAndroid Build Coastguard Worker }
171*cfb92d14SAndroid Build Coastguard Worker
172*cfb92d14SAndroid Build Coastguard Worker exit:
173*cfb92d14SAndroid Build Coastguard Worker return error;
174*cfb92d14SAndroid Build Coastguard Worker }
175*cfb92d14SAndroid Build Coastguard Worker
176*cfb92d14SAndroid Build Coastguard Worker /**
177*cfb92d14SAndroid Build Coastguard Worker * @cli coaps start
178*cfb92d14SAndroid Build Coastguard Worker * @code
179*cfb92d14SAndroid Build Coastguard Worker * coaps start
180*cfb92d14SAndroid Build Coastguard Worker * Done
181*cfb92d14SAndroid Build Coastguard Worker * @endcode
182*cfb92d14SAndroid Build Coastguard Worker * @code
183*cfb92d14SAndroid Build Coastguard Worker * coaps start false
184*cfb92d14SAndroid Build Coastguard Worker * Done
185*cfb92d14SAndroid Build Coastguard Worker * @endcode
186*cfb92d14SAndroid Build Coastguard Worker * @code
187*cfb92d14SAndroid Build Coastguard Worker * coaps start 8
188*cfb92d14SAndroid Build Coastguard Worker * Done
189*cfb92d14SAndroid Build Coastguard Worker * @endcode
190*cfb92d14SAndroid Build Coastguard Worker * @cparam coaps start [@ca{check-peer-cert} | @ca{max-conn-attempts}]
191*cfb92d14SAndroid Build Coastguard Worker * The `check-peer-cert` parameter determines if the peer-certificate check is
192*cfb92d14SAndroid Build Coastguard Worker * enabled (default) or disabled.
193*cfb92d14SAndroid Build Coastguard Worker * The `max-conn-attempts` parameter sets the maximum number of allowed
194*cfb92d14SAndroid Build Coastguard Worker * attempts, successful or failed, to connect to the CoAP Secure server.
195*cfb92d14SAndroid Build Coastguard Worker * The default value of this parameter is `0`, which means that there is
196*cfb92d14SAndroid Build Coastguard Worker * no limit to the number of attempts.
197*cfb92d14SAndroid Build Coastguard Worker * The `check-peer-cert` and `max-conn-attempts` parameters work
198*cfb92d14SAndroid Build Coastguard Worker * together in the following combinations, even though you can only specify
199*cfb92d14SAndroid Build Coastguard Worker * one argument:
200*cfb92d14SAndroid Build Coastguard Worker * * No argument specified: Defaults are used.
201*cfb92d14SAndroid Build Coastguard Worker * * Setting `check-peer-cert` to `true`:
202*cfb92d14SAndroid Build Coastguard Worker * Has the same effect as omitting the argument, which is that the
203*cfb92d14SAndroid Build Coastguard Worker * `check-peer-cert` value is `true`, and the `max-conn-attempts` value is 0.
204*cfb92d14SAndroid Build Coastguard Worker * * Setting `check-peer-cert` to `false`:
205*cfb92d14SAndroid Build Coastguard Worker * `check-peer-cert` value is `false`, and the `max-conn-attempts` value is 0.
206*cfb92d14SAndroid Build Coastguard Worker * * Specifying a number:
207*cfb92d14SAndroid Build Coastguard Worker * `check-peer-cert` is `true`, and the `max-conn-attempts` value is the
208*cfb92d14SAndroid Build Coastguard Worker * number specified in the argument.
209*cfb92d14SAndroid Build Coastguard Worker * @par
210*cfb92d14SAndroid Build Coastguard Worker * Starts the CoAP Secure service. @moreinfo{@coaps}.
211*cfb92d14SAndroid Build Coastguard Worker * @sa otCoapSecureStart
212*cfb92d14SAndroid Build Coastguard Worker * @sa otCoapSecureSetSslAuthMode
213*cfb92d14SAndroid Build Coastguard Worker * @sa otCoapSecureSetClientConnectEventCallback
214*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])215*cfb92d14SAndroid Build Coastguard Worker template <> otError CoapSecure::Process<Cmd("start")>(Arg aArgs[])
216*cfb92d14SAndroid Build Coastguard Worker {
217*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
218*cfb92d14SAndroid Build Coastguard Worker bool verifyPeerCert = true;
219*cfb92d14SAndroid Build Coastguard Worker uint16_t maxConnAttempts = 0;
220*cfb92d14SAndroid Build Coastguard Worker
221*cfb92d14SAndroid Build Coastguard Worker if (!aArgs[0].IsEmpty())
222*cfb92d14SAndroid Build Coastguard Worker {
223*cfb92d14SAndroid Build Coastguard Worker if (aArgs[0] == "false")
224*cfb92d14SAndroid Build Coastguard Worker {
225*cfb92d14SAndroid Build Coastguard Worker verifyPeerCert = false;
226*cfb92d14SAndroid Build Coastguard Worker }
227*cfb92d14SAndroid Build Coastguard Worker else if (aArgs[0] == "true")
228*cfb92d14SAndroid Build Coastguard Worker {
229*cfb92d14SAndroid Build Coastguard Worker verifyPeerCert = true;
230*cfb92d14SAndroid Build Coastguard Worker }
231*cfb92d14SAndroid Build Coastguard Worker else
232*cfb92d14SAndroid Build Coastguard Worker {
233*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = aArgs[0].ParseAsUint16(maxConnAttempts));
234*cfb92d14SAndroid Build Coastguard Worker }
235*cfb92d14SAndroid Build Coastguard Worker }
236*cfb92d14SAndroid Build Coastguard Worker
237*cfb92d14SAndroid Build Coastguard Worker otCoapSecureSetSslAuthMode(GetInstancePtr(), verifyPeerCert);
238*cfb92d14SAndroid Build Coastguard Worker otCoapSecureSetClientConnectEventCallback(GetInstancePtr(), &CoapSecure::HandleConnectEvent, this);
239*cfb92d14SAndroid Build Coastguard Worker
240*cfb92d14SAndroid Build Coastguard Worker #if CLI_COAP_SECURE_USE_COAP_DEFAULT_HANDLER
241*cfb92d14SAndroid Build Coastguard Worker otCoapSecureSetDefaultHandler(GetInstancePtr(), &CoapSecure::DefaultHandler, this);
242*cfb92d14SAndroid Build Coastguard Worker #endif
243*cfb92d14SAndroid Build Coastguard Worker
244*cfb92d14SAndroid Build Coastguard Worker error = otCoapSecureStartWithMaxConnAttempts(GetInstancePtr(), OT_DEFAULT_COAP_SECURE_PORT, maxConnAttempts,
245*cfb92d14SAndroid Build Coastguard Worker nullptr, nullptr);
246*cfb92d14SAndroid Build Coastguard Worker
247*cfb92d14SAndroid Build Coastguard Worker exit:
248*cfb92d14SAndroid Build Coastguard Worker return error;
249*cfb92d14SAndroid Build Coastguard Worker }
250*cfb92d14SAndroid Build Coastguard Worker
251*cfb92d14SAndroid Build Coastguard Worker /**
252*cfb92d14SAndroid Build Coastguard Worker * @cli coaps stop
253*cfb92d14SAndroid Build Coastguard Worker * @code
254*cfb92d14SAndroid Build Coastguard Worker * coaps stop
255*cfb92d14SAndroid Build Coastguard Worker * Done
256*cfb92d14SAndroid Build Coastguard Worker * @endcode
257*cfb92d14SAndroid Build Coastguard Worker * @par
258*cfb92d14SAndroid Build Coastguard Worker * Stops the CoAP Secure service. @moreinfo{@coaps}.
259*cfb92d14SAndroid Build Coastguard Worker * @sa otCoapSecureStop
260*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])261*cfb92d14SAndroid Build Coastguard Worker template <> otError CoapSecure::Process<Cmd("stop")>(Arg aArgs[])
262*cfb92d14SAndroid Build Coastguard Worker {
263*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aArgs);
264*cfb92d14SAndroid Build Coastguard Worker
265*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
266*cfb92d14SAndroid Build Coastguard Worker otCoapRemoveBlockWiseResource(GetInstancePtr(), &mResource);
267*cfb92d14SAndroid Build Coastguard Worker #else
268*cfb92d14SAndroid Build Coastguard Worker otCoapRemoveResource(GetInstancePtr(), &mResource);
269*cfb92d14SAndroid Build Coastguard Worker #endif
270*cfb92d14SAndroid Build Coastguard Worker
271*cfb92d14SAndroid Build Coastguard Worker if (otCoapSecureIsConnectionActive(GetInstancePtr()))
272*cfb92d14SAndroid Build Coastguard Worker {
273*cfb92d14SAndroid Build Coastguard Worker otCoapSecureDisconnect(GetInstancePtr());
274*cfb92d14SAndroid Build Coastguard Worker mShutdownFlag = true;
275*cfb92d14SAndroid Build Coastguard Worker }
276*cfb92d14SAndroid Build Coastguard Worker else
277*cfb92d14SAndroid Build Coastguard Worker {
278*cfb92d14SAndroid Build Coastguard Worker Stop();
279*cfb92d14SAndroid Build Coastguard Worker }
280*cfb92d14SAndroid Build Coastguard Worker
281*cfb92d14SAndroid Build Coastguard Worker return OT_ERROR_NONE;
282*cfb92d14SAndroid Build Coastguard Worker }
283*cfb92d14SAndroid Build Coastguard Worker
284*cfb92d14SAndroid Build Coastguard Worker /**
285*cfb92d14SAndroid Build Coastguard Worker * @cli coaps isclosed
286*cfb92d14SAndroid Build Coastguard Worker * @code
287*cfb92d14SAndroid Build Coastguard Worker * coaps isclosed
288*cfb92d14SAndroid Build Coastguard Worker * no
289*cfb92d14SAndroid Build Coastguard Worker * Done
290*cfb92d14SAndroid Build Coastguard Worker * @endcode
291*cfb92d14SAndroid Build Coastguard Worker * @par
292*cfb92d14SAndroid Build Coastguard Worker * Indicates if the CoAP Secure service is closed. @moreinfo{@coaps}.
293*cfb92d14SAndroid Build Coastguard Worker * @sa otCoapSecureIsClosed
294*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])295*cfb92d14SAndroid Build Coastguard Worker template <> otError CoapSecure::Process<Cmd("isclosed")>(Arg aArgs[])
296*cfb92d14SAndroid Build Coastguard Worker {
297*cfb92d14SAndroid Build Coastguard Worker return ProcessIsRequest(aArgs, otCoapSecureIsClosed);
298*cfb92d14SAndroid Build Coastguard Worker }
299*cfb92d14SAndroid Build Coastguard Worker
300*cfb92d14SAndroid Build Coastguard Worker /**
301*cfb92d14SAndroid Build Coastguard Worker * @cli coaps isconnected
302*cfb92d14SAndroid Build Coastguard Worker * @code
303*cfb92d14SAndroid Build Coastguard Worker * coaps isconnected
304*cfb92d14SAndroid Build Coastguard Worker * yes
305*cfb92d14SAndroid Build Coastguard Worker * Done
306*cfb92d14SAndroid Build Coastguard Worker * @endcode
307*cfb92d14SAndroid Build Coastguard Worker * @par
308*cfb92d14SAndroid Build Coastguard Worker * Indicates if the CoAP Secure service is connected. @moreinfo{@coaps}.
309*cfb92d14SAndroid Build Coastguard Worker * @sa otCoapSecureIsConnected
310*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])311*cfb92d14SAndroid Build Coastguard Worker template <> otError CoapSecure::Process<Cmd("isconnected")>(Arg aArgs[])
312*cfb92d14SAndroid Build Coastguard Worker {
313*cfb92d14SAndroid Build Coastguard Worker return ProcessIsRequest(aArgs, otCoapSecureIsConnected);
314*cfb92d14SAndroid Build Coastguard Worker }
315*cfb92d14SAndroid Build Coastguard Worker
316*cfb92d14SAndroid Build Coastguard Worker /**
317*cfb92d14SAndroid Build Coastguard Worker * @cli coaps isconnactive
318*cfb92d14SAndroid Build Coastguard Worker * @code
319*cfb92d14SAndroid Build Coastguard Worker * coaps isconnactive
320*cfb92d14SAndroid Build Coastguard Worker * yes
321*cfb92d14SAndroid Build Coastguard Worker * Done
322*cfb92d14SAndroid Build Coastguard Worker * @endcode
323*cfb92d14SAndroid Build Coastguard Worker * @par
324*cfb92d14SAndroid Build Coastguard Worker * Indicates if the CoAP Secure service connection is active
325*cfb92d14SAndroid Build Coastguard Worker * (either already connected or in the process of establishing a connection).
326*cfb92d14SAndroid Build Coastguard Worker * @moreinfo{@coaps}.
327*cfb92d14SAndroid Build Coastguard Worker * @sa otCoapSecureIsConnectionActive
328*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])329*cfb92d14SAndroid Build Coastguard Worker template <> otError CoapSecure::Process<Cmd("isconnactive")>(Arg aArgs[])
330*cfb92d14SAndroid Build Coastguard Worker {
331*cfb92d14SAndroid Build Coastguard Worker return ProcessIsRequest(aArgs, otCoapSecureIsConnectionActive);
332*cfb92d14SAndroid Build Coastguard Worker }
333*cfb92d14SAndroid Build Coastguard Worker
ProcessIsRequest(Arg aArgs[],bool (* IsChecker)(otInstance *))334*cfb92d14SAndroid Build Coastguard Worker otError CoapSecure::ProcessIsRequest(Arg aArgs[], bool (*IsChecker)(otInstance *))
335*cfb92d14SAndroid Build Coastguard Worker {
336*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
337*cfb92d14SAndroid Build Coastguard Worker
338*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(aArgs[0].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
339*cfb92d14SAndroid Build Coastguard Worker OutputLine("%s", IsChecker(GetInstancePtr()) ? "yes" : "no");
340*cfb92d14SAndroid Build Coastguard Worker
341*cfb92d14SAndroid Build Coastguard Worker exit:
342*cfb92d14SAndroid Build Coastguard Worker return error;
343*cfb92d14SAndroid Build Coastguard Worker }
344*cfb92d14SAndroid Build Coastguard Worker
345*cfb92d14SAndroid Build Coastguard Worker /**
346*cfb92d14SAndroid Build Coastguard Worker * @cli coaps get
347*cfb92d14SAndroid Build Coastguard Worker * @code
348*cfb92d14SAndroid Build Coastguard Worker * coaps get test-resource
349*cfb92d14SAndroid Build Coastguard Worker * Done
350*cfb92d14SAndroid Build Coastguard Worker * @endcode
351*cfb92d14SAndroid Build Coastguard Worker * @code
352*cfb92d14SAndroid Build Coastguard Worker * coaps get test-resource block-1024
353*cfb92d14SAndroid Build Coastguard Worker * Done
354*cfb92d14SAndroid Build Coastguard Worker * @endcode
355*cfb92d14SAndroid Build Coastguard Worker * @cparam coaps get @ca{uri-path} [@ca{type}]
356*cfb92d14SAndroid Build Coastguard Worker * * `uri-path`: URI path of the resource.
357*cfb92d14SAndroid Build Coastguard Worker * * `type`:
358*cfb92d14SAndroid Build Coastguard Worker * * `con`: Confirmable
359*cfb92d14SAndroid Build Coastguard Worker * * `non-con`: Non-confirmable (default)
360*cfb92d14SAndroid Build Coastguard Worker * * `block-`: Use this option, followed by the block-wise value,
361*cfb92d14SAndroid Build Coastguard Worker * if the response should be transferred block-wise.
362*cfb92d14SAndroid Build Coastguard Worker * Valid values are: `block-16`, `block-32`, `block-64`, `block-128`,
363*cfb92d14SAndroid Build Coastguard Worker * `block-256`, `block-512`, or `block-1024`.
364*cfb92d14SAndroid Build Coastguard Worker * @par
365*cfb92d14SAndroid Build Coastguard Worker * Gets information about the specified CoAPS resource on the CoAPS server.
366*cfb92d14SAndroid Build Coastguard Worker * @moreinfo{@coaps}.
367*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])368*cfb92d14SAndroid Build Coastguard Worker template <> otError CoapSecure::Process<Cmd("get")>(Arg aArgs[]) { return ProcessRequest(aArgs, OT_COAP_CODE_GET); }
369*cfb92d14SAndroid Build Coastguard Worker
370*cfb92d14SAndroid Build Coastguard Worker /**
371*cfb92d14SAndroid Build Coastguard Worker * @cli coaps post
372*cfb92d14SAndroid Build Coastguard Worker * @code
373*cfb92d14SAndroid Build Coastguard Worker * coaps post test-resource con hellothere
374*cfb92d14SAndroid Build Coastguard Worker * Done
375*cfb92d14SAndroid Build Coastguard Worker * @endcode
376*cfb92d14SAndroid Build Coastguard Worker * @code
377*cfb92d14SAndroid Build Coastguard Worker * coaps post test-resource block-1024 10
378*cfb92d14SAndroid Build Coastguard Worker * Done
379*cfb92d14SAndroid Build Coastguard Worker * @endcode
380*cfb92d14SAndroid Build Coastguard Worker * @cparam @ca{uri-path} [@ca{type}] [@ca{payload}]
381*cfb92d14SAndroid Build Coastguard Worker * * `uri-path`: URI path of the resource.
382*cfb92d14SAndroid Build Coastguard Worker * * `type`:
383*cfb92d14SAndroid Build Coastguard Worker * * `con`: Confirmable
384*cfb92d14SAndroid Build Coastguard Worker * * `non-con`: Non-confirmable (default)
385*cfb92d14SAndroid Build Coastguard Worker * * `block-`: Use this option, followed by the block-wise value,
386*cfb92d14SAndroid Build Coastguard Worker * to send blocks with a randomly generated number of bytes for the payload.
387*cfb92d14SAndroid Build Coastguard Worker * Valid values are: `block-16`, `block-32`, `block-64`, `block-128`,
388*cfb92d14SAndroid Build Coastguard Worker * `block-256`, `block-512`, or `block-1024`.
389*cfb92d14SAndroid Build Coastguard Worker * * `payload`: CoAPS payload request, which if used is either a string
390*cfb92d14SAndroid Build Coastguard Worker * or an integer, depending on the `type`. If the `type` is `con` or `non-con`,
391*cfb92d14SAndroid Build Coastguard Worker * the payload parameter is optional. If you leave out the payload
392*cfb92d14SAndroid Build Coastguard Worker * parameter, an empty payload is sent. However, If you use the payload
393*cfb92d14SAndroid Build Coastguard Worker * parameter, its value must be a string, such as `hellothere`. If the
394*cfb92d14SAndroid Build Coastguard Worker * `type` is `block-`, the value of the payload parameter must be an
395*cfb92d14SAndroid Build Coastguard Worker * integer that specifies the number of blocks to send. The `block-` type
396*cfb92d14SAndroid Build Coastguard Worker * requires `OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE` to be set.
397*cfb92d14SAndroid Build Coastguard Worker * @par
398*cfb92d14SAndroid Build Coastguard Worker * Creates the specified CoAPS resource. @moreinfo{@coaps}.
399*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])400*cfb92d14SAndroid Build Coastguard Worker template <> otError CoapSecure::Process<Cmd("post")>(Arg aArgs[]) { return ProcessRequest(aArgs, OT_COAP_CODE_POST); }
401*cfb92d14SAndroid Build Coastguard Worker
402*cfb92d14SAndroid Build Coastguard Worker /**
403*cfb92d14SAndroid Build Coastguard Worker * @cli coaps put
404*cfb92d14SAndroid Build Coastguard Worker * @code
405*cfb92d14SAndroid Build Coastguard Worker * coaps put test-resource con hellothere
406*cfb92d14SAndroid Build Coastguard Worker * Done
407*cfb92d14SAndroid Build Coastguard Worker * @endcode
408*cfb92d14SAndroid Build Coastguard Worker * @code
409*cfb92d14SAndroid Build Coastguard Worker * coaps put test-resource block-1024 10
410*cfb92d14SAndroid Build Coastguard Worker * Done
411*cfb92d14SAndroid Build Coastguard Worker * @endcode
412*cfb92d14SAndroid Build Coastguard Worker * @cparam @ca{uri-path} [@ca{type}] [@ca{payload}]
413*cfb92d14SAndroid Build Coastguard Worker * * `uri-path`: URI path of the resource.
414*cfb92d14SAndroid Build Coastguard Worker * * `type`:
415*cfb92d14SAndroid Build Coastguard Worker * * `con`: Confirmable
416*cfb92d14SAndroid Build Coastguard Worker * * `non-con`: Non-confirmable (default)
417*cfb92d14SAndroid Build Coastguard Worker * * `block-`: Use this option, followed by the block-wise value,
418*cfb92d14SAndroid Build Coastguard Worker * to send blocks with a randomly generated number of bytes for the payload.
419*cfb92d14SAndroid Build Coastguard Worker * Valid values are: `block-16`, `block-32`, `block-64`, `block-128`,
420*cfb92d14SAndroid Build Coastguard Worker * `block-256`, `block-512`, or `block-1024`.
421*cfb92d14SAndroid Build Coastguard Worker * * `payload`: CoAPS payload request, which if used is either a string
422*cfb92d14SAndroid Build Coastguard Worker * or an integer, depending on the `type`. If the `type` is `con` or `non-con`,
423*cfb92d14SAndroid Build Coastguard Worker * the payload parameter is optional. If you leave out the payload
424*cfb92d14SAndroid Build Coastguard Worker * parameter, an empty payload is sent. However, If you use the payload
425*cfb92d14SAndroid Build Coastguard Worker * parameter, its value must be a string, such as `hellothere`. If the
426*cfb92d14SAndroid Build Coastguard Worker * `type` is `block-`, the value of the payload parameter must be an
427*cfb92d14SAndroid Build Coastguard Worker * integer that specifies the number of blocks to send. The `block-` type
428*cfb92d14SAndroid Build Coastguard Worker * requires `OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE` to be set.
429*cfb92d14SAndroid Build Coastguard Worker * @par
430*cfb92d14SAndroid Build Coastguard Worker * Modifies the specified CoAPS resource. @moreinfo{@coaps}.
431*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])432*cfb92d14SAndroid Build Coastguard Worker template <> otError CoapSecure::Process<Cmd("put")>(Arg aArgs[]) { return ProcessRequest(aArgs, OT_COAP_CODE_PUT); }
433*cfb92d14SAndroid Build Coastguard Worker
434*cfb92d14SAndroid Build Coastguard Worker /**
435*cfb92d14SAndroid Build Coastguard Worker * @cli coaps delete
436*cfb92d14SAndroid Build Coastguard Worker * @code
437*cfb92d14SAndroid Build Coastguard Worker * coaps delete test-resource con hellothere
438*cfb92d14SAndroid Build Coastguard Worker * Done
439*cfb92d14SAndroid Build Coastguard Worker * @endcode
440*cfb92d14SAndroid Build Coastguard Worker * @cparam coaps delete @ca{uri-path} [@ca{type}] [@ca{payload}]
441*cfb92d14SAndroid Build Coastguard Worker * * `uri-path`: URI path of the resource.
442*cfb92d14SAndroid Build Coastguard Worker * * `type`:
443*cfb92d14SAndroid Build Coastguard Worker * * `con`: Confirmable
444*cfb92d14SAndroid Build Coastguard Worker * * `non-con`: Non-confirmable (default)
445*cfb92d14SAndroid Build Coastguard Worker * * `payload`: CoAPS payload request.
446*cfb92d14SAndroid Build Coastguard Worker * @par
447*cfb92d14SAndroid Build Coastguard Worker * The CoAPS payload string to delete.
448*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])449*cfb92d14SAndroid Build Coastguard Worker template <> otError CoapSecure::Process<Cmd("delete")>(Arg aArgs[])
450*cfb92d14SAndroid Build Coastguard Worker {
451*cfb92d14SAndroid Build Coastguard Worker return ProcessRequest(aArgs, OT_COAP_CODE_DELETE);
452*cfb92d14SAndroid Build Coastguard Worker }
453*cfb92d14SAndroid Build Coastguard Worker
ProcessRequest(Arg aArgs[],otCoapCode aCoapCode)454*cfb92d14SAndroid Build Coastguard Worker otError CoapSecure::ProcessRequest(Arg aArgs[], otCoapCode aCoapCode)
455*cfb92d14SAndroid Build Coastguard Worker {
456*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
457*cfb92d14SAndroid Build Coastguard Worker otMessage *message = nullptr;
458*cfb92d14SAndroid Build Coastguard Worker uint16_t payloadLength = 0;
459*cfb92d14SAndroid Build Coastguard Worker
460*cfb92d14SAndroid Build Coastguard Worker // Default parameters
461*cfb92d14SAndroid Build Coastguard Worker char coapUri[kMaxUriLength];
462*cfb92d14SAndroid Build Coastguard Worker otCoapType coapType = OT_COAP_TYPE_NON_CONFIRMABLE;
463*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
464*cfb92d14SAndroid Build Coastguard Worker bool coapBlock = false;
465*cfb92d14SAndroid Build Coastguard Worker otCoapBlockSzx coapBlockSize = OT_COAP_OPTION_BLOCK_SZX_16;
466*cfb92d14SAndroid Build Coastguard Worker BlockType coapBlockType = (aCoapCode == OT_COAP_CODE_GET) ? kBlockType2 : kBlockType1;
467*cfb92d14SAndroid Build Coastguard Worker #endif
468*cfb92d14SAndroid Build Coastguard Worker
469*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(!aArgs[0].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
470*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(aArgs[0].GetLength() < sizeof(coapUri), error = OT_ERROR_INVALID_ARGS);
471*cfb92d14SAndroid Build Coastguard Worker strcpy(coapUri, aArgs[0].GetCString());
472*cfb92d14SAndroid Build Coastguard Worker
473*cfb92d14SAndroid Build Coastguard Worker if (!aArgs[1].IsEmpty())
474*cfb92d14SAndroid Build Coastguard Worker {
475*cfb92d14SAndroid Build Coastguard Worker if (aArgs[1] == "con")
476*cfb92d14SAndroid Build Coastguard Worker {
477*cfb92d14SAndroid Build Coastguard Worker coapType = OT_COAP_TYPE_CONFIRMABLE;
478*cfb92d14SAndroid Build Coastguard Worker }
479*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
480*cfb92d14SAndroid Build Coastguard Worker else if (aArgs[1] == "block-16")
481*cfb92d14SAndroid Build Coastguard Worker {
482*cfb92d14SAndroid Build Coastguard Worker coapType = OT_COAP_TYPE_CONFIRMABLE;
483*cfb92d14SAndroid Build Coastguard Worker coapBlock = true;
484*cfb92d14SAndroid Build Coastguard Worker coapBlockSize = OT_COAP_OPTION_BLOCK_SZX_16;
485*cfb92d14SAndroid Build Coastguard Worker }
486*cfb92d14SAndroid Build Coastguard Worker else if (aArgs[1] == "block-32")
487*cfb92d14SAndroid Build Coastguard Worker {
488*cfb92d14SAndroid Build Coastguard Worker coapType = OT_COAP_TYPE_CONFIRMABLE;
489*cfb92d14SAndroid Build Coastguard Worker coapBlock = true;
490*cfb92d14SAndroid Build Coastguard Worker coapBlockSize = OT_COAP_OPTION_BLOCK_SZX_32;
491*cfb92d14SAndroid Build Coastguard Worker }
492*cfb92d14SAndroid Build Coastguard Worker else if (aArgs[1] == "block-64")
493*cfb92d14SAndroid Build Coastguard Worker {
494*cfb92d14SAndroid Build Coastguard Worker coapType = OT_COAP_TYPE_CONFIRMABLE;
495*cfb92d14SAndroid Build Coastguard Worker coapBlock = true;
496*cfb92d14SAndroid Build Coastguard Worker coapBlockSize = OT_COAP_OPTION_BLOCK_SZX_64;
497*cfb92d14SAndroid Build Coastguard Worker }
498*cfb92d14SAndroid Build Coastguard Worker else if (aArgs[1] == "block-128")
499*cfb92d14SAndroid Build Coastguard Worker {
500*cfb92d14SAndroid Build Coastguard Worker coapType = OT_COAP_TYPE_CONFIRMABLE;
501*cfb92d14SAndroid Build Coastguard Worker coapBlock = true;
502*cfb92d14SAndroid Build Coastguard Worker coapBlockSize = OT_COAP_OPTION_BLOCK_SZX_128;
503*cfb92d14SAndroid Build Coastguard Worker }
504*cfb92d14SAndroid Build Coastguard Worker else if (aArgs[1] == "block-256")
505*cfb92d14SAndroid Build Coastguard Worker {
506*cfb92d14SAndroid Build Coastguard Worker coapType = OT_COAP_TYPE_CONFIRMABLE;
507*cfb92d14SAndroid Build Coastguard Worker coapBlock = true;
508*cfb92d14SAndroid Build Coastguard Worker coapBlockSize = OT_COAP_OPTION_BLOCK_SZX_256;
509*cfb92d14SAndroid Build Coastguard Worker }
510*cfb92d14SAndroid Build Coastguard Worker else if (aArgs[1] == "block-512")
511*cfb92d14SAndroid Build Coastguard Worker {
512*cfb92d14SAndroid Build Coastguard Worker coapType = OT_COAP_TYPE_CONFIRMABLE;
513*cfb92d14SAndroid Build Coastguard Worker coapBlock = true;
514*cfb92d14SAndroid Build Coastguard Worker coapBlockSize = OT_COAP_OPTION_BLOCK_SZX_512;
515*cfb92d14SAndroid Build Coastguard Worker }
516*cfb92d14SAndroid Build Coastguard Worker else if (aArgs[1] == "block-1024")
517*cfb92d14SAndroid Build Coastguard Worker {
518*cfb92d14SAndroid Build Coastguard Worker coapType = OT_COAP_TYPE_CONFIRMABLE;
519*cfb92d14SAndroid Build Coastguard Worker coapBlock = true;
520*cfb92d14SAndroid Build Coastguard Worker coapBlockSize = OT_COAP_OPTION_BLOCK_SZX_1024;
521*cfb92d14SAndroid Build Coastguard Worker }
522*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
523*cfb92d14SAndroid Build Coastguard Worker }
524*cfb92d14SAndroid Build Coastguard Worker
525*cfb92d14SAndroid Build Coastguard Worker message = otCoapNewMessage(GetInstancePtr(), nullptr);
526*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(message != nullptr, error = OT_ERROR_NO_BUFS);
527*cfb92d14SAndroid Build Coastguard Worker
528*cfb92d14SAndroid Build Coastguard Worker otCoapMessageInit(message, coapType, aCoapCode);
529*cfb92d14SAndroid Build Coastguard Worker otCoapMessageGenerateToken(message, OT_COAP_DEFAULT_TOKEN_LENGTH);
530*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = otCoapMessageAppendUriPathOptions(message, coapUri));
531*cfb92d14SAndroid Build Coastguard Worker
532*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
533*cfb92d14SAndroid Build Coastguard Worker if (coapBlock)
534*cfb92d14SAndroid Build Coastguard Worker {
535*cfb92d14SAndroid Build Coastguard Worker if (coapBlockType == kBlockType1)
536*cfb92d14SAndroid Build Coastguard Worker {
537*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = otCoapMessageAppendBlock1Option(message, 0, true, coapBlockSize));
538*cfb92d14SAndroid Build Coastguard Worker }
539*cfb92d14SAndroid Build Coastguard Worker else
540*cfb92d14SAndroid Build Coastguard Worker {
541*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = otCoapMessageAppendBlock2Option(message, 0, false, coapBlockSize));
542*cfb92d14SAndroid Build Coastguard Worker }
543*cfb92d14SAndroid Build Coastguard Worker }
544*cfb92d14SAndroid Build Coastguard Worker #endif
545*cfb92d14SAndroid Build Coastguard Worker
546*cfb92d14SAndroid Build Coastguard Worker if (!aArgs[2].IsEmpty())
547*cfb92d14SAndroid Build Coastguard Worker {
548*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
549*cfb92d14SAndroid Build Coastguard Worker if (coapBlock)
550*cfb92d14SAndroid Build Coastguard Worker {
551*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = aArgs[2].ParseAsUint32(mBlockCount));
552*cfb92d14SAndroid Build Coastguard Worker }
553*cfb92d14SAndroid Build Coastguard Worker else
554*cfb92d14SAndroid Build Coastguard Worker {
555*cfb92d14SAndroid Build Coastguard Worker #endif
556*cfb92d14SAndroid Build Coastguard Worker payloadLength = aArgs[2].GetLength();
557*cfb92d14SAndroid Build Coastguard Worker
558*cfb92d14SAndroid Build Coastguard Worker if (payloadLength > 0)
559*cfb92d14SAndroid Build Coastguard Worker {
560*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = otCoapMessageSetPayloadMarker(message));
561*cfb92d14SAndroid Build Coastguard Worker }
562*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
563*cfb92d14SAndroid Build Coastguard Worker }
564*cfb92d14SAndroid Build Coastguard Worker #endif
565*cfb92d14SAndroid Build Coastguard Worker }
566*cfb92d14SAndroid Build Coastguard Worker
567*cfb92d14SAndroid Build Coastguard Worker if (payloadLength > 0)
568*cfb92d14SAndroid Build Coastguard Worker {
569*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = otMessageAppend(message, aArgs[2].GetCString(), payloadLength));
570*cfb92d14SAndroid Build Coastguard Worker }
571*cfb92d14SAndroid Build Coastguard Worker
572*cfb92d14SAndroid Build Coastguard Worker if ((coapType == OT_COAP_TYPE_CONFIRMABLE) || (aCoapCode == OT_COAP_CODE_GET))
573*cfb92d14SAndroid Build Coastguard Worker {
574*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
575*cfb92d14SAndroid Build Coastguard Worker if (coapBlock)
576*cfb92d14SAndroid Build Coastguard Worker {
577*cfb92d14SAndroid Build Coastguard Worker error =
578*cfb92d14SAndroid Build Coastguard Worker otCoapSecureSendRequestBlockWise(GetInstancePtr(), message, &CoapSecure::HandleResponse, this,
579*cfb92d14SAndroid Build Coastguard Worker &CoapSecure::BlockwiseTransmitHook, &CoapSecure::BlockwiseReceiveHook);
580*cfb92d14SAndroid Build Coastguard Worker }
581*cfb92d14SAndroid Build Coastguard Worker else
582*cfb92d14SAndroid Build Coastguard Worker {
583*cfb92d14SAndroid Build Coastguard Worker #endif
584*cfb92d14SAndroid Build Coastguard Worker error = otCoapSecureSendRequest(GetInstancePtr(), message, &CoapSecure::HandleResponse, this);
585*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
586*cfb92d14SAndroid Build Coastguard Worker }
587*cfb92d14SAndroid Build Coastguard Worker #endif
588*cfb92d14SAndroid Build Coastguard Worker }
589*cfb92d14SAndroid Build Coastguard Worker else
590*cfb92d14SAndroid Build Coastguard Worker {
591*cfb92d14SAndroid Build Coastguard Worker error = otCoapSecureSendRequest(GetInstancePtr(), message, nullptr, nullptr);
592*cfb92d14SAndroid Build Coastguard Worker }
593*cfb92d14SAndroid Build Coastguard Worker
594*cfb92d14SAndroid Build Coastguard Worker exit:
595*cfb92d14SAndroid Build Coastguard Worker
596*cfb92d14SAndroid Build Coastguard Worker if ((error != OT_ERROR_NONE) && (message != nullptr))
597*cfb92d14SAndroid Build Coastguard Worker {
598*cfb92d14SAndroid Build Coastguard Worker otMessageFree(message);
599*cfb92d14SAndroid Build Coastguard Worker }
600*cfb92d14SAndroid Build Coastguard Worker
601*cfb92d14SAndroid Build Coastguard Worker return error;
602*cfb92d14SAndroid Build Coastguard Worker }
603*cfb92d14SAndroid Build Coastguard Worker
604*cfb92d14SAndroid Build Coastguard Worker /**
605*cfb92d14SAndroid Build Coastguard Worker * @cli coaps connect
606*cfb92d14SAndroid Build Coastguard Worker * @code
607*cfb92d14SAndroid Build Coastguard Worker * coaps connect fdde:ad00:beef:0:9903:14b:27e0:5744
608*cfb92d14SAndroid Build Coastguard Worker * Done
609*cfb92d14SAndroid Build Coastguard Worker * coaps connected
610*cfb92d14SAndroid Build Coastguard Worker * @endcode
611*cfb92d14SAndroid Build Coastguard Worker * @cparam coaps connect @ca{address}
612*cfb92d14SAndroid Build Coastguard Worker * The `address` parameter is the IPv6 address of the peer.
613*cfb92d14SAndroid Build Coastguard Worker * @par
614*cfb92d14SAndroid Build Coastguard Worker * Initializes a Datagram Transport Layer Security (DTLS) session with a peer.
615*cfb92d14SAndroid Build Coastguard Worker * @moreinfo{@coaps}.
616*cfb92d14SAndroid Build Coastguard Worker * @sa otCoapSecureConnect
617*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])618*cfb92d14SAndroid Build Coastguard Worker template <> otError CoapSecure::Process<Cmd("connect")>(Arg aArgs[])
619*cfb92d14SAndroid Build Coastguard Worker {
620*cfb92d14SAndroid Build Coastguard Worker otError error;
621*cfb92d14SAndroid Build Coastguard Worker otSockAddr sockaddr;
622*cfb92d14SAndroid Build Coastguard Worker
623*cfb92d14SAndroid Build Coastguard Worker ClearAllBytes(sockaddr);
624*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = aArgs[0].ParseAsIp6Address(sockaddr.mAddress));
625*cfb92d14SAndroid Build Coastguard Worker sockaddr.mPort = OT_DEFAULT_COAP_SECURE_PORT;
626*cfb92d14SAndroid Build Coastguard Worker
627*cfb92d14SAndroid Build Coastguard Worker if (!aArgs[1].IsEmpty())
628*cfb92d14SAndroid Build Coastguard Worker {
629*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = aArgs[1].ParseAsUint16(sockaddr.mPort));
630*cfb92d14SAndroid Build Coastguard Worker }
631*cfb92d14SAndroid Build Coastguard Worker
632*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = otCoapSecureConnect(GetInstancePtr(), &sockaddr, &CoapSecure::HandleConnectEvent, this));
633*cfb92d14SAndroid Build Coastguard Worker
634*cfb92d14SAndroid Build Coastguard Worker exit:
635*cfb92d14SAndroid Build Coastguard Worker return error;
636*cfb92d14SAndroid Build Coastguard Worker }
637*cfb92d14SAndroid Build Coastguard Worker
638*cfb92d14SAndroid Build Coastguard Worker /**
639*cfb92d14SAndroid Build Coastguard Worker * @cli coaps disconnect
640*cfb92d14SAndroid Build Coastguard Worker * @code
641*cfb92d14SAndroid Build Coastguard Worker * coaps disconnect
642*cfb92d14SAndroid Build Coastguard Worker * coaps disconnected
643*cfb92d14SAndroid Build Coastguard Worker * Done
644*cfb92d14SAndroid Build Coastguard Worker * @endcode
645*cfb92d14SAndroid Build Coastguard Worker * @par
646*cfb92d14SAndroid Build Coastguard Worker * Stops the DTLS session.
647*cfb92d14SAndroid Build Coastguard Worker * @sa otCoapSecureDisconnect
648*cfb92d14SAndroid Build Coastguard Worker */
Process(Arg aArgs[])649*cfb92d14SAndroid Build Coastguard Worker template <> otError CoapSecure::Process<Cmd("disconnect")>(Arg aArgs[])
650*cfb92d14SAndroid Build Coastguard Worker {
651*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aArgs);
652*cfb92d14SAndroid Build Coastguard Worker
653*cfb92d14SAndroid Build Coastguard Worker otCoapSecureDisconnect(GetInstancePtr());
654*cfb92d14SAndroid Build Coastguard Worker
655*cfb92d14SAndroid Build Coastguard Worker return OT_ERROR_NONE;
656*cfb92d14SAndroid Build Coastguard Worker }
657*cfb92d14SAndroid Build Coastguard Worker
658*cfb92d14SAndroid Build Coastguard Worker /**
659*cfb92d14SAndroid Build Coastguard Worker * <!--- This tag is before the IF statement so that Doxygen imports the command. --->
660*cfb92d14SAndroid Build Coastguard Worker * @cli coaps psk
661*cfb92d14SAndroid Build Coastguard Worker * @code
662*cfb92d14SAndroid Build Coastguard Worker * coaps psk 1234 key1
663*cfb92d14SAndroid Build Coastguard Worker * Done
664*cfb92d14SAndroid Build Coastguard Worker * @endcode
665*cfb92d14SAndroid Build Coastguard Worker * @cparam coaps psk @ca{psk-value} @ca{psk-id}
666*cfb92d14SAndroid Build Coastguard Worker * * `psk-value`: The pre-shared key
667*cfb92d14SAndroid Build Coastguard Worker * * `psk-id`: The pre-shared key identifier.
668*cfb92d14SAndroid Build Coastguard Worker * @par
669*cfb92d14SAndroid Build Coastguard Worker * Sets the pre-shared key (PSK) and cipher suite DTLS_PSK_WITH_AES_128_CCM_8.
670*cfb92d14SAndroid Build Coastguard Worker * @note This command requires the build-time feature
671*cfb92d14SAndroid Build Coastguard Worker * `MBEDTLS_KEY_EXCHANGE_PSK_ENABLED` to be enabled.
672*cfb92d14SAndroid Build Coastguard Worker * @sa #otCoapSecureSetPsk
673*cfb92d14SAndroid Build Coastguard Worker */
674*cfb92d14SAndroid Build Coastguard Worker #ifdef MBEDTLS_KEY_EXCHANGE_PSK_ENABLED
Process(Arg aArgs[])675*cfb92d14SAndroid Build Coastguard Worker template <> otError CoapSecure::Process<Cmd("psk")>(Arg aArgs[])
676*cfb92d14SAndroid Build Coastguard Worker {
677*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
678*cfb92d14SAndroid Build Coastguard Worker uint16_t length;
679*cfb92d14SAndroid Build Coastguard Worker
680*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(!aArgs[1].IsEmpty(), error = OT_ERROR_INVALID_ARGS);
681*cfb92d14SAndroid Build Coastguard Worker
682*cfb92d14SAndroid Build Coastguard Worker length = aArgs[0].GetLength();
683*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(length <= sizeof(mPsk), error = OT_ERROR_INVALID_ARGS);
684*cfb92d14SAndroid Build Coastguard Worker mPskLength = static_cast<uint8_t>(length);
685*cfb92d14SAndroid Build Coastguard Worker memcpy(mPsk, aArgs[0].GetCString(), mPskLength);
686*cfb92d14SAndroid Build Coastguard Worker
687*cfb92d14SAndroid Build Coastguard Worker length = aArgs[1].GetLength();
688*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(length <= sizeof(mPskId), error = OT_ERROR_INVALID_ARGS);
689*cfb92d14SAndroid Build Coastguard Worker mPskIdLength = static_cast<uint8_t>(length);
690*cfb92d14SAndroid Build Coastguard Worker memcpy(mPskId, aArgs[1].GetCString(), mPskIdLength);
691*cfb92d14SAndroid Build Coastguard Worker
692*cfb92d14SAndroid Build Coastguard Worker otCoapSecureSetPsk(GetInstancePtr(), mPsk, mPskLength, mPskId, mPskIdLength);
693*cfb92d14SAndroid Build Coastguard Worker mUseCertificate = false;
694*cfb92d14SAndroid Build Coastguard Worker
695*cfb92d14SAndroid Build Coastguard Worker exit:
696*cfb92d14SAndroid Build Coastguard Worker return error;
697*cfb92d14SAndroid Build Coastguard Worker }
698*cfb92d14SAndroid Build Coastguard Worker #endif // MBEDTLS_KEY_EXCHANGE_PSK_ENABLED
699*cfb92d14SAndroid Build Coastguard Worker
700*cfb92d14SAndroid Build Coastguard Worker /**
701*cfb92d14SAndroid Build Coastguard Worker * <!--- This tag is before the IF statement so that Doxygen imports the command. --->
702*cfb92d14SAndroid Build Coastguard Worker * @cli coaps x509
703*cfb92d14SAndroid Build Coastguard Worker * @code
704*cfb92d14SAndroid Build Coastguard Worker * coaps x509
705*cfb92d14SAndroid Build Coastguard Worker * Done
706*cfb92d14SAndroid Build Coastguard Worker * @endcode
707*cfb92d14SAndroid Build Coastguard Worker * @par
708*cfb92d14SAndroid Build Coastguard Worker * Sets the X509 certificate of the local device with the corresponding private key for
709*cfb92d14SAndroid Build Coastguard Worker * the DTLS session with `DTLS_ECDHE_ECDSA_WITH_AES_128_CCM_8`.
710*cfb92d14SAndroid Build Coastguard Worker * @note This command requires `MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED=1`
711*cfb92d14SAndroid Build Coastguard Worker * to be enabled.
712*cfb92d14SAndroid Build Coastguard Worker * The X.509 certificate is stored in the location: `src/cli/x509_cert_key.hpp`.
713*cfb92d14SAndroid Build Coastguard Worker * @sa otCoapSecureSetCertificate
714*cfb92d14SAndroid Build Coastguard Worker * @sa otCoapSecureSetCaCertificateChain
715*cfb92d14SAndroid Build Coastguard Worker */
716*cfb92d14SAndroid Build Coastguard Worker #ifdef MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
Process(Arg aArgs[])717*cfb92d14SAndroid Build Coastguard Worker template <> otError CoapSecure::Process<Cmd("x509")>(Arg aArgs[])
718*cfb92d14SAndroid Build Coastguard Worker {
719*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aArgs);
720*cfb92d14SAndroid Build Coastguard Worker
721*cfb92d14SAndroid Build Coastguard Worker otCoapSecureSetCertificate(GetInstancePtr(), reinterpret_cast<const uint8_t *>(OT_CLI_COAPS_X509_CERT),
722*cfb92d14SAndroid Build Coastguard Worker sizeof(OT_CLI_COAPS_X509_CERT), reinterpret_cast<const uint8_t *>(OT_CLI_COAPS_PRIV_KEY),
723*cfb92d14SAndroid Build Coastguard Worker sizeof(OT_CLI_COAPS_PRIV_KEY));
724*cfb92d14SAndroid Build Coastguard Worker
725*cfb92d14SAndroid Build Coastguard Worker otCoapSecureSetCaCertificateChain(GetInstancePtr(),
726*cfb92d14SAndroid Build Coastguard Worker reinterpret_cast<const uint8_t *>(OT_CLI_COAPS_TRUSTED_ROOT_CERTIFICATE),
727*cfb92d14SAndroid Build Coastguard Worker sizeof(OT_CLI_COAPS_TRUSTED_ROOT_CERTIFICATE));
728*cfb92d14SAndroid Build Coastguard Worker mUseCertificate = true;
729*cfb92d14SAndroid Build Coastguard Worker
730*cfb92d14SAndroid Build Coastguard Worker return OT_ERROR_NONE;
731*cfb92d14SAndroid Build Coastguard Worker }
732*cfb92d14SAndroid Build Coastguard Worker #endif
733*cfb92d14SAndroid Build Coastguard Worker
Process(Arg aArgs[])734*cfb92d14SAndroid Build Coastguard Worker otError CoapSecure::Process(Arg aArgs[])
735*cfb92d14SAndroid Build Coastguard Worker {
736*cfb92d14SAndroid Build Coastguard Worker #define CmdEntry(aCommandString) \
737*cfb92d14SAndroid Build Coastguard Worker { \
738*cfb92d14SAndroid Build Coastguard Worker aCommandString, &CoapSecure::Process<Cmd(aCommandString)> \
739*cfb92d14SAndroid Build Coastguard Worker }
740*cfb92d14SAndroid Build Coastguard Worker
741*cfb92d14SAndroid Build Coastguard Worker static constexpr Command kCommands[] = {
742*cfb92d14SAndroid Build Coastguard Worker CmdEntry("connect"), CmdEntry("delete"), CmdEntry("disconnect"), CmdEntry("get"),
743*cfb92d14SAndroid Build Coastguard Worker CmdEntry("isclosed"), CmdEntry("isconnactive"), CmdEntry("isconnected"), CmdEntry("post"),
744*cfb92d14SAndroid Build Coastguard Worker #ifdef MBEDTLS_KEY_EXCHANGE_PSK_ENABLED
745*cfb92d14SAndroid Build Coastguard Worker CmdEntry("psk"),
746*cfb92d14SAndroid Build Coastguard Worker #endif
747*cfb92d14SAndroid Build Coastguard Worker CmdEntry("put"), CmdEntry("resource"), CmdEntry("set"), CmdEntry("start"),
748*cfb92d14SAndroid Build Coastguard Worker CmdEntry("stop"),
749*cfb92d14SAndroid Build Coastguard Worker #ifdef MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
750*cfb92d14SAndroid Build Coastguard Worker CmdEntry("x509"),
751*cfb92d14SAndroid Build Coastguard Worker #endif
752*cfb92d14SAndroid Build Coastguard Worker };
753*cfb92d14SAndroid Build Coastguard Worker
754*cfb92d14SAndroid Build Coastguard Worker #undef CmdEntry
755*cfb92d14SAndroid Build Coastguard Worker
756*cfb92d14SAndroid Build Coastguard Worker static_assert(BinarySearch::IsSorted(kCommands), "kCommands is not sorted");
757*cfb92d14SAndroid Build Coastguard Worker
758*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_INVALID_COMMAND;
759*cfb92d14SAndroid Build Coastguard Worker const Command *command;
760*cfb92d14SAndroid Build Coastguard Worker
761*cfb92d14SAndroid Build Coastguard Worker if (aArgs[0].IsEmpty() || (aArgs[0] == "help"))
762*cfb92d14SAndroid Build Coastguard Worker {
763*cfb92d14SAndroid Build Coastguard Worker OutputCommandTable(kCommands);
764*cfb92d14SAndroid Build Coastguard Worker ExitNow(error = aArgs[0].IsEmpty() ? OT_ERROR_INVALID_ARGS : OT_ERROR_NONE);
765*cfb92d14SAndroid Build Coastguard Worker }
766*cfb92d14SAndroid Build Coastguard Worker
767*cfb92d14SAndroid Build Coastguard Worker command = BinarySearch::Find(aArgs[0].GetCString(), kCommands);
768*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(command != nullptr);
769*cfb92d14SAndroid Build Coastguard Worker
770*cfb92d14SAndroid Build Coastguard Worker error = (this->*command->mHandler)(aArgs + 1);
771*cfb92d14SAndroid Build Coastguard Worker
772*cfb92d14SAndroid Build Coastguard Worker exit:
773*cfb92d14SAndroid Build Coastguard Worker return error;
774*cfb92d14SAndroid Build Coastguard Worker }
775*cfb92d14SAndroid Build Coastguard Worker
Stop(void)776*cfb92d14SAndroid Build Coastguard Worker void CoapSecure::Stop(void)
777*cfb92d14SAndroid Build Coastguard Worker {
778*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
779*cfb92d14SAndroid Build Coastguard Worker otCoapRemoveBlockWiseResource(GetInstancePtr(), &mResource);
780*cfb92d14SAndroid Build Coastguard Worker #else
781*cfb92d14SAndroid Build Coastguard Worker otCoapRemoveResource(GetInstancePtr(), &mResource);
782*cfb92d14SAndroid Build Coastguard Worker #endif
783*cfb92d14SAndroid Build Coastguard Worker otCoapSecureStop(GetInstancePtr());
784*cfb92d14SAndroid Build Coastguard Worker }
785*cfb92d14SAndroid Build Coastguard Worker
HandleConnectEvent(otCoapSecureConnectEvent aEvent,void * aContext)786*cfb92d14SAndroid Build Coastguard Worker void CoapSecure::HandleConnectEvent(otCoapSecureConnectEvent aEvent, void *aContext)
787*cfb92d14SAndroid Build Coastguard Worker {
788*cfb92d14SAndroid Build Coastguard Worker static_cast<CoapSecure *>(aContext)->HandleConnectEvent(aEvent);
789*cfb92d14SAndroid Build Coastguard Worker }
790*cfb92d14SAndroid Build Coastguard Worker
HandleConnectEvent(otCoapSecureConnectEvent aEvent)791*cfb92d14SAndroid Build Coastguard Worker void CoapSecure::HandleConnectEvent(otCoapSecureConnectEvent aEvent)
792*cfb92d14SAndroid Build Coastguard Worker {
793*cfb92d14SAndroid Build Coastguard Worker if (aEvent == OT_COAP_SECURE_CONNECTED)
794*cfb92d14SAndroid Build Coastguard Worker {
795*cfb92d14SAndroid Build Coastguard Worker OutputLine("coaps connected");
796*cfb92d14SAndroid Build Coastguard Worker }
797*cfb92d14SAndroid Build Coastguard Worker else
798*cfb92d14SAndroid Build Coastguard Worker {
799*cfb92d14SAndroid Build Coastguard Worker OutputLine("coaps disconnected");
800*cfb92d14SAndroid Build Coastguard Worker
801*cfb92d14SAndroid Build Coastguard Worker if (mShutdownFlag)
802*cfb92d14SAndroid Build Coastguard Worker {
803*cfb92d14SAndroid Build Coastguard Worker Stop();
804*cfb92d14SAndroid Build Coastguard Worker mShutdownFlag = false;
805*cfb92d14SAndroid Build Coastguard Worker }
806*cfb92d14SAndroid Build Coastguard Worker }
807*cfb92d14SAndroid Build Coastguard Worker }
808*cfb92d14SAndroid Build Coastguard Worker
HandleRequest(void * aContext,otMessage * aMessage,const otMessageInfo * aMessageInfo)809*cfb92d14SAndroid Build Coastguard Worker void CoapSecure::HandleRequest(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo)
810*cfb92d14SAndroid Build Coastguard Worker {
811*cfb92d14SAndroid Build Coastguard Worker static_cast<CoapSecure *>(aContext)->HandleRequest(aMessage, aMessageInfo);
812*cfb92d14SAndroid Build Coastguard Worker }
813*cfb92d14SAndroid Build Coastguard Worker
HandleRequest(otMessage * aMessage,const otMessageInfo * aMessageInfo)814*cfb92d14SAndroid Build Coastguard Worker void CoapSecure::HandleRequest(otMessage *aMessage, const otMessageInfo *aMessageInfo)
815*cfb92d14SAndroid Build Coastguard Worker {
816*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
817*cfb92d14SAndroid Build Coastguard Worker otMessage *responseMessage = nullptr;
818*cfb92d14SAndroid Build Coastguard Worker otCoapCode responseCode = OT_COAP_CODE_EMPTY;
819*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
820*cfb92d14SAndroid Build Coastguard Worker uint64_t blockValue = 0;
821*cfb92d14SAndroid Build Coastguard Worker bool blockPresent = false;
822*cfb92d14SAndroid Build Coastguard Worker otCoapOptionIterator iterator;
823*cfb92d14SAndroid Build Coastguard Worker #endif
824*cfb92d14SAndroid Build Coastguard Worker
825*cfb92d14SAndroid Build Coastguard Worker OutputFormat("coaps request from ");
826*cfb92d14SAndroid Build Coastguard Worker OutputIp6Address(aMessageInfo->mPeerAddr);
827*cfb92d14SAndroid Build Coastguard Worker OutputFormat(" ");
828*cfb92d14SAndroid Build Coastguard Worker
829*cfb92d14SAndroid Build Coastguard Worker switch (otCoapMessageGetCode(aMessage))
830*cfb92d14SAndroid Build Coastguard Worker {
831*cfb92d14SAndroid Build Coastguard Worker case OT_COAP_CODE_GET:
832*cfb92d14SAndroid Build Coastguard Worker OutputFormat("GET");
833*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
834*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = otCoapOptionIteratorInit(&iterator, aMessage));
835*cfb92d14SAndroid Build Coastguard Worker if (otCoapOptionIteratorGetFirstOptionMatching(&iterator, OT_COAP_OPTION_BLOCK2) != nullptr)
836*cfb92d14SAndroid Build Coastguard Worker {
837*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = otCoapOptionIteratorGetOptionUintValue(&iterator, &blockValue));
838*cfb92d14SAndroid Build Coastguard Worker blockPresent = true;
839*cfb92d14SAndroid Build Coastguard Worker }
840*cfb92d14SAndroid Build Coastguard Worker #endif
841*cfb92d14SAndroid Build Coastguard Worker break;
842*cfb92d14SAndroid Build Coastguard Worker
843*cfb92d14SAndroid Build Coastguard Worker case OT_COAP_CODE_DELETE:
844*cfb92d14SAndroid Build Coastguard Worker OutputFormat("DELETE");
845*cfb92d14SAndroid Build Coastguard Worker break;
846*cfb92d14SAndroid Build Coastguard Worker
847*cfb92d14SAndroid Build Coastguard Worker case OT_COAP_CODE_PUT:
848*cfb92d14SAndroid Build Coastguard Worker OutputFormat("PUT");
849*cfb92d14SAndroid Build Coastguard Worker break;
850*cfb92d14SAndroid Build Coastguard Worker
851*cfb92d14SAndroid Build Coastguard Worker case OT_COAP_CODE_POST:
852*cfb92d14SAndroid Build Coastguard Worker OutputFormat("POST");
853*cfb92d14SAndroid Build Coastguard Worker break;
854*cfb92d14SAndroid Build Coastguard Worker
855*cfb92d14SAndroid Build Coastguard Worker default:
856*cfb92d14SAndroid Build Coastguard Worker OutputLine("Undefined");
857*cfb92d14SAndroid Build Coastguard Worker return;
858*cfb92d14SAndroid Build Coastguard Worker }
859*cfb92d14SAndroid Build Coastguard Worker
860*cfb92d14SAndroid Build Coastguard Worker PrintPayload(aMessage);
861*cfb92d14SAndroid Build Coastguard Worker
862*cfb92d14SAndroid Build Coastguard Worker if ((otCoapMessageGetType(aMessage) == OT_COAP_TYPE_CONFIRMABLE) ||
863*cfb92d14SAndroid Build Coastguard Worker (otCoapMessageGetCode(aMessage) == OT_COAP_CODE_GET))
864*cfb92d14SAndroid Build Coastguard Worker {
865*cfb92d14SAndroid Build Coastguard Worker if (otCoapMessageGetCode(aMessage) == OT_COAP_CODE_GET)
866*cfb92d14SAndroid Build Coastguard Worker {
867*cfb92d14SAndroid Build Coastguard Worker responseCode = OT_COAP_CODE_CONTENT;
868*cfb92d14SAndroid Build Coastguard Worker }
869*cfb92d14SAndroid Build Coastguard Worker else
870*cfb92d14SAndroid Build Coastguard Worker {
871*cfb92d14SAndroid Build Coastguard Worker responseCode = OT_COAP_CODE_VALID;
872*cfb92d14SAndroid Build Coastguard Worker }
873*cfb92d14SAndroid Build Coastguard Worker
874*cfb92d14SAndroid Build Coastguard Worker responseMessage = otCoapNewMessage(GetInstancePtr(), nullptr);
875*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(responseMessage != nullptr, error = OT_ERROR_NO_BUFS);
876*cfb92d14SAndroid Build Coastguard Worker
877*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(
878*cfb92d14SAndroid Build Coastguard Worker error = otCoapMessageInitResponse(responseMessage, aMessage, OT_COAP_TYPE_ACKNOWLEDGMENT, responseCode));
879*cfb92d14SAndroid Build Coastguard Worker
880*cfb92d14SAndroid Build Coastguard Worker if (otCoapMessageGetCode(aMessage) == OT_COAP_CODE_GET)
881*cfb92d14SAndroid Build Coastguard Worker {
882*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
883*cfb92d14SAndroid Build Coastguard Worker if (blockPresent)
884*cfb92d14SAndroid Build Coastguard Worker {
885*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = otCoapMessageAppendBlock2Option(responseMessage,
886*cfb92d14SAndroid Build Coastguard Worker static_cast<uint32_t>(blockValue >> 4), true,
887*cfb92d14SAndroid Build Coastguard Worker static_cast<otCoapBlockSzx>(blockValue & 0x7)));
888*cfb92d14SAndroid Build Coastguard Worker }
889*cfb92d14SAndroid Build Coastguard Worker #endif
890*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = otCoapMessageSetPayloadMarker(responseMessage));
891*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
892*cfb92d14SAndroid Build Coastguard Worker if (!blockPresent)
893*cfb92d14SAndroid Build Coastguard Worker {
894*cfb92d14SAndroid Build Coastguard Worker #endif
895*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = otMessageAppend(responseMessage, &mResourceContent,
896*cfb92d14SAndroid Build Coastguard Worker static_cast<uint16_t>(strlen(mResourceContent))));
897*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
898*cfb92d14SAndroid Build Coastguard Worker }
899*cfb92d14SAndroid Build Coastguard Worker #endif
900*cfb92d14SAndroid Build Coastguard Worker }
901*cfb92d14SAndroid Build Coastguard Worker
902*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
903*cfb92d14SAndroid Build Coastguard Worker if (blockPresent)
904*cfb92d14SAndroid Build Coastguard Worker {
905*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = otCoapSecureSendResponseBlockWise(GetInstancePtr(), responseMessage, aMessageInfo,
906*cfb92d14SAndroid Build Coastguard Worker this, mResource.mTransmitHook));
907*cfb92d14SAndroid Build Coastguard Worker }
908*cfb92d14SAndroid Build Coastguard Worker else
909*cfb92d14SAndroid Build Coastguard Worker {
910*cfb92d14SAndroid Build Coastguard Worker #endif
911*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = otCoapSecureSendResponse(GetInstancePtr(), responseMessage, aMessageInfo));
912*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
913*cfb92d14SAndroid Build Coastguard Worker }
914*cfb92d14SAndroid Build Coastguard Worker #endif
915*cfb92d14SAndroid Build Coastguard Worker }
916*cfb92d14SAndroid Build Coastguard Worker
917*cfb92d14SAndroid Build Coastguard Worker exit:
918*cfb92d14SAndroid Build Coastguard Worker
919*cfb92d14SAndroid Build Coastguard Worker if (error != OT_ERROR_NONE)
920*cfb92d14SAndroid Build Coastguard Worker {
921*cfb92d14SAndroid Build Coastguard Worker if (responseMessage != nullptr)
922*cfb92d14SAndroid Build Coastguard Worker {
923*cfb92d14SAndroid Build Coastguard Worker OutputLine("coaps send response error %d: %s", error, otThreadErrorToString(error));
924*cfb92d14SAndroid Build Coastguard Worker otMessageFree(responseMessage);
925*cfb92d14SAndroid Build Coastguard Worker }
926*cfb92d14SAndroid Build Coastguard Worker }
927*cfb92d14SAndroid Build Coastguard Worker else if (responseCode >= OT_COAP_CODE_RESPONSE_MIN)
928*cfb92d14SAndroid Build Coastguard Worker {
929*cfb92d14SAndroid Build Coastguard Worker OutputLine("coaps response sent");
930*cfb92d14SAndroid Build Coastguard Worker }
931*cfb92d14SAndroid Build Coastguard Worker }
932*cfb92d14SAndroid Build Coastguard Worker
HandleResponse(void * aContext,otMessage * aMessage,const otMessageInfo * aMessageInfo,otError aError)933*cfb92d14SAndroid Build Coastguard Worker void CoapSecure::HandleResponse(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo, otError aError)
934*cfb92d14SAndroid Build Coastguard Worker {
935*cfb92d14SAndroid Build Coastguard Worker static_cast<CoapSecure *>(aContext)->HandleResponse(aMessage, aMessageInfo, aError);
936*cfb92d14SAndroid Build Coastguard Worker }
937*cfb92d14SAndroid Build Coastguard Worker
HandleResponse(otMessage * aMessage,const otMessageInfo * aMessageInfo,otError aError)938*cfb92d14SAndroid Build Coastguard Worker void CoapSecure::HandleResponse(otMessage *aMessage, const otMessageInfo *aMessageInfo, otError aError)
939*cfb92d14SAndroid Build Coastguard Worker {
940*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMessageInfo);
941*cfb92d14SAndroid Build Coastguard Worker
942*cfb92d14SAndroid Build Coastguard Worker if (aError != OT_ERROR_NONE)
943*cfb92d14SAndroid Build Coastguard Worker {
944*cfb92d14SAndroid Build Coastguard Worker OutputLine("coaps receive response error %d: %s", aError, otThreadErrorToString(aError));
945*cfb92d14SAndroid Build Coastguard Worker }
946*cfb92d14SAndroid Build Coastguard Worker else
947*cfb92d14SAndroid Build Coastguard Worker {
948*cfb92d14SAndroid Build Coastguard Worker OutputFormat("coaps response from ");
949*cfb92d14SAndroid Build Coastguard Worker OutputIp6Address(aMessageInfo->mPeerAddr);
950*cfb92d14SAndroid Build Coastguard Worker
951*cfb92d14SAndroid Build Coastguard Worker PrintPayload(aMessage);
952*cfb92d14SAndroid Build Coastguard Worker }
953*cfb92d14SAndroid Build Coastguard Worker }
954*cfb92d14SAndroid Build Coastguard Worker
955*cfb92d14SAndroid Build Coastguard Worker #if CLI_COAP_SECURE_USE_COAP_DEFAULT_HANDLER
DefaultHandler(void * aContext,otMessage * aMessage,const otMessageInfo * aMessageInfo)956*cfb92d14SAndroid Build Coastguard Worker void CoapSecure::DefaultHandler(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo)
957*cfb92d14SAndroid Build Coastguard Worker {
958*cfb92d14SAndroid Build Coastguard Worker static_cast<CoapSecure *>(aContext)->DefaultHandler(aMessage, aMessageInfo);
959*cfb92d14SAndroid Build Coastguard Worker }
960*cfb92d14SAndroid Build Coastguard Worker
DefaultHandler(otMessage * aMessage,const otMessageInfo * aMessageInfo)961*cfb92d14SAndroid Build Coastguard Worker void CoapSecure::DefaultHandler(otMessage *aMessage, const otMessageInfo *aMessageInfo)
962*cfb92d14SAndroid Build Coastguard Worker {
963*cfb92d14SAndroid Build Coastguard Worker otError error = OT_ERROR_NONE;
964*cfb92d14SAndroid Build Coastguard Worker otMessage *responseMessage = nullptr;
965*cfb92d14SAndroid Build Coastguard Worker
966*cfb92d14SAndroid Build Coastguard Worker if ((otCoapMessageGetType(aMessage) == OT_COAP_TYPE_CONFIRMABLE) ||
967*cfb92d14SAndroid Build Coastguard Worker (otCoapMessageGetCode(aMessage) == OT_COAP_CODE_GET))
968*cfb92d14SAndroid Build Coastguard Worker {
969*cfb92d14SAndroid Build Coastguard Worker responseMessage = otCoapNewMessage(GetInstancePtr(), nullptr);
970*cfb92d14SAndroid Build Coastguard Worker VerifyOrExit(responseMessage != nullptr, error = OT_ERROR_NO_BUFS);
971*cfb92d14SAndroid Build Coastguard Worker
972*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = otCoapMessageInitResponse(responseMessage, aMessage, OT_COAP_TYPE_NON_CONFIRMABLE,
973*cfb92d14SAndroid Build Coastguard Worker OT_COAP_CODE_NOT_FOUND));
974*cfb92d14SAndroid Build Coastguard Worker
975*cfb92d14SAndroid Build Coastguard Worker SuccessOrExit(error = otCoapSecureSendResponse(GetInstancePtr(), responseMessage, aMessageInfo));
976*cfb92d14SAndroid Build Coastguard Worker }
977*cfb92d14SAndroid Build Coastguard Worker
978*cfb92d14SAndroid Build Coastguard Worker exit:
979*cfb92d14SAndroid Build Coastguard Worker if (error != OT_ERROR_NONE && responseMessage != nullptr)
980*cfb92d14SAndroid Build Coastguard Worker {
981*cfb92d14SAndroid Build Coastguard Worker otMessageFree(responseMessage);
982*cfb92d14SAndroid Build Coastguard Worker }
983*cfb92d14SAndroid Build Coastguard Worker }
984*cfb92d14SAndroid Build Coastguard Worker #endif // CLI_COAP_SECURE_USE_COAP_DEFAULT_HANDLER
985*cfb92d14SAndroid Build Coastguard Worker
986*cfb92d14SAndroid Build Coastguard Worker #if OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
BlockwiseReceiveHook(void * aContext,const uint8_t * aBlock,uint32_t aPosition,uint16_t aBlockLength,bool aMore,uint32_t aTotalLength)987*cfb92d14SAndroid Build Coastguard Worker otError CoapSecure::BlockwiseReceiveHook(void *aContext,
988*cfb92d14SAndroid Build Coastguard Worker const uint8_t *aBlock,
989*cfb92d14SAndroid Build Coastguard Worker uint32_t aPosition,
990*cfb92d14SAndroid Build Coastguard Worker uint16_t aBlockLength,
991*cfb92d14SAndroid Build Coastguard Worker bool aMore,
992*cfb92d14SAndroid Build Coastguard Worker uint32_t aTotalLength)
993*cfb92d14SAndroid Build Coastguard Worker {
994*cfb92d14SAndroid Build Coastguard Worker return static_cast<CoapSecure *>(aContext)->BlockwiseReceiveHook(aBlock, aPosition, aBlockLength, aMore,
995*cfb92d14SAndroid Build Coastguard Worker aTotalLength);
996*cfb92d14SAndroid Build Coastguard Worker }
997*cfb92d14SAndroid Build Coastguard Worker
BlockwiseReceiveHook(const uint8_t * aBlock,uint32_t aPosition,uint16_t aBlockLength,bool aMore,uint32_t aTotalLength)998*cfb92d14SAndroid Build Coastguard Worker otError CoapSecure::BlockwiseReceiveHook(const uint8_t *aBlock,
999*cfb92d14SAndroid Build Coastguard Worker uint32_t aPosition,
1000*cfb92d14SAndroid Build Coastguard Worker uint16_t aBlockLength,
1001*cfb92d14SAndroid Build Coastguard Worker bool aMore,
1002*cfb92d14SAndroid Build Coastguard Worker uint32_t aTotalLength)
1003*cfb92d14SAndroid Build Coastguard Worker {
1004*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aMore);
1005*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aTotalLength);
1006*cfb92d14SAndroid Build Coastguard Worker
1007*cfb92d14SAndroid Build Coastguard Worker OutputLine("received block: Num %i Len %i", aPosition / aBlockLength, aBlockLength);
1008*cfb92d14SAndroid Build Coastguard Worker
1009*cfb92d14SAndroid Build Coastguard Worker for (uint16_t i = 0; i < aBlockLength / 16; i++)
1010*cfb92d14SAndroid Build Coastguard Worker {
1011*cfb92d14SAndroid Build Coastguard Worker OutputBytesLine(&aBlock[i * 16], 16);
1012*cfb92d14SAndroid Build Coastguard Worker }
1013*cfb92d14SAndroid Build Coastguard Worker
1014*cfb92d14SAndroid Build Coastguard Worker return OT_ERROR_NONE;
1015*cfb92d14SAndroid Build Coastguard Worker }
1016*cfb92d14SAndroid Build Coastguard Worker
BlockwiseTransmitHook(void * aContext,uint8_t * aBlock,uint32_t aPosition,uint16_t * aBlockLength,bool * aMore)1017*cfb92d14SAndroid Build Coastguard Worker otError CoapSecure::BlockwiseTransmitHook(void *aContext,
1018*cfb92d14SAndroid Build Coastguard Worker uint8_t *aBlock,
1019*cfb92d14SAndroid Build Coastguard Worker uint32_t aPosition,
1020*cfb92d14SAndroid Build Coastguard Worker uint16_t *aBlockLength,
1021*cfb92d14SAndroid Build Coastguard Worker bool *aMore)
1022*cfb92d14SAndroid Build Coastguard Worker {
1023*cfb92d14SAndroid Build Coastguard Worker return static_cast<CoapSecure *>(aContext)->BlockwiseTransmitHook(aBlock, aPosition, aBlockLength, aMore);
1024*cfb92d14SAndroid Build Coastguard Worker }
1025*cfb92d14SAndroid Build Coastguard Worker
BlockwiseTransmitHook(uint8_t * aBlock,uint32_t aPosition,uint16_t * aBlockLength,bool * aMore)1026*cfb92d14SAndroid Build Coastguard Worker otError CoapSecure::BlockwiseTransmitHook(uint8_t *aBlock, uint32_t aPosition, uint16_t *aBlockLength, bool *aMore)
1027*cfb92d14SAndroid Build Coastguard Worker {
1028*cfb92d14SAndroid Build Coastguard Worker static uint32_t blockCount = 0;
1029*cfb92d14SAndroid Build Coastguard Worker OT_UNUSED_VARIABLE(aPosition);
1030*cfb92d14SAndroid Build Coastguard Worker
1031*cfb92d14SAndroid Build Coastguard Worker // Send a random payload
1032*cfb92d14SAndroid Build Coastguard Worker otRandomNonCryptoFillBuffer(aBlock, *aBlockLength);
1033*cfb92d14SAndroid Build Coastguard Worker
1034*cfb92d14SAndroid Build Coastguard Worker OutputLine("send block: Num %i Len %i", blockCount, *aBlockLength);
1035*cfb92d14SAndroid Build Coastguard Worker
1036*cfb92d14SAndroid Build Coastguard Worker for (uint16_t i = 0; i < *aBlockLength / 16; i++)
1037*cfb92d14SAndroid Build Coastguard Worker {
1038*cfb92d14SAndroid Build Coastguard Worker OutputBytesLine(&aBlock[i * 16], 16);
1039*cfb92d14SAndroid Build Coastguard Worker }
1040*cfb92d14SAndroid Build Coastguard Worker
1041*cfb92d14SAndroid Build Coastguard Worker if (blockCount == mBlockCount - 1)
1042*cfb92d14SAndroid Build Coastguard Worker {
1043*cfb92d14SAndroid Build Coastguard Worker blockCount = 0;
1044*cfb92d14SAndroid Build Coastguard Worker *aMore = false;
1045*cfb92d14SAndroid Build Coastguard Worker }
1046*cfb92d14SAndroid Build Coastguard Worker else
1047*cfb92d14SAndroid Build Coastguard Worker {
1048*cfb92d14SAndroid Build Coastguard Worker *aMore = true;
1049*cfb92d14SAndroid Build Coastguard Worker blockCount++;
1050*cfb92d14SAndroid Build Coastguard Worker }
1051*cfb92d14SAndroid Build Coastguard Worker
1052*cfb92d14SAndroid Build Coastguard Worker return OT_ERROR_NONE;
1053*cfb92d14SAndroid Build Coastguard Worker }
1054*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
1055*cfb92d14SAndroid Build Coastguard Worker
1056*cfb92d14SAndroid Build Coastguard Worker } // namespace Cli
1057*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
1058*cfb92d14SAndroid Build Coastguard Worker
1059*cfb92d14SAndroid Build Coastguard Worker #endif // OPENTHREAD_CONFIG_COAP_SECURE_API_ENABLE
1060