terence zhang / Mbed OS mbed-os-example-wakaama

Dependencies:   C12832 LM75B

Committer:
terencez
Date:
Sun May 07 03:00:16 2017 +0000
Revision:
15:d0f20339c1ad
Parent:
14:ec9e195830ff
Fix the "Get" operation fail issue, tested get information from device.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
terence zhang 4:35892233a85d 1 /*******************************************************************************
terence zhang 4:35892233a85d 2 *
terencez 15:d0f20339c1ad 3 * Copyright (c) 2013, 2014 Intel Corporation and others.
terence zhang 4:35892233a85d 4 * All rights reserved. This program and the accompanying materials
terence zhang 4:35892233a85d 5 * are made available under the terms of the Eclipse Public License v1.0
terence zhang 4:35892233a85d 6 * and Eclipse Distribution License v1.0 which accompany this distribution.
terence zhang 4:35892233a85d 7 *
terence zhang 4:35892233a85d 8 * The Eclipse Public License is available at
terence zhang 4:35892233a85d 9 * http://www.eclipse.org/legal/epl-v10.html
terence zhang 4:35892233a85d 10 * The Eclipse Distribution License is available at
terence zhang 4:35892233a85d 11 * http://www.eclipse.org/org/documents/edl-v10.php.
terence zhang 4:35892233a85d 12 *
terence zhang 4:35892233a85d 13 * Contributors:
terence zhang 4:35892233a85d 14 * David Navarro, Intel Corporation - initial API and implementation
terence zhang 4:35892233a85d 15 * Bosch Software Innovations GmbH - Please refer to git log
terence zhang 4:35892233a85d 16 * Pascal Rieux - Please refer to git log
terence zhang 4:35892233a85d 17 *
terence zhang 4:35892233a85d 18 *******************************************************************************/
terence zhang 4:35892233a85d 19
terence zhang 4:35892233a85d 20 /*
terence zhang 4:35892233a85d 21 * Resources:
terence zhang 4:35892233a85d 22 *
terence zhang 4:35892233a85d 23 * Name | ID | Operations | Instances | Mandatory | Type | Range | Units |
terence zhang 4:35892233a85d 24 * Server URI | 0 | | Single | Yes | String | | |
terence zhang 4:35892233a85d 25 * Bootstrap Server | 1 | | Single | Yes | Boolean | | |
terence zhang 4:35892233a85d 26 * Security Mode | 2 | | Single | Yes | Integer | 0-3 | |
terence zhang 4:35892233a85d 27 * Public Key or ID | 3 | | Single | Yes | Opaque | | |
terence zhang 4:35892233a85d 28 * Server Public Key or ID | 4 | | Single | Yes | Opaque | | |
terence zhang 4:35892233a85d 29 * Secret Key | 5 | | Single | Yes | Opaque | | |
terence zhang 4:35892233a85d 30 * SMS Security Mode | 6 | | Single | Yes | Integer | 0-255 | |
terence zhang 4:35892233a85d 31 * SMS Binding Key Param. | 7 | | Single | Yes | Opaque | 6 B | |
terence zhang 4:35892233a85d 32 * SMS Binding Secret Keys | 8 | | Single | Yes | Opaque | 32-48 B | |
terence zhang 4:35892233a85d 33 * Server SMS Number | 9 | | Single | Yes | Integer | | |
terence zhang 4:35892233a85d 34 * Short Server ID | 10 | | Single | No | Integer | 1-65535 | |
terence zhang 4:35892233a85d 35 * Client Hold Off Time | 11 | | Single | Yes | Integer | | s |
terence zhang 4:35892233a85d 36 *
terence zhang 4:35892233a85d 37 */
terence zhang 4:35892233a85d 38
terence zhang 4:35892233a85d 39 /*
terence zhang 4:35892233a85d 40 * Here we implement a very basic LWM2M Security Object which only knows NoSec security mode.
terence zhang 4:35892233a85d 41 */
terence zhang 4:35892233a85d 42
terence zhang 4:35892233a85d 43 #include "liblwm2m.h"
terence zhang 4:35892233a85d 44
terence zhang 4:35892233a85d 45 #include <stdlib.h>
terence zhang 4:35892233a85d 46 #include <string.h>
terence zhang 4:35892233a85d 47 #include <stdio.h>
terence zhang 4:35892233a85d 48
terencez 15:d0f20339c1ad 49 #define LWM2M_SECURITY_URI_ID 0
terencez 15:d0f20339c1ad 50 #define LWM2M_SECURITY_BOOTSTRAP_ID 1
terencez 15:d0f20339c1ad 51 #define LWM2M_SECURITY_MODE_ID 2
terencez 15:d0f20339c1ad 52 #define LWM2M_SECURITY_PUBLIC_KEY_ID 3
terencez 15:d0f20339c1ad 53 #define LWM2M_SECURITY_SERVER_PUBLIC_KEY_ID 4
terencez 15:d0f20339c1ad 54 #define LWM2M_SECURITY_SECRET_KEY_ID 5
terencez 15:d0f20339c1ad 55 #define LWM2M_SECURITY_SMS_SECURITY_ID 6
terencez 15:d0f20339c1ad 56 #define LWM2M_SECURITY_SMS_KEY_PARAM_ID 7
terencez 15:d0f20339c1ad 57 #define LWM2M_SECURITY_SMS_SECRET_KEY_ID 8
terencez 15:d0f20339c1ad 58 #define LWM2M_SECURITY_SMS_SERVER_NUMBER_ID 9
terencez 15:d0f20339c1ad 59 #define LWM2M_SECURITY_SHORT_SERVER_ID 10
terencez 15:d0f20339c1ad 60 #define LWM2M_SECURITY_HOLD_OFF_ID 11
terence zhang 4:35892233a85d 61
terence zhang 4:35892233a85d 62 typedef struct _security_instance_
terence zhang 4:35892233a85d 63 {
terence zhang 4:35892233a85d 64 struct _security_instance_ * next; // matches lwm2m_list_t::next
terence zhang 4:35892233a85d 65 uint16_t instanceId; // matches lwm2m_list_t::id
terence zhang 4:35892233a85d 66 char * uri;
terencez 15:d0f20339c1ad 67 bool isBootstrap;
terencez 15:d0f20339c1ad 68 uint8_t securityMode;
terencez 15:d0f20339c1ad 69 char * publicIdentity;
terencez 15:d0f20339c1ad 70 uint16_t publicIdLen;
terencez 15:d0f20339c1ad 71 char * serverPublicKey;
terencez 15:d0f20339c1ad 72 uint16_t serverPublicKeyLen;
terencez 15:d0f20339c1ad 73 char * secretKey;
terencez 15:d0f20339c1ad 74 uint16_t secretKeyLen;
terencez 15:d0f20339c1ad 75 uint8_t smsSecurityMode;
terencez 15:d0f20339c1ad 76 char * smsParams; // SMS binding key parameters
terencez 15:d0f20339c1ad 77 uint16_t smsParamsLen;
terencez 15:d0f20339c1ad 78 char * smsSecret; // SMS binding secret key
terencez 15:d0f20339c1ad 79 uint16_t smsSecretLen;
terence zhang 4:35892233a85d 80 uint16_t shortID;
terence zhang 4:35892233a85d 81 uint32_t clientHoldOffTime;
terence zhang 4:35892233a85d 82 } security_instance_t;
terence zhang 4:35892233a85d 83
terence zhang 4:35892233a85d 84 static uint8_t prv_get_value(lwm2m_data_t * dataP,
terence zhang 4:35892233a85d 85 security_instance_t * targetP)
terence zhang 4:35892233a85d 86 {
terence zhang 4:35892233a85d 87 switch (dataP->id)
terence zhang 4:35892233a85d 88 {
terence zhang 4:35892233a85d 89 case LWM2M_SECURITY_URI_ID:
terence zhang 4:35892233a85d 90 lwm2m_data_encode_string(targetP->uri, dataP);
terence zhang 4:35892233a85d 91 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 92
terence zhang 4:35892233a85d 93 case LWM2M_SECURITY_BOOTSTRAP_ID:
terence zhang 4:35892233a85d 94 lwm2m_data_encode_bool(targetP->isBootstrap, dataP);
terence zhang 4:35892233a85d 95 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 96
terence zhang 4:35892233a85d 97 case LWM2M_SECURITY_SECURITY_ID:
terencez 15:d0f20339c1ad 98 lwm2m_data_encode_int(targetP->securityMode, dataP);
terence zhang 4:35892233a85d 99 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 100
terence zhang 4:35892233a85d 101 case LWM2M_SECURITY_PUBLIC_KEY_ID:
terencez 15:d0f20339c1ad 102 lwm2m_data_encode_opaque((uint8_t*)targetP->publicIdentity, targetP->publicIdLen, dataP);
terence zhang 4:35892233a85d 103 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 104
terence zhang 4:35892233a85d 105 case LWM2M_SECURITY_SERVER_PUBLIC_KEY_ID:
terencez 15:d0f20339c1ad 106 lwm2m_data_encode_opaque((uint8_t*)targetP->serverPublicKey, targetP->serverPublicKeyLen, dataP);
terence zhang 4:35892233a85d 107 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 108
terence zhang 4:35892233a85d 109 case LWM2M_SECURITY_SECRET_KEY_ID:
terencez 15:d0f20339c1ad 110 lwm2m_data_encode_opaque((uint8_t*)targetP->secretKey, targetP->secretKeyLen, dataP);
terence zhang 4:35892233a85d 111 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 112
terence zhang 4:35892233a85d 113 case LWM2M_SECURITY_SMS_SECURITY_ID:
terencez 15:d0f20339c1ad 114 lwm2m_data_encode_int(targetP->smsSecurityMode, dataP);
terence zhang 4:35892233a85d 115 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 116
terence zhang 4:35892233a85d 117 case LWM2M_SECURITY_SMS_KEY_PARAM_ID:
terencez 15:d0f20339c1ad 118 lwm2m_data_encode_opaque((uint8_t*)targetP->smsParams, targetP->smsParamsLen, dataP);
terence zhang 4:35892233a85d 119 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 120
terence zhang 4:35892233a85d 121 case LWM2M_SECURITY_SMS_SECRET_KEY_ID:
terencez 15:d0f20339c1ad 122 lwm2m_data_encode_opaque((uint8_t*)targetP->smsSecret, targetP->smsSecretLen, dataP);
terence zhang 4:35892233a85d 123 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 124
terence zhang 4:35892233a85d 125 case LWM2M_SECURITY_SMS_SERVER_NUMBER_ID:
terence zhang 4:35892233a85d 126 lwm2m_data_encode_int(0, dataP);
terence zhang 4:35892233a85d 127 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 128
terence zhang 4:35892233a85d 129 case LWM2M_SECURITY_SHORT_SERVER_ID:
terence zhang 4:35892233a85d 130 lwm2m_data_encode_int(targetP->shortID, dataP);
terence zhang 4:35892233a85d 131 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 132
terence zhang 4:35892233a85d 133 case LWM2M_SECURITY_HOLD_OFF_ID:
terence zhang 4:35892233a85d 134 lwm2m_data_encode_int(targetP->clientHoldOffTime, dataP);
terence zhang 4:35892233a85d 135 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 136
terence zhang 4:35892233a85d 137 default:
terence zhang 4:35892233a85d 138 return COAP_404_NOT_FOUND;
terence zhang 4:35892233a85d 139 }
terence zhang 4:35892233a85d 140 }
terence zhang 4:35892233a85d 141
terence zhang 4:35892233a85d 142 static uint8_t prv_security_read(uint16_t instanceId,
terence zhang 4:35892233a85d 143 int * numDataP,
terence zhang 4:35892233a85d 144 lwm2m_data_t ** dataArrayP,
terence zhang 4:35892233a85d 145 lwm2m_object_t * objectP)
terence zhang 4:35892233a85d 146 {
terence zhang 4:35892233a85d 147 security_instance_t * targetP;
terence zhang 4:35892233a85d 148 uint8_t result;
terence zhang 4:35892233a85d 149 int i;
terence zhang 4:35892233a85d 150
terence zhang 4:35892233a85d 151 targetP = (security_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId);
terence zhang 4:35892233a85d 152 if (NULL == targetP) return COAP_404_NOT_FOUND;
terence zhang 4:35892233a85d 153
terence zhang 4:35892233a85d 154 // is the server asking for the full instance ?
terence zhang 4:35892233a85d 155 if (*numDataP == 0)
terence zhang 4:35892233a85d 156 {
terence zhang 4:35892233a85d 157 uint16_t resList[] = {LWM2M_SECURITY_URI_ID,
terence zhang 4:35892233a85d 158 LWM2M_SECURITY_BOOTSTRAP_ID,
terence zhang 4:35892233a85d 159 LWM2M_SECURITY_SECURITY_ID,
terence zhang 4:35892233a85d 160 LWM2M_SECURITY_PUBLIC_KEY_ID,
terence zhang 4:35892233a85d 161 LWM2M_SECURITY_SERVER_PUBLIC_KEY_ID,
terence zhang 4:35892233a85d 162 LWM2M_SECURITY_SECRET_KEY_ID,
terence zhang 4:35892233a85d 163 LWM2M_SECURITY_SMS_SECURITY_ID,
terence zhang 4:35892233a85d 164 LWM2M_SECURITY_SMS_KEY_PARAM_ID,
terence zhang 4:35892233a85d 165 LWM2M_SECURITY_SMS_SECRET_KEY_ID,
terence zhang 4:35892233a85d 166 LWM2M_SECURITY_SMS_SERVER_NUMBER_ID,
terence zhang 4:35892233a85d 167 LWM2M_SECURITY_SHORT_SERVER_ID,
terence zhang 4:35892233a85d 168 LWM2M_SECURITY_HOLD_OFF_ID};
terence zhang 4:35892233a85d 169 int nbRes = sizeof(resList)/sizeof(uint16_t);
terence zhang 4:35892233a85d 170
terence zhang 4:35892233a85d 171 *dataArrayP = lwm2m_data_new(nbRes);
terence zhang 4:35892233a85d 172 if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;
terence zhang 4:35892233a85d 173 *numDataP = nbRes;
terence zhang 4:35892233a85d 174 for (i = 0 ; i < nbRes ; i++)
terence zhang 4:35892233a85d 175 {
terence zhang 4:35892233a85d 176 (*dataArrayP)[i].id = resList[i];
terence zhang 4:35892233a85d 177 }
terence zhang 4:35892233a85d 178 }
terence zhang 4:35892233a85d 179
terence zhang 4:35892233a85d 180 i = 0;
terence zhang 4:35892233a85d 181 do
terence zhang 4:35892233a85d 182 {
terence zhang 4:35892233a85d 183 result = prv_get_value((*dataArrayP) + i, targetP);
terence zhang 4:35892233a85d 184 i++;
terence zhang 4:35892233a85d 185 } while (i < *numDataP && result == COAP_205_CONTENT);
terence zhang 4:35892233a85d 186
terence zhang 4:35892233a85d 187 return result;
terence zhang 4:35892233a85d 188 }
terence zhang 4:35892233a85d 189
terencez 15:d0f20339c1ad 190 #ifdef LWM2M_BOOTSTRAP
terencez 15:d0f20339c1ad 191
terencez 15:d0f20339c1ad 192 static uint8_t prv_security_write(uint16_t instanceId,
terencez 15:d0f20339c1ad 193 int numData,
terencez 15:d0f20339c1ad 194 lwm2m_data_t * dataArray,
terencez 15:d0f20339c1ad 195 lwm2m_object_t * objectP)
terencez 15:d0f20339c1ad 196 {
terencez 15:d0f20339c1ad 197 security_instance_t * targetP;
terencez 15:d0f20339c1ad 198 int i;
terencez 15:d0f20339c1ad 199 uint8_t result = COAP_204_CHANGED;
terencez 15:d0f20339c1ad 200
terencez 15:d0f20339c1ad 201 targetP = (security_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId);
terencez 15:d0f20339c1ad 202 if (NULL == targetP)
terencez 15:d0f20339c1ad 203 {
terencez 15:d0f20339c1ad 204 return COAP_404_NOT_FOUND;
terencez 15:d0f20339c1ad 205 }
terencez 15:d0f20339c1ad 206
terencez 15:d0f20339c1ad 207 i = 0;
terencez 15:d0f20339c1ad 208 do {
terencez 15:d0f20339c1ad 209 switch (dataArray[i].id)
terencez 15:d0f20339c1ad 210 {
terencez 15:d0f20339c1ad 211 case LWM2M_SECURITY_URI_ID:
terencez 15:d0f20339c1ad 212 if (targetP->uri != NULL) lwm2m_free(targetP->uri);
terencez 15:d0f20339c1ad 213 targetP->uri = (char *)lwm2m_malloc(dataArray[i].value.asBuffer.length + 1);
terencez 15:d0f20339c1ad 214 memset(targetP->uri, 0, dataArray[i].value.asBuffer.length + 1);
terencez 15:d0f20339c1ad 215 if (targetP->uri != NULL)
terencez 15:d0f20339c1ad 216 {
terencez 15:d0f20339c1ad 217 strncpy(targetP->uri, (char*)dataArray[i].value.asBuffer.buffer, dataArray[i].value.asBuffer.length);
terencez 15:d0f20339c1ad 218 result = COAP_204_CHANGED;
terencez 15:d0f20339c1ad 219 }
terencez 15:d0f20339c1ad 220 else
terencez 15:d0f20339c1ad 221 {
terencez 15:d0f20339c1ad 222 result = COAP_500_INTERNAL_SERVER_ERROR;
terencez 15:d0f20339c1ad 223 }
terencez 15:d0f20339c1ad 224 break;
terencez 15:d0f20339c1ad 225
terencez 15:d0f20339c1ad 226 case LWM2M_SECURITY_BOOTSTRAP_ID:
terencez 15:d0f20339c1ad 227 if (1 == lwm2m_data_decode_bool(dataArray + i, &(targetP->isBootstrap)))
terencez 15:d0f20339c1ad 228 {
terencez 15:d0f20339c1ad 229 result = COAP_204_CHANGED;
terencez 15:d0f20339c1ad 230 }
terencez 15:d0f20339c1ad 231 else
terencez 15:d0f20339c1ad 232 {
terencez 15:d0f20339c1ad 233 result = COAP_400_BAD_REQUEST;
terencez 15:d0f20339c1ad 234 }
terencez 15:d0f20339c1ad 235 break;
terencez 15:d0f20339c1ad 236
terencez 15:d0f20339c1ad 237 case LWM2M_SECURITY_SECURITY_ID:
terencez 15:d0f20339c1ad 238 {
terencez 15:d0f20339c1ad 239 int64_t value;
terencez 15:d0f20339c1ad 240
terencez 15:d0f20339c1ad 241 if (1 == lwm2m_data_decode_int(dataArray + i, &value))
terencez 15:d0f20339c1ad 242 {
terencez 15:d0f20339c1ad 243 if (value >= 0 && value <= 3)
terencez 15:d0f20339c1ad 244 {
terencez 15:d0f20339c1ad 245 targetP->securityMode = value;
terencez 15:d0f20339c1ad 246 result = COAP_204_CHANGED;
terencez 15:d0f20339c1ad 247 }
terencez 15:d0f20339c1ad 248 else
terencez 15:d0f20339c1ad 249 {
terencez 15:d0f20339c1ad 250 result = COAP_406_NOT_ACCEPTABLE;
terencez 15:d0f20339c1ad 251 }
terencez 15:d0f20339c1ad 252 }
terencez 15:d0f20339c1ad 253 else
terencez 15:d0f20339c1ad 254 {
terencez 15:d0f20339c1ad 255 result = COAP_400_BAD_REQUEST;
terencez 15:d0f20339c1ad 256 }
terencez 15:d0f20339c1ad 257 }
terencez 15:d0f20339c1ad 258 break;
terencez 15:d0f20339c1ad 259 case LWM2M_SECURITY_PUBLIC_KEY_ID:
terencez 15:d0f20339c1ad 260 if (targetP->publicIdentity != NULL) lwm2m_free(targetP->publicIdentity);
terencez 15:d0f20339c1ad 261 targetP->publicIdentity = (char *)lwm2m_malloc(dataArray[i].value.asBuffer.length +1);
terencez 15:d0f20339c1ad 262 memset(targetP->publicIdentity, 0, dataArray[i].value.asBuffer.length + 1);
terencez 15:d0f20339c1ad 263 if (targetP->publicIdentity != NULL)
terencez 15:d0f20339c1ad 264 {
terencez 15:d0f20339c1ad 265 memcpy(targetP->publicIdentity, (char*)dataArray[i].value.asBuffer.buffer, dataArray[i].value.asBuffer.length);
terencez 15:d0f20339c1ad 266 targetP->publicIdLen = dataArray[i].value.asBuffer.length;
terencez 15:d0f20339c1ad 267 result = COAP_204_CHANGED;
terencez 15:d0f20339c1ad 268 }
terencez 15:d0f20339c1ad 269 else
terencez 15:d0f20339c1ad 270 {
terencez 15:d0f20339c1ad 271 result = COAP_500_INTERNAL_SERVER_ERROR;
terencez 15:d0f20339c1ad 272 }
terencez 15:d0f20339c1ad 273 break;
terencez 15:d0f20339c1ad 274
terencez 15:d0f20339c1ad 275 case LWM2M_SECURITY_SERVER_PUBLIC_KEY_ID:
terencez 15:d0f20339c1ad 276 if (targetP->serverPublicKey != NULL) lwm2m_free(targetP->serverPublicKey);
terencez 15:d0f20339c1ad 277 targetP->serverPublicKey = (char *)lwm2m_malloc(dataArray[i].value.asBuffer.length +1);
terencez 15:d0f20339c1ad 278 memset(targetP->serverPublicKey, 0, dataArray[i].value.asBuffer.length + 1);
terencez 15:d0f20339c1ad 279 if (targetP->serverPublicKey != NULL)
terencez 15:d0f20339c1ad 280 {
terencez 15:d0f20339c1ad 281 memcpy(targetP->serverPublicKey, (char*)dataArray[i].value.asBuffer.buffer, dataArray[i].value.asBuffer.length);
terencez 15:d0f20339c1ad 282 targetP->serverPublicKeyLen = dataArray[i].value.asBuffer.length;
terencez 15:d0f20339c1ad 283 result = COAP_204_CHANGED;
terencez 15:d0f20339c1ad 284 }
terencez 15:d0f20339c1ad 285 else
terencez 15:d0f20339c1ad 286 {
terencez 15:d0f20339c1ad 287 result = COAP_500_INTERNAL_SERVER_ERROR;
terencez 15:d0f20339c1ad 288 }
terencez 15:d0f20339c1ad 289 break;
terencez 15:d0f20339c1ad 290
terencez 15:d0f20339c1ad 291 case LWM2M_SECURITY_SECRET_KEY_ID:
terencez 15:d0f20339c1ad 292 if (targetP->secretKey != NULL) lwm2m_free(targetP->secretKey);
terencez 15:d0f20339c1ad 293 targetP->secretKey = (char *)lwm2m_malloc(dataArray[i].value.asBuffer.length +1);
terencez 15:d0f20339c1ad 294 memset(targetP->secretKey, 0, dataArray[i].value.asBuffer.length + 1);
terencez 15:d0f20339c1ad 295 if (targetP->secretKey != NULL)
terencez 15:d0f20339c1ad 296 {
terencez 15:d0f20339c1ad 297 memcpy(targetP->secretKey, (char*)dataArray[i].value.asBuffer.buffer, dataArray[i].value.asBuffer.length);
terencez 15:d0f20339c1ad 298 targetP->secretKeyLen = dataArray[i].value.asBuffer.length;
terencez 15:d0f20339c1ad 299 result = COAP_204_CHANGED;
terencez 15:d0f20339c1ad 300 }
terencez 15:d0f20339c1ad 301 else
terencez 15:d0f20339c1ad 302 {
terencez 15:d0f20339c1ad 303 result = COAP_500_INTERNAL_SERVER_ERROR;
terencez 15:d0f20339c1ad 304 }
terencez 15:d0f20339c1ad 305 break;
terencez 15:d0f20339c1ad 306
terencez 15:d0f20339c1ad 307 case LWM2M_SECURITY_SMS_SECURITY_ID:
terencez 15:d0f20339c1ad 308 // Let just ignore this
terencez 15:d0f20339c1ad 309 result = COAP_204_CHANGED;
terencez 15:d0f20339c1ad 310 break;
terencez 15:d0f20339c1ad 311
terencez 15:d0f20339c1ad 312 case LWM2M_SECURITY_SMS_KEY_PARAM_ID:
terencez 15:d0f20339c1ad 313 // Let just ignore this
terencez 15:d0f20339c1ad 314 result = COAP_204_CHANGED;
terencez 15:d0f20339c1ad 315 break;
terencez 15:d0f20339c1ad 316
terencez 15:d0f20339c1ad 317 case LWM2M_SECURITY_SMS_SECRET_KEY_ID:
terencez 15:d0f20339c1ad 318 // Let just ignore this
terencez 15:d0f20339c1ad 319 result = COAP_204_CHANGED;
terencez 15:d0f20339c1ad 320 break;
terencez 15:d0f20339c1ad 321
terencez 15:d0f20339c1ad 322 case LWM2M_SECURITY_SMS_SERVER_NUMBER_ID:
terencez 15:d0f20339c1ad 323 // Let just ignore this
terencez 15:d0f20339c1ad 324 result = COAP_204_CHANGED;
terencez 15:d0f20339c1ad 325 break;
terencez 15:d0f20339c1ad 326
terencez 15:d0f20339c1ad 327 case LWM2M_SECURITY_SHORT_SERVER_ID:
terencez 15:d0f20339c1ad 328 {
terencez 15:d0f20339c1ad 329 int64_t value;
terencez 15:d0f20339c1ad 330
terencez 15:d0f20339c1ad 331 if (1 == lwm2m_data_decode_int(dataArray + i, &value))
terencez 15:d0f20339c1ad 332 {
terencez 15:d0f20339c1ad 333 if (value >= 0 && value <= 0xFFFF)
terencez 15:d0f20339c1ad 334 {
terencez 15:d0f20339c1ad 335 targetP->shortID = value;
terencez 15:d0f20339c1ad 336 result = COAP_204_CHANGED;
terencez 15:d0f20339c1ad 337 }
terencez 15:d0f20339c1ad 338 else
terencez 15:d0f20339c1ad 339 {
terencez 15:d0f20339c1ad 340 result = COAP_406_NOT_ACCEPTABLE;
terencez 15:d0f20339c1ad 341 }
terencez 15:d0f20339c1ad 342 }
terencez 15:d0f20339c1ad 343 else
terencez 15:d0f20339c1ad 344 {
terencez 15:d0f20339c1ad 345 result = COAP_400_BAD_REQUEST;
terencez 15:d0f20339c1ad 346 }
terencez 15:d0f20339c1ad 347 }
terencez 15:d0f20339c1ad 348 break;
terencez 15:d0f20339c1ad 349
terencez 15:d0f20339c1ad 350 case LWM2M_SECURITY_HOLD_OFF_ID:
terencez 15:d0f20339c1ad 351 {
terencez 15:d0f20339c1ad 352 int64_t value;
terencez 15:d0f20339c1ad 353
terencez 15:d0f20339c1ad 354 if (1 == lwm2m_data_decode_int(dataArray + i, &value))
terencez 15:d0f20339c1ad 355 {
terencez 15:d0f20339c1ad 356 if (value >= 0 && value <= 0xFFFF)
terencez 15:d0f20339c1ad 357 {
terencez 15:d0f20339c1ad 358 targetP->clientHoldOffTime = value;
terencez 15:d0f20339c1ad 359 result = COAP_204_CHANGED;
terencez 15:d0f20339c1ad 360 }
terencez 15:d0f20339c1ad 361 else
terencez 15:d0f20339c1ad 362 {
terencez 15:d0f20339c1ad 363 result = COAP_406_NOT_ACCEPTABLE;
terencez 15:d0f20339c1ad 364 }
terencez 15:d0f20339c1ad 365 }
terencez 15:d0f20339c1ad 366 else
terencez 15:d0f20339c1ad 367 {
terencez 15:d0f20339c1ad 368 result = COAP_400_BAD_REQUEST;
terencez 15:d0f20339c1ad 369 }
terencez 15:d0f20339c1ad 370 break;
terencez 15:d0f20339c1ad 371 }
terencez 15:d0f20339c1ad 372 default:
terencez 15:d0f20339c1ad 373 return COAP_404_NOT_FOUND;
terencez 15:d0f20339c1ad 374 }
terencez 15:d0f20339c1ad 375 i++;
terencez 15:d0f20339c1ad 376 } while (i < numData && result == COAP_204_CHANGED);
terencez 15:d0f20339c1ad 377
terencez 15:d0f20339c1ad 378 return result;
terencez 15:d0f20339c1ad 379 }
terencez 15:d0f20339c1ad 380
terencez 15:d0f20339c1ad 381 static uint8_t prv_security_delete(uint16_t id,
terencez 15:d0f20339c1ad 382 lwm2m_object_t * objectP)
terencez 15:d0f20339c1ad 383 {
terencez 15:d0f20339c1ad 384 security_instance_t * targetP;
terencez 15:d0f20339c1ad 385
terencez 15:d0f20339c1ad 386 objectP->instanceList = lwm2m_list_remove(objectP->instanceList, id, (lwm2m_list_t **)&targetP);
terencez 15:d0f20339c1ad 387 if (NULL == targetP) return COAP_404_NOT_FOUND;
terencez 15:d0f20339c1ad 388 if (NULL != targetP->uri)
terencez 15:d0f20339c1ad 389 {
terencez 15:d0f20339c1ad 390 lwm2m_free(targetP->uri);
terencez 15:d0f20339c1ad 391 }
terencez 15:d0f20339c1ad 392
terencez 15:d0f20339c1ad 393 lwm2m_free(targetP);
terencez 15:d0f20339c1ad 394
terencez 15:d0f20339c1ad 395 return COAP_202_DELETED;
terencez 15:d0f20339c1ad 396 }
terencez 15:d0f20339c1ad 397
terencez 15:d0f20339c1ad 398 static uint8_t prv_security_create(uint16_t instanceId,
terencez 15:d0f20339c1ad 399 int numData,
terencez 15:d0f20339c1ad 400 lwm2m_data_t * dataArray,
terencez 15:d0f20339c1ad 401 lwm2m_object_t * objectP)
terencez 15:d0f20339c1ad 402 {
terencez 15:d0f20339c1ad 403 security_instance_t * targetP;
terencez 15:d0f20339c1ad 404 uint8_t result;
terencez 15:d0f20339c1ad 405
terencez 15:d0f20339c1ad 406 targetP = (security_instance_t *)lwm2m_malloc(sizeof(security_instance_t));
terencez 15:d0f20339c1ad 407 if (NULL == targetP) return COAP_500_INTERNAL_SERVER_ERROR;
terencez 15:d0f20339c1ad 408 memset(targetP, 0, sizeof(security_instance_t));
terencez 15:d0f20339c1ad 409
terencez 15:d0f20339c1ad 410 targetP->instanceId = instanceId;
terencez 15:d0f20339c1ad 411 objectP->instanceList = LWM2M_LIST_ADD(objectP->instanceList, targetP);
terencez 15:d0f20339c1ad 412
terencez 15:d0f20339c1ad 413 result = prv_security_write(instanceId, numData, dataArray, objectP);
terencez 15:d0f20339c1ad 414
terencez 15:d0f20339c1ad 415 if (result != COAP_204_CHANGED)
terencez 15:d0f20339c1ad 416 {
terencez 15:d0f20339c1ad 417 (void)prv_security_delete(instanceId, objectP);
terencez 15:d0f20339c1ad 418 }
terencez 15:d0f20339c1ad 419 else
terencez 15:d0f20339c1ad 420 {
terencez 15:d0f20339c1ad 421 result = COAP_201_CREATED;
terencez 15:d0f20339c1ad 422 }
terencez 15:d0f20339c1ad 423
terencez 15:d0f20339c1ad 424 return result;
terencez 15:d0f20339c1ad 425 }
terencez 15:d0f20339c1ad 426 #endif
terencez 15:d0f20339c1ad 427
terencez 15:d0f20339c1ad 428 void copy_security_object(lwm2m_object_t * objectDest, lwm2m_object_t * objectSrc)
terencez 15:d0f20339c1ad 429 {
terencez 15:d0f20339c1ad 430 memcpy(objectDest, objectSrc, sizeof(lwm2m_object_t));
terencez 15:d0f20339c1ad 431 objectDest->instanceList = NULL;
terencez 15:d0f20339c1ad 432 objectDest->userData = NULL;
terencez 15:d0f20339c1ad 433 security_instance_t * instanceSrc = (security_instance_t *)objectSrc->instanceList;
terencez 15:d0f20339c1ad 434 security_instance_t * previousInstanceDest = NULL;
terencez 15:d0f20339c1ad 435 while (instanceSrc != NULL)
terencez 15:d0f20339c1ad 436 {
terencez 15:d0f20339c1ad 437 security_instance_t * instanceDest = (security_instance_t *)lwm2m_malloc(sizeof(security_instance_t));
terencez 15:d0f20339c1ad 438 if (NULL == instanceDest)
terencez 15:d0f20339c1ad 439 {
terencez 15:d0f20339c1ad 440 return;
terencez 15:d0f20339c1ad 441 }
terencez 15:d0f20339c1ad 442 memcpy(instanceDest, instanceSrc, sizeof(security_instance_t));
terencez 15:d0f20339c1ad 443 instanceDest->uri = (char*)lwm2m_malloc(strlen(instanceSrc->uri) + 1);
terencez 15:d0f20339c1ad 444 strcpy(instanceDest->uri, instanceSrc->uri);
terencez 15:d0f20339c1ad 445 if (instanceSrc->securityMode == LWM2M_SECURITY_MODE_PRE_SHARED_KEY)
terencez 15:d0f20339c1ad 446 {
terencez 15:d0f20339c1ad 447 instanceDest->publicIdentity = lwm2m_strdup(instanceSrc->publicIdentity);
terencez 15:d0f20339c1ad 448 instanceDest->secretKey = lwm2m_strdup(instanceSrc->secretKey);
terencez 15:d0f20339c1ad 449 }
terencez 15:d0f20339c1ad 450 instanceSrc = (security_instance_t *)instanceSrc->next;
terencez 15:d0f20339c1ad 451 if (previousInstanceDest == NULL)
terencez 15:d0f20339c1ad 452 {
terencez 15:d0f20339c1ad 453 objectDest->instanceList = (lwm2m_list_t *)instanceDest;
terencez 15:d0f20339c1ad 454 }
terencez 15:d0f20339c1ad 455 else
terencez 15:d0f20339c1ad 456 {
terencez 15:d0f20339c1ad 457 previousInstanceDest->next = instanceDest;
terencez 15:d0f20339c1ad 458 }
terencez 15:d0f20339c1ad 459 previousInstanceDest = instanceDest;
terencez 15:d0f20339c1ad 460 }
terencez 15:d0f20339c1ad 461 }
terencez 15:d0f20339c1ad 462
terencez 15:d0f20339c1ad 463 void display_security_object(lwm2m_object_t * object)
terencez 15:d0f20339c1ad 464 {
terencez 15:d0f20339c1ad 465 #ifdef WITH_LOGS
terencez 15:d0f20339c1ad 466 fprintf(stdout, " /%u: Security object, instances:\r\n", object->objID);
terencez 15:d0f20339c1ad 467 security_instance_t * instance = (security_instance_t *)object->instanceList;
terencez 15:d0f20339c1ad 468 while (instance != NULL)
terencez 15:d0f20339c1ad 469 {
terencez 15:d0f20339c1ad 470 fprintf(stdout, " /%u/%u: instanceId: %u, uri: %s, isBootstrap: %s, shortId: %u, clientHoldOffTime: %u\r\n",
terencez 15:d0f20339c1ad 471 object->objID, instance->instanceId,
terencez 15:d0f20339c1ad 472 instance->instanceId, instance->uri, instance->isBootstrap ? "true" : "false",
terencez 15:d0f20339c1ad 473 instance->shortID, instance->clientHoldOffTime);
terencez 15:d0f20339c1ad 474 instance = (security_instance_t *)instance->next;
terencez 15:d0f20339c1ad 475 }
terencez 15:d0f20339c1ad 476 #endif
terencez 15:d0f20339c1ad 477 }
terencez 15:d0f20339c1ad 478
terencez 15:d0f20339c1ad 479 void clean_security_object(lwm2m_object_t * objectP)
terencez 15:d0f20339c1ad 480 {
terencez 15:d0f20339c1ad 481 while (objectP->instanceList != NULL)
terencez 15:d0f20339c1ad 482 {
terencez 15:d0f20339c1ad 483 security_instance_t * securityInstance = (security_instance_t *)objectP->instanceList;
terencez 15:d0f20339c1ad 484 objectP->instanceList = objectP->instanceList->next;
terencez 15:d0f20339c1ad 485 if (NULL != securityInstance->uri)
terencez 15:d0f20339c1ad 486 {
terencez 15:d0f20339c1ad 487 lwm2m_free(securityInstance->uri);
terencez 15:d0f20339c1ad 488 }
terencez 15:d0f20339c1ad 489 if (securityInstance->securityMode == LWM2M_SECURITY_MODE_PRE_SHARED_KEY)
terencez 15:d0f20339c1ad 490 {
terencez 15:d0f20339c1ad 491 lwm2m_free(securityInstance->publicIdentity);
terencez 15:d0f20339c1ad 492 lwm2m_free(securityInstance->secretKey);
terencez 15:d0f20339c1ad 493 }
terencez 15:d0f20339c1ad 494 lwm2m_free(securityInstance);
terencez 15:d0f20339c1ad 495 }
terencez 15:d0f20339c1ad 496 }
terencez 15:d0f20339c1ad 497
terencez 15:d0f20339c1ad 498 lwm2m_object_t * get_security_object(int serverId,
terencez 15:d0f20339c1ad 499 const char* serverUri,
terencez 15:d0f20339c1ad 500 char * bsPskId,
terencez 15:d0f20339c1ad 501 char * psk,
terencez 15:d0f20339c1ad 502 uint16_t pskLen,
terencez 15:d0f20339c1ad 503 bool isBootstrap)
terence zhang 4:35892233a85d 504 {
terence zhang 4:35892233a85d 505 lwm2m_object_t * securityObj;
terence zhang 4:35892233a85d 506
terence zhang 4:35892233a85d 507 securityObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t));
terence zhang 4:35892233a85d 508
terence zhang 4:35892233a85d 509 if (NULL != securityObj)
terence zhang 4:35892233a85d 510 {
terence zhang 4:35892233a85d 511 security_instance_t * targetP;
terence zhang 4:35892233a85d 512
terence zhang 4:35892233a85d 513 memset(securityObj, 0, sizeof(lwm2m_object_t));
terence zhang 4:35892233a85d 514
terence zhang 4:35892233a85d 515 securityObj->objID = 0;
terence zhang 4:35892233a85d 516
terence zhang 4:35892233a85d 517 // Manually create an hardcoded instance
terence zhang 4:35892233a85d 518 targetP = (security_instance_t *)lwm2m_malloc(sizeof(security_instance_t));
terence zhang 4:35892233a85d 519 if (NULL == targetP)
terence zhang 4:35892233a85d 520 {
terence zhang 4:35892233a85d 521 lwm2m_free(securityObj);
terence zhang 4:35892233a85d 522 return NULL;
terence zhang 4:35892233a85d 523 }
terence zhang 4:35892233a85d 524
terence zhang 4:35892233a85d 525 memset(targetP, 0, sizeof(security_instance_t));
terence zhang 4:35892233a85d 526 targetP->instanceId = 0;
terencez 15:d0f20339c1ad 527 targetP->uri = (char*)lwm2m_malloc(strlen(serverUri)+1);
terencez 15:d0f20339c1ad 528 strcpy(targetP->uri, serverUri);
terencez 15:d0f20339c1ad 529
terencez 15:d0f20339c1ad 530 targetP->securityMode = LWM2M_SECURITY_MODE_NONE;
terencez 15:d0f20339c1ad 531 targetP->publicIdentity = NULL;
terencez 15:d0f20339c1ad 532 targetP->publicIdLen = 0;
terencez 15:d0f20339c1ad 533 targetP->secretKey = NULL;
terencez 15:d0f20339c1ad 534 targetP->secretKeyLen = 0;
terencez 15:d0f20339c1ad 535 if (bsPskId != NULL || psk != NULL)
terencez 15:d0f20339c1ad 536 {
terencez 15:d0f20339c1ad 537 targetP->securityMode = LWM2M_SECURITY_MODE_PRE_SHARED_KEY;
terencez 15:d0f20339c1ad 538 if (bsPskId)
terencez 15:d0f20339c1ad 539 {
terencez 15:d0f20339c1ad 540 targetP->publicIdentity = strdup(bsPskId);
terencez 15:d0f20339c1ad 541 targetP->publicIdLen = strlen(bsPskId);
terencez 15:d0f20339c1ad 542 }
terencez 15:d0f20339c1ad 543 if (pskLen > 0)
terencez 15:d0f20339c1ad 544 {
terencez 15:d0f20339c1ad 545 targetP->secretKey = (char*)lwm2m_malloc(pskLen);
terencez 15:d0f20339c1ad 546 if (targetP->secretKey == NULL)
terencez 15:d0f20339c1ad 547 {
terencez 15:d0f20339c1ad 548 clean_security_object(securityObj);
terencez 15:d0f20339c1ad 549 return NULL;
terencez 15:d0f20339c1ad 550 }
terencez 15:d0f20339c1ad 551 memcpy(targetP->secretKey, psk, pskLen);
terencez 15:d0f20339c1ad 552 targetP->secretKeyLen = pskLen;
terencez 15:d0f20339c1ad 553 }
terencez 15:d0f20339c1ad 554 }
terencez 15:d0f20339c1ad 555 targetP->isBootstrap = isBootstrap;
terencez 15:d0f20339c1ad 556 targetP->shortID = serverId;
terence zhang 4:35892233a85d 557 targetP->clientHoldOffTime = 10;
terence zhang 4:35892233a85d 558
terence zhang 4:35892233a85d 559 securityObj->instanceList = LWM2M_LIST_ADD(securityObj->instanceList, targetP);
terence zhang 4:35892233a85d 560
terence zhang 4:35892233a85d 561 securityObj->readFunc = prv_security_read;
terencez 15:d0f20339c1ad 562 #ifdef LWM2M_BOOTSTRAP
terencez 15:d0f20339c1ad 563 securityObj->writeFunc = prv_security_write;
terencez 15:d0f20339c1ad 564 securityObj->createFunc = prv_security_create;
terencez 15:d0f20339c1ad 565 securityObj->deleteFunc = prv_security_delete;
terencez 15:d0f20339c1ad 566 #endif
terence zhang 4:35892233a85d 567 }
terence zhang 4:35892233a85d 568
terence zhang 4:35892233a85d 569 return securityObj;
terence zhang 4:35892233a85d 570 }
terence zhang 4:35892233a85d 571
terence zhang 4:35892233a85d 572 char * get_server_uri(lwm2m_object_t * objectP,
terence zhang 4:35892233a85d 573 uint16_t secObjInstID)
terence zhang 4:35892233a85d 574 {
terence zhang 4:35892233a85d 575 security_instance_t * targetP = (security_instance_t *)LWM2M_LIST_FIND(objectP->instanceList, secObjInstID);
terence zhang 4:35892233a85d 576
terence zhang 4:35892233a85d 577 if (NULL != targetP)
terence zhang 4:35892233a85d 578 {
terence zhang 4:35892233a85d 579 return lwm2m_strdup(targetP->uri);
terence zhang 4:35892233a85d 580 }
terence zhang 4:35892233a85d 581
terence zhang 4:35892233a85d 582 return NULL;
terence zhang 4:35892233a85d 583 }