mirror of
https://github.com/moonlight-stream/moonlight-common-c.git
synced 2025-07-01 23:35:58 +00:00
Add control stream encryption v2 support
This commit is contained in:
parent
b6bbb4fb26
commit
3430ee2c3a
@ -90,7 +90,7 @@ static int intervalTotalFrameCount;
|
|||||||
static uint64_t intervalStartTimeMs;
|
static uint64_t intervalStartTimeMs;
|
||||||
static int lastIntervalLossPercentage;
|
static int lastIntervalLossPercentage;
|
||||||
static int lastConnectionStatusUpdate;
|
static int lastConnectionStatusUpdate;
|
||||||
static int currentEnetSequenceNumber;
|
static uint32_t currentEnetSequenceNumber;
|
||||||
static uint64_t firstFrameTimeMs;
|
static uint64_t firstFrameTimeMs;
|
||||||
|
|
||||||
static LINKED_BLOCKING_QUEUE invalidReferenceFrameTuples;
|
static LINKED_BLOCKING_QUEUE invalidReferenceFrameTuples;
|
||||||
@ -503,9 +503,18 @@ static bool encryptControlMessage(PNVCTL_ENCRYPTED_PACKET_HEADER encPacket, PNVC
|
|||||||
unsigned char iv[16] = { 0 };
|
unsigned char iv[16] = { 0 };
|
||||||
int encryptedSize = sizeof(*packet) + packet->payloadLength;
|
int encryptedSize = sizeof(*packet) + packet->payloadLength;
|
||||||
|
|
||||||
// This is a truncating cast, but it's what Nvidia does, so we have to mimic it.
|
|
||||||
// NB: Setting the IV must happen while encPacket->seq is still in native byte-order!
|
// NB: Setting the IV must happen while encPacket->seq is still in native byte-order!
|
||||||
iv[0] = (unsigned char)encPacket->seq;
|
if (EncryptionFeaturesEnabled & SS_ENC_CONTROL_V2) {
|
||||||
|
// Populate the IV in little endian byte order
|
||||||
|
iv[3] = (unsigned char)(encPacket->seq >> 24);
|
||||||
|
iv[2] = (unsigned char)(encPacket->seq >> 16);
|
||||||
|
iv[1] = (unsigned char)(encPacket->seq >> 8);
|
||||||
|
iv[0] = (unsigned char)(encPacket->seq >> 0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// This is a truncating cast, but it's what Nvidia does, so we have to mimic it.
|
||||||
|
iv[0] = (unsigned char)encPacket->seq;
|
||||||
|
}
|
||||||
|
|
||||||
encPacket->encryptedHeaderType = LE16(encPacket->encryptedHeaderType);
|
encPacket->encryptedHeaderType = LE16(encPacket->encryptedHeaderType);
|
||||||
encPacket->length = LE16(encPacket->length);
|
encPacket->length = LE16(encPacket->length);
|
||||||
@ -545,8 +554,17 @@ static bool decryptControlMessageToV1(PNVCTL_ENCRYPTED_PACKET_HEADER encPacket,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is a truncating cast, but it's what Nvidia does, so we have to mimic it.
|
if (EncryptionFeaturesEnabled & SS_ENC_CONTROL_V2) {
|
||||||
iv[0] = (unsigned char)encPacket->seq;
|
// Populate the IV in little endian byte order
|
||||||
|
iv[3] = (unsigned char)(encPacket->seq >> 24);
|
||||||
|
iv[2] = (unsigned char)(encPacket->seq >> 16);
|
||||||
|
iv[1] = (unsigned char)(encPacket->seq >> 8);
|
||||||
|
iv[0] = (unsigned char)(encPacket->seq >> 0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// This is a truncating cast, but it's what Nvidia does, so we have to mimic it.
|
||||||
|
iv[0] = (unsigned char)encPacket->seq;
|
||||||
|
}
|
||||||
|
|
||||||
int plaintextLength = encPacket->length - sizeof(encPacket->seq) - AES_GCM_TAG_LENGTH;
|
int plaintextLength = encPacket->length - sizeof(encPacket->seq) - AES_GCM_TAG_LENGTH;
|
||||||
*packet = malloc(plaintextLength);
|
*packet = malloc(plaintextLength);
|
||||||
|
@ -266,11 +266,18 @@ static PSDP_OPTION getAttributesList(char*urlSafeAddr) {
|
|||||||
optionHead = NULL;
|
optionHead = NULL;
|
||||||
err = 0;
|
err = 0;
|
||||||
|
|
||||||
// Send client feature flags to Sunshine hosts
|
|
||||||
if (IS_SUNSHINE()) {
|
if (IS_SUNSHINE()) {
|
||||||
|
// Send client feature flags to Sunshine hosts
|
||||||
uint32_t moonlightFeatureFlags = ML_FF_FEC_STATUS | ML_FF_SESSION_ID_V1;
|
uint32_t moonlightFeatureFlags = ML_FF_FEC_STATUS | ML_FF_SESSION_ID_V1;
|
||||||
snprintf(payloadStr, sizeof(payloadStr), "%u", moonlightFeatureFlags);
|
snprintf(payloadStr, sizeof(payloadStr), "%u", moonlightFeatureFlags);
|
||||||
err |= addAttributeString(&optionHead, "x-ml-general.featureFlags", payloadStr);
|
err |= addAttributeString(&optionHead, "x-ml-general.featureFlags", payloadStr);
|
||||||
|
|
||||||
|
// New-style control stream encryption is low overhead, so we enable it any time it is supported
|
||||||
|
if (EncryptionFeaturesSupported & SS_ENC_CONTROL_V2) {
|
||||||
|
EncryptionFeaturesEnabled |= SS_ENC_CONTROL_V2;
|
||||||
|
}
|
||||||
|
snprintf(payloadStr, sizeof(payloadStr), "%u", EncryptionFeaturesEnabled);
|
||||||
|
err |= addAttributeString(&optionHead, "x-ss-general.encryptionEnabled", payloadStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(payloadStr, sizeof(payloadStr), "%d", StreamConfig.width);
|
snprintf(payloadStr, sizeof(payloadStr), "%d", StreamConfig.width);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user