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.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. namespace Shadowsocks.Encryption
  7. {
  8. public static class CryptoUtils
  9. {
  10. public static byte[] MD5(byte[] b)
  11. {
  12. MD5Digest md5 = new MD5Digest();
  13. md5.BlockUpdate(b, 0, b.Length);
  14. byte[] r = new byte[16];
  15. md5.DoFinal(r, 0);
  16. return r;
  17. }
  18. // currently useless, just keep api same
  19. public static Span<byte> MD5(Span<byte> span)
  20. {
  21. byte[] b = span.ToArray();
  22. MD5Digest md5 = new MD5Digest();
  23. md5.BlockUpdate(b, 0, b.Length);
  24. byte[] r = new byte[16];
  25. md5.DoFinal(r, 0);
  26. return r;
  27. }
  28. public static byte[] HKDF(int keylen, byte[] master, byte[] salt, byte[] info)
  29. {
  30. byte[] ret = new byte[keylen];
  31. IDigest degist = new Sha1Digest();
  32. HkdfParameters parameters = new HkdfParameters(master, salt, info);
  33. HkdfBytesGenerator hkdf = new HkdfBytesGenerator(degist);
  34. hkdf.Init(parameters);
  35. hkdf.GenerateBytes(ret, 0, keylen);
  36. return ret;
  37. }
  38. // currently useless, just keep api same, again
  39. public static Span<byte> HKDF(int keylen, Span<byte> master, Span<byte> salt, Span<byte> info)
  40. {
  41. byte[] ret = new byte[keylen];
  42. IDigest degist = new Sha1Digest();
  43. HkdfParameters parameters = new HkdfParameters(master.ToArray(), salt.ToArray(), info.ToArray());
  44. HkdfBytesGenerator hkdf = new HkdfBytesGenerator(degist);
  45. hkdf.Init(parameters);
  46. hkdf.GenerateBytes(ret, 0, keylen);
  47. return ret.AsSpan();
  48. }
  49. public static void SodiumIncrement(byte[] salt)
  50. {
  51. bool o = true; // overflow flag
  52. for (int i = 0; i < salt.Length; i++)
  53. {
  54. if (!o) continue;
  55. salt[i]++;
  56. o = salt[i] == 0;
  57. }
  58. }
  59. public static void SodiumIncrement(Span<byte> salt)
  60. {
  61. bool o = true; // overflow flag
  62. for (int i = 0; i < salt.Length; i++)
  63. {
  64. if (!o) continue;
  65. salt[i]++;
  66. o = salt[i] == 0;
  67. }
  68. }
  69. }
  70. }