SessionParameters.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using System.Collections;
  5. using System.IO;
  6. using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
  7. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Tls
  8. {
  9. public sealed class SessionParameters
  10. {
  11. public sealed class Builder
  12. {
  13. private int mCipherSuite = -1;
  14. private short mCompressionAlgorithm = -1;
  15. private byte[] mMasterSecret = null;
  16. private Certificate mPeerCertificate = null;
  17. private byte[] mPskIdentity = null;
  18. private byte[] mSrpIdentity = null;
  19. private byte[] mEncodedServerExtensions = null;
  20. private bool mExtendedMasterSecret = false;
  21. public Builder()
  22. {
  23. }
  24. public SessionParameters Build()
  25. {
  26. Validate(this.mCipherSuite >= 0, "cipherSuite");
  27. Validate(this.mCompressionAlgorithm >= 0, "compressionAlgorithm");
  28. Validate(this.mMasterSecret != null, "masterSecret");
  29. return new SessionParameters(mCipherSuite, (byte)mCompressionAlgorithm, mMasterSecret, mPeerCertificate,
  30. mPskIdentity, mSrpIdentity, mEncodedServerExtensions, mExtendedMasterSecret);
  31. }
  32. public Builder SetCipherSuite(int cipherSuite)
  33. {
  34. this.mCipherSuite = cipherSuite;
  35. return this;
  36. }
  37. public Builder SetCompressionAlgorithm(byte compressionAlgorithm)
  38. {
  39. this.mCompressionAlgorithm = compressionAlgorithm;
  40. return this;
  41. }
  42. public Builder SetExtendedMasterSecret(bool extendedMasterSecret)
  43. {
  44. this.mExtendedMasterSecret = extendedMasterSecret;
  45. return this;
  46. }
  47. public Builder SetMasterSecret(byte[] masterSecret)
  48. {
  49. this.mMasterSecret = masterSecret;
  50. return this;
  51. }
  52. public Builder SetPeerCertificate(Certificate peerCertificate)
  53. {
  54. this.mPeerCertificate = peerCertificate;
  55. return this;
  56. }
  57. public Builder SetPskIdentity(byte[] pskIdentity)
  58. {
  59. this.mPskIdentity = pskIdentity;
  60. return this;
  61. }
  62. public Builder SetSrpIdentity(byte[] srpIdentity)
  63. {
  64. this.mSrpIdentity = srpIdentity;
  65. return this;
  66. }
  67. public Builder SetServerExtensions(IDictionary serverExtensions)
  68. {
  69. if (serverExtensions == null)
  70. {
  71. mEncodedServerExtensions = null;
  72. }
  73. else
  74. {
  75. MemoryStream buf = new MemoryStream();
  76. TlsProtocol.WriteExtensions(buf, serverExtensions);
  77. mEncodedServerExtensions = buf.ToArray();
  78. }
  79. return this;
  80. }
  81. private void Validate(bool condition, string parameter)
  82. {
  83. if (!condition)
  84. throw new InvalidOperationException("Required session parameter '" + parameter + "' not configured");
  85. }
  86. }
  87. private int mCipherSuite;
  88. private byte mCompressionAlgorithm;
  89. private byte[] mMasterSecret;
  90. private Certificate mPeerCertificate;
  91. private byte[] mPskIdentity;
  92. private byte[] mSrpIdentity;
  93. private byte[] mEncodedServerExtensions;
  94. private bool mExtendedMasterSecret;
  95. private SessionParameters(int cipherSuite, byte compressionAlgorithm, byte[] masterSecret,
  96. Certificate peerCertificate, byte[] pskIdentity, byte[] srpIdentity, byte[] encodedServerExtensions,
  97. bool extendedMasterSecret)
  98. {
  99. this.mCipherSuite = cipherSuite;
  100. this.mCompressionAlgorithm = compressionAlgorithm;
  101. this.mMasterSecret = Arrays.Clone(masterSecret);
  102. this.mPeerCertificate = peerCertificate;
  103. this.mPskIdentity = Arrays.Clone(pskIdentity);
  104. this.mSrpIdentity = Arrays.Clone(srpIdentity);
  105. this.mEncodedServerExtensions = encodedServerExtensions;
  106. this.mExtendedMasterSecret = extendedMasterSecret;
  107. }
  108. public void Clear()
  109. {
  110. if (this.mMasterSecret != null)
  111. {
  112. Arrays.Fill(this.mMasterSecret, (byte)0);
  113. }
  114. }
  115. public SessionParameters Copy()
  116. {
  117. return new SessionParameters(mCipherSuite, mCompressionAlgorithm, mMasterSecret, mPeerCertificate,
  118. mPskIdentity, mSrpIdentity, mEncodedServerExtensions, mExtendedMasterSecret);
  119. }
  120. public int CipherSuite
  121. {
  122. get { return mCipherSuite; }
  123. }
  124. public byte CompressionAlgorithm
  125. {
  126. get { return mCompressionAlgorithm; }
  127. }
  128. public bool IsExtendedMasterSecret
  129. {
  130. get { return mExtendedMasterSecret; }
  131. }
  132. public byte[] MasterSecret
  133. {
  134. get { return mMasterSecret; }
  135. }
  136. public Certificate PeerCertificate
  137. {
  138. get { return mPeerCertificate; }
  139. }
  140. public byte[] PskIdentity
  141. {
  142. get { return mPskIdentity; }
  143. }
  144. public byte[] SrpIdentity
  145. {
  146. get { return mSrpIdentity; }
  147. }
  148. public IDictionary ReadServerExtensions()
  149. {
  150. if (mEncodedServerExtensions == null)
  151. return null;
  152. MemoryStream buf = new MemoryStream(mEncodedServerExtensions, false);
  153. return TlsProtocol.ReadExtensions(buf);
  154. }
  155. }
  156. }
  157. #pragma warning restore
  158. #endif