public virtual TlsHandshakeHash NotifyPrfDetermined()
    {
        int prfAlgorithm = mContext.SecurityParameters.PrfAlgorithm;

        if (prfAlgorithm == 0)
        {
            CombinedHash combinedHash = new CombinedHash();
            combinedHash.Init(mContext);
            mBuf.UpdateDigest(combinedHash);
            return(combinedHash.NotifyPrfDetermined());
        }
        mPrfHashAlgorithm = TlsUtilities.GetHashAlgorithmForPrfAlgorithm(prfAlgorithm);
        CheckTrackingHash((byte)mPrfHashAlgorithm);
        return(this);
    }
    public override byte[] GenerateServerKeyExchange()
    {
        DigestInputBuffer digestInputBuffer = new DigestInputBuffer();

        mECAgreePrivateKey = TlsEccUtilities.GenerateEphemeralServerKeyExchange(mContext.SecureRandom, mNamedCurves, mClientECPointFormats, digestInputBuffer);
        SignatureAndHashAlgorithm signatureAndHashAlgorithm = TlsUtilities.GetSignatureAndHashAlgorithm(mContext, mServerCredentials);
        IDigest            digest             = TlsUtilities.CreateHash(signatureAndHashAlgorithm);
        SecurityParameters securityParameters = mContext.SecurityParameters;

        digest.BlockUpdate(securityParameters.clientRandom, 0, securityParameters.clientRandom.Length);
        digest.BlockUpdate(securityParameters.serverRandom, 0, securityParameters.serverRandom.Length);
        digestInputBuffer.UpdateDigest(digest);
        byte[]          hash            = DigestUtilities.DoFinal(digest);
        byte[]          signature       = mServerCredentials.GenerateCertificateSignature(hash);
        DigitallySigned digitallySigned = new DigitallySigned(signatureAndHashAlgorithm, signature);

        digitallySigned.Encode(digestInputBuffer);
        return(digestInputBuffer.ToArray());
    }
    public override byte[] GenerateServerKeyExchange()
    {
        mSrpServer.Init(mSrpGroup, mSrpVerifier, TlsUtilities.CreateHash(2), mContext.SecureRandom);
        BigInteger        b = mSrpServer.GenerateServerCredentials();
        ServerSrpParams   serverSrpParams   = new ServerSrpParams(mSrpGroup.N, mSrpGroup.G, mSrpSalt, b);
        DigestInputBuffer digestInputBuffer = new DigestInputBuffer();

        serverSrpParams.Encode(digestInputBuffer);
        if (mServerCredentials != null)
        {
            SignatureAndHashAlgorithm signatureAndHashAlgorithm = TlsUtilities.GetSignatureAndHashAlgorithm(mContext, mServerCredentials);
            IDigest            digest             = TlsUtilities.CreateHash(signatureAndHashAlgorithm);
            SecurityParameters securityParameters = mContext.SecurityParameters;
            digest.BlockUpdate(securityParameters.clientRandom, 0, securityParameters.clientRandom.Length);
            digest.BlockUpdate(securityParameters.serverRandom, 0, securityParameters.serverRandom.Length);
            digestInputBuffer.UpdateDigest(digest);
            byte[] array = new byte[digest.GetDigestSize()];
            digest.DoFinal(array, 0);
            byte[]          signature       = mServerCredentials.GenerateCertificateSignature(array);
            DigitallySigned digitallySigned = new DigitallySigned(signatureAndHashAlgorithm, signature);
            digitallySigned.Encode(digestInputBuffer);
        }
        return(digestInputBuffer.ToArray());
    }