private bool PerformHandshakeStage1(bool encrypted)
{
OutputBuffer.WriteByte((byte)(encrypted ? 6 : 3));
_pOutputBuffer=new byte[1536];
var rand = new Random();
for (var i = 0; i < 1536; i++)
{
_pOutputBuffer[i] = (byte) (rand.Next()%256);
}
_pOutputBuffer[0] = _pOutputBuffer[1] = _pOutputBuffer[2] = _pOutputBuffer[3] = 0;
// 5. Put the flash version. We impersonate with 9.0.124.2
_pOutputBuffer[4] = 9;
_pOutputBuffer[5] = 0;
_pOutputBuffer[6] = 124;
_pOutputBuffer[7] = 2;
var clientDHOffset = GetDHOffset(_pOutputBuffer, _usedScheme);
_pDHWrapper = new DHWrapper(1024);
_pClientPublicKey = _pDHWrapper.PublicKey;
Buffer.BlockCopy(_pClientPublicKey, 0, _pOutputBuffer, (int)clientDHOffset, 128);
var clientDigestOffset = GetDigestOffset(_pOutputBuffer, _usedScheme);
var pTempBuffer = new byte[1536 - 32];
Buffer.BlockCopy(_pOutputBuffer, 0, pTempBuffer, 0, (int)clientDigestOffset);
Buffer.BlockCopy(_pOutputBuffer, (int) (clientDigestOffset + 32), pTempBuffer, (int)clientDigestOffset, (int) (1536 - clientDigestOffset - 32));
//var pTempHash = new byte[512];
var pTempHash = HMACsha256(pTempBuffer,1536-32,GenuineFpKey,30 ); // Hmacsha256.ComputeHash(pTempBuffer, 0,1536 - 32);
Buffer.BlockCopy(pTempHash, 0, _pOutputBuffer, (int) clientDigestOffset,32);
_pClientDigest = new byte[32];
Buffer.BlockCopy(pTempHash, 0, _pClientDigest, 0, 32);
OutputBuffer.Write(_pOutputBuffer, 0, 1536);
//_outputBuffer222.Write(_pOutputBuffer, 0, 1536);
_pOutputBuffer = null;
if (!EnqueueForOutbound(OutputBuffer))
{
Logger.FATAL("Unable to signal ouput data");
return false;
}
_rtmpState = RTMPState.RTMP_STATE_CLIENT_REQUEST_SENT;
return true;
}