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

6 years ago
6 years ago
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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)
  55. {
  56. continue;
  57. }
  58. salt[i]++;
  59. o = salt[i] == 0;
  60. }
  61. }
  62. public static void SodiumIncrement(Span<byte> salt)
  63. {
  64. bool o = true; // overflow flag
  65. for (int i = 0; i < salt.Length; i++)
  66. {
  67. if (!o)
  68. {
  69. continue;
  70. }
  71. salt[i]++;
  72. o = salt[i] == 0;
  73. }
  74. }
  75. }
  76. }