前一篇文字http://blog.csdn.net/linyanwen99/article/details/8664626叙述了rtmfp协议第一趟的握手流程,
本篇文字继续叙述第二趟握手流程,如下:
一.接收packet的处理,如下图:
1.读取该request的数据,如下:
(1)UInt8 marker = packet.read8();其中marker==0x0b,表示session启动过程.
(2)UInt16 time = packet.read16();
(3)UInt8 id = packet.read8();
(4)UInt16 size = packet.read16();
说明:这里读取到的id值为id==0x38,表示Initiator Initial Keying chunk,简称IIKeying数据块.
(5)(UInt32&)farId = request.read32();//读取farId
(6)if(request.read7BitLongValue()!=COOKIE_SIZE)//比较cookie是否匹配
(7)std::map<const UInt8*,Cookie*,CompareCookies>::iterator itCookie = _cookies.find(request.current());//查找cookie,该cookie就是在第一趟握手阶段创建的
(8)读取剩下的signature和public key,如下:
request.next(COOKIE_SIZE);
size_t farSignatureLen = (size_t)request.read7BitLongValue();EVP_Digest(request.current(),farSignatureLen,(UInt8*) peer.id,NULL,EVP_sha256(),NULL);
std::vector<UInt8> publicKey(request.read7BitValue()-2);
request.next(2); // unknown
request.readRaw(&publicKey[0],publicKey.size());
size_t farCertificateLen = request.read7BitValue();//证书长度
转载请注明出处:山水间博客,http://blog.csdn.net/linyanwen99/article/details/8667459
二.Response packet的处理,如下:
1.根据上面的加密,解密数据,farid,以及一些与client相关的数据,创建session,如下:
Session& session = _gateway.createSession(farId,peer,pDecryptKey,pEncryptKey,cookie);
(UInt32&)cookie.id = session.id; //serial number
2.写入signature与public key,如下:
_writer.write32(id);
_writer.write7BitLongValue(_nonce.size());
_writer.writeRaw(&_nonce[0],_nonce.size());
_writer.write8(0x58);//unknown
3.写入typeId和Size,如下:
response.write8(0x78);
response.write16(response.length()-response.position()-2);
说明1:计算加密解密,如下:
UInt8 decryptKey[AES_KEY_SIZE];
UInt8* pDecryptKey=&decryptKey[0];
UInt8 encryptKey[AES_KEY_SIZE];
UInt8* pEncryptKey=&encryptKey[0];
RTMFP::ComputeDiffieHellmanSecret(_pDH,initiatorKey,initKeySize,sharedSecret);
RTMFP::ComputeAsymetricKeys(sharedSecret,initiatorNonce,initNonceSize,&_nonce[0],_nonce.size(),decryptKey,encryptKey);
这些函数最底层都是调用了openssl函数的接口,欲知这些函数接口的功能以及如何使用,请关注本系列文字的更新,后续会讲到.
说明2:这里讲的都是正常的握手情况,不考虑异常情况的处理,欲知异常情况的处理,请关注本系列文字的更新,后续会讲到.
至此,第二趟握手也已经结束
未完待续~~
转载请注明出处:山水间博客,http://blog.csdn.net/linyanwen99/article/details/8667459