/********EXTERNAL OBJECT PUBLIC METHODS  - END ********/

        private String Sign(PrivateKey key, string hashAlgorithm, Stream input)
        {
            PrivateKeyManager keyMan = (PrivateKeyManager)key;

            if (keyMan.HasError())
            {
                this.error = keyMan.GetError();
                return("");
            }
            AsymmetricSigningAlgorithm asymmetricSigningAlgorithm = AsymmetricSigningAlgorithmUtils
                                                                    .GetAsymmetricSigningAlgorithm(keyMan.getPrivateKeyAlgorithm(), this.error);

            if (this.HasError())
            {
                return("");
            }
            ISigner signer = AsymmetricSigningAlgorithmUtils.GetSigner(asymmetricSigningAlgorithm, GetHash(hashAlgorithm),
                                                                       this.error);

            if (this.HasError())
            {
                return("");
            }
            SetUpSigner(signer, input, keyMan.getPrivateKeyParameterForSigning(), true);
            if (this.HasError())
            {
                return("");
            }
            byte[] outputBytes = null;
            try
            {
                outputBytes = signer.GenerateSignature();
            }
            catch (Exception e)
            {
                error.setError("AE01", e.Message);
                return("");
            }
            String result = "";

            try
            {
                result = Base64.ToBase64String(outputBytes);
            }
            catch (Exception e)
            {
                error.setError("AE018", e.Message);
                return("");
            }
            return(result);
        }