private static bool IsAppProtocolVersionValid( Peer remotePeer, AppProtocolVersion localVersion, AppProtocolVersion remoteVersion, IImmutableSet <PublicKey> trustedAppProtocolVersionSigners, DifferentAppProtocolVersionEncountered differentAppProtocolVersionEncountered) { if (remoteVersion.Equals(localVersion)) { return(true); } if (!(trustedAppProtocolVersionSigners is null) && !trustedAppProtocolVersionSigners.Any(remoteVersion.Verify)) { return(false); } if (differentAppProtocolVersionEncountered is null) { return(false); } return(differentAppProtocolVersionEncountered(remotePeer, remoteVersion, localVersion)); }
private static void ValidateAppProtocolVersionTemplate( AppProtocolVersion appProtocolVersion, IImmutableSet <PublicKey>?trustedAppProtocolVersionSigners, DifferentAppProtocolVersionEncountered?differentAppProtocolVersionEncountered, Peer peer, byte[] identity, AppProtocolVersion peerAppProtocolVersion) { if (peerAppProtocolVersion.Equals(appProtocolVersion)) { return; } bool trusted = !( trustedAppProtocolVersionSigners is { } tapvs&& tapvs.All(publicKey => !peerAppProtocolVersion.Verify(publicKey))); if (trusted && differentAppProtocolVersionEncountered is { } dapve) { dapve(peer, peerAppProtocolVersion, appProtocolVersion); } throw new DifferentAppProtocolVersionException( $"The APV of a received message is invalid; " + $"Local: APV {appProtocolVersion} " + $"with signature {ByteUtil.Hex(appProtocolVersion.Signature)} " + $"by signer {appProtocolVersion.Signer}\n" + $"Remote: APV {peerAppProtocolVersion} " + $"with signature {ByteUtil.Hex(peerAppProtocolVersion.Signature)} " + $"by signer {peerAppProtocolVersion.Signer}\n" + $"Signed by a trusted signer: {trusted}", peer, identity, appProtocolVersion, peerAppProtocolVersion, trusted); }