Esempio n. 1
0
 public override bool Close()
 {
     if (!base.Close())
     {
         return(false);
     }
     SA.Close("Edge closed!");
     return(true);
 }
Esempio n. 2
0
 public override bool Close()
 {
     if (Interlocked.Exchange(ref _closed, 1) == 1)
     {
         return(false);
     }
     SA.Close("Edge closed!");
     base.Close();
     return(true);
 }
Esempio n. 3
0
        ///<summary>Makes the SecurityOverlord listen to the edge and instantiates
        ///a new SecurityAssociation for the insecure edge.  CreateSecurityAssociation
        ///is idempotent.</summary>
        protected override void WrapEdge(Edge edge)
        {
            edge.Subscribe(_so, null);
            SecurityAssociation sa = _so.CreateSecurityAssociation(edge, DefaultEdgeSPI, !edge.IsInbound);

            if (edge.IsClosed)
            {
                sa.Close("Edge closed too quickly.");
            }
        }
        protected void HandleEdgeClose(object edge, EventArgs ea)
        {
            Edge e = edge as Edge;

            if (e == null)
            {
                throw new Exception("Should be Edge");
            }

            SecurityAssociation sa = null;

            RemoveFromDictionary(e, out sa);

            if (sa != null)
            {
                sa.Close("Edge closed early.");
            }
        }
Esempio n. 5
0
        override protected void ValidDisconnection(Connection con)
        {
            ISender sender;

            if (!_address_to_sender.TryGetValue(con.Address, out sender))
            {
                sender = _so.CheckForSecurityAssociation(con.State.Edge);
                if (sender == null)
                {
                    return;
                }
            }
            SecurityAssociation sa = sender as SecurityAssociation;

            if (sa != null)
            {
                sa.Close("Connection closed...");
            }
        }
    /// <summary>3b) Receive a Confirm, verify the entire stack and send a Confirm
    /// 4a)Receive a Confirm, verify the entire stack and all set to go</summary>
    /// <param name="sa">A security association that we wish to perform the
    /// specified control operation on.</param>
    /// <param name="scm">The received SecurityControlMessage.</param>
    /// <param name="scm_reply">A prepared reply message (with headers and such.</param>
    /// <param name="return_path">Where to send the result.</param>
    /// <param name="low_level_sender">We expect the return_path to not be an edge or
    /// some other type of "low level" sender, so this contains the parsed out value.</param>
    protected void HandleControlConfirm(SecurityAssociation sa,
        SecurityControlMessage scm, SecurityControlMessage scm_reply,
        ISender return_path, ISender low_level_sender)
    {
      ProtocolLog.WriteIf(ProtocolLog.Security, GetHashCode() + " Received Confirm from: " + low_level_sender);
      if(sa == null) {
        throw new Exception("No valid SA!");
      }
      HashAlgorithm sha1 = new SHA1CryptoServiceProvider();
      scm.Verify((RSACryptoServiceProvider) sa.RemoteCertificate.Value.RSA, sha1);

      if(return_path == low_level_sender) {
        sa.VerifyResponse(scm.Hash);
      } else {
        sa.VerifyRequest(scm.Hash);
        scm_reply.LocalCookie = scm.RemoteCookie;
        scm_reply.RemoteCookie = scm.LocalCookie;
        scm_reply.Hash = sa.DHEWithCertificateAndCAsInHash.Value;
        scm_reply.Type = SecurityControlMessage.MessageType.Confirm;
        lock(_private_key_lock) {
          scm_reply.Sign(_private_key, sha1);
        }
        ICopyable to_send = new CopyList(SecureControl, scm_reply.Packet);
        return_path.Send(to_send);
      }
      if(Verify(sa)) {
        sa.Enable();
      } else {
        sa.Close("Unable to verify the SA as being valid!");
      }

      ProtocolLog.WriteIf(ProtocolLog.Security, GetHashCode() + " Successful Confirm from: " + low_level_sender);
    }