123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
- using System;
- using System.Collections;
- using System.Globalization;
- using Org.BouncyCastle.Asn1;
- using Org.BouncyCastle.Asn1.Iana;
- using Org.BouncyCastle.Asn1.Pkcs;
- using Org.BouncyCastle.Crypto;
- using Org.BouncyCastle.Crypto.Engines;
- using Org.BouncyCastle.Crypto.Macs;
- using Org.BouncyCastle.Crypto.Paddings;
- using Org.BouncyCastle.Utilities;
- namespace Org.BouncyCastle.Security
- {
- /// <remarks>
- /// Utility class for creating HMac object from their names/Oids
- /// </remarks>
- public sealed class MacUtilities
- {
- private MacUtilities()
- {
- }
- private static readonly IDictionary algorithms = Org.BouncyCastle.Utilities.Platform.CreateHashtable();
- //private static readonly IDictionary oids = Org.BouncyCastle.Utilities.Platform.CreateHashtable();
- static MacUtilities()
- {
- algorithms[IanaObjectIdentifiers.HmacMD5.Id] = "HMAC-MD5";
- algorithms[IanaObjectIdentifiers.HmacRipeMD160.Id] = "HMAC-RIPEMD160";
- algorithms[IanaObjectIdentifiers.HmacSha1.Id] = "HMAC-SHA1";
- algorithms[IanaObjectIdentifiers.HmacTiger.Id] = "HMAC-TIGER";
- algorithms[PkcsObjectIdentifiers.IdHmacWithSha1.Id] = "HMAC-SHA1";
- algorithms[PkcsObjectIdentifiers.IdHmacWithSha224.Id] = "HMAC-SHA224";
- algorithms[PkcsObjectIdentifiers.IdHmacWithSha256.Id] = "HMAC-SHA256";
- algorithms[PkcsObjectIdentifiers.IdHmacWithSha384.Id] = "HMAC-SHA384";
- algorithms[PkcsObjectIdentifiers.IdHmacWithSha512.Id] = "HMAC-SHA512";
- // TODO AESMAC?
- algorithms["DES"] = "DESMAC";
- algorithms["DES/CFB8"] = "DESMAC/CFB8";
- algorithms["DES64"] = "DESMAC64";
- algorithms["DESEDE"] = "DESEDEMAC";
- algorithms[PkcsObjectIdentifiers.DesEde3Cbc.Id] = "DESEDEMAC";
- algorithms["DESEDE/CFB8"] = "DESEDEMAC/CFB8";
- algorithms["DESISO9797MAC"] = "DESWITHISO9797";
- algorithms["DESEDE64"] = "DESEDEMAC64";
- algorithms["DESEDE64WITHISO7816-4PADDING"] = "DESEDEMAC64WITHISO7816-4PADDING";
- algorithms["DESEDEISO9797ALG1MACWITHISO7816-4PADDING"] = "DESEDEMAC64WITHISO7816-4PADDING";
- algorithms["DESEDEISO9797ALG1WITHISO7816-4PADDING"] = "DESEDEMAC64WITHISO7816-4PADDING";
- algorithms["ISO9797ALG3"] = "ISO9797ALG3MAC";
- algorithms["ISO9797ALG3MACWITHISO7816-4PADDING"] = "ISO9797ALG3WITHISO7816-4PADDING";
- algorithms["SKIPJACK"] = "SKIPJACKMAC";
- algorithms["SKIPJACK/CFB8"] = "SKIPJACKMAC/CFB8";
- algorithms["IDEA"] = "IDEAMAC";
- algorithms["IDEA/CFB8"] = "IDEAMAC/CFB8";
- algorithms["RC2"] = "RC2MAC";
- algorithms["RC2/CFB8"] = "RC2MAC/CFB8";
- algorithms["RC5"] = "RC5MAC";
- algorithms["RC5/CFB8"] = "RC5MAC/CFB8";
- algorithms["GOST28147"] = "GOST28147MAC";
- algorithms["VMPC"] = "VMPCMAC";
- algorithms["VMPC-MAC"] = "VMPCMAC";
- algorithms["SIPHASH"] = "SIPHASH-2-4";
- algorithms["PBEWITHHMACSHA"] = "PBEWITHHMACSHA1";
- algorithms["1.3.14.3.2.26"] = "PBEWITHHMACSHA1";
- }
- // /// <summary>
- // /// Returns a ObjectIdentifier for a given digest mechanism.
- // /// </summary>
- // /// <param name="mechanism">A string representation of the digest meanism.</param>
- // /// <returns>A DerObjectIdentifier, null if the Oid is not available.</returns>
- // public static DerObjectIdentifier GetObjectIdentifier(
- // string mechanism)
- // {
- // mechanism = (string) algorithms[Org.BouncyCastle.Utilities.Platform.ToUpperInvariant(mechanism)];
- //
- // if (mechanism != null)
- // {
- // return (DerObjectIdentifier)oids[mechanism];
- // }
- //
- // return null;
- // }
- // public static ICollection Algorithms
- // {
- // get { return oids.Keys; }
- // }
- public static IMac GetMac(
- DerObjectIdentifier id)
- {
- return GetMac(id.Id);
- }
- public static IMac GetMac(
- string algorithm)
- {
- string upper = Org.BouncyCastle.Utilities.Platform.ToUpperInvariant(algorithm);
- string mechanism = (string) algorithms[upper];
- if (mechanism == null)
- {
- mechanism = upper;
- }
- if (Org.BouncyCastle.Utilities.Platform.StartsWith(mechanism, "PBEWITH"))
- {
- mechanism = mechanism.Substring("PBEWITH".Length);
- }
- if (Org.BouncyCastle.Utilities.Platform.StartsWith(mechanism, "HMAC"))
- {
- string digestName;
- if (Org.BouncyCastle.Utilities.Platform.StartsWith(mechanism, "HMAC-") || Org.BouncyCastle.Utilities.Platform.StartsWith(mechanism, "HMAC/"))
- {
- digestName = mechanism.Substring(5);
- }
- else
- {
- digestName = mechanism.Substring(4);
- }
- return new HMac(DigestUtilities.GetDigest(digestName));
- }
- if (mechanism == "AESCMAC")
- {
- return new CMac(new AesFastEngine());
- }
- if (mechanism == "DESMAC")
- {
- return new CbcBlockCipherMac(new DesEngine());
- }
- if (mechanism == "DESMAC/CFB8")
- {
- return new CfbBlockCipherMac(new DesEngine());
- }
- if (mechanism == "DESMAC64")
- {
- return new CbcBlockCipherMac(new DesEngine(), 64);
- }
- if (mechanism == "DESEDECMAC")
- {
- return new CMac(new DesEdeEngine());
- }
- if (mechanism == "DESEDEMAC")
- {
- return new CbcBlockCipherMac(new DesEdeEngine());
- }
- if (mechanism == "DESEDEMAC/CFB8")
- {
- return new CfbBlockCipherMac(new DesEdeEngine());
- }
- if (mechanism == "DESEDEMAC64")
- {
- return new CbcBlockCipherMac(new DesEdeEngine(), 64);
- }
- if (mechanism == "DESEDEMAC64WITHISO7816-4PADDING")
- {
- return new CbcBlockCipherMac(new DesEdeEngine(), 64, new ISO7816d4Padding());
- }
- if (mechanism == "DESWITHISO9797"
- || mechanism == "ISO9797ALG3MAC")
- {
- return new ISO9797Alg3Mac(new DesEngine());
- }
- if (mechanism == "ISO9797ALG3WITHISO7816-4PADDING")
- {
- return new ISO9797Alg3Mac(new DesEngine(), new ISO7816d4Padding());
- }
- if (mechanism == "SKIPJACKMAC")
- {
- return new CbcBlockCipherMac(new SkipjackEngine());
- }
- if (mechanism == "SKIPJACKMAC/CFB8")
- {
- return new CfbBlockCipherMac(new SkipjackEngine());
- }
- if (mechanism == "IDEAMAC")
- {
- return new CbcBlockCipherMac(new IdeaEngine());
- }
- if (mechanism == "IDEAMAC/CFB8")
- {
- return new CfbBlockCipherMac(new IdeaEngine());
- }
- if (mechanism == "RC2MAC")
- {
- return new CbcBlockCipherMac(new RC2Engine());
- }
- if (mechanism == "RC2MAC/CFB8")
- {
- return new CfbBlockCipherMac(new RC2Engine());
- }
- if (mechanism == "RC5MAC")
- {
- return new CbcBlockCipherMac(new RC532Engine());
- }
- if (mechanism == "RC5MAC/CFB8")
- {
- return new CfbBlockCipherMac(new RC532Engine());
- }
- if (mechanism == "GOST28147MAC")
- {
- return new Gost28147Mac();
- }
- if (mechanism == "VMPCMAC")
- {
- return new VmpcMac();
- }
- if (mechanism == "SIPHASH-2-4")
- {
- return new SipHash();
- }
- throw new SecurityUtilityException("Mac " + mechanism + " not recognised.");
- }
- public static string GetAlgorithmName(
- DerObjectIdentifier oid)
- {
- return (string) algorithms[oid.Id];
- }
- public static byte[] CalculateMac(string algorithm, ICipherParameters cp, byte[] input)
- {
- IMac mac = GetMac(algorithm);
- mac.Init(cp);
- mac.BlockUpdate(input, 0, input.Length);
- return DoFinal(mac);
- }
- public static byte[] DoFinal(IMac mac)
- {
- byte[] b = new byte[mac.GetMacSize()];
- mac.DoFinal(b, 0);
- return b;
- }
- public static byte[] DoFinal(IMac mac, byte[] input)
- {
- mac.BlockUpdate(input, 0, input.Length);
- return DoFinal(mac);
- }
- }
- }
- #endif
|