void IoTService::authenticateMessage(boost::asio::ip::address_v6 senderAddress, std::vector<uint8_t> data, ec taKey) { LOG(INFO) << "CBOR decode message..."; Signature sig; std::vector<uint8_t> message; std::array<uint8_t, 16> senderBytes = senderAddress.to_bytes(); std::vector<uint8_t> senderBytesVec(senderBytes.begin(), senderBytes.end()); struct cbor_load_result result; cbor_item_t* item = cbor_load(data.data(), data.size(), &result); size_t pairs = cbor_map_size(item); for (cbor_pair* pair = cbor_map_handle(item); pairs > 0; pair++, pairs--) { if (strncmp(reinterpret_cast<char*>(cbor_string_handle(pair->key)), "sig", 3) == 0) { sig = Signature::fromCBORArray(pair->value); } else if (strncmp(reinterpret_cast<char*>(cbor_string_handle(pair->key)), "msg", 3) == 0) { size_t length = cbor_bytestring_length(pair->value); message = std::vector<uint8_t>(cbor_bytestring_handle(pair->value), cbor_bytestring_handle(pair->value) + length); } } LOG(INFO) << "Authenticating message..."; bool sigCorrect = Signature::verify(senderBytesVec, message, taKey.p, sig); if (sigCorrect) { LOG(INFO) << "Signature correct: msg: " << byteVecToStr(message); } else { LOG(INFO) << "Signature invalid."; } }
size_t cbor_serialize_map(const cbor_item_t *item, unsigned char *buffer, size_t buffer_size) { assert(cbor_isa_map(item)); size_t size = cbor_map_size(item), written = 0; struct cbor_pair * handle = cbor_map_handle(item); if (cbor_map_is_definite(item)) { written = cbor_encode_map_start(size, buffer, buffer_size); } else { assert(cbor_map_is_indefinite(item)); written = cbor_encode_indef_map_start(buffer, buffer_size); } if (written == 0) return 0; size_t item_written; for (size_t i = 0; i < size; i++) { item_written = cbor_serialize(handle->key, buffer + written, buffer_size - written); if (item_written == 0) return 0; else written += item_written; item_written = cbor_serialize((handle++)->value, buffer + written, buffer_size - written); if (item_written == 0) return 0; else written += item_written; } if (cbor_map_is_definite(item)) { return written; } else { assert(cbor_map_is_indefinite(item)); item_written = cbor_encode_break(buffer + written, buffer_size - written); if (item_written == 0) return 0; else return written + 1; } }