PskTlsServer.cs 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Agreement;
  5. using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Parameters;
  6. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Tls
  7. {
  8. public class PskTlsServer
  9. : AbstractTlsServer
  10. {
  11. protected TlsPskIdentityManager mPskIdentityManager;
  12. public PskTlsServer(TlsPskIdentityManager pskIdentityManager)
  13. : this(new DefaultTlsCipherFactory(), pskIdentityManager)
  14. {
  15. }
  16. public PskTlsServer(TlsCipherFactory cipherFactory, TlsPskIdentityManager pskIdentityManager)
  17. : base(cipherFactory)
  18. {
  19. this.mPskIdentityManager = pskIdentityManager;
  20. }
  21. protected virtual TlsEncryptionCredentials GetRsaEncryptionCredentials()
  22. {
  23. throw new TlsFatalAlert(AlertDescription.internal_error);
  24. }
  25. protected virtual DHParameters GetDHParameters()
  26. {
  27. return DHStandardGroups.rfc7919_ffdhe2048;
  28. }
  29. protected override int[] GetCipherSuites()
  30. {
  31. return new int[]
  32. {
  33. CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256,
  34. CipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA,
  35. CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA256,
  36. CipherSuite.TLS_DHE_PSK_WITH_AES_128_CBC_SHA
  37. };
  38. }
  39. public override TlsCredentials GetCredentials()
  40. {
  41. int keyExchangeAlgorithm = TlsUtilities.GetKeyExchangeAlgorithm(mSelectedCipherSuite);
  42. switch (keyExchangeAlgorithm)
  43. {
  44. case KeyExchangeAlgorithm.DHE_PSK:
  45. case KeyExchangeAlgorithm.ECDHE_PSK:
  46. case KeyExchangeAlgorithm.PSK:
  47. return null;
  48. case KeyExchangeAlgorithm.RSA_PSK:
  49. return GetRsaEncryptionCredentials();
  50. default:
  51. /* Note: internal error here; selected a key exchange we don't implement! */
  52. throw new TlsFatalAlert(AlertDescription.internal_error);
  53. }
  54. }
  55. public override TlsKeyExchange GetKeyExchange()
  56. {
  57. int keyExchangeAlgorithm = TlsUtilities.GetKeyExchangeAlgorithm(mSelectedCipherSuite);
  58. switch (keyExchangeAlgorithm)
  59. {
  60. case KeyExchangeAlgorithm.DHE_PSK:
  61. case KeyExchangeAlgorithm.ECDHE_PSK:
  62. case KeyExchangeAlgorithm.PSK:
  63. case KeyExchangeAlgorithm.RSA_PSK:
  64. return CreatePskKeyExchange(keyExchangeAlgorithm);
  65. default:
  66. /*
  67. * Note: internal error here; the TlsProtocol implementation verifies that the
  68. * server-selected cipher suite was in the list of client-offered cipher suites, so if
  69. * we now can't produce an implementation, we shouldn't have offered it!
  70. */
  71. throw new TlsFatalAlert(AlertDescription.internal_error);
  72. }
  73. }
  74. protected virtual TlsKeyExchange CreatePskKeyExchange(int keyExchange)
  75. {
  76. return new TlsPskKeyExchange(keyExchange, mSupportedSignatureAlgorithms, null, mPskIdentityManager,
  77. null, GetDHParameters(), mNamedCurves, mClientECPointFormats, mServerECPointFormats);
  78. }
  79. }
  80. }
  81. #pragma warning restore
  82. #endif