From 8909d51b617530b43a902aff092e0e115a69135c Mon Sep 17 00:00:00 2001 From: fabik111 Date: Tue, 22 Apr 2025 18:01:10 +0200 Subject: [PATCH] add public key message --- .../src/test_provisioning_command_encode.cpp | 44 +++++++++++++++++++ src/ConfiguratorAgents/AgentsManager.cpp | 3 +- src/ConfiguratorAgents/MessagesDefinitions.h | 2 + .../BoardConfigurationProtocol.cpp | 20 +++++++++ .../BoardConfigurationProtocol.h | 1 + .../CBORAdapter.cpp | 14 ++++++ .../BoardConfigurationProtocol/CBORAdapter.h | 2 + .../cbor/CBORInstances.h | 1 + .../cbor/Encoder.cpp | 19 ++++++++ .../BoardConfigurationProtocol/cbor/Encoder.h | 8 ++++ .../cbor/ProvisioningMessage.h | 9 ++++ 11 files changed, 122 insertions(+), 1 deletion(-) diff --git a/extras/test/src/test_provisioning_command_encode.cpp b/extras/test/src/test_provisioning_command_encode.cpp index 28ef8f5..b42b6ba 100644 --- a/extras/test/src/test_provisioning_command_encode.cpp +++ b/extras/test/src/test_provisioning_command_encode.cpp @@ -180,6 +180,50 @@ } } + WHEN("Encode a message with provisioning public key") + { + ProvPublicKeyProvisioningMessage command; + command.c.id = ProvisioningMessageId::ProvPublicKeyProvisioningMessageId; + command.provPublicKey = "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7JxCtXl5SvIrHmiasqyN4pyoXRlm44d5WXNpqmvJ\nk0tH8UpmIeHG7YPAkKLaqid95v/wLVoWeX5EbjxmlCkFtw==\n-----END PUBLIC KEY-----\n"; + uint8_t buffer[512]; + size_t bytes_encoded = sizeof(buffer); + + CBORMessageEncoder encoder; + MessageEncoder::Status err = encoder.encode((Message*)&command, buffer, bytes_encoded); + + // Test the encoding is + // DA 00012017 # tag(73751) + // 81 # array(1) + // 78 B4 # text(180) + // 2D 2D 2D 2D 2D 4245 47 49 4E 20 50 55 42 4C 49 43204B45592D2D2D2D2D0A0A4D466B77457759484B6F5A497A6A3043415159494B6F5A497A6A3044415163445167414537 + // 4A784374586C3553764972486D69617371794E3470796F58526C6D3434643557584E70716D764A0A6B3074483855706D49654847375950416B4B4C617169643935762F774C566F5765583545626A786D6C436B4674773D3D0A0A2D2D2D2D2D454E44205055424C4943204B45592D2D2D2D2D0A + + uint8_t expected_result[] = { + 0xDA, 0x00, 0x01, 0x20, 0x17, 0x81, 0x78, 0xB2, + 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49, + 0x43, 0x20, 0x4B, 0x45, 0x59, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x46, 0x6B, 0x77, + 0x45, 0x77, 0x59, 0x48, 0x4B, 0x6F, 0x5A, 0x49, + 0x7A, 0x6A, 0x30, 0x43, 0x41, 0x51, 0x59, 0x49, 0x4B, 0x6F, 0x5A, 0x49, + 0x7A, 0x6A, 0x30, 0x44, 0x41, 0x51, 0x63, 0x44, 0x51, 0x67, 0x41, 0x45, + 0x37, 0x4A, 0x78, 0x43, 0x74, 0x58, 0x6C, 0x35, 0x53, 0x76, 0x49, 0x72, + 0x48, 0x6D, 0x69, 0x61, 0x73, 0x71, 0x79, 0x4E, 0x34, 0x70, 0x79, 0x6F, + 0x58, 0x52, 0x6C, 0x6D, 0x34, 0x34, 0x64, 0x35, 0x57, 0x58, 0x4E, 0x70, + 0x71, 0x6D, 0x76, 0x4A, 0x0A, 0x6B, 0x30, 0x74, 0x48, 0x38, 0x55, 0x70, + 0x6D, 0x49, 0x65, 0x48, 0x47, 0x37, 0x59, 0x50, 0x41, 0x6B, 0x4B, 0x4C, + 0x61, 0x71, 0x69, 0x64, 0x39, 0x35, 0x76, 0x2F, 0x77, 0x4C, 0x56, 0x6F, + 0x57, 0x65, 0x58, 0x35, 0x45, 0x62, 0x6A, 0x78, 0x6D, 0x6C, 0x43, 0x6B, + 0x46, 0x74, 0x77, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, + 0x45, 0x4E, 0x44, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49, 0x43, 0x20, 0x4B, + 0x45, 0x59, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A + }; + + THEN("The encoding is successful") { + REQUIRE(err == MessageEncoder::Status::Complete); + REQUIRE(bytes_encoded == sizeof(expected_result)); + REQUIRE(memcmp(buffer, expected_result, sizeof(expected_result)) == 0); + } + } + WHEN("Encode a message with provisioning ble mac Address ") { BLEMacAddressProvisioningMessage command; diff --git a/src/ConfiguratorAgents/AgentsManager.cpp b/src/ConfiguratorAgents/AgentsManager.cpp index b9ce385..00990b2 100644 --- a/src/ConfiguratorAgents/AgentsManager.cpp +++ b/src/ConfiguratorAgents/AgentsManager.cpp @@ -309,6 +309,7 @@ void AgentsManagerClass::updateProgressRequest(MessageOutputType type) { case MessageOutputType::WIFI_FW_VERSION: key = RequestType::GET_WIFI_FW_VERSION ; break; case MessageOutputType::PROV_SKETCH_VERSION: key = RequestType::GET_PROVISIONING_SKETCH_VERSION; break; case MessageOutputType::NETCONFIG_LIB_VERSION: key = RequestType::GET_NETCONFIG_LIB_VERSION ; break; + case MessageOutputType::PROV_PUBLIC_KEY: key = RequestType::GET_ID ; break; } if (key == RequestType::NONE) { @@ -317,7 +318,7 @@ void AgentsManagerClass::updateProgressRequest(MessageOutputType type) { if( key == RequestType::GET_ID && _statusRequest.key == key && _statusRequest.pending){ _statusRequest.completion++; - if(_statusRequest.completion == 2){ + if(_statusRequest.completion == 3){ _statusRequest.reset(); } return; diff --git a/src/ConfiguratorAgents/MessagesDefinitions.h b/src/ConfiguratorAgents/MessagesDefinitions.h index f79e888..b7c0707 100644 --- a/src/ConfiguratorAgents/MessagesDefinitions.h +++ b/src/ConfiguratorAgents/MessagesDefinitions.h @@ -61,6 +61,7 @@ enum class MessageOutputType { STATUS, WIFI_FW_VERSION, PROV_SKETCH_VERSION, NETCONFIG_LIB_VERSION, + PROV_PUBLIC_KEY }; /* Types of ingoing messages */ @@ -86,6 +87,7 @@ struct ProvisioningOutputMessage { const char *wifiFwVersion; const char *provSketchVersion; const char *netConfigLibVersion; + const char *provPublicKey; } m; }; diff --git a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.cpp b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.cpp index e0d856f..764c5ce 100644 --- a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.cpp +++ b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.cpp @@ -75,6 +75,9 @@ bool BoardConfigurationProtocol::sendMsg(ProvisioningOutputMessage &msg) { case MessageOutputType::NETCONFIG_LIB_VERSION: res = sendVersion(msg.m.netConfigLibVersion, msg.type); break; + case MessageOutputType::PROV_PUBLIC_KEY: + res = sendProvPublicKey(msg.m.provPublicKey, strlen(msg.m.provPublicKey)); + break; default: break; } @@ -294,6 +297,23 @@ bool BoardConfigurationProtocol::sendJwt(const char *jwt, size_t len) { return res; } +bool BoardConfigurationProtocol::sendProvPublicKey(const char *provPublicKey, size_t len) { + + size_t cborDataLen = CBOR_MIN_PROV_PUBIC_KEY_LEN + len; + uint8_t data[cborDataLen]; + + if (!CBORAdapter::provPublicKeyToCBOR(provPublicKey, data, &cborDataLen)) { + return false; + } + + if (!sendData(PacketManager::MessageType::DATA, data, cborDataLen)) { + DEBUG_WARNING("BoardConfigurationProtocol::%s failed to send JWT", __FUNCTION__); + return false; + } + + return true; +} + bool BoardConfigurationProtocol::sendBleMacAddress(const uint8_t *mac, size_t len) { bool res = false; if (len != BLE_MAC_ADDRESS_SIZE) { diff --git a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.h b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.h index 4db3bba..7e9f11d 100644 --- a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.h +++ b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.h @@ -96,6 +96,7 @@ class BoardConfigurationProtocol { bool sendNetworkOptions(const NetworkOptions *netOptions); bool sendUhwid(const byte *uhwid); bool sendJwt(const char *jwt, size_t len); + bool sendProvPublicKey(const char *provPublicKey, size_t len); bool sendBleMacAddress(const uint8_t *mac, size_t len); bool sendVersion(const char *version, MessageOutputType type); TransmissionResult transmitStream(); diff --git a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/CBORAdapter.cpp b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/CBORAdapter.cpp index 456a163..c764be7 100644 --- a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/CBORAdapter.cpp +++ b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/CBORAdapter.cpp @@ -69,6 +69,20 @@ bool CBORAdapter::BLEMacAddressToCBOR(const uint8_t *mac, uint8_t *data, size_t return status == MessageEncoder::Status::Complete ? true : false; } +bool CBORAdapter::provPublicKeyToCBOR(const char *provPublicKey, uint8_t *data, size_t *len) { + CBORMessageEncoder encoder; + if(*len < CBOR_MIN_PROV_PUBIC_KEY_LEN + strlen(provPublicKey)) { + return false; + } + ProvPublicKeyProvisioningMessage provPublicKeyMsg; + provPublicKeyMsg.c.id = ProvisioningMessageId::ProvPublicKeyProvisioningMessageId; + provPublicKeyMsg.provPublicKey = provPublicKey; + + MessageEncoder::Status status = encoder.encode((Message *)&provPublicKeyMsg, data, *len); + + return status == MessageEncoder::Status::Complete ? true : false; +} + bool CBORAdapter::statusToCBOR(StatusMessage msg, uint8_t *data, size_t *len) { bool result = false; diff --git a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/CBORAdapter.h b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/CBORAdapter.h index 40917df..c2fda6c 100644 --- a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/CBORAdapter.h +++ b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/CBORAdapter.h @@ -21,11 +21,13 @@ #define CBOR_MIN_WIFI_FW_VERSION_LEN CBOR_DATA_HEADER_LEN + 1 // CBOR_DATA_HEADER_LEN + 1 byte for the length of the string #define CBOR_MIN_PROV_SKETCH_VERSION_LEN CBOR_DATA_HEADER_LEN + 1 // CBOR_DATA_HEADER_LEN + 1 byte for the length of the string #define CBOR_MIN_NETCONFIG_LIB_VERSION_LEN CBOR_DATA_HEADER_LEN + 1 // CBOR_DATA_HEADER_LEN + 1 byte for the length of the string +#define CBOR_MIN_PROV_PUBIC_KEY_LEN CBOR_DATA_HEADER_LEN + 3 // CBOR_DATA_HEADER_LEN + 2 bytes for the length of the string + 1 byte for the type of the string class CBORAdapter { public: static bool uhwidToCBOR(const byte *uhwid, uint8_t *data, size_t *len); static bool jwtToCBOR(const char *jwt, uint8_t *data, size_t *len); + static bool provPublicKeyToCBOR(const char *provPublicKey, uint8_t *data, size_t *len); static bool BLEMacAddressToCBOR(const uint8_t *mac, uint8_t *data, size_t *len); static bool wifiFWVersionToCBOR(const char *wifiFWVersion, uint8_t *data, size_t *len); static bool provSketchVersionToCBOR(const char *provSketchVersion, uint8_t *data, size_t *len); diff --git a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/CBORInstances.h b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/CBORInstances.h index b726e0f..a485a47 100644 --- a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/CBORInstances.h +++ b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/CBORInstances.h @@ -7,6 +7,7 @@ static StatusProvisioningMessageEncoder statusProvisioningMessageEnc static ListWifiNetworksProvisioningMessageEncoder listWifiNetworksProvisioningMessageEncoder; static UniqueHardwareIdProvisioningMessageEncoder uniqueHardwareIdProvisioningMessageEncoder; static JWTProvisioningMessageEncoder jWTProvisioningMessageEncoder; +static ProvPublicKeyProvisioningMessageEncoder provPublicKeyProvisioningMessageEncoder; static BLEMacAddressProvisioningMessageEncoder bLEMacAddressProvisioningMessageEncoder; static WiFiFWVersionProvisioningMessageEncoder wiFiFWVersionProvisioningMessageEncoder; static ProvSketchVersionProvisioningMessageEncoder provSketchVersionProvisioningMessageEncoder; diff --git a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/Encoder.cpp b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/Encoder.cpp index fd0bb07..8c90fdd 100644 --- a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/Encoder.cpp +++ b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/Encoder.cpp @@ -173,4 +173,23 @@ MessageEncoder::Status NetConfigLibVersProvisioningMessageEncoder::encode(CborEn return MessageEncoder::Status::Complete; } +MessageEncoder::Status ProvPublicKeyProvisioningMessageEncoder::encode(CborEncoder *encoder, Message *msg) { + ProvPublicKeyProvisioningMessage * provisioningProvPublicKey = (ProvPublicKeyProvisioningMessage*) msg; + CborEncoder array_encoder; + + if(cbor_encoder_create_array(encoder, &array_encoder, 1) != CborNoError) { + return MessageEncoder::Status::Error; + } + + if(cbor_encode_text_stringz(&array_encoder, provisioningProvPublicKey->provPublicKey) != CborNoError) { + return MessageEncoder::Status::Error; + } + + if(cbor_encoder_close_container(encoder, &array_encoder) != CborNoError) { + return MessageEncoder::Status::Error; + } + + return MessageEncoder::Status::Complete; +} + #endif // NETWORK_CONFIGURATOR_COMPATIBLE diff --git a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/Encoder.h b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/Encoder.h index fd02dfa..51c1d40 100644 --- a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/Encoder.h +++ b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/Encoder.h @@ -75,3 +75,11 @@ class NetConfigLibVersProvisioningMessageEncoder: public CBORMessageEncoderInter protected: MessageEncoder::Status encode(CborEncoder* encoder, Message *msg) override; }; + +class ProvPublicKeyProvisioningMessageEncoder: public CBORMessageEncoderInterface { + public: + ProvPublicKeyProvisioningMessageEncoder() + : CBORMessageEncoderInterface(CBORProvPublicKeyProvisioningMessage, ProvPublicKeyProvisioningMessageId) {} + protected: + MessageEncoder::Status encode(CborEncoder* encoder, Message *msg) override; + }; diff --git a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/ProvisioningMessage.h b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/ProvisioningMessage.h index 383c9ef..95c1748 100644 --- a/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/ProvisioningMessage.h +++ b/src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/ProvisioningMessage.h @@ -50,6 +50,7 @@ enum CBORProvisioningMessageTag: CBORTag { CBORWiFiFWVersionProvisioningMessage = 0x012014, CBORProvSketchVersionProvisioningMessage = 0x012015, CBORNetConfigLibVersProvisioningMessage = 0x012016, + CBORProvPublicKeyProvisioningMessage = 0x012017, }; enum ProvisioningMessageId: MessageId { @@ -62,6 +63,7 @@ enum ProvisioningMessageId: MessageId { ProvSketchVersionProvisioningMessageId, NetConfigLibVersProvisioningMessageId, JWTProvisioningMessageId, + ProvPublicKeyProvisioningMessageId, TimestampProvisioningMessageId, CommandsProvisioningMessageId, WifiConfigProvisioningMessageId, @@ -109,6 +111,13 @@ struct JWTProvisioningMessage { }; }; +struct ProvPublicKeyProvisioningMessage { + ProvisioningMessage c; + struct { + const char *provPublicKey; //The payload is a string. + }; +}; + struct BLEMacAddressProvisioningMessage { ProvisioningMessage c; struct {