Exemple #1
0
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.";
	}
}
Exemple #2
0
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;
	}
}