You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

CryptoUtils.cs 2.2 kB

5 years ago
5 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using Org.BouncyCastle.Crypto;
  2. using Org.BouncyCastle.Crypto.Digests;
  3. using Org.BouncyCastle.Crypto.Generators;
  4. using Org.BouncyCastle.Crypto.Parameters;
  5. using System;
  6. using System.Security.Cryptography;
  7. using System.Threading;
  8. namespace Shadowsocks.Crypto
  9. {
  10. public static class CryptoUtils
  11. {
  12. private static readonly ThreadLocal<MD5> Md5Hasher = new ThreadLocal<MD5>(System.Security.Cryptography.MD5.Create);
  13. public static byte[] MD5(byte[] b)
  14. {
  15. var hash = new byte[CryptoBase.MD5Length];
  16. Md5Hasher.Value.TryComputeHash(b, hash, out _);
  17. return hash;
  18. }
  19. // currently useless, just keep api same
  20. public static Span<byte> MD5(Span<byte> span)
  21. {
  22. Span<byte> hash = new byte[CryptoBase.MD5Length];
  23. Md5Hasher.Value.TryComputeHash(span, hash, out _);
  24. return hash;
  25. }
  26. public static byte[] HKDF(int keylen, byte[] master, byte[] salt, byte[] info)
  27. {
  28. byte[] ret = new byte[keylen];
  29. IDigest degist = new Sha1Digest();
  30. HkdfParameters parameters = new HkdfParameters(master, salt, info);
  31. HkdfBytesGenerator hkdf = new HkdfBytesGenerator(degist);
  32. hkdf.Init(parameters);
  33. hkdf.GenerateBytes(ret, 0, keylen);
  34. return ret;
  35. }
  36. // currently useless, just keep api same, again
  37. public static Span<byte> HKDF(int keylen, Span<byte> master, Span<byte> salt, Span<byte> info)
  38. {
  39. byte[] ret = new byte[keylen];
  40. IDigest degist = new Sha1Digest();
  41. HkdfParameters parameters = new HkdfParameters(master.ToArray(), salt.ToArray(), info.ToArray());
  42. HkdfBytesGenerator hkdf = new HkdfBytesGenerator(degist);
  43. hkdf.Init(parameters);
  44. hkdf.GenerateBytes(ret, 0, keylen);
  45. return ret.AsSpan();
  46. }
  47. public static void SodiumIncrement(Span<byte> salt)
  48. {
  49. for (var i = 0; i < salt.Length; ++i)
  50. {
  51. if (++salt[i] != 0)
  52. {
  53. break;
  54. }
  55. }
  56. }
  57. }
  58. }