mcs.go

mspMessageCryptoService:gossip消息加密服务相关实现,其实现了MessageCryptoService接口。

NewMCS

根据参数创建一个mspMessageCryptoService实例。此函数由3个参数:

  • policies.ChannelPolicyManagerGetter:通过管理器方法访问给定通道的策略管理器。

  • crypto.LocalSigner:签名功能实例

  • mgmt.DeserializersManager:反序列化管理器

ValidateIdentity

验证远程peer的身份。如果peer身份是invalid, revoked, expired,那么返回错误;否则返回nil

GetPKIidOfCert

返回peer身份的PKI-ID,如果出错,返回nil。peer的PKI-ID是作为MSP身份的序列化版本的peerIdentity的SHA2-256计算值。

  • 反序列化peerIdentity

  • 连接反序列化后的msp-id和 idbytes得到raw字节数组

  • 调用Hash对raw进行sha2-256加密,返回hash结果

VerifyBlock

验证区块是否已经签名,并且区块头里面的序列号与传入的序列号一致,都一致返回nil,否则返回错误。

  • 把传入的signedBlock字节数组转换为common.block结构

  • 比较区块头里面的序列号和传入的序列号是否一致

  • 取出channelid与传入的channelID比较是否一致

  • 验证Header.DataHash等于block.Data的hash值

  • 获得签名验证策略,将签名值和区块数据进行验证

Sign

对一个字节数据进行签名。

Verify

在peer的验证密钥下,检查签名是否是消息的有效签名。

  • 调用getValidatedIdentity获得identity和chainID

  • 如果chainID为空,说明peerIdentity属于peer的本地MSP,调用identity.Verify直接验证签名

  • 如果chainID不为空,签名必须与该通道chainid所在channel读策略验证,调用VerifyByChannel验证。

VerifyByChannel

  • 通过chainID获得策略管理器

  • 策略管理器取得channel读策略

  • 使用读策略来评价消息和签名是否一致

Expiration

获得peerIdentity的过期时间

getValidatedIdentity

使用peerIdentity获得msp identity和chainID

  • 注意peerIdentity假定是Identity的序列化。首先把peerIdentity反序列化,此处用的是deserializer实例。

  • 然后与本地msp进行比对,获得本地反序列化实例GetLocalDeserializer,对peerIdentity反序列化。如果没有报错,则认为local MSP成功反序列化了,进一步校验其它属性和msp Identifier。满足要求则peerIdentity属于peer的本地MSP,返回identity和空的chainID。

  • 上面一步没有校验成功,则调用GetChannelDeserializers获得chainID和对应的IdentityDeserializer,然后使用反序列化实例deserializer进行peerIdentity反序列化,判断获得identity有效性,合格则返回,否则最终返回错误

Last updated