static uint8_t prv_get_value(lwm2m_data_t * dataP, security_instance_t * targetP) { switch (dataP->id) { case LWM2M_SECURITY_URI_ID: lwm2m_data_encode_string(targetP->uri, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_BOOTSTRAP_ID: lwm2m_data_encode_bool(targetP->isBootstrap, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SECURITY_ID: lwm2m_data_encode_int(targetP->securityMode, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_PUBLIC_KEY_ID: lwm2m_data_encode_opaque(targetP->publicIdentity, targetP->publicIdLen, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SERVER_PUBLIC_KEY_ID: lwm2m_data_encode_opaque(targetP->serverPublicKey, targetP->serverPublicKeyLen, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SECRET_KEY_ID: lwm2m_data_encode_opaque(targetP->secretKey, targetP->secretKeyLen, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SMS_SECURITY_ID: lwm2m_data_encode_int(targetP->smsSecurityMode, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SMS_KEY_PARAM_ID: lwm2m_data_encode_opaque(targetP->smsParams, targetP->smsParamsLen, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SMS_SECRET_KEY_ID: lwm2m_data_encode_opaque(targetP->smsSecret, targetP->smsSecretLen, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SMS_SERVER_NUMBER_ID: lwm2m_data_encode_int(0, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SHORT_SERVER_ID: lwm2m_data_encode_int(targetP->shortID, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_HOLD_OFF_ID: lwm2m_data_encode_int(targetP->clientHoldOffTime, dataP); return COAP_205_CONTENT; default: return COAP_404_NOT_FOUND; } }
void lwm2m_data_encode_nstring(const char * string, size_t length, lwm2m_data_t * dataP) { LOG_ARG("length: %d, string: \"%s\"", length, string); lwm2m_data_encode_opaque((uint8_t *)string, length, dataP); if (dataP->type == LWM2M_TYPE_OPAQUE) { dataP->type = LWM2M_TYPE_STRING; } }
static int prv_add_server(bs_info_t * infoP, read_server_t * dataP) { lwm2m_data_t * tlvP; int size; bs_server_tlv_t * serverP; lwm2m_media_type_t format; switch (dataP->securityMode) { case LWM2M_SECURITY_MODE_NONE: size = 4; break; case LWM2M_SECURITY_MODE_PRE_SHARED_KEY: size = 6; break; case LWM2M_SECURITY_MODE_RAW_PUBLIC_KEY: case LWM2M_SECURITY_MODE_CERTIFICATE: size = 7; break; default: return -1; } serverP = (bs_server_tlv_t *)lwm2m_malloc(sizeof(bs_server_tlv_t)); if (serverP == NULL) return -1; memset(serverP, 0, sizeof(bs_server_tlv_t)); serverP->id = dataP->id; tlvP = lwm2m_data_new(size); if (tlvP == NULL) goto error; // LWM2M Server URI tlvP[0].id = LWM2M_SECURITY_URI_ID; lwm2m_data_encode_string(dataP->uri, tlvP); // Bootstrap Server tlvP[1].id = LWM2M_SECURITY_BOOTSTRAP_ID; lwm2m_data_encode_bool(dataP->isBootstrap, tlvP + 1); // Short Server ID tlvP[2].id = LWM2M_SECURITY_SHORT_SERVER_ID; lwm2m_data_encode_int(dataP->id, tlvP + 2); // Security Mode tlvP[3].id = LWM2M_SECURITY_SECURITY_ID; lwm2m_data_encode_int(dataP->securityMode, tlvP + 3); if (size > 4) { tlvP[4].id = LWM2M_SECURITY_PUBLIC_KEY_ID; lwm2m_data_encode_opaque(dataP->publicKey, dataP->publicKeyLen, tlvP + 4); tlvP[5].id = LWM2M_SECURITY_SECRET_KEY_ID; lwm2m_data_encode_opaque(dataP->secretKey, dataP->secretKeyLen, tlvP + 5); if (size == 7) { tlvP[6].id = LWM2M_SECURITY_SERVER_PUBLIC_KEY_ID; lwm2m_data_encode_opaque(dataP->serverKey, dataP->serverKeyLen, tlvP + 5); } } format = LWM2M_CONTENT_TLV; serverP->securityLen = lwm2m_data_serialize(NULL, size, tlvP, &format, &(serverP->securityData)); if (serverP->securityLen <= 0) goto error; lwm2m_data_free(size, tlvP); if (dataP->isBootstrap == false) { size = 4; tlvP = lwm2m_data_new(size); if (tlvP == NULL) goto error; // Short Server ID tlvP[0].id = LWM2M_SERVER_SHORT_ID_ID; lwm2m_data_encode_int(dataP->id, tlvP); // Lifetime tlvP[1].id = LWM2M_SERVER_LIFETIME_ID; lwm2m_data_encode_int(dataP->lifetime, tlvP + 1); // Notification Storing tlvP[2].id = LWM2M_SERVER_STORING_ID; lwm2m_data_encode_bool(false, tlvP + 2); // Binding tlvP[3].id = LWM2M_SERVER_BINDING_ID; lwm2m_data_encode_string("U", tlvP + 3); serverP->serverLen = lwm2m_data_serialize(NULL, size, tlvP, &format, &(serverP->serverData)); if (serverP->serverLen <= 0) goto error; lwm2m_data_free(size, tlvP); } infoP->serverList = (bs_server_tlv_t *)LWM2M_LIST_ADD(infoP->serverList, serverP); return 0; error: if (tlvP != NULL) lwm2m_data_free(size, tlvP); if (serverP->securityData != NULL) lwm2m_free(serverP->securityData); if (serverP->serverData != NULL) lwm2m_free(serverP->serverData); lwm2m_free(serverP); return -1; }
static bool prv_convertValue(_record_t * recordP, lwm2m_data_t * targetP) { switch (recordP->type) { case _TYPE_FALSE: lwm2m_data_encode_bool(false, targetP); break; case _TYPE_TRUE: lwm2m_data_encode_bool(true, targetP); break; case _TYPE_FLOAT: { size_t i; i = 0; while (i < recordP->valueLen && recordP->value[i] != '.') { i++; } if (i == recordP->valueLen) { int64_t value; if ( 1 != utils_textToInt(recordP->value, recordP->valueLen, &value)) { return false; } lwm2m_data_encode_int(value, targetP); } else { double value; if ( 1 != utils_textToFloat(recordP->value, recordP->valueLen, &value)) { return false; } lwm2m_data_encode_float(value, targetP); } } break; case _TYPE_STRING: lwm2m_data_encode_opaque(recordP->value, recordP->valueLen, targetP); targetP->type = LWM2M_TYPE_STRING; break; case _TYPE_UNSET: default: return false; } return true; }
static bool prv_convertValue(const _record_t * recordP, lwm2m_data_t * targetP) { switch (recordP->value.type) { case LWM2M_TYPE_STRING: if (0 != recordP->value.value.asBuffer.length) { size_t stringLen; uint8_t *string = (uint8_t *)lwm2m_malloc(recordP->value.value.asBuffer.length); if (!string) return false; stringLen = json_unescapeString(string, recordP->value.value.asBuffer.buffer, recordP->value.value.asBuffer.length); if (stringLen) { lwm2m_data_encode_nstring((char *)string, stringLen, targetP); lwm2m_free(string); } else { lwm2m_free(string); return false; } } else { lwm2m_data_encode_nstring(NULL, 0, targetP); } break; case LWM2M_TYPE_OPAQUE: if (0 != recordP->value.value.asBuffer.length) { size_t dataLength; uint8_t *data; dataLength = utils_base64GetDecodedSize((const char *)recordP->value.value.asBuffer.buffer, recordP->value.value.asBuffer.length); data = lwm2m_malloc(dataLength); if (!data) return false; dataLength = utils_base64Decode((const char *)recordP->value.value.asBuffer.buffer, recordP->value.value.asBuffer.length, data, dataLength); if (dataLength) { lwm2m_data_encode_opaque(data, dataLength, targetP); lwm2m_free(data); } else { lwm2m_free(data); return false; } } else { lwm2m_data_encode_opaque(NULL, 0, targetP); } break; default: targetP->type = recordP->value.type; memcpy(&targetP->value, &recordP->value.value, sizeof(targetP->value)); break; case LWM2M_TYPE_OBJECT: case LWM2M_TYPE_OBJECT_INSTANCE: case LWM2M_TYPE_MULTIPLE_RESOURCE: case LWM2M_TYPE_CORE_LINK: /* Should never happen */ return false; } return true; }