/// <summary> /// MAC. /// <para/>Legal mac size is between 8 and block size (8 bits increments). /// <para/>Legal mac size must be at least 24 bits (FIPS Publication 81) or 16 bits if being used as a data authenticator (FIPS Publication 113). /// <para/>Used (block size / 2) as mac size by default. /// </summary> /// <param name="blockAlgorithm">Symmetric block algorithm.</param> /// <param name="macSize">MAC size bits.</param> public MAC(IBlockAlgorithm blockAlgorithm, int macSize) { if (macSize < 8 || macSize > blockAlgorithm.BlockSize || macSize % 8 != 0) { throw new CryptographicException("Legal mac size is between 8 and block size (8 bits increments)."); } this.Mechanism = string.Format(CultureInfo.InvariantCulture, "{0}/MAC", blockAlgorithm.Mechanism); this.BlockAlgorithm = (BlockAlgorithm)blockAlgorithm; this.HashSize = macSize; }
/// <summary> /// CMAC. /// <para/>Legal mac size is between 8 and block size (8 bits increments). /// <para/>Used block size as mac size by default. /// </summary> /// <param name="blockAlgorithm">Symmetric block algorithm.</param> public CMAC(IBlockAlgorithm blockAlgorithm) : this(blockAlgorithm, blockAlgorithm.BlockSize) { }
/// <summary> /// Try get algorithm from mechanism. /// </summary> /// <param name="mechanism">Algorithm mechanism.</param> /// <param name="algorithm">Algorithm.</param> /// <returns></returns> public static bool TryGetAlgorithm(string mechanism, out IBlockAlgorithm algorithm) { mechanism = mechanism.Replace('_', '-').Replace('/', '-').ToUpperInvariant(); switch (mechanism) { case "AES": algorithm = AES; return(true); case "BLOWFISH": algorithm = Blowfish; return(true); case "CAMELLIA": algorithm = Camellia; return(true); case "CAST5": algorithm = CAST5; return(true); case "CAST6": algorithm = CAST6; return(true); case "DES": algorithm = DES; return(true); case "DESEDE": case "DESEDE3": case "TDEA": case "TRIPLEDES": case "3DES": algorithm = DESede; return(true); case "DSTU7624-128": algorithm = DSTU7624_128; return(true); case "DSTU7624-256": algorithm = DSTU7624_256; return(true); case "DSTU7624-512": algorithm = DSTU7624_512; return(true); case "GOST28147": algorithm = GOST28147; return(true); case "IDEA": algorithm = IDEA; return(true); case "NOEKEON": algorithm = Noekeon; return(true); case "RC2": algorithm = RC2; return(true); case "RC5": case "RC5-32": algorithm = RC5; return(true); case "RC5-64": algorithm = RC5_64; return(true); case "RC6": algorithm = RC6; return(true); case "RIJNDAEL-128": case "RIJNDAEL128": algorithm = Rijndael_128; return(true); case "RIJNDAEL-160": case "RIJNDAEL160": algorithm = Rijndael_160; return(true); case "RIJNDAEL-192": case "RIJNDAEL192": algorithm = Rijndael_192; return(true); case "RIJNDAEL-224": case "RIJNDAEL224": algorithm = Rijndael_224; return(true); case "RIJNDAEL-256": case "RIJNDAEL256": algorithm = Rijndael_256; return(true); case "SEED": algorithm = SEED; return(true); case "SERPENT": algorithm = Serpent; return(true); case "SKIPJACK": algorithm = SKIPJACK; return(true); case "SM4": algorithm = SM4; return(true); case "TEA": algorithm = TEA; return(true); case "THREEFISH-256": case "THREEFISH256": algorithm = Threefish_256; return(true); case "THREEFISH-512": case "THREEFISH512": algorithm = Threefish_512; return(true); case "THREEFISH-1024": case "THREEFISH1024": algorithm = Threefish_1024; return(true); case "TNEPRES": algorithm = Tnepres; return(true); case "TWOFISH": algorithm = Twofish; return(true); case "XTEA": algorithm = XTEA; return(true); default: algorithm = null; return(false); } }