private bool PerformHandshakeStage2(InputStream inputBuffer, bool encrypted)
{
if (encrypted || _pProtocolHandler.ValidateHandshake)
{
if (!VerifyServer(inputBuffer))
{
Logger.FATAL("Unable to verify server");
return false;
}
}
var pBuffer = new BufferWithOffset(inputBuffer);
pBuffer.Offset++;
var serverDHOffset = GetDHOffset(pBuffer, _usedScheme);
if (_pDHWrapper == null)
{
Logger.FATAL("dh wrapper not initialized");
return false;
}
var pubKey= new byte[128];
Buffer.BlockCopy(pBuffer.Buffer, (pBuffer.Offset + (int)serverDHOffset), pubKey, 0, 128);
var secretKey = _pDHWrapper.CreateSharedKey(pubKey);
if (encrypted)
{
_pKeyIn = new RC4_KEY();
_pKeyOut = new RC4_KEY();
var pubKeyIn = new byte[128];
Buffer.BlockCopy(pBuffer.Buffer,(int) (pBuffer.Offset+serverDHOffset),pubKeyIn,0,128);
Utils.InitRC4Encryption(secretKey, pubKeyIn, _pClientPublicKey,_pKeyIn,_pKeyOut);
}
var serverDigestOffset = GetDigestOffset(pBuffer, _usedScheme);
_pOutputBuffer = Utils.GenerateRandomBytes(1536);
pBuffer.Offset += (int)serverDigestOffset;
var pChallangeKey = HMACsha256(pBuffer, 32, GenuineFpKey, 62);//Hmacsha256.ComputeHash(pBuffer.Buffer, pBuffer.Offset, 32);
var pDigest = new HMACSHA256(pChallangeKey).ComputeHash(_pOutputBuffer, 0, 1536 - 32);
Buffer.BlockCopy(pDigest,0,_pOutputBuffer,1536-32,32);
OutputBuffer.Write(_pOutputBuffer, 0, 1536);
_pOutputBuffer = null;
_rtmpState = RTMPState.RTMP_STATE_DONE;
return true;
}