SecretKeyPacket.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using System.IO;
  5. using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
  6. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Bcpg
  7. {
  8. /// <remarks>Basic packet for a PGP secret key.</remarks>
  9. public class SecretKeyPacket
  10. : ContainedPacket //, PublicKeyAlgorithmTag
  11. {
  12. public const int UsageNone = 0x00;
  13. public const int UsageChecksum = 0xff;
  14. public const int UsageSha1 = 0xfe;
  15. private PublicKeyPacket pubKeyPacket;
  16. private readonly byte[] secKeyData;
  17. private int s2kUsage;
  18. private SymmetricKeyAlgorithmTag encAlgorithm;
  19. private S2k s2k;
  20. private byte[] iv;
  21. internal SecretKeyPacket(
  22. BcpgInputStream bcpgIn)
  23. {
  24. if (this is SecretSubkeyPacket)
  25. {
  26. pubKeyPacket = new PublicSubkeyPacket(bcpgIn);
  27. }
  28. else
  29. {
  30. pubKeyPacket = new PublicKeyPacket(bcpgIn);
  31. }
  32. s2kUsage = bcpgIn.ReadByte();
  33. if (s2kUsage == UsageChecksum || s2kUsage == UsageSha1)
  34. {
  35. encAlgorithm = (SymmetricKeyAlgorithmTag) bcpgIn.ReadByte();
  36. s2k = new S2k(bcpgIn);
  37. }
  38. else
  39. {
  40. encAlgorithm = (SymmetricKeyAlgorithmTag) s2kUsage;
  41. }
  42. if (!(s2k != null && s2k.Type == S2k.GnuDummyS2K && s2k.ProtectionMode == 0x01))
  43. {
  44. if (s2kUsage != 0)
  45. {
  46. if (((int) encAlgorithm) < 7)
  47. {
  48. iv = new byte[8];
  49. }
  50. else
  51. {
  52. iv = new byte[16];
  53. }
  54. bcpgIn.ReadFully(iv);
  55. }
  56. }
  57. secKeyData = bcpgIn.ReadAll();
  58. }
  59. public SecretKeyPacket(
  60. PublicKeyPacket pubKeyPacket,
  61. SymmetricKeyAlgorithmTag encAlgorithm,
  62. S2k s2k,
  63. byte[] iv,
  64. byte[] secKeyData)
  65. {
  66. this.pubKeyPacket = pubKeyPacket;
  67. this.encAlgorithm = encAlgorithm;
  68. if (encAlgorithm != SymmetricKeyAlgorithmTag.Null)
  69. {
  70. this.s2kUsage = UsageChecksum;
  71. }
  72. else
  73. {
  74. this.s2kUsage = UsageNone;
  75. }
  76. this.s2k = s2k;
  77. this.iv = Arrays.Clone(iv);
  78. this.secKeyData = secKeyData;
  79. }
  80. public SecretKeyPacket(
  81. PublicKeyPacket pubKeyPacket,
  82. SymmetricKeyAlgorithmTag encAlgorithm,
  83. int s2kUsage,
  84. S2k s2k,
  85. byte[] iv,
  86. byte[] secKeyData)
  87. {
  88. this.pubKeyPacket = pubKeyPacket;
  89. this.encAlgorithm = encAlgorithm;
  90. this.s2kUsage = s2kUsage;
  91. this.s2k = s2k;
  92. this.iv = Arrays.Clone(iv);
  93. this.secKeyData = secKeyData;
  94. }
  95. public SymmetricKeyAlgorithmTag EncAlgorithm
  96. {
  97. get { return encAlgorithm; }
  98. }
  99. public int S2kUsage
  100. {
  101. get { return s2kUsage; }
  102. }
  103. public byte[] GetIV()
  104. {
  105. return Arrays.Clone(iv);
  106. }
  107. public S2k S2k
  108. {
  109. get { return s2k; }
  110. }
  111. public PublicKeyPacket PublicKeyPacket
  112. {
  113. get { return pubKeyPacket; }
  114. }
  115. public byte[] GetSecretKeyData()
  116. {
  117. return secKeyData;
  118. }
  119. public byte[] GetEncodedContents()
  120. {
  121. MemoryStream bOut = new MemoryStream();
  122. BcpgOutputStream pOut = new BcpgOutputStream(bOut);
  123. pOut.Write(pubKeyPacket.GetEncodedContents());
  124. pOut.WriteByte((byte) s2kUsage);
  125. if (s2kUsage == UsageChecksum || s2kUsage == UsageSha1)
  126. {
  127. pOut.WriteByte((byte) encAlgorithm);
  128. pOut.WriteObject(s2k);
  129. }
  130. if (iv != null)
  131. {
  132. pOut.Write(iv);
  133. }
  134. if (secKeyData != null && secKeyData.Length > 0)
  135. {
  136. pOut.Write(secKeyData);
  137. }
  138. return bOut.ToArray();
  139. }
  140. public override void Encode(
  141. BcpgOutputStream bcpgOut)
  142. {
  143. bcpgOut.WritePacket(PacketTag.SecretKey, GetEncodedContents(), true);
  144. }
  145. }
  146. }
  147. #pragma warning restore
  148. #endif