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

Dependencies:   C12832 LM75B

Committer:
terence zhang
Date:
Fri Apr 28 18:20:36 2017 +0800
Revision:
4:35892233a85d
update and merge wakaama objects from examples/lightclient.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
terence zhang 4:35892233a85d 1 /*******************************************************************************
terence zhang 4:35892233a85d 2 *
terence zhang 4:35892233a85d 3 * Copyright (c) 2013, 2014, 2015 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
terence zhang 4:35892233a85d 49
terence zhang 4:35892233a85d 50 typedef struct _security_instance_
terence zhang 4:35892233a85d 51 {
terence zhang 4:35892233a85d 52 struct _security_instance_ * next; // matches lwm2m_list_t::next
terence zhang 4:35892233a85d 53 uint16_t instanceId; // matches lwm2m_list_t::id
terence zhang 4:35892233a85d 54 char * uri;
terence zhang 4:35892233a85d 55 bool isBootstrap;
terence zhang 4:35892233a85d 56 uint16_t shortID;
terence zhang 4:35892233a85d 57 uint32_t clientHoldOffTime;
terence zhang 4:35892233a85d 58 } security_instance_t;
terence zhang 4:35892233a85d 59
terence zhang 4:35892233a85d 60 static uint8_t prv_get_value(lwm2m_data_t * dataP,
terence zhang 4:35892233a85d 61 security_instance_t * targetP)
terence zhang 4:35892233a85d 62 {
terence zhang 4:35892233a85d 63
terence zhang 4:35892233a85d 64 switch (dataP->id)
terence zhang 4:35892233a85d 65 {
terence zhang 4:35892233a85d 66 case LWM2M_SECURITY_URI_ID:
terence zhang 4:35892233a85d 67 lwm2m_data_encode_string(targetP->uri, dataP);
terence zhang 4:35892233a85d 68 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 69
terence zhang 4:35892233a85d 70 case LWM2M_SECURITY_BOOTSTRAP_ID:
terence zhang 4:35892233a85d 71 lwm2m_data_encode_bool(targetP->isBootstrap, dataP);
terence zhang 4:35892233a85d 72 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 73
terence zhang 4:35892233a85d 74 case LWM2M_SECURITY_SECURITY_ID:
terence zhang 4:35892233a85d 75 lwm2m_data_encode_int(LWM2M_SECURITY_MODE_NONE, dataP);
terence zhang 4:35892233a85d 76 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 77
terence zhang 4:35892233a85d 78 case LWM2M_SECURITY_PUBLIC_KEY_ID:
terence zhang 4:35892233a85d 79 // Here we return an opaque of 1 byte containing 0
terence zhang 4:35892233a85d 80 {
terence zhang 4:35892233a85d 81 uint8_t value = 0;
terence zhang 4:35892233a85d 82
terence zhang 4:35892233a85d 83 lwm2m_data_encode_opaque(&value, 1, dataP);
terence zhang 4:35892233a85d 84 }
terence zhang 4:35892233a85d 85 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 86
terence zhang 4:35892233a85d 87 case LWM2M_SECURITY_SERVER_PUBLIC_KEY_ID:
terence zhang 4:35892233a85d 88 // Here we return an opaque of 1 byte containing 0
terence zhang 4:35892233a85d 89 {
terence zhang 4:35892233a85d 90 uint8_t value = 0;
terence zhang 4:35892233a85d 91
terence zhang 4:35892233a85d 92 lwm2m_data_encode_opaque(&value, 1, dataP);
terence zhang 4:35892233a85d 93 }
terence zhang 4:35892233a85d 94 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 95
terence zhang 4:35892233a85d 96 case LWM2M_SECURITY_SECRET_KEY_ID:
terence zhang 4:35892233a85d 97 // Here we return an opaque of 1 byte containing 0
terence zhang 4:35892233a85d 98 {
terence zhang 4:35892233a85d 99 uint8_t value = 0;
terence zhang 4:35892233a85d 100
terence zhang 4:35892233a85d 101 lwm2m_data_encode_opaque(&value, 1, dataP);
terence zhang 4:35892233a85d 102 }
terence zhang 4:35892233a85d 103 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 104
terence zhang 4:35892233a85d 105 case LWM2M_SECURITY_SMS_SECURITY_ID:
terence zhang 4:35892233a85d 106 lwm2m_data_encode_int(LWM2M_SECURITY_MODE_NONE, dataP);
terence zhang 4:35892233a85d 107 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 108
terence zhang 4:35892233a85d 109 case LWM2M_SECURITY_SMS_KEY_PARAM_ID:
terence zhang 4:35892233a85d 110 // Here we return an opaque of 6 bytes containing a buggy value
terence zhang 4:35892233a85d 111 {
terence zhang 4:35892233a85d 112 char * value = "12345";
terence zhang 4:35892233a85d 113 lwm2m_data_encode_opaque((uint8_t *)value, 6, dataP);
terence zhang 4:35892233a85d 114 }
terence zhang 4:35892233a85d 115 return COAP_205_CONTENT;
terence zhang 4:35892233a85d 116
terence zhang 4:35892233a85d 117 case LWM2M_SECURITY_SMS_SECRET_KEY_ID:
terence zhang 4:35892233a85d 118 // Here we return an opaque of 32 bytes containing a buggy value
terence zhang 4:35892233a85d 119 {
terence zhang 4:35892233a85d 120 char * value = "1234567890abcdefghijklmnopqrstu";
terence zhang 4:35892233a85d 121 lwm2m_data_encode_opaque((uint8_t *)value, 32, dataP);
terence zhang 4:35892233a85d 122 }
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
terence zhang 4:35892233a85d 190 lwm2m_object_t * get_security_object()
terence zhang 4:35892233a85d 191 {
terence zhang 4:35892233a85d 192 lwm2m_object_t * securityObj;
terence zhang 4:35892233a85d 193
terence zhang 4:35892233a85d 194 securityObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t));
terence zhang 4:35892233a85d 195
terence zhang 4:35892233a85d 196 if (NULL != securityObj)
terence zhang 4:35892233a85d 197 {
terence zhang 4:35892233a85d 198 security_instance_t * targetP;
terence zhang 4:35892233a85d 199
terence zhang 4:35892233a85d 200 memset(securityObj, 0, sizeof(lwm2m_object_t));
terence zhang 4:35892233a85d 201
terence zhang 4:35892233a85d 202 securityObj->objID = 0;
terence zhang 4:35892233a85d 203
terence zhang 4:35892233a85d 204 // Manually create an hardcoded instance
terence zhang 4:35892233a85d 205 targetP = (security_instance_t *)lwm2m_malloc(sizeof(security_instance_t));
terence zhang 4:35892233a85d 206 if (NULL == targetP)
terence zhang 4:35892233a85d 207 {
terence zhang 4:35892233a85d 208 lwm2m_free(securityObj);
terence zhang 4:35892233a85d 209 return NULL;
terence zhang 4:35892233a85d 210 }
terence zhang 4:35892233a85d 211
terence zhang 4:35892233a85d 212 memset(targetP, 0, sizeof(security_instance_t));
terence zhang 4:35892233a85d 213 targetP->instanceId = 0;
terence zhang 4:35892233a85d 214 targetP->uri = strdup("coap://localhost:5683");
terence zhang 4:35892233a85d 215 targetP->isBootstrap = false;
terence zhang 4:35892233a85d 216 targetP->shortID = 123;
terence zhang 4:35892233a85d 217 targetP->clientHoldOffTime = 10;
terence zhang 4:35892233a85d 218
terence zhang 4:35892233a85d 219 securityObj->instanceList = LWM2M_LIST_ADD(securityObj->instanceList, targetP);
terence zhang 4:35892233a85d 220
terence zhang 4:35892233a85d 221 securityObj->readFunc = prv_security_read;
terence zhang 4:35892233a85d 222 }
terence zhang 4:35892233a85d 223
terence zhang 4:35892233a85d 224 return securityObj;
terence zhang 4:35892233a85d 225 }
terence zhang 4:35892233a85d 226
terence zhang 4:35892233a85d 227 void free_security_object(lwm2m_object_t * objectP)
terence zhang 4:35892233a85d 228 {
terence zhang 4:35892233a85d 229 while (objectP->instanceList != NULL)
terence zhang 4:35892233a85d 230 {
terence zhang 4:35892233a85d 231 security_instance_t * securityInstance = (security_instance_t *)objectP->instanceList;
terence zhang 4:35892233a85d 232 objectP->instanceList = objectP->instanceList->next;
terence zhang 4:35892233a85d 233 if (NULL != securityInstance->uri)
terence zhang 4:35892233a85d 234 {
terence zhang 4:35892233a85d 235 lwm2m_free(securityInstance->uri);
terence zhang 4:35892233a85d 236 }
terence zhang 4:35892233a85d 237 lwm2m_free(securityInstance);
terence zhang 4:35892233a85d 238 }
terence zhang 4:35892233a85d 239 lwm2m_free(objectP);
terence zhang 4:35892233a85d 240 }
terence zhang 4:35892233a85d 241
terence zhang 4:35892233a85d 242 char * get_server_uri(lwm2m_object_t * objectP,
terence zhang 4:35892233a85d 243 uint16_t secObjInstID)
terence zhang 4:35892233a85d 244 {
terence zhang 4:35892233a85d 245 security_instance_t * targetP = (security_instance_t *)LWM2M_LIST_FIND(objectP->instanceList, secObjInstID);
terence zhang 4:35892233a85d 246
terence zhang 4:35892233a85d 247 if (NULL != targetP)
terence zhang 4:35892233a85d 248 {
terence zhang 4:35892233a85d 249 return lwm2m_strdup(targetP->uri);
terence zhang 4:35892233a85d 250 }
terence zhang 4:35892233a85d 251
terence zhang 4:35892233a85d 252 return NULL;
terence zhang 4:35892233a85d 253 }