加密握手协议全局位置

Server服务器作为上层使用的接口,直接调用Start启动。Start完成启动监听端口、连接以及建立通信的任务。在运行中,Star通过创建多个goroutine,并将goroutine的结果通过channel形式汇聚给run进行集中处理。当用户间建立节点以后,通过Msg格式进行通信。其中

newTransport 是和节点建立连接(tcp或者udp)后进行协商密钥、协议握手的地方,通过rlpx协议来进行握手。除了建立rlpx握手,在运行通信的整个过程中,需要进行如下判断:

加密握手协议流程

加密握手细节描述

关键步骤补充:

生成Authpacket(Dialing执行) 接收AuthPacket(Listening执行)
1.创建enchandshake结构体,该结构体包含 Initiator(bool) RemoteID(discover.NodeID) remotePub(ecies.pk) initNonce, respNonce(byte) randomPrivateKey(ecies.sk) remoteRandomPub(ecies.pk) 1.创建authMsgV4结构体 gotPlain(bool) initiatorPubkey(byte) Signature(byte) Nonce(byte) Version(unit) |
2.执行makeAuthMsg方法: 1)将romteID恢复为公钥remotePub 其中ECDSA公钥作为ECIES公钥 2) 生成随机intiator nonce 3)生成随机ECDH密钥randomPrivKey 4)对信息签名得到signature(见附录) 处理后输出AuthMsgV4格式的数据 发送的数据包括: Version(=4) Nonce(随机生成) InitiatorPubKey(本地sk参与) Signature 2.读取authMsg操作readHandshakeMsg ◑ 若为pre-EIP8: 1) 将ECDSA私钥作为ECIES私钥 2) 通过私钥解密ECIES密文为明文 3) 对明文进行解码 ◑ 若为EIP8格式: 1) 增加前缀并连接 2) 解密为明文 3) 对明文进行解码 解码后的[]byte赋值给s作为authPacket |
3.生成经过封装的AuthPacket AuthPacket=sealEIP8(AuthMsg) 封装过程如下: 1) rlp编码 2) 填充随机数据使总长至少到100byte 3) 加前缀 4) 进行ECIES加密(remotePub) |
生成authRespPacket(Listening执行) 接收authRespPacket(Dialing执行)
1.创建enchandshake结构体(同前) 1.创建authRespV4结构体 RandomPubkey(byte) Nonce(byte) Version(unit) |
2.处理authMsg操作, 通过handleAuthMsg方法 1)将远端的身份传入,其中包括 ◑ nonce值传入给initNonce ◑ 将initiatorPK恢复为remotePub 其中ECDSA公钥作为ECIES公钥 2)生成随机ECDH私钥randomPrivKey 3)检查签名signature,并 恢复出remoteRandomPub 2.读取authRespMsg操作, 使用readHandshakeMsg方法 ◑ 若为pre-EIP8: 1) 将ECDSA私钥作为ECIES私钥 2) 通过私钥解密ECIES密文为明文 3) 对明文进行解码 ◑ 若为EIP8格式: 1) 增加前缀并连接 2) 解密为明文 3) 对明文进行解码 解码后byte赋值给s作为authRespPacket |
3. 执行makeAuthMsg方法: 1)生成随机respNonce 2)创建authRespV4结构体 该结构体包括: RandomPubKey Nonce Version 3)对结构体进行copy赋值 处理后输出AuthRespV4格式的数据 发送的数据包括: Version(=4) Nonce(随机生成) RespPubKey(本地sk参与) 3.创建enchandshake结构体(同前) |
4.生成经过封装的AuthRespPacket ◑ 若为明文格式: 需通过ECIES进行加密(remotePub) authRespPacket=sealPlain(AuthMsg) ◑ 若为非明文格式: 进行EIP8封装(同前) authRespPacket=sealEIP8(AuthMsg) 4.处理authResp操作handleAuthResp 1)读取nonce 2)将RandomPubKey恢复为remoteRandomPub 其中将输入的PK去编组化,并 将ECDSA公钥作为ECIES公钥 |

感谢HPB团队整理。