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.
object_security.c@4:35892233a85d, 2017-04-28 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |