Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
share/object_security.c@15:d0f20339c1ad, 2017-05-07 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |