Фикс ассиметричного обмена

This commit is contained in:
RoyceDa
2026-04-04 18:07:24 +02:00
parent a341aedd8d
commit 30f2c90015

View File

@@ -294,14 +294,17 @@ export function CallProvider(props : CallProviderProps) {
/** /**
* Другая сторона отправила нам ключи, теперь отправляем ей свои для генерации общего секрета * Другая сторона отправила нам ключи, теперь отправляем ей свои для генерации общего секрета
*/ */
const keys = generateSessionKeys();
const sharedPublic = packet.getSharedPublic(); const sharedPublic = packet.getSharedPublic();
if(!sharedPublic){ if(!sharedPublic){
info("Received key exchange signal without shared public key"); info("Received key exchange signal without shared public key");
return; return;
} }
if(!sessionKeys){
info("Received key exchange signal but session keys are not generated");
return;
}
const computedSharedSecret = nacl.box.before(Buffer.from(sharedPublic, 'hex'), keys.secretKey); const computedSharedSecret = nacl.box.before(Buffer.from(sharedPublic, 'hex'), sessionKeys.secretKey);
sharedSecretRef.current = Buffer.from(computedSharedSecret).toString('hex'); sharedSecretRef.current = Buffer.from(computedSharedSecret).toString('hex');
info("Generated shared secret for call session: " + sharedSecretRef.current); info("Generated shared secret for call session: " + sharedSecretRef.current);
setCallState(CallState.WEB_RTC_EXCHANGE); setCallState(CallState.WEB_RTC_EXCHANGE);
@@ -316,7 +319,7 @@ export function CallProvider(props : CallProviderProps) {
signalPacket.setSrc(publicKey); signalPacket.setSrc(publicKey);
signalPacket.setDst(activeCall); signalPacket.setDst(activeCall);
signalPacket.setSignalType(SignalType.KEY_EXCHANGE); signalPacket.setSignalType(SignalType.KEY_EXCHANGE);
signalPacket.setSharedPublic(Buffer.from(keys.publicKey).toString('hex')); signalPacket.setSharedPublic(Buffer.from(sessionKeys.publicKey).toString('hex'));
send(signalPacket); send(signalPacket);
} }
if(signalType == SignalType.ACCEPT){ if(signalType == SignalType.ACCEPT){
@@ -556,7 +559,11 @@ export function CallProvider(props : CallProviderProps) {
stopLoopSound(); stopLoopSound();
stopSound(); stopSound();
/** /**
* Звонок принят, можно обмениваться ключами * Звонок принят, генерируем свой ключ для будующего обмена
*/
generateSessionKeys();
/**
* Отправляем сигнал что звонок принят другой стороне, чтобы она могла начать обмен ключами и установку соединения
*/ */
const signalPacket = new PacketSignalPeer(); const signalPacket = new PacketSignalPeer();
signalPacket.setSrc(publicKey); signalPacket.setSrc(publicKey);
@@ -565,6 +572,9 @@ export function CallProvider(props : CallProviderProps) {
signalPacket.setJoinToken(callTokenRef.current); signalPacket.setJoinToken(callTokenRef.current);
signalPacket.setSignalType(SignalType.ACCEPT); signalPacket.setSignalType(SignalType.ACCEPT);
send(signalPacket); send(signalPacket);
/**
* Устанавливаем состояние звонка и стадию обмена ключами
*/
setCallState(CallState.KEY_EXCHANGE); setCallState(CallState.KEY_EXCHANGE);
roleRef.current = CallRole.CALLEE; roleRef.current = CallRole.CALLEE;
} }