Skip to content

Commit 8909d51

Browse files
committed
add public key message
1 parent d887ec0 commit 8909d51

11 files changed

+122
-1
lines changed

extras/test/src/test_provisioning_command_encode.cpp

+44
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,50 @@
180180
}
181181
}
182182

183+
WHEN("Encode a message with provisioning public key")
184+
{
185+
ProvPublicKeyProvisioningMessage command;
186+
command.c.id = ProvisioningMessageId::ProvPublicKeyProvisioningMessageId;
187+
command.provPublicKey = "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7JxCtXl5SvIrHmiasqyN4pyoXRlm44d5WXNpqmvJ\nk0tH8UpmIeHG7YPAkKLaqid95v/wLVoWeX5EbjxmlCkFtw==\n-----END PUBLIC KEY-----\n";
188+
uint8_t buffer[512];
189+
size_t bytes_encoded = sizeof(buffer);
190+
191+
CBORMessageEncoder encoder;
192+
MessageEncoder::Status err = encoder.encode((Message*)&command, buffer, bytes_encoded);
193+
194+
// Test the encoding is
195+
// DA 00012017 # tag(73751)
196+
// 81 # array(1)
197+
// 78 B4 # text(180)
198+
// 2D 2D 2D 2D 2D 4245 47 49 4E 20 50 55 42 4C 49 43204B45592D2D2D2D2D0A0A4D466B77457759484B6F5A497A6A3043415159494B6F5A497A6A3044415163445167414537
199+
// 4A784374586C3553764972486D69617371794E3470796F58526C6D3434643557584E70716D764A0A6B3074483855706D49654847375950416B4B4C617169643935762F774C566F5765583545626A786D6C436B4674773D3D0A0A2D2D2D2D2D454E44205055424C4943204B45592D2D2D2D2D0A
200+
201+
uint8_t expected_result[] = {
202+
0xDA, 0x00, 0x01, 0x20, 0x17, 0x81, 0x78, 0xB2,
203+
0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49,
204+
0x43, 0x20, 0x4B, 0x45, 0x59, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A, 0x4D, 0x46, 0x6B, 0x77,
205+
0x45, 0x77, 0x59, 0x48, 0x4B, 0x6F, 0x5A, 0x49,
206+
0x7A, 0x6A, 0x30, 0x43, 0x41, 0x51, 0x59, 0x49, 0x4B, 0x6F, 0x5A, 0x49,
207+
0x7A, 0x6A, 0x30, 0x44, 0x41, 0x51, 0x63, 0x44, 0x51, 0x67, 0x41, 0x45,
208+
0x37, 0x4A, 0x78, 0x43, 0x74, 0x58, 0x6C, 0x35, 0x53, 0x76, 0x49, 0x72,
209+
0x48, 0x6D, 0x69, 0x61, 0x73, 0x71, 0x79, 0x4E, 0x34, 0x70, 0x79, 0x6F,
210+
0x58, 0x52, 0x6C, 0x6D, 0x34, 0x34, 0x64, 0x35, 0x57, 0x58, 0x4E, 0x70,
211+
0x71, 0x6D, 0x76, 0x4A, 0x0A, 0x6B, 0x30, 0x74, 0x48, 0x38, 0x55, 0x70,
212+
0x6D, 0x49, 0x65, 0x48, 0x47, 0x37, 0x59, 0x50, 0x41, 0x6B, 0x4B, 0x4C,
213+
0x61, 0x71, 0x69, 0x64, 0x39, 0x35, 0x76, 0x2F, 0x77, 0x4C, 0x56, 0x6F,
214+
0x57, 0x65, 0x58, 0x35, 0x45, 0x62, 0x6A, 0x78, 0x6D, 0x6C, 0x43, 0x6B,
215+
0x46, 0x74, 0x77, 0x3D, 0x3D, 0x0A, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
216+
0x45, 0x4E, 0x44, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49, 0x43, 0x20, 0x4B,
217+
0x45, 0x59, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x0A
218+
};
219+
220+
THEN("The encoding is successful") {
221+
REQUIRE(err == MessageEncoder::Status::Complete);
222+
REQUIRE(bytes_encoded == sizeof(expected_result));
223+
REQUIRE(memcmp(buffer, expected_result, sizeof(expected_result)) == 0);
224+
}
225+
}
226+
183227
WHEN("Encode a message with provisioning ble mac Address ")
184228
{
185229
BLEMacAddressProvisioningMessage command;

src/ConfiguratorAgents/AgentsManager.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ void AgentsManagerClass::updateProgressRequest(MessageOutputType type) {
309309
case MessageOutputType::WIFI_FW_VERSION: key = RequestType::GET_WIFI_FW_VERSION ; break;
310310
case MessageOutputType::PROV_SKETCH_VERSION: key = RequestType::GET_PROVISIONING_SKETCH_VERSION; break;
311311
case MessageOutputType::NETCONFIG_LIB_VERSION: key = RequestType::GET_NETCONFIG_LIB_VERSION ; break;
312+
case MessageOutputType::PROV_PUBLIC_KEY: key = RequestType::GET_ID ; break;
312313
}
313314

314315
if (key == RequestType::NONE) {
@@ -317,7 +318,7 @@ void AgentsManagerClass::updateProgressRequest(MessageOutputType type) {
317318

318319
if( key == RequestType::GET_ID && _statusRequest.key == key && _statusRequest.pending){
319320
_statusRequest.completion++;
320-
if(_statusRequest.completion == 2){
321+
if(_statusRequest.completion == 3){
321322
_statusRequest.reset();
322323
}
323324
return;

src/ConfiguratorAgents/MessagesDefinitions.h

+2
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ enum class MessageOutputType { STATUS,
6161
WIFI_FW_VERSION,
6262
PROV_SKETCH_VERSION,
6363
NETCONFIG_LIB_VERSION,
64+
PROV_PUBLIC_KEY
6465
};
6566

6667
/* Types of ingoing messages */
@@ -86,6 +87,7 @@ struct ProvisioningOutputMessage {
8687
const char *wifiFwVersion;
8788
const char *provSketchVersion;
8889
const char *netConfigLibVersion;
90+
const char *provPublicKey;
8991
} m;
9092
};
9193

src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ bool BoardConfigurationProtocol::sendMsg(ProvisioningOutputMessage &msg) {
7575
case MessageOutputType::NETCONFIG_LIB_VERSION:
7676
res = sendVersion(msg.m.netConfigLibVersion, msg.type);
7777
break;
78+
case MessageOutputType::PROV_PUBLIC_KEY:
79+
res = sendProvPublicKey(msg.m.provPublicKey, strlen(msg.m.provPublicKey));
80+
break;
7881
default:
7982
break;
8083
}
@@ -294,6 +297,23 @@ bool BoardConfigurationProtocol::sendJwt(const char *jwt, size_t len) {
294297
return res;
295298
}
296299

300+
bool BoardConfigurationProtocol::sendProvPublicKey(const char *provPublicKey, size_t len) {
301+
302+
size_t cborDataLen = CBOR_MIN_PROV_PUBIC_KEY_LEN + len;
303+
uint8_t data[cborDataLen];
304+
305+
if (!CBORAdapter::provPublicKeyToCBOR(provPublicKey, data, &cborDataLen)) {
306+
return false;
307+
}
308+
309+
if (!sendData(PacketManager::MessageType::DATA, data, cborDataLen)) {
310+
DEBUG_WARNING("BoardConfigurationProtocol::%s failed to send JWT", __FUNCTION__);
311+
return false;
312+
}
313+
314+
return true;
315+
}
316+
297317
bool BoardConfigurationProtocol::sendBleMacAddress(const uint8_t *mac, size_t len) {
298318
bool res = false;
299319
if (len != BLE_MAC_ADDRESS_SIZE) {

src/ConfiguratorAgents/agents/BoardConfigurationProtocol/BoardConfigurationProtocol.h

+1
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ class BoardConfigurationProtocol {
9696
bool sendNetworkOptions(const NetworkOptions *netOptions);
9797
bool sendUhwid(const byte *uhwid);
9898
bool sendJwt(const char *jwt, size_t len);
99+
bool sendProvPublicKey(const char *provPublicKey, size_t len);
99100
bool sendBleMacAddress(const uint8_t *mac, size_t len);
100101
bool sendVersion(const char *version, MessageOutputType type);
101102
TransmissionResult transmitStream();

src/ConfiguratorAgents/agents/BoardConfigurationProtocol/CBORAdapter.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,20 @@ bool CBORAdapter::BLEMacAddressToCBOR(const uint8_t *mac, uint8_t *data, size_t
6969
return status == MessageEncoder::Status::Complete ? true : false;
7070
}
7171

72+
bool CBORAdapter::provPublicKeyToCBOR(const char *provPublicKey, uint8_t *data, size_t *len) {
73+
CBORMessageEncoder encoder;
74+
if(*len < CBOR_MIN_PROV_PUBIC_KEY_LEN + strlen(provPublicKey)) {
75+
return false;
76+
}
77+
ProvPublicKeyProvisioningMessage provPublicKeyMsg;
78+
provPublicKeyMsg.c.id = ProvisioningMessageId::ProvPublicKeyProvisioningMessageId;
79+
provPublicKeyMsg.provPublicKey = provPublicKey;
80+
81+
MessageEncoder::Status status = encoder.encode((Message *)&provPublicKeyMsg, data, *len);
82+
83+
return status == MessageEncoder::Status::Complete ? true : false;
84+
}
85+
7286
bool CBORAdapter::statusToCBOR(StatusMessage msg, uint8_t *data, size_t *len) {
7387
bool result = false;
7488

src/ConfiguratorAgents/agents/BoardConfigurationProtocol/CBORAdapter.h

+2
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@
2121
#define CBOR_MIN_WIFI_FW_VERSION_LEN CBOR_DATA_HEADER_LEN + 1 // CBOR_DATA_HEADER_LEN + 1 byte for the length of the string
2222
#define CBOR_MIN_PROV_SKETCH_VERSION_LEN CBOR_DATA_HEADER_LEN + 1 // CBOR_DATA_HEADER_LEN + 1 byte for the length of the string
2323
#define CBOR_MIN_NETCONFIG_LIB_VERSION_LEN CBOR_DATA_HEADER_LEN + 1 // CBOR_DATA_HEADER_LEN + 1 byte for the length of the string
24+
#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
2425

2526
class CBORAdapter {
2627
public:
2728
static bool uhwidToCBOR(const byte *uhwid, uint8_t *data, size_t *len);
2829
static bool jwtToCBOR(const char *jwt, uint8_t *data, size_t *len);
30+
static bool provPublicKeyToCBOR(const char *provPublicKey, uint8_t *data, size_t *len);
2931
static bool BLEMacAddressToCBOR(const uint8_t *mac, uint8_t *data, size_t *len);
3032
static bool wifiFWVersionToCBOR(const char *wifiFWVersion, uint8_t *data, size_t *len);
3133
static bool provSketchVersionToCBOR(const char *provSketchVersion, uint8_t *data, size_t *len);

src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/CBORInstances.h

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ static StatusProvisioningMessageEncoder statusProvisioningMessageEnc
77
static ListWifiNetworksProvisioningMessageEncoder listWifiNetworksProvisioningMessageEncoder;
88
static UniqueHardwareIdProvisioningMessageEncoder uniqueHardwareIdProvisioningMessageEncoder;
99
static JWTProvisioningMessageEncoder jWTProvisioningMessageEncoder;
10+
static ProvPublicKeyProvisioningMessageEncoder provPublicKeyProvisioningMessageEncoder;
1011
static BLEMacAddressProvisioningMessageEncoder bLEMacAddressProvisioningMessageEncoder;
1112
static WiFiFWVersionProvisioningMessageEncoder wiFiFWVersionProvisioningMessageEncoder;
1213
static ProvSketchVersionProvisioningMessageEncoder provSketchVersionProvisioningMessageEncoder;

src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/Encoder.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -173,4 +173,23 @@ MessageEncoder::Status NetConfigLibVersProvisioningMessageEncoder::encode(CborEn
173173
return MessageEncoder::Status::Complete;
174174
}
175175

176+
MessageEncoder::Status ProvPublicKeyProvisioningMessageEncoder::encode(CborEncoder *encoder, Message *msg) {
177+
ProvPublicKeyProvisioningMessage * provisioningProvPublicKey = (ProvPublicKeyProvisioningMessage*) msg;
178+
CborEncoder array_encoder;
179+
180+
if(cbor_encoder_create_array(encoder, &array_encoder, 1) != CborNoError) {
181+
return MessageEncoder::Status::Error;
182+
}
183+
184+
if(cbor_encode_text_stringz(&array_encoder, provisioningProvPublicKey->provPublicKey) != CborNoError) {
185+
return MessageEncoder::Status::Error;
186+
}
187+
188+
if(cbor_encoder_close_container(encoder, &array_encoder) != CborNoError) {
189+
return MessageEncoder::Status::Error;
190+
}
191+
192+
return MessageEncoder::Status::Complete;
193+
}
194+
176195
#endif // NETWORK_CONFIGURATOR_COMPATIBLE

src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/Encoder.h

+8
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,11 @@ class NetConfigLibVersProvisioningMessageEncoder: public CBORMessageEncoderInter
7575
protected:
7676
MessageEncoder::Status encode(CborEncoder* encoder, Message *msg) override;
7777
};
78+
79+
class ProvPublicKeyProvisioningMessageEncoder: public CBORMessageEncoderInterface {
80+
public:
81+
ProvPublicKeyProvisioningMessageEncoder()
82+
: CBORMessageEncoderInterface(CBORProvPublicKeyProvisioningMessage, ProvPublicKeyProvisioningMessageId) {}
83+
protected:
84+
MessageEncoder::Status encode(CborEncoder* encoder, Message *msg) override;
85+
};

src/ConfiguratorAgents/agents/BoardConfigurationProtocol/cbor/ProvisioningMessage.h

+9
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ enum CBORProvisioningMessageTag: CBORTag {
5050
CBORWiFiFWVersionProvisioningMessage = 0x012014,
5151
CBORProvSketchVersionProvisioningMessage = 0x012015,
5252
CBORNetConfigLibVersProvisioningMessage = 0x012016,
53+
CBORProvPublicKeyProvisioningMessage = 0x012017,
5354
};
5455

5556
enum ProvisioningMessageId: MessageId {
@@ -62,6 +63,7 @@ enum ProvisioningMessageId: MessageId {
6263
ProvSketchVersionProvisioningMessageId,
6364
NetConfigLibVersProvisioningMessageId,
6465
JWTProvisioningMessageId,
66+
ProvPublicKeyProvisioningMessageId,
6567
TimestampProvisioningMessageId,
6668
CommandsProvisioningMessageId,
6769
WifiConfigProvisioningMessageId,
@@ -109,6 +111,13 @@ struct JWTProvisioningMessage {
109111
};
110112
};
111113

114+
struct ProvPublicKeyProvisioningMessage {
115+
ProvisioningMessage c;
116+
struct {
117+
const char *provPublicKey; //The payload is a string.
118+
};
119+
};
120+
112121
struct BLEMacAddressProvisioningMessage {
113122
ProvisioningMessage c;
114123
struct {

0 commit comments

Comments
 (0)