@@ -57,6 +57,7 @@ typedef struct
57
57
uint32_t signCounter ; /* sign counter for this connection */
58
58
uint8_t * pCsrk ; /* signing key for this connection */
59
59
attsSignBuf_t * pBuf ; /* current data being processed */
60
+ bool_t authenticated ; /* Indicate if the CSRK is authenticated or not */
60
61
} attsSignCcb_t ;
61
62
62
63
/* ATTS signed PDU control block */
@@ -160,53 +161,69 @@ static void attsProcSignedWrite(attCcb_t *pCcb, uint16_t len, uint8_t *pPacket)
160
161
/* find attribute */
161
162
if ((pAttr = attsFindByHandle (handle , & pGroup )) != NULL )
162
163
{
163
- /* verify permissions */
164
- if (attsPermissions ( pCcb -> connId , ATTS_PERMIT_WRITE , handle , pAttr -> permissions ) != ATT_SUCCESS )
164
+ /* verify signed write is permitted */
165
+ if (( pAttr -> settings & ATTS_SET_ALLOW_SIGNED ) == 0 )
165
166
{
166
167
return ;
167
168
}
168
- /* verify signed write is permitted */
169
- else if ((pAttr -> settings & ATTS_SET_ALLOW_SIGNED ) == 0 )
169
+
170
+ /* verify that csrk is present */
171
+ if (attsSignCcbByConnId (pCcb -> connId )-> pCsrk == NULL ) {
172
+ return ;
173
+ }
174
+
175
+ /* verify basic permissions */
176
+ if ((pAttr -> permissions & (ATTS_PERMIT_WRITE | ATTS_PERMIT_WRITE_ENC )) == 0 )
170
177
{
171
178
return ;
172
179
}
180
+
181
+ /* verify authentication */
182
+ if ((pAttr -> permissions & ATTS_PERMIT_WRITE_AUTH ) &&
183
+ (attsSignCcbByConnId (pCcb -> connId )-> authenticated == 0 ))
184
+ {
185
+ return ;
186
+ }
187
+
188
+ /* Note: authorization not verified at this stage as it is reserved for lesc
189
+ writes; authorization occurs latter when the write cb is called */
190
+
173
191
/* verify write length, fixed length */
174
- else if (((pAttr -> settings & ATTS_SET_VARIABLE_LEN ) == 0 ) &&
192
+ if (((pAttr -> settings & ATTS_SET_VARIABLE_LEN ) == 0 ) &&
175
193
(writeLen != pAttr -> maxLen ))
176
194
{
177
195
return ;
178
196
}
197
+
179
198
/* verify write length, variable length */
180
- else if (((pAttr -> settings & ATTS_SET_VARIABLE_LEN ) != 0 ) &&
199
+ if (((pAttr -> settings & ATTS_SET_VARIABLE_LEN ) != 0 ) &&
181
200
(writeLen > pAttr -> maxLen ))
182
201
{
183
202
return ;
184
203
}
185
- else
204
+
205
+ /* allocate buffer to store packet and parameters */
206
+ if ((pBuf = WsfBufAlloc (sizeof (attsSignBuf_t ) - 1 + len )) != NULL )
186
207
{
187
- /* allocate buffer to store packet and parameters */
188
- if ((pBuf = WsfBufAlloc (sizeof (attsSignBuf_t ) - 1 + len )) != NULL )
189
- {
190
- /* initialize buffer */
191
- pBuf -> pCcb = pCcb ;
192
- pBuf -> handle = handle ;
193
- pBuf -> writeLen = writeLen ;
194
- pBuf -> connId = pCcb -> connId ;
195
- memcpy (pBuf -> packet , (pPacket + L2C_PAYLOAD_START ), len );
208
+ /* initialize buffer */
209
+ pBuf -> pCcb = pCcb ;
210
+ pBuf -> handle = handle ;
211
+ pBuf -> writeLen = writeLen ;
212
+ pBuf -> connId = pCcb -> connId ;
213
+ memcpy (pBuf -> packet , (pPacket + L2C_PAYLOAD_START ), len );
196
214
197
- /* check if a signed write is already in progress */
198
- pSignCcb = attsSignCcbByConnId (pCcb -> connId );
215
+ /* check if a signed write is already in progress */
216
+ pSignCcb = attsSignCcbByConnId (pCcb -> connId );
199
217
200
- if (pSignCcb -> pBuf != NULL )
201
- {
202
- /* signed write in progress; queue packet */
203
- WsfQueueEnq (& attsSignCb .msgQueue , pBuf );
204
- }
205
- else
206
- {
207
- /* start signed data processing */
208
- attsSignedWriteStart (pSignCcb , pBuf );
209
- }
218
+ if (pSignCcb -> pBuf != NULL )
219
+ {
220
+ /* signed write in progress; queue packet */
221
+ WsfQueueEnq (& attsSignCb .msgQueue , pBuf );
222
+ }
223
+ else
224
+ {
225
+ /* start signed data processing */
226
+ attsSignedWriteStart (pSignCcb , pBuf );
210
227
}
211
228
}
212
229
}
@@ -336,13 +353,15 @@ void AttsSignInit(void)
336
353
*
337
354
* \param connId DM connection ID.
338
355
* \param pCsrk Pointer to data signing key (CSRK).
356
+ * \param authenticated True if CSRK is authenticated and false otherwise.
339
357
*
340
358
* \return None.
341
359
*/
342
360
/*************************************************************************************************/
343
- void AttsSetCsrk (dmConnId_t connId , uint8_t * pCsrk )
361
+ void AttsSetCsrk (dmConnId_t connId , uint8_t * pCsrk , bool_t authenticated )
344
362
{
345
363
attsSignCcbByConnId (connId )-> pCsrk = pCsrk ;
364
+ attsSignCcbByConnId (connId )-> authenticated = authenticated ;
346
365
}
347
366
348
367
/*************************************************************************************************/
0 commit comments