feat: Treat data to/from RPS and AMT as binary.

This commit is contained in:
Mudit Vats
2021-08-16 17:43:07 -07:00
parent 185cdceadb
commit 87ca74fdf3
7 changed files with 81 additions and 21 deletions

View File

@@ -264,7 +264,12 @@ bool act_create_request(std::string commands, std::string dns_suffix, std::strin
// serialize payload
std::string serializedPayload = utility::conversions::to_utf8string(activationPayload.serialize());
std::string encodedPayload = util_encode_base64(serializedPayload);
std::vector<unsigned char> serializedPayloadVector;
for (int i = 0; i < serializedPayload.size(); i++)
{
serializedPayloadVector.push_back(serializedPayload[i]);
}
std::string encodedPayload = util_encode_base64(serializedPayloadVector);
utility::string_t payload = utility::conversions::to_string_t(encodedPayload);
msg[U("payload")] = web::json::value::string(payload);
@@ -274,7 +279,7 @@ bool act_create_request(std::string commands, std::string dns_suffix, std::strin
return true;
}
bool act_create_response(std::string payload, std::string& response)
bool act_create_response(std::vector<unsigned char> payload, std::string& response)
{
web::json::value msg;

View File

@@ -7,6 +7,7 @@
#define __ACTIVATION_H__
#include <string>
#include <vector>
#define PROTOCOL_VERSION "4.1.0"
@@ -17,6 +18,6 @@
#endif
bool act_create_request(std::string commands, std::string dns_suffix, std::string& request);
bool act_create_response(std::string payload, std::string& response);
bool act_create_response(std::vector<unsigned char> payload, std::string& response);
#endif

View File

@@ -212,7 +212,7 @@ int main(int argc, char* argv[])
std::string msgStatus = "";
std::string msgMessage = "";
std::string msgPayload = "";
std::string payloadDecoded = "";
std::vector<unsigned char> payloadDecoded;
if ( !parsed.has_field(U("method")) || !parsed.has_field(U("apiKey")) || !parsed.has_field(U("appVersion")) ||
!parsed.has_field(U("protocolVersion")) || !parsed.has_field(U("status")) || !parsed.has_field(U("message")) ||
@@ -294,6 +294,9 @@ int main(int argc, char* argv[])
server_cert.hash = certHash;
bool sbhc_success = cmd_start_config_host_based(server_cert, amt_cert);
// wait for configuration to settle down
std::this_thread::sleep_for(std::chrono::seconds(1));
if (!sbhc_success)
{
int state;
@@ -305,11 +308,11 @@ int main(int argc, char* argv[])
break;
case 1:
std::cout << "Provisioning state is in-provisioning." << std::endl;
(cmd_stop_configuration()) ? std::cout << "Provisioning state succesfully reset." : std::cout << "Provisioning state could not be reset.";
(cmd_stop_configuration()) ? std::cout << "Provisioning state succesfully reset." << std::endl : std::cout << "Provisioning state could not be reset." << std::endl;
break;
case 2:
std::cout << "Provisioning state is post-provisioning." << std::endl;
(cmd_stop_configuration()) ? std::cout << "Provisioning state succesfully reset." : std::cout << "Provisioning state could not be reset.";
(cmd_stop_configuration()) ? std::cout << "Provisioning state succesfully reset." << std::endl : std::cout << "Provisioning state could not be reset." << std::endl;
break;
default:
break;
@@ -395,11 +398,34 @@ int main(int argc, char* argv[])
if (arg_verbose)
{
std::cout << std::endl << "vvv -- message to AMT -- vvv" << std::endl;
std::cout << payloadDecoded << std::endl;
if (shbc_config)
{
std::cout << "message size is " << payloadDecoded.size() << " bytes." << std::endl;
for (int i = 0; i < payloadDecoded.size(); i++)
{
printf("%02x ", payloadDecoded[i]);
if ((i > 0) && (i % 32 == 0))
{
std::cout << std::endl;
}
}
std::cout << std::endl;
}
else
{
for (int i = 0; i < payloadDecoded.size(); i++)
{
printf("%c", payloadDecoded[i]);
}
}
std::cout << std::endl;
}
// send message to LMS
if (send(lms_socket, payloadDecoded.c_str(), (int)payloadDecoded.length(), 0) < 0)
int sendPayloudStatus = send(lms_socket, (const char *) payloadDecoded.data(), payloadDecoded.size(), 0);
if (sendPayloudStatus < 0)
{
throw std::runtime_error("error: socket send");
}
@@ -418,7 +444,8 @@ int main(int argc, char* argv[])
// read until connection is closed by LMS
while (1)
{
std::string superBuffer = "";
std::vector<unsigned char> superBuffer;
superBuffer.clear();
while (1)
{
int res = select(fd, &rset, NULL, NULL, &timeout);
@@ -436,7 +463,9 @@ int main(int argc, char* argv[])
res = recv(lms_socket, recv_buffer, 4096, 0);
if (res > 0)
{
superBuffer += recv_buffer;
for (int i = 0; i < res; i++) {
superBuffer.push_back(recv_buffer[i]);
}
}
else if (res < 0)
{
@@ -452,16 +481,36 @@ int main(int argc, char* argv[])
} // while select()
// if there is some data send it
if (superBuffer.length() > 0)
if (superBuffer.size() > 0)
{
if (arg_verbose)
{
std::cout << std::endl << "^^^ -- message from AMT -- ^^^" << std::endl;
std::cout << superBuffer << std::endl;
if (shbc_config)
{
std::cout << "message size is " << superBuffer.size() << " bytes." << std::endl;
for (int i = 0; i < superBuffer.size(); i++)
{
printf("%02x ", superBuffer[i]);
if ((i > 0) && (i % 32 == 0))
{
std::cout << std::endl;
}
}
std::cout << std::endl;
}
else
{
for (int i = 0; i < superBuffer.size(); i++)
{
printf("%c", superBuffer[i]);
}
}
std::cout << std::endl;
}
std::string response;
if (!act_create_response(superBuffer.c_str(), response)) return;
if (!act_create_response(superBuffer, response)) return;
web::websockets::client::websocket_outgoing_message send_websocket_msg;
std::string send_websocket_buffer(response);

View File

@@ -60,7 +60,12 @@ bool shbc_create_response(std::string cert_algo, std::string cert_hash, bool con
// serialize payload
std::string serializedPayload = utility::conversions::to_utf8string(responsePayload.serialize());
std::string encodedPayload = util_encode_base64(serializedPayload);
std::vector<unsigned char> serializedPayloadVector;
for (int i = 0; i < serializedPayload.size(); i++)
{
serializedPayloadVector.push_back(serializedPayload[i]);
}
std::string encodedPayload = util_encode_base64(serializedPayloadVector);
utility::string_t payload = utility::conversions::to_string_t(encodedPayload);
msg[U("payload")] = web::json::value::string(payload);

View File

@@ -29,7 +29,7 @@ TEST(testUtils, isPrintableTestInvalid)
EXPECT_EQ(false, util_is_printable(s));
}
/*
// Test encode of base64 string
TEST(testUtils, encodebase64)
{
@@ -41,7 +41,7 @@ TEST(testUtils, decodebase64)
{
EXPECT_EQ(plainText, util_decode_base64(encodedText));
}
*/
// Test return value of util_format_uuid
TEST(testUtils, formatUUIDSuccess)
{

View File

@@ -8,7 +8,7 @@
#include <string>
#include <cpprest/streams.h>
std::string util_encode_base64(std::string str)
std::string util_encode_base64(std::vector<unsigned char> str)
{
std::vector<unsigned char> strVector(str.begin(), str.end());
utility::string_t base64 = utility::conversions::to_base64(strVector);
@@ -17,11 +17,11 @@ std::string util_encode_base64(std::string str)
return encodedString;
}
std::string util_decode_base64(std::string str)
std::vector<unsigned char> util_decode_base64(std::string str)
{
utility::string_t serializedData = utility::conversions::to_string_t(str);
std::vector<unsigned char> strVector = utility::conversions::from_base64(serializedData);
std::string decodedString(strVector.begin(), strVector.end());
std::vector<unsigned char> decodedString(strVector.begin(), strVector.end());
return decodedString;
}

View File

@@ -9,8 +9,8 @@
#include <string>
#include <vector>
std::string util_encode_base64(std::string str);
std::string util_decode_base64(std::string str);
std::string util_encode_base64(std::vector<unsigned char> str);
std::vector<unsigned char> util_decode_base64(std::string str);
bool util_is_printable(std::string str);
bool util_format_uuid(std::vector<unsigned char> uuid_bytes, std::string& uuid_string);
bool util_hex_string_to_bytes(std::string hex_string, std::vector<unsigned char>& hex_bytes);