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


        /// <summary>
        /// Gets the BufferedBlockCipher loaded with Padding, Mode and Engine to Encrypt with a Symmetric Block Algorithm
        /// </summary>
        /// <param name="algorithm">string SymmetricBlockAlgorithm enum, symmetric block algorithm name</param>
        /// <param name="mode">string SymmetricBlockModes enum, symmetric block mode name</param>
        /// <param name="padding">string SymmetricBlockPadding enum, symmetric block padding name</param>
        /// <returns>BufferedBlockCipher loaded with Padding, Mode and Engine to Encrypt with a Symmetric Block Algorithm</returns>
        private BufferedBlockCipher getCipher(SymmetricBlockAlgorithm algorithm, SymmetricBlockMode mode,
                                              SymmetricBlockPadding padding)
        {
            IBlockCipher        engine        = getCipherEngine(algorithm);
            IBlockCipherPadding paddingCipher = getPadding(padding);
            IBlockCipher        bc;

            if (mode != SymmetricBlockMode.ECB)
            {
                bc = getCipherMode(engine, mode);
            }
            else
            {
                bc = engine;
            }
            // si el padding es WITHCTS el paddingCipher es null
            if (usesCTS(mode, padding))
            {
                return(new CtsBlockCipher(bc)); // no usa el paddingCipher que es el null
            }
            if (padding == SymmetricBlockPadding.NOPADDING)
            {
                return(new BufferedBlockCipher(bc));
            }
            else
            {
                return(new PaddedBufferedBlockCipher(bc, paddingCipher));
            }
        }
