Pfp Cybersecurity (Aka Power Fingerprinting, Inc.) / Mbed OS pfp-emon-nxp

Dependencies:   FXAS21002 FXOS8700Q

Committer:
vithyat
Date:
Fri Mar 20 20:15:18 2020 +0000
Revision:
2:990c985a69ae
Parent:
0:977e87915078
Update to work with P2Scan runtime

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vithyat 0:977e87915078 1 /*
vithyat 0:977e87915078 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
vithyat 0:977e87915078 3 * SPDX-License-Identifier: Apache-2.0
vithyat 0:977e87915078 4 * Licensed under the Apache License, Version 2.0 (the License); you may
vithyat 0:977e87915078 5 * not use this file except in compliance with the License.
vithyat 0:977e87915078 6 * You may obtain a copy of the License at
vithyat 0:977e87915078 7 *
vithyat 0:977e87915078 8 * http://www.apache.org/licenses/LICENSE-2.0
vithyat 0:977e87915078 9 *
vithyat 0:977e87915078 10 * Unless required by applicable law or agreed to in writing, software
vithyat 0:977e87915078 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
vithyat 0:977e87915078 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
vithyat 0:977e87915078 13 * See the License for the specific language governing permissions and
vithyat 0:977e87915078 14 * limitations under the License.
vithyat 0:977e87915078 15 */
vithyat 0:977e87915078 16 #include "mbed-client/m2msecurity.h"
vithyat 0:977e87915078 17 #include "mbed-client/m2mconstants.h"
vithyat 0:977e87915078 18 #include "mbed-client/m2mobject.h"
vithyat 0:977e87915078 19 #include "mbed-client/m2mobjectinstance.h"
vithyat 0:977e87915078 20 #include "mbed-client/m2mresource.h"
vithyat 0:977e87915078 21 #include "mbed-client/m2mstring.h"
vithyat 0:977e87915078 22 #include "mbed-trace/mbed_trace.h"
vithyat 0:977e87915078 23
vithyat 0:977e87915078 24 #include <stdlib.h>
vithyat 0:977e87915078 25
vithyat 0:977e87915078 26 #define TRACE_GROUP "mClt"
vithyat 0:977e87915078 27
vithyat 0:977e87915078 28 #define BUFFER_SIZE 21
vithyat 0:977e87915078 29
vithyat 0:977e87915078 30 // Default instance id's that server uses
vithyat 0:977e87915078 31 #define DEFAULT_M2M_INSTANCE 0
vithyat 0:977e87915078 32 #define DEFAULT_BOOTSTRAP_INSTANCE 1
vithyat 0:977e87915078 33
vithyat 0:977e87915078 34 M2MSecurity* M2MSecurity::_instance = NULL;
vithyat 0:977e87915078 35
vithyat 0:977e87915078 36 M2MSecurity* M2MSecurity::get_instance()
vithyat 0:977e87915078 37 {
vithyat 0:977e87915078 38 if (_instance == NULL) {
vithyat 0:977e87915078 39 _instance = new M2MSecurity(M2MServer);
vithyat 0:977e87915078 40 }
vithyat 0:977e87915078 41 return _instance;
vithyat 0:977e87915078 42 }
vithyat 0:977e87915078 43
vithyat 0:977e87915078 44 void M2MSecurity::delete_instance()
vithyat 0:977e87915078 45 {
vithyat 0:977e87915078 46 delete _instance;
vithyat 0:977e87915078 47 _instance = NULL;
vithyat 0:977e87915078 48 }
vithyat 0:977e87915078 49
vithyat 0:977e87915078 50
vithyat 0:977e87915078 51 M2MSecurity::M2MSecurity(ServerType ser_type)
vithyat 0:977e87915078 52 : M2MObject(M2M_SECURITY_ID, stringdup(M2M_SECURITY_ID))
vithyat 0:977e87915078 53 {
vithyat 0:977e87915078 54 }
vithyat 0:977e87915078 55
vithyat 0:977e87915078 56 M2MSecurity::~M2MSecurity()
vithyat 0:977e87915078 57 {
vithyat 0:977e87915078 58 }
vithyat 0:977e87915078 59
vithyat 0:977e87915078 60 M2MObjectInstance* M2MSecurity::create_object_instance(ServerType server_type)
vithyat 0:977e87915078 61 {
vithyat 0:977e87915078 62 uint16_t instance_id = DEFAULT_M2M_INSTANCE;
vithyat 0:977e87915078 63 if (server_type == Bootstrap) {
vithyat 0:977e87915078 64 instance_id = DEFAULT_BOOTSTRAP_INSTANCE;
vithyat 0:977e87915078 65 }
vithyat 0:977e87915078 66
vithyat 0:977e87915078 67 M2MObjectInstance *server_instance = M2MObject::object_instance(instance_id);
vithyat 0:977e87915078 68 if (server_instance != NULL) {
vithyat 0:977e87915078 69 // Instance already exists, return NULL
vithyat 0:977e87915078 70 return NULL;
vithyat 0:977e87915078 71 }
vithyat 0:977e87915078 72
vithyat 0:977e87915078 73 server_instance = M2MObject::create_object_instance(instance_id);
vithyat 0:977e87915078 74 if (server_instance) {
vithyat 0:977e87915078 75 M2MResource* res = server_instance->create_dynamic_resource(SECURITY_M2M_SERVER_URI,
vithyat 0:977e87915078 76 OMA_RESOURCE_TYPE,
vithyat 0:977e87915078 77 M2MResourceInstance::STRING,
vithyat 0:977e87915078 78 false);
vithyat 0:977e87915078 79 if (res) {
vithyat 0:977e87915078 80 res->set_operation(M2MBase::NOT_ALLOWED);
vithyat 0:977e87915078 81 }
vithyat 0:977e87915078 82 res = server_instance->create_dynamic_resource(SECURITY_BOOTSTRAP_SERVER,
vithyat 0:977e87915078 83 OMA_RESOURCE_TYPE,
vithyat 0:977e87915078 84 M2MResourceInstance::BOOLEAN,
vithyat 0:977e87915078 85 false);
vithyat 0:977e87915078 86 if (res) {
vithyat 0:977e87915078 87 res->set_operation(M2MBase::NOT_ALLOWED);
vithyat 0:977e87915078 88 res->set_value((int)server_type);
vithyat 0:977e87915078 89 }
vithyat 0:977e87915078 90 res = server_instance->create_dynamic_resource(SECURITY_SECURITY_MODE,
vithyat 0:977e87915078 91 OMA_RESOURCE_TYPE,
vithyat 0:977e87915078 92 M2MResourceInstance::INTEGER,
vithyat 0:977e87915078 93 false);
vithyat 0:977e87915078 94 if (res) {
vithyat 0:977e87915078 95 res->set_operation(M2MBase::NOT_ALLOWED);
vithyat 0:977e87915078 96 }
vithyat 0:977e87915078 97 res = server_instance->create_dynamic_resource(SECURITY_PUBLIC_KEY,
vithyat 0:977e87915078 98 OMA_RESOURCE_TYPE,
vithyat 0:977e87915078 99 M2MResourceInstance::OPAQUE,
vithyat 0:977e87915078 100 false);
vithyat 0:977e87915078 101 if (res) {
vithyat 0:977e87915078 102 res->set_operation(M2MBase::NOT_ALLOWED);
vithyat 0:977e87915078 103 }
vithyat 0:977e87915078 104 res = server_instance->create_dynamic_resource(SECURITY_SERVER_PUBLIC_KEY,
vithyat 0:977e87915078 105 OMA_RESOURCE_TYPE,
vithyat 0:977e87915078 106 M2MResourceInstance::OPAQUE,
vithyat 0:977e87915078 107 false);
vithyat 0:977e87915078 108 if (res) {
vithyat 0:977e87915078 109 res->set_operation(M2MBase::NOT_ALLOWED);
vithyat 0:977e87915078 110 }
vithyat 0:977e87915078 111 res = server_instance->create_dynamic_resource(SECURITY_SECRET_KEY,
vithyat 0:977e87915078 112 OMA_RESOURCE_TYPE,
vithyat 0:977e87915078 113 M2MResourceInstance::OPAQUE,
vithyat 0:977e87915078 114 false);
vithyat 0:977e87915078 115 if (res) {
vithyat 0:977e87915078 116 res->set_operation(M2MBase::NOT_ALLOWED);
vithyat 0:977e87915078 117 }
vithyat 0:977e87915078 118
vithyat 0:977e87915078 119 res = server_instance->create_dynamic_resource(SECURITY_OPEN_CERTIFICATE_CHAIN,
vithyat 0:977e87915078 120 OMA_RESOURCE_TYPE,
vithyat 0:977e87915078 121 M2MResourceInstance::OPAQUE,
vithyat 0:977e87915078 122 false);
vithyat 0:977e87915078 123 if (res) {
vithyat 0:977e87915078 124 res->set_operation(M2MBase::NOT_ALLOWED);
vithyat 0:977e87915078 125 }
vithyat 0:977e87915078 126
vithyat 0:977e87915078 127 res = server_instance->create_dynamic_resource(SECURITY_CLOSE_CERTIFICATE_CHAIN,
vithyat 0:977e87915078 128 OMA_RESOURCE_TYPE,
vithyat 0:977e87915078 129 M2MResourceInstance::OPAQUE,
vithyat 0:977e87915078 130 false);
vithyat 0:977e87915078 131 if (res) {
vithyat 0:977e87915078 132 res->set_operation(M2MBase::NOT_ALLOWED);
vithyat 0:977e87915078 133 }
vithyat 0:977e87915078 134
vithyat 0:977e87915078 135 res = server_instance->create_dynamic_resource(SECURITY_READ_CERTIFICATE_CHAIN,
vithyat 0:977e87915078 136 OMA_RESOURCE_TYPE,
vithyat 0:977e87915078 137 M2MResourceInstance::OPAQUE,
vithyat 0:977e87915078 138 false);
vithyat 0:977e87915078 139 if (res) {
vithyat 0:977e87915078 140 res->set_operation(M2MBase::NOT_ALLOWED);
vithyat 0:977e87915078 141 }
vithyat 0:977e87915078 142
vithyat 0:977e87915078 143 if (M2MSecurity::M2MServer == server_type) {
vithyat 0:977e87915078 144 res = server_instance->create_dynamic_resource(SECURITY_SHORT_SERVER_ID,
vithyat 0:977e87915078 145 OMA_RESOURCE_TYPE,
vithyat 0:977e87915078 146 M2MResourceInstance::INTEGER,
vithyat 0:977e87915078 147 false);
vithyat 0:977e87915078 148 if (res) {
vithyat 0:977e87915078 149 res->set_operation(M2MBase::NOT_ALLOWED);
vithyat 0:977e87915078 150 }
vithyat 0:977e87915078 151 }
vithyat 0:977e87915078 152 }
vithyat 0:977e87915078 153 return server_instance;
vithyat 0:977e87915078 154 }
vithyat 0:977e87915078 155
vithyat 0:977e87915078 156 void M2MSecurity::remove_security_instances()
vithyat 0:977e87915078 157 {
vithyat 0:977e87915078 158 int32_t instance_id = _instance->get_security_instance_id(M2MSecurity::Bootstrap);
vithyat 0:977e87915078 159 if (instance_id >= 0) {
vithyat 0:977e87915078 160 _instance->remove_object_instance(instance_id);
vithyat 0:977e87915078 161 }
vithyat 0:977e87915078 162 instance_id = _instance->get_security_instance_id(M2MSecurity::M2MServer);
vithyat 0:977e87915078 163 if (instance_id >= 0) {
vithyat 0:977e87915078 164 _instance->remove_object_instance(instance_id);
vithyat 0:977e87915078 165 }
vithyat 0:977e87915078 166 }
vithyat 0:977e87915078 167
vithyat 0:977e87915078 168 M2MResource* M2MSecurity::create_resource(SecurityResource resource, uint32_t value, uint16_t instance_id)
vithyat 0:977e87915078 169 {
vithyat 0:977e87915078 170 M2MResource* res = NULL;
vithyat 0:977e87915078 171 M2MObjectInstance *server_instance = M2MObject::object_instance(instance_id);
vithyat 0:977e87915078 172 if (server_instance == NULL) {
vithyat 0:977e87915078 173 return NULL;
vithyat 0:977e87915078 174 }
vithyat 0:977e87915078 175
vithyat 0:977e87915078 176 const char* security_id_ptr = "";
vithyat 0:977e87915078 177 if (!is_resource_present(resource, instance_id)) {
vithyat 0:977e87915078 178 switch(resource) {
vithyat 0:977e87915078 179 case SMSSecurityMode:
vithyat 0:977e87915078 180 security_id_ptr = SECURITY_SMS_SECURITY_MODE;
vithyat 0:977e87915078 181 break;
vithyat 0:977e87915078 182 case M2MServerSMSNumber:
vithyat 0:977e87915078 183 security_id_ptr = SECURITY_M2M_SERVER_SMS_NUMBER;
vithyat 0:977e87915078 184 break;
vithyat 0:977e87915078 185 case ShortServerID:
vithyat 0:977e87915078 186 security_id_ptr = SECURITY_SHORT_SERVER_ID;
vithyat 0:977e87915078 187 break;
vithyat 0:977e87915078 188 case ClientHoldOffTime:
vithyat 0:977e87915078 189 security_id_ptr = SECURITY_CLIENT_HOLD_OFF_TIME;
vithyat 0:977e87915078 190 break;
vithyat 0:977e87915078 191 default:
vithyat 0:977e87915078 192 break;
vithyat 0:977e87915078 193 }
vithyat 0:977e87915078 194 }
vithyat 0:977e87915078 195
vithyat 0:977e87915078 196 const String security_id(security_id_ptr);
vithyat 0:977e87915078 197
vithyat 0:977e87915078 198 if (!security_id.empty()) {
vithyat 0:977e87915078 199 if (server_instance) {
vithyat 0:977e87915078 200 res = server_instance->create_dynamic_resource(security_id,OMA_RESOURCE_TYPE,
vithyat 0:977e87915078 201 M2MResourceInstance::INTEGER,
vithyat 0:977e87915078 202 false);
vithyat 0:977e87915078 203
vithyat 0:977e87915078 204 if (res) {
vithyat 0:977e87915078 205 res->set_operation(M2MBase::NOT_ALLOWED);
vithyat 0:977e87915078 206 res->set_value(value);
vithyat 0:977e87915078 207 }
vithyat 0:977e87915078 208 }
vithyat 0:977e87915078 209 }
vithyat 0:977e87915078 210 return res;
vithyat 0:977e87915078 211 }
vithyat 0:977e87915078 212
vithyat 0:977e87915078 213 bool M2MSecurity::delete_resource(SecurityResource resource, uint16_t instance_id)
vithyat 0:977e87915078 214 {
vithyat 0:977e87915078 215 bool success = false;
vithyat 0:977e87915078 216 const char* security_id_ptr;
vithyat 0:977e87915078 217 M2MObjectInstance *server_instance = M2MObject::object_instance(instance_id);
vithyat 0:977e87915078 218 if (server_instance == NULL) {
vithyat 0:977e87915078 219 return NULL;
vithyat 0:977e87915078 220 }
vithyat 0:977e87915078 221 switch(resource) {
vithyat 0:977e87915078 222 case SMSSecurityMode:
vithyat 0:977e87915078 223 security_id_ptr = SECURITY_SMS_SECURITY_MODE;
vithyat 0:977e87915078 224 break;
vithyat 0:977e87915078 225 case M2MServerSMSNumber:
vithyat 0:977e87915078 226 security_id_ptr = SECURITY_M2M_SERVER_SMS_NUMBER;
vithyat 0:977e87915078 227 break;
vithyat 0:977e87915078 228 case ShortServerID:
vithyat 0:977e87915078 229 if (M2MSecurity::Bootstrap == server_type(instance_id)) {
vithyat 0:977e87915078 230 security_id_ptr = SECURITY_SHORT_SERVER_ID;
vithyat 0:977e87915078 231 } else {
vithyat 0:977e87915078 232 security_id_ptr = NULL;
vithyat 0:977e87915078 233 }
vithyat 0:977e87915078 234 break;
vithyat 0:977e87915078 235 case ClientHoldOffTime:
vithyat 0:977e87915078 236 security_id_ptr = SECURITY_CLIENT_HOLD_OFF_TIME;
vithyat 0:977e87915078 237 break;
vithyat 0:977e87915078 238 default:
vithyat 0:977e87915078 239 // Others are mandatory resources hence cannot be deleted.
vithyat 0:977e87915078 240 security_id_ptr = NULL;
vithyat 0:977e87915078 241 break;
vithyat 0:977e87915078 242 }
vithyat 0:977e87915078 243
vithyat 0:977e87915078 244 if (security_id_ptr) {
vithyat 0:977e87915078 245 if (server_instance) {
vithyat 0:977e87915078 246 success = server_instance->remove_resource(security_id_ptr);
vithyat 0:977e87915078 247 }
vithyat 0:977e87915078 248 }
vithyat 0:977e87915078 249 return success;
vithyat 0:977e87915078 250 }
vithyat 0:977e87915078 251
vithyat 0:977e87915078 252 bool M2MSecurity::set_resource_value(SecurityResource resource,
vithyat 0:977e87915078 253 const String &value,
vithyat 0:977e87915078 254 uint16_t instance_id)
vithyat 0:977e87915078 255 {
vithyat 0:977e87915078 256 bool success = false;
vithyat 0:977e87915078 257 if (M2MSecurity::M2MServerUri == resource) {
vithyat 0:977e87915078 258 M2MResource* res = get_resource(resource, instance_id);
vithyat 0:977e87915078 259 if (res) {
vithyat 0:977e87915078 260 success = res->set_value((const uint8_t*)value.c_str(),(uint32_t)value.length());
vithyat 0:977e87915078 261 }
vithyat 0:977e87915078 262 }
vithyat 0:977e87915078 263 return success;
vithyat 0:977e87915078 264 }
vithyat 0:977e87915078 265
vithyat 0:977e87915078 266 bool M2MSecurity::set_resource_value(SecurityResource resource,
vithyat 0:977e87915078 267 uint32_t value,
vithyat 0:977e87915078 268 uint16_t instance_id)
vithyat 0:977e87915078 269 {
vithyat 0:977e87915078 270 bool success = false;
vithyat 0:977e87915078 271 M2MResource* res = get_resource(resource, instance_id);
vithyat 0:977e87915078 272 if (res) {
vithyat 0:977e87915078 273 if (M2MSecurity::SecurityMode == resource ||
vithyat 0:977e87915078 274 M2MSecurity::SMSSecurityMode == resource ||
vithyat 0:977e87915078 275 M2MSecurity::M2MServerSMSNumber == resource ||
vithyat 0:977e87915078 276 M2MSecurity::ShortServerID == resource ||
vithyat 0:977e87915078 277 M2MSecurity::BootstrapServer == resource ||
vithyat 0:977e87915078 278 M2MSecurity::ClientHoldOffTime == resource) {
vithyat 0:977e87915078 279 success = res->set_value(value);
vithyat 0:977e87915078 280
vithyat 0:977e87915078 281 }
vithyat 0:977e87915078 282 }
vithyat 0:977e87915078 283 return success;
vithyat 0:977e87915078 284 }
vithyat 0:977e87915078 285
vithyat 0:977e87915078 286 bool M2MSecurity::set_resource_value(SecurityResource resource,
vithyat 0:977e87915078 287 const uint8_t *value,
vithyat 0:977e87915078 288 const uint16_t length,
vithyat 0:977e87915078 289 uint16_t instance_id)
vithyat 0:977e87915078 290 {
vithyat 0:977e87915078 291 bool success = false;
vithyat 0:977e87915078 292 M2MResource* res = get_resource(resource, instance_id);
vithyat 0:977e87915078 293 if (res) {
vithyat 0:977e87915078 294 if (M2MSecurity::PublicKey == resource ||
vithyat 0:977e87915078 295 M2MSecurity::ServerPublicKey == resource ||
vithyat 0:977e87915078 296 M2MSecurity::Secretkey == resource ||
vithyat 0:977e87915078 297 M2MSecurity::M2MServerUri == resource) {
vithyat 0:977e87915078 298 success = res->set_value(value,length);
vithyat 0:977e87915078 299 }
vithyat 0:977e87915078 300 }
vithyat 0:977e87915078 301 return success;
vithyat 0:977e87915078 302 }
vithyat 0:977e87915078 303
vithyat 0:977e87915078 304 String M2MSecurity::resource_value_string(SecurityResource resource, uint16_t instance_id) const
vithyat 0:977e87915078 305 {
vithyat 0:977e87915078 306 String value = "";
vithyat 0:977e87915078 307 M2MResource* res = get_resource(resource, instance_id);
vithyat 0:977e87915078 308 if (res) {
vithyat 0:977e87915078 309 if (M2MSecurity::M2MServerUri == resource) {
vithyat 0:977e87915078 310 value = res->get_value_string();
vithyat 0:977e87915078 311 }
vithyat 0:977e87915078 312 }
vithyat 0:977e87915078 313 return value;
vithyat 0:977e87915078 314 }
vithyat 0:977e87915078 315
vithyat 0:977e87915078 316 int M2MSecurity::resource_value_buffer(SecurityResource resource,
vithyat 0:977e87915078 317 uint8_t *&data,
vithyat 0:977e87915078 318 uint16_t instance_id,
vithyat 0:977e87915078 319 size_t *buffer_len) const
vithyat 0:977e87915078 320 {
vithyat 0:977e87915078 321 M2MResource* res = get_resource(resource, instance_id);
vithyat 0:977e87915078 322 if (res) {
vithyat 0:977e87915078 323 if (M2MSecurity::PublicKey == resource ||
vithyat 0:977e87915078 324 M2MSecurity::ServerPublicKey == resource ||
vithyat 0:977e87915078 325 M2MSecurity::Secretkey == resource ||
vithyat 0:977e87915078 326 M2MSecurity::OpenCertificateChain == resource ||
vithyat 0:977e87915078 327 M2MSecurity::CloseCertificateChain == resource ||
vithyat 0:977e87915078 328 M2MSecurity::ReadDeviceCertificateChain == resource) {
vithyat 0:977e87915078 329 return res->read_resource_value(*(M2MResourceBase *)res, data, buffer_len);
vithyat 0:977e87915078 330 }
vithyat 0:977e87915078 331 }
vithyat 0:977e87915078 332
vithyat 0:977e87915078 333 return -1;
vithyat 0:977e87915078 334 }
vithyat 0:977e87915078 335
vithyat 0:977e87915078 336 uint32_t M2MSecurity::resource_value_buffer(SecurityResource resource,
vithyat 0:977e87915078 337 const uint8_t *&data,
vithyat 0:977e87915078 338 uint16_t instance_id) const
vithyat 0:977e87915078 339 {
vithyat 0:977e87915078 340 uint32_t size = 0;
vithyat 0:977e87915078 341 M2MResource* res = get_resource(resource, instance_id);
vithyat 0:977e87915078 342 if (res) {
vithyat 0:977e87915078 343 if (M2MSecurity::PublicKey == resource ||
vithyat 0:977e87915078 344 M2MSecurity::ServerPublicKey == resource ||
vithyat 0:977e87915078 345 M2MSecurity::Secretkey == resource) {
vithyat 0:977e87915078 346 data = res->value();
vithyat 0:977e87915078 347 size = res->value_length();
vithyat 0:977e87915078 348 }
vithyat 0:977e87915078 349 }
vithyat 0:977e87915078 350 return size;
vithyat 0:977e87915078 351 }
vithyat 0:977e87915078 352
vithyat 0:977e87915078 353
vithyat 0:977e87915078 354 uint32_t M2MSecurity::resource_value_int(SecurityResource resource, uint16_t instance_id) const
vithyat 0:977e87915078 355 {
vithyat 0:977e87915078 356 uint32_t value = 0;
vithyat 0:977e87915078 357 M2MResource* res = get_resource(resource, instance_id);
vithyat 0:977e87915078 358 if (res) {
vithyat 0:977e87915078 359 if (M2MSecurity::SecurityMode == resource ||
vithyat 0:977e87915078 360 M2MSecurity::SMSSecurityMode == resource ||
vithyat 0:977e87915078 361 M2MSecurity::M2MServerSMSNumber == resource ||
vithyat 0:977e87915078 362 M2MSecurity::ShortServerID == resource ||
vithyat 0:977e87915078 363 M2MSecurity::BootstrapServer == resource ||
vithyat 0:977e87915078 364 M2MSecurity::ClientHoldOffTime == resource) {
vithyat 0:977e87915078 365 // note: the value may be 32bit int on 32b archs.
vithyat 0:977e87915078 366 value = res->get_value_int();
vithyat 0:977e87915078 367 }
vithyat 0:977e87915078 368 }
vithyat 0:977e87915078 369 return value;
vithyat 0:977e87915078 370 }
vithyat 0:977e87915078 371
vithyat 0:977e87915078 372 bool M2MSecurity::is_resource_present(SecurityResource resource, uint16_t instance_id) const
vithyat 0:977e87915078 373 {
vithyat 0:977e87915078 374 bool success = false;
vithyat 0:977e87915078 375 M2MResource *res = get_resource(resource, instance_id);
vithyat 0:977e87915078 376 if (res) {
vithyat 0:977e87915078 377 success = true;
vithyat 0:977e87915078 378 }
vithyat 0:977e87915078 379 return success;
vithyat 0:977e87915078 380 }
vithyat 0:977e87915078 381
vithyat 0:977e87915078 382 uint16_t M2MSecurity::total_resource_count(uint16_t instance_id) const
vithyat 0:977e87915078 383 {
vithyat 0:977e87915078 384 uint16_t count = 0;
vithyat 0:977e87915078 385 M2MObjectInstance *server_instance = M2MObject::object_instance(instance_id);
vithyat 0:977e87915078 386 if (server_instance) {
vithyat 0:977e87915078 387 count = server_instance->resources().size();
vithyat 0:977e87915078 388 }
vithyat 0:977e87915078 389 return count;
vithyat 0:977e87915078 390 }
vithyat 0:977e87915078 391
vithyat 0:977e87915078 392 M2MSecurity::ServerType M2MSecurity::server_type(uint16_t instance_id) const
vithyat 0:977e87915078 393 {
vithyat 0:977e87915078 394 uint32_t sec_mode = resource_value_int(M2MSecurity::BootstrapServer, instance_id);
vithyat 0:977e87915078 395 M2MSecurity::ServerType type = M2MSecurity::M2MServer;
vithyat 0:977e87915078 396 if (sec_mode == 1) {
vithyat 0:977e87915078 397 type = M2MSecurity::Bootstrap;
vithyat 0:977e87915078 398 }
vithyat 0:977e87915078 399 return type;
vithyat 0:977e87915078 400 }
vithyat 0:977e87915078 401
vithyat 0:977e87915078 402 M2MResource* M2MSecurity::get_resource(SecurityResource res, uint16_t instance_id) const
vithyat 0:977e87915078 403 {
vithyat 0:977e87915078 404 M2MResource* res_object = NULL;
vithyat 0:977e87915078 405 M2MObjectInstance *server_instance = M2MObject::object_instance(instance_id);
vithyat 0:977e87915078 406 if (server_instance == NULL) {
vithyat 0:977e87915078 407 return NULL;
vithyat 0:977e87915078 408 }
vithyat 0:977e87915078 409
vithyat 0:977e87915078 410 if (server_instance) {
vithyat 0:977e87915078 411 const char* res_name_ptr = NULL;
vithyat 0:977e87915078 412 switch(res) {
vithyat 0:977e87915078 413 case M2MServerUri:
vithyat 0:977e87915078 414 res_name_ptr = SECURITY_M2M_SERVER_URI;
vithyat 0:977e87915078 415 break;
vithyat 0:977e87915078 416 case BootstrapServer:
vithyat 0:977e87915078 417 res_name_ptr = SECURITY_BOOTSTRAP_SERVER;
vithyat 0:977e87915078 418 break;
vithyat 0:977e87915078 419 case SecurityMode:
vithyat 0:977e87915078 420 res_name_ptr = SECURITY_SECURITY_MODE;
vithyat 0:977e87915078 421 break;
vithyat 0:977e87915078 422 case PublicKey:
vithyat 0:977e87915078 423 res_name_ptr = SECURITY_PUBLIC_KEY;
vithyat 0:977e87915078 424 break;
vithyat 0:977e87915078 425 case ServerPublicKey:
vithyat 0:977e87915078 426 res_name_ptr = SECURITY_SERVER_PUBLIC_KEY;
vithyat 0:977e87915078 427 break;
vithyat 0:977e87915078 428 case Secretkey:
vithyat 0:977e87915078 429 res_name_ptr = SECURITY_SECRET_KEY;
vithyat 0:977e87915078 430 break;
vithyat 0:977e87915078 431 case SMSSecurityMode:
vithyat 0:977e87915078 432 res_name_ptr = SECURITY_SMS_SECURITY_MODE;
vithyat 0:977e87915078 433 break;
vithyat 0:977e87915078 434 case SMSBindingKey:
vithyat 0:977e87915078 435 res_name_ptr = SECURITY_SMS_BINDING_KEY;
vithyat 0:977e87915078 436 break;
vithyat 0:977e87915078 437 case SMSBindingSecretKey:
vithyat 0:977e87915078 438 res_name_ptr = SECURITY_SMS_BINDING_SECRET_KEY;
vithyat 0:977e87915078 439 break;
vithyat 0:977e87915078 440 case M2MServerSMSNumber:
vithyat 0:977e87915078 441 res_name_ptr = SECURITY_M2M_SERVER_SMS_NUMBER;
vithyat 0:977e87915078 442 break;
vithyat 0:977e87915078 443 case ShortServerID:
vithyat 0:977e87915078 444 res_name_ptr = SECURITY_SHORT_SERVER_ID;
vithyat 0:977e87915078 445 break;
vithyat 0:977e87915078 446 case ClientHoldOffTime:
vithyat 0:977e87915078 447 res_name_ptr = SECURITY_CLIENT_HOLD_OFF_TIME;
vithyat 0:977e87915078 448 break;
vithyat 0:977e87915078 449 case OpenCertificateChain:
vithyat 0:977e87915078 450 res_name_ptr = SECURITY_OPEN_CERTIFICATE_CHAIN;
vithyat 0:977e87915078 451 break;
vithyat 0:977e87915078 452 case CloseCertificateChain:
vithyat 0:977e87915078 453 res_name_ptr = SECURITY_CLOSE_CERTIFICATE_CHAIN;
vithyat 0:977e87915078 454 break;
vithyat 0:977e87915078 455 case ReadDeviceCertificateChain:
vithyat 0:977e87915078 456 res_name_ptr = SECURITY_READ_CERTIFICATE_CHAIN;
vithyat 0:977e87915078 457 break;
vithyat 0:977e87915078 458 }
vithyat 0:977e87915078 459
vithyat 0:977e87915078 460 if (res_name_ptr) {
vithyat 0:977e87915078 461 res_object = server_instance->resource(res_name_ptr);
vithyat 0:977e87915078 462 }
vithyat 0:977e87915078 463 }
vithyat 0:977e87915078 464 return res_object;
vithyat 0:977e87915078 465 }
vithyat 0:977e87915078 466
vithyat 0:977e87915078 467 void M2MSecurity::clear_resources(uint16_t instance_id)
vithyat 0:977e87915078 468 {
vithyat 0:977e87915078 469 for(int i = 0; i <= M2MSecurity::ClientHoldOffTime; i++) {
vithyat 0:977e87915078 470 M2MResource *res = get_resource((SecurityResource) i, instance_id);
vithyat 0:977e87915078 471 if (res) {
vithyat 0:977e87915078 472 res->clear_value();
vithyat 0:977e87915078 473 }
vithyat 0:977e87915078 474 }
vithyat 0:977e87915078 475 }
vithyat 0:977e87915078 476
vithyat 0:977e87915078 477 int32_t M2MSecurity::get_security_instance_id(ServerType ser_type) const
vithyat 0:977e87915078 478 {
vithyat 0:977e87915078 479 int32_t instance_id = -1;
vithyat 0:977e87915078 480
vithyat 0:977e87915078 481 const M2MObjectInstanceList &insts = instances();
vithyat 0:977e87915078 482
vithyat 0:977e87915078 483 if (!insts.empty()) {
vithyat 0:977e87915078 484 M2MObjectInstanceList::const_iterator it;
vithyat 0:977e87915078 485 it = insts.begin();
vithyat 0:977e87915078 486 for ( ; it != insts.end(); it++ ) {
vithyat 0:977e87915078 487 uint16_t id = (*it)->instance_id();
vithyat 0:977e87915078 488 if (server_type(id) == ser_type) {
vithyat 0:977e87915078 489 instance_id = id;
vithyat 0:977e87915078 490 break;
vithyat 0:977e87915078 491 }
vithyat 0:977e87915078 492 }
vithyat 0:977e87915078 493 }
vithyat 0:977e87915078 494 return instance_id;
vithyat 0:977e87915078 495 }