Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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);
        }