示例#2
0
        /// <summary>
        /// Mapping between SymmetricBlockPadding enum representation and string name
        /// </summary>
        /// <param name="symmetricBlockPadding">SymmetricBlockPadding enum, padding name</param>
        /// <param name="error">Error type for error management</param>
        /// <returns>string name value of SymmetricBlockPadding</returns>
        public static string valueOf(SymmetricBlockPadding symmetricBlockPadding, Error error)
        {
            switch (symmetricBlockPadding)
            {
            case SymmetricBlockPadding.NOPADDING:
                return("NOPADDING");

            case SymmetricBlockPadding.PKCS7PADDING:
                return("PKCS7PADDING");

            case SymmetricBlockPadding.ISO10126D2PADDING:
                return("ISO10126D2PADDING");

            case SymmetricBlockPadding.X923PADDING:
                return("X923PADDING");

            case SymmetricBlockPadding.ISO7816D4PADDING:
                return("ISO7816D4PADDING");

            case SymmetricBlockPadding.ZEROBYTEPADDING:
                return("ZEROBYTEPADDING");

            case SymmetricBlockPadding.WITHCTS:
                return("WITHCTS");

            default:
                error.setError("SB009", "Unrecognized SymmetricBlockPadding");
                return("Unrecognized block padding");
            }
        }
        /// <summary>
        /// Builds an IBlockCipherPadding
        /// </summary>
        /// <param name="padding">SymmetricBlockPadding enum, padding name</param>
        /// <returns>IBlockCipherPadding with loaded padding type, if padding is WITHCTS returns null</returns>
        private IBlockCipherPadding getPadding(SymmetricBlockPadding padding)
        {
            IBlockCipherPadding paddingCipher = null;

            switch (padding)
            {
            case SymmetricBlockPadding.NOPADDING:
                paddingCipher = null;
                break;

            case SymmetricBlockPadding.ISO7816D4PADDING:
                paddingCipher = new ISO7816d4Padding();
                break;

            case SymmetricBlockPadding.ISO10126D2PADDING:
                paddingCipher = new ISO10126d2Padding();
                break;

            case SymmetricBlockPadding.PKCS7PADDING:
                paddingCipher = new Pkcs7Padding();
                break;

            case SymmetricBlockPadding.WITHCTS:
                break;

            case SymmetricBlockPadding.X923PADDING:
                paddingCipher = new X923Padding();
                break;

            case SymmetricBlockPadding.ZEROBYTEPADDING:
                paddingCipher = new ZeroBytePadding();
                break;

            default:
                this.error.setError("SB018", "Cipher " + padding + " not recognised.");
                break;
            }
            return(paddingCipher);
        }
 /// <summary>
 /// True if it uses CTS
 /// </summary>
 /// <param name="mode">string SymmetricBlockModes enum, symmetric block mode name</param>
 /// <param name="padding">string SymmetricBlockPadding enum, symmetric block padding name</param>
 /// <returns>boolean true if it uses CTS</returns>
 private bool usesCTS(SymmetricBlockMode mode, SymmetricBlockPadding padding)
 {
     return(mode == SymmetricBlockMode.CTS || padding == SymmetricBlockPadding.WITHCTS);
 }
        public string DoDecrypt(string symmetricBlockAlgorithm, string symmetricBlockMode,
                                string symmetricBlockPadding, string key, string IV, string encryptedInput)
        {
            this.error.cleanError();
            SymmetricBlockAlgorithm algorithm = SymmetricBlockAlgorithmUtils.getSymmetricBlockAlgorithm(symmetricBlockAlgorithm, this.error);
            SymmetricBlockMode      mode      = SymmetricBlockModeUtils.getSymmetricBlockMode(symmetricBlockMode, this.error);
            SymmetricBlockPadding   padding   = SymmetricBlockPaddingUtils.getSymmetricBlockPadding(symmetricBlockPadding, this.error);

            if (this.error.existsError())
            {
                return("");
            }

            BufferedBlockCipher bbc = getCipher(algorithm, mode, padding);

            if (this.error.existsError() && !(string.Compare(this.error.Code, "SB016", true) == 0))
            {
                return("");
            }
            byte[] bytesKey = SecurityUtils.GetHexa(key, "SB023", this.error);
            byte[] bytesIV  = SecurityUtils.GetHexa(IV, "SB023", this.error);
            if (this.HasError())
            {
                return("");
            }

            KeyParameter keyParam = new KeyParameter(bytesKey);

            if (SymmetricBlockMode.ECB != mode && SymmetricBlockMode.OPENPGPCFB != mode)
            {
                ParametersWithIV keyParamWithIV = new ParametersWithIV(keyParam, bytesIV);
                try
                {
                    bbc.Init(false, keyParamWithIV);
                }catch (Exception e)
                {
                    this.error.setError("SB027", e.Message);
                    return("");
                }
            }
            else
            {
                try
                {
                    bbc.Init(false, keyParam);
                }catch (Exception e)
                {
                    this.error.setError("SB028", e.Message);
                    return("");
                }
            }

            byte[] out2            = Base64.Decode(encryptedInput);
            byte[] comparisonBytes = new byte[bbc.GetOutputSize(out2.Length)];
            int    length          = bbc.ProcessBytes(out2, 0, out2.Length, comparisonBytes, 0);

            try
            {
                bbc.DoFinal(comparisonBytes, length);
            }
            catch (Exception)
            {
                this.error.setError("SB015", "Block decryption exception");
                return("");
            }
            this.error.cleanError();

            EncodingUtil eu = new EncodingUtil();

            this.error = eu.GetError();
            return(eu.getString(comparisonBytes));
        }
        public string DoEncrypt(string symmetricBlockAlgorithm, string symmetricBlockMode,
                                string symmetricBlockPadding, string key, string IV, string plainText)
        {
            this.error.cleanError();
            SymmetricBlockAlgorithm algorithm = SymmetricBlockAlgorithmUtils.getSymmetricBlockAlgorithm(symmetricBlockAlgorithm, this.error);
            SymmetricBlockMode      mode      = SymmetricBlockModeUtils.getSymmetricBlockMode(symmetricBlockMode, this.error);
            SymmetricBlockPadding   padding   = SymmetricBlockPaddingUtils.getSymmetricBlockPadding(symmetricBlockPadding, this.error);

            if (this.error.existsError())
            {
                return("");
            }

            BufferedBlockCipher bbc = getCipher(algorithm, mode, padding);

            if (this.error.existsError() && !(string.Compare(this.error.Code, "SB016", true) == 0))
            {
                return("");
            }
            byte[] byteIV  = SecurityUtils.GetHexa(IV, "SB022", this.error);
            byte[] byteKey = SecurityUtils.GetHexa(key, "SB022", this.error);
            if (this.HasError())
            {
                return("");
            }
            KeyParameter keyParam = new KeyParameter(byteKey);

            if (SymmetricBlockMode.ECB != mode && SymmetricBlockMode.OPENPGPCFB != mode)
            {
                ParametersWithIV keyParamWithIV = new ParametersWithIV(keyParam, byteIV);
                try{
                    bbc.Init(true, keyParamWithIV);
                }catch (Exception e)
                {
                    this.error.setError("SB025", e.Message);
                    return("");
                }
            }
            else
            {
                try
                {
                    bbc.Init(true, keyParam);
                }catch (Exception e)
                {
                    this.error.setError("SB026", e.Message);
                    return("");
                }
            }

            EncodingUtil eu = new EncodingUtil();

            byte[] inputBytes = eu.getBytes(plainText);
            if (eu.GetError().existsError())
            {
                this.error = eu.GetError();
                return("");
            }
            byte[] outputBytes = new byte[bbc.GetOutputSize(inputBytes.Length)];
            int    length      = bbc.ProcessBytes(inputBytes, 0, inputBytes.Length, outputBytes, 0);

            try
            {
                bbc.DoFinal(outputBytes, length);
            }
            catch (Exception)
            {
                this.error.setError("SB013", "Block encryption exception");
                return("");
            }
            string result = Base64.ToBase64String(outputBytes);

            if (result == null || result.Length == 0)
            {
                this.error.setError("SB014", "Error encoding base64");
                return("");
            }
            this.error.cleanError();
            return(result);
        }