Changed various static and dynamic stack-based buffers to TempBuffer
Also added casting overload to TempBuffer so that get() method is no longer needed
This commit is contained in:
parent
c417fe74f7
commit
f6ebc1ae22
42
src/HAP.cpp
42
src/HAP.cpp
|
|
@ -495,8 +495,8 @@ int HAPClient::postPairSetupURL(){
|
||||||
|
|
||||||
hkdf.create(sessionKey, srp.sharedSecret,64,"Pair-Setup-Encrypt-Salt","Pair-Setup-Encrypt-Info"); // create SessionKey
|
hkdf.create(sessionKey, srp.sharedSecret,64,"Pair-Setup-Encrypt-Salt","Pair-Setup-Encrypt-Info"); // create SessionKey
|
||||||
|
|
||||||
uint8_t decrypted[1024]; // temporary storage for decrypted data
|
TempBuffer<uint8_t> decrypted(tlv8.len(kTLVType_EncryptedData)); // temporary storage for decrypted data
|
||||||
unsigned long long decryptedLen; // length (in bytes) of decrypted data
|
unsigned long long decryptedLen; // length (in bytes) of decrypted data
|
||||||
|
|
||||||
if(crypto_aead_chacha20poly1305_ietf_decrypt( // use SessionKey to decrypt encryptedData TLV with padded nonce="PS-Msg05"
|
if(crypto_aead_chacha20poly1305_ietf_decrypt( // use SessionKey to decrypt encryptedData TLV with padded nonce="PS-Msg05"
|
||||||
decrypted, &decryptedLen, NULL,
|
decrypted, &decryptedLen, NULL,
|
||||||
|
|
@ -542,7 +542,7 @@ int HAPClient::postPairSetupURL(){
|
||||||
|
|
||||||
uint8_t iosDeviceX[32];
|
uint8_t iosDeviceX[32];
|
||||||
hkdf.create(iosDeviceX,srp.sharedSecret,64,"Pair-Setup-Controller-Sign-Salt","Pair-Setup-Controller-Sign-Info"); // derive iosDeviceX from SRP Shared Secret using HKDF
|
hkdf.create(iosDeviceX,srp.sharedSecret,64,"Pair-Setup-Controller-Sign-Salt","Pair-Setup-Controller-Sign-Info"); // derive iosDeviceX from SRP Shared Secret using HKDF
|
||||||
size_t iosDeviceXLen=32;
|
const size_t iosDeviceXLen=32;
|
||||||
|
|
||||||
uint8_t *iosDevicePairingID = tlv8.buf(kTLVType_Identifier); // set iosDevicePairingID from TLV record
|
uint8_t *iosDevicePairingID = tlv8.buf(kTLVType_Identifier); // set iosDevicePairingID from TLV record
|
||||||
size_t iosDevicePairingIDLen = tlv8.len(kTLVType_Identifier);
|
size_t iosDevicePairingIDLen = tlv8.len(kTLVType_Identifier);
|
||||||
|
|
@ -575,15 +575,15 @@ int HAPClient::postPairSetupURL(){
|
||||||
|
|
||||||
uint8_t accessoryX[32];
|
uint8_t accessoryX[32];
|
||||||
hkdf.create(accessoryX,srp.sharedSecret,64,"Pair-Setup-Accessory-Sign-Salt","Pair-Setup-Accessory-Sign-Info"); // derive accessoryX from SRP Shared Secret using HKDF
|
hkdf.create(accessoryX,srp.sharedSecret,64,"Pair-Setup-Accessory-Sign-Salt","Pair-Setup-Accessory-Sign-Info"); // derive accessoryX from SRP Shared Secret using HKDF
|
||||||
size_t accessoryXLen=32;
|
const size_t accessoryXLen=32;
|
||||||
|
|
||||||
uint8_t *accessoryPairingID=accessory.ID; // set accessoryPairingID from storage
|
uint8_t *accessoryPairingID=accessory.ID; // set accessoryPairingID from storage
|
||||||
size_t accessoryPairingIDLen=17;
|
const size_t accessoryPairingIDLen=17;
|
||||||
|
|
||||||
uint8_t *accessoryLTPK=accessory.LTPK; // set accessoryLTPK (Ed25519 long-term public key) from storage
|
uint8_t *accessoryLTPK=accessory.LTPK; // set accessoryLTPK (Ed25519 long-term public key) from storage
|
||||||
size_t accessoryLTPKLen=32;
|
const size_t accessoryLTPKLen=32;
|
||||||
|
|
||||||
size_t accessoryInfoLen=accessoryXLen+accessoryPairingIDLen+accessoryLTPKLen; // total size of accessoryInfo
|
const size_t accessoryInfoLen=accessoryXLen+accessoryPairingIDLen+accessoryLTPKLen; // total size of accessoryInfo
|
||||||
uint8_t accessoryInfo[accessoryInfoLen];
|
uint8_t accessoryInfo[accessoryInfoLen];
|
||||||
|
|
||||||
memcpy(accessoryInfo,accessoryX,accessoryXLen); // accessoryInfo = accessoryX
|
memcpy(accessoryInfo,accessoryX,accessoryXLen); // accessoryInfo = accessoryX
|
||||||
|
|
@ -694,9 +694,9 @@ int HAPClient::postPairVerifyURL(){
|
||||||
crypto_scalarmult_curve25519(sharedCurveKey,secretCurveKey,iosCurveKey); // generate (and persist) Pair Verify SharedSecret CurveKey from Accessory's Curve25519 secret key and Controller's Curve25519 public key (32 bytes)
|
crypto_scalarmult_curve25519(sharedCurveKey,secretCurveKey,iosCurveKey); // generate (and persist) Pair Verify SharedSecret CurveKey from Accessory's Curve25519 secret key and Controller's Curve25519 public key (32 bytes)
|
||||||
|
|
||||||
uint8_t *accessoryPairingID = accessory.ID; // set accessoryPairingID
|
uint8_t *accessoryPairingID = accessory.ID; // set accessoryPairingID
|
||||||
size_t accessoryPairingIDLen = 17;
|
const size_t accessoryPairingIDLen = 17;
|
||||||
|
|
||||||
size_t accessoryInfoLen=32+accessoryPairingIDLen+32; // total size of accessoryInfo
|
const size_t accessoryInfoLen=32+accessoryPairingIDLen+32; // total size of accessoryInfo
|
||||||
uint8_t accessoryInfo[accessoryInfoLen];
|
uint8_t accessoryInfo[accessoryInfoLen];
|
||||||
|
|
||||||
memcpy(accessoryInfo,publicCurveKey,32); // accessoryInfo = Accessory's Curve25519 public key
|
memcpy(accessoryInfo,publicCurveKey,32); // accessoryInfo = Accessory's Curve25519 public key
|
||||||
|
|
@ -750,8 +750,8 @@ int HAPClient::postPairVerifyURL(){
|
||||||
return(0);
|
return(0);
|
||||||
};
|
};
|
||||||
|
|
||||||
uint8_t decrypted[1024]; // temporary storage for decrypted data
|
TempBuffer<uint8_t> decrypted(tlv8.len(kTLVType_EncryptedData)); // temporary storage for decrypted data
|
||||||
unsigned long long decryptedLen; // length (in bytes) of decrypted data
|
unsigned long long decryptedLen; // length (in bytes) of decrypted data
|
||||||
|
|
||||||
if(crypto_aead_chacha20poly1305_ietf_decrypt( // use SessionKey to decrypt encrypytedData TLV with padded nonce="PV-Msg03"
|
if(crypto_aead_chacha20poly1305_ietf_decrypt( // use SessionKey to decrypt encrypytedData TLV with padded nonce="PV-Msg03"
|
||||||
decrypted, &decryptedLen, NULL,
|
decrypted, &decryptedLen, NULL,
|
||||||
|
|
@ -804,7 +804,7 @@ int HAPClient::postPairVerifyURL(){
|
||||||
charPrintRow(tPair->ID,36,2);
|
charPrintRow(tPair->ID,36,2);
|
||||||
LOG2("...\n");
|
LOG2("...\n");
|
||||||
|
|
||||||
size_t iosDeviceInfoLen=32+36+32;
|
const size_t iosDeviceInfoLen=32+36+32;
|
||||||
uint8_t iosDeviceInfo[iosDeviceInfoLen];
|
uint8_t iosDeviceInfo[iosDeviceInfoLen];
|
||||||
|
|
||||||
memcpy(iosDeviceInfo,iosCurveKey,32);
|
memcpy(iosDeviceInfo,iosCurveKey,32);
|
||||||
|
|
@ -1006,7 +1006,6 @@ int HAPClient::getCharacteristicsURL(char *urlBuf){
|
||||||
if(urlBuf[i]==',')
|
if(urlBuf[i]==',')
|
||||||
numIDs++;
|
numIDs++;
|
||||||
|
|
||||||
// char *ids[numIDs]; // reserve space for number of IDs found
|
|
||||||
TempBuffer<char *> ids(numIDs); // reserve space for number of IDs found
|
TempBuffer<char *> ids(numIDs); // reserve space for number of IDs found
|
||||||
int flags=GET_VALUE|GET_AID; // flags indicating which characteristic fields to include in response (HAP Table 6-13)
|
int flags=GET_VALUE|GET_AID; // flags indicating which characteristic fields to include in response (HAP Table 6-13)
|
||||||
numIDs=0; // reset number of IDs found
|
numIDs=0; // reset number of IDs found
|
||||||
|
|
@ -1045,7 +1044,6 @@ int HAPClient::getCharacteristicsURL(char *urlBuf){
|
||||||
return(0);
|
return(0);
|
||||||
|
|
||||||
int nBytes=homeSpan.sprintfAttributes(ids.get(),numIDs,flags,NULL); // get JSON response - includes terminating null (will be recast to uint8_t* below)
|
int nBytes=homeSpan.sprintfAttributes(ids.get(),numIDs,flags,NULL); // get JSON response - includes terminating null (will be recast to uint8_t* below)
|
||||||
// char jsonBuf[nBytes+1];
|
|
||||||
TempBuffer<char> jsonBuf(nBytes+1);
|
TempBuffer<char> jsonBuf(nBytes+1);
|
||||||
homeSpan.sprintfAttributes(ids.get(),numIDs,flags,jsonBuf.get());
|
homeSpan.sprintfAttributes(ids.get(),numIDs,flags,jsonBuf.get());
|
||||||
|
|
||||||
|
|
@ -1109,8 +1107,8 @@ int HAPClient::putCharacteristicsURL(char *json){
|
||||||
} else { // multicast respose is required
|
} else { // multicast respose is required
|
||||||
|
|
||||||
int nBytes=homeSpan.sprintfAttributes(pObj,n,NULL); // get JSON response - includes terminating null (will be recast to uint8_t* below)
|
int nBytes=homeSpan.sprintfAttributes(pObj,n,NULL); // get JSON response - includes terminating null (will be recast to uint8_t* below)
|
||||||
char jsonBuf[nBytes+1];
|
TempBuffer<char> jsonBuf(nBytes+1);
|
||||||
homeSpan.sprintfAttributes(pObj,n,jsonBuf);
|
homeSpan.sprintfAttributes(pObj,n,jsonBuf.get());
|
||||||
|
|
||||||
char *body;
|
char *body;
|
||||||
asprintf(&body,"HTTP/1.1 207 Multi-Status\r\nContent-Type: application/hap+json\r\nContent-Length: %d\r\n\r\n",nBytes);
|
asprintf(&body,"HTTP/1.1 207 Multi-Status\r\nContent-Type: application/hap+json\r\nContent-Length: %d\r\n\r\n",nBytes);
|
||||||
|
|
@ -1119,10 +1117,10 @@ int HAPClient::putCharacteristicsURL(char *json){
|
||||||
LOG2(client.remoteIP());
|
LOG2(client.remoteIP());
|
||||||
LOG2(" >>>>>>>>>>\n");
|
LOG2(" >>>>>>>>>>\n");
|
||||||
LOG2(body);
|
LOG2(body);
|
||||||
LOG2(jsonBuf);
|
LOG2(jsonBuf.get());
|
||||||
LOG2("\n");
|
LOG2("\n");
|
||||||
|
|
||||||
sendEncrypted(body,(uint8_t *)jsonBuf,nBytes); // note recasting of jsonBuf into uint8_t*
|
sendEncrypted(body,(uint8_t *)jsonBuf.get(),nBytes); // note recasting of jsonBuf into uint8_t*
|
||||||
free(body);
|
free(body);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -1376,8 +1374,8 @@ void HAPClient::eventNotify(SpanBuf *pObj, int nObj, int ignoreClient){
|
||||||
int nBytes=homeSpan.sprintfNotify(pObj,nObj,NULL,cNum); // get JSON response for notifications to client cNum - includes terminating null (will be recast to uint8_t* below)
|
int nBytes=homeSpan.sprintfNotify(pObj,nObj,NULL,cNum); // get JSON response for notifications to client cNum - includes terminating null (will be recast to uint8_t* below)
|
||||||
|
|
||||||
if(nBytes>0){ // if there are notifications to send to client cNum
|
if(nBytes>0){ // if there are notifications to send to client cNum
|
||||||
char jsonBuf[nBytes+1];
|
TempBuffer<char> jsonBuf(nBytes+1);
|
||||||
homeSpan.sprintfNotify(pObj,nObj,jsonBuf,cNum);
|
homeSpan.sprintfNotify(pObj,nObj,jsonBuf.get(),cNum);
|
||||||
|
|
||||||
char *body;
|
char *body;
|
||||||
asprintf(&body,"EVENT/1.0 200 OK\r\nContent-Type: application/hap+json\r\nContent-Length: %d\r\n\r\n",nBytes);
|
asprintf(&body,"EVENT/1.0 200 OK\r\nContent-Type: application/hap+json\r\nContent-Length: %d\r\n\r\n",nBytes);
|
||||||
|
|
@ -1386,10 +1384,10 @@ void HAPClient::eventNotify(SpanBuf *pObj, int nObj, int ignoreClient){
|
||||||
LOG2(hap[cNum]->client.remoteIP());
|
LOG2(hap[cNum]->client.remoteIP());
|
||||||
LOG2(" >>>>>>>>>>\n");
|
LOG2(" >>>>>>>>>>\n");
|
||||||
LOG2(body);
|
LOG2(body);
|
||||||
LOG2(jsonBuf);
|
LOG2(jsonBuf.get());
|
||||||
LOG2("\n");
|
LOG2("\n");
|
||||||
|
|
||||||
hap[cNum]->sendEncrypted(body,(uint8_t *)jsonBuf,nBytes); // note recasting of jsonBuf into uint8_t*
|
hap[cNum]->sendEncrypted(body,(uint8_t *)jsonBuf.get(),nBytes); // note recasting of jsonBuf into uint8_t*
|
||||||
free(body);
|
free(body);
|
||||||
|
|
||||||
} // if there are characteristic updates to notify client cNum
|
} // if there are characteristic updates to notify client cNum
|
||||||
|
|
|
||||||
|
|
@ -630,10 +630,10 @@ void Span::processSerialCommand(const char *c){
|
||||||
case 'd': {
|
case 'd': {
|
||||||
|
|
||||||
TempBuffer<char> qBuf(sprintfAttributes(NULL)+1);
|
TempBuffer<char> qBuf(sprintfAttributes(NULL)+1);
|
||||||
sprintfAttributes(qBuf.get());
|
sprintfAttributes(qBuf);
|
||||||
|
|
||||||
LOG0("\n*** Attributes Database: size=%d configuration=%d ***\n\n",qBuf.len()-1,hapConfig.configNumber);
|
LOG0("\n*** Attributes Database: size=%d configuration=%d ***\n\n",qBuf.len()-1,hapConfig.configNumber);
|
||||||
prettyPrint(qBuf.get());
|
prettyPrint(qBuf);
|
||||||
LOG0("\n*** End Database ***\n\n");
|
LOG0("\n*** End Database ***\n\n");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -271,12 +271,13 @@ void SRP6A::print(mbedtls_mpi *mpi, int minLogLevel){
|
||||||
if(homeSpan.getLogLevel()<minLogLevel)
|
if(homeSpan.getLogLevel()<minLogLevel)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
char sBuf[2000];
|
|
||||||
size_t sLen;
|
size_t sLen;
|
||||||
|
|
||||||
mbedtls_mpi_write_string(mpi,16,sBuf,2000,&sLen);
|
mbedtls_mpi_write_string(mpi,16,NULL,0,&sLen);
|
||||||
|
TempBuffer<char> sBuf(sLen);
|
||||||
|
mbedtls_mpi_write_string(mpi,16,sBuf.get(),sLen,&sLen);
|
||||||
|
|
||||||
Serial.printf("%d %s\n",(sLen-1)/2,sBuf); // subtract 1 for null-terminator, and then divide by 2 to get number of bytes (e.g. 4F = 2 characters, but represents just one mpi byte)
|
Serial.printf("%d %s\n",(sLen-1)/2,sBuf.get()); // subtract 1 for null-terminator, and then divide by 2 to get number of bytes (e.g. 4F = 2 characters, but represents just one mpi byte)
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
|
|
|
||||||
|
|
@ -86,6 +86,10 @@ class TempBuffer {
|
||||||
bufType *get(){
|
bufType *get(){
|
||||||
return(buf);
|
return(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
operator bufType*() const{
|
||||||
|
return(buf);
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ void setup() {
|
||||||
new Service::AccessoryInformation();
|
new Service::AccessoryInformation();
|
||||||
new Characteristic::Identify();
|
new Characteristic::Identify();
|
||||||
|
|
||||||
for(int i=0;i<50;i++){
|
for(int i=0;i<10;i++){
|
||||||
new SpanAccessory();
|
new SpanAccessory();
|
||||||
new Service::AccessoryInformation();
|
new Service::AccessoryInformation();
|
||||||
new Characteristic::Identify();
|
new Characteristic::Identify();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue