Cipher.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace Renci.SshNet.Security.Cryptography
  6. {
  7. /// <summary>
  8. /// Base class for cipher implementation.
  9. /// </summary>
  10. public abstract class Cipher
  11. {
  12. /// <summary>
  13. /// Encrypts the specified input.
  14. /// </summary>
  15. /// <param name="input">The input.</param>
  16. /// <returns></returns>
  17. public abstract byte[] Encrypt(byte[] input);
  18. /// <summary>
  19. /// Decrypts the specified input.
  20. /// </summary>
  21. /// <param name="input">The input.</param>
  22. /// <returns></returns>
  23. public abstract byte[] Decrypt(byte[] input);
  24. #region Packing functions
  25. /// <summary>
  26. /// Populates buffer with big endian number representation.
  27. /// </summary>
  28. /// <param name="number">The number to convert.</param>
  29. /// <param name="buffer">The buffer.</param>
  30. protected static void UInt32ToBigEndian(uint number, byte[] buffer)
  31. {
  32. buffer[0] = (byte)(number >> 24);
  33. buffer[1] = (byte)(number >> 16);
  34. buffer[2] = (byte)(number >> 8);
  35. buffer[3] = (byte)(number);
  36. }
  37. /// <summary>
  38. /// Populates buffer with big endian number representation.
  39. /// </summary>
  40. /// <param name="number">The number to convert.</param>
  41. /// <param name="buffer">The buffer.</param>
  42. /// <param name="offset">The buffer offset.</param>
  43. protected static void UInt32ToBigEndian(uint number, byte[] buffer, int offset)
  44. {
  45. buffer[offset] = (byte)(number >> 24);
  46. buffer[offset + 1] = (byte)(number >> 16);
  47. buffer[offset + 2] = (byte)(number >> 8);
  48. buffer[offset + 3] = (byte)(number);
  49. }
  50. /// <summary>
  51. /// Converts big endian bytes into number.
  52. /// </summary>
  53. /// <param name="buffer">The buffer.</param>
  54. /// <returns></returns>
  55. protected static uint BigEndianToUInt32(byte[] buffer)
  56. {
  57. uint n = (uint)buffer[0] << 24;
  58. n |= (uint)buffer[1] << 16;
  59. n |= (uint)buffer[2] << 8;
  60. n |= (uint)buffer[3];
  61. return n;
  62. }
  63. /// <summary>
  64. /// Converts big endian bytes into number.
  65. /// </summary>
  66. /// <param name="buffer">The buffer.</param>
  67. /// <param name="offset">The buffer offset.</param>
  68. /// <returns></returns>
  69. protected static uint BigEndianToUInt32(byte[] buffer, int offset)
  70. {
  71. uint n = (uint)buffer[offset] << 24;
  72. n |= (uint)buffer[offset + 1] << 16;
  73. n |= (uint)buffer[offset + 2] << 8;
  74. n |= (uint)buffer[offset + 3];
  75. return n;
  76. }
  77. /// <summary>
  78. /// Converts big endian bytes into number.
  79. /// </summary>
  80. /// <param name="buffer">The buffer.</param>
  81. /// <returns></returns>
  82. protected static ulong BigEndianToUInt64(byte[] buffer)
  83. {
  84. uint hi = BigEndianToUInt32(buffer);
  85. uint lo = BigEndianToUInt32(buffer, 4);
  86. return ((ulong)hi << 32) | (ulong)lo;
  87. }
  88. /// <summary>
  89. /// Converts big endian bytes into number.
  90. /// </summary>
  91. /// <param name="buffer">The buffer.</param>
  92. /// <param name="offset">The buffer offset.</param>
  93. /// <returns></returns>
  94. protected static ulong BigEndianToUInt64(byte[] buffer, int offset)
  95. {
  96. uint hi = BigEndianToUInt32(buffer, offset);
  97. uint lo = BigEndianToUInt32(buffer, offset + 4);
  98. return ((ulong)hi << 32) | (ulong)lo;
  99. }
  100. /// <summary>
  101. /// Populates buffer with big endian number representation.
  102. /// </summary>
  103. /// <param name="number">The number to convert.</param>
  104. /// <param name="buffer">The buffer.</param>
  105. protected static void UInt64ToBigEndian(ulong number, byte[] buffer)
  106. {
  107. UInt32ToBigEndian((uint)(number >> 32), buffer);
  108. UInt32ToBigEndian((uint)(number), buffer, 4);
  109. }
  110. /// <summary>
  111. /// Populates buffer with big endian number representation.
  112. /// </summary>
  113. /// <param name="number">The number to convert.</param>
  114. /// <param name="buffer">The buffer.</param>
  115. /// <param name="offset">The buffer offset.</param>
  116. protected static void UInt64ToBigEndian(ulong number, byte[] buffer, int offset)
  117. {
  118. UInt32ToBigEndian((uint)(number >> 32), buffer, offset);
  119. UInt32ToBigEndian((uint)(number), buffer, offset + 4);
  120. }
  121. /// <summary>
  122. /// Populates buffer with little endian number representation.
  123. /// </summary>
  124. /// <param name="number">The number to convert.</param>
  125. /// <param name="buffer">The buffer.</param>
  126. protected static void UInt32ToLittleEndian(uint number, byte[] buffer)
  127. {
  128. buffer[0] = (byte)(number);
  129. buffer[1] = (byte)(number >> 8);
  130. buffer[2] = (byte)(number >> 16);
  131. buffer[3] = (byte)(number >> 24);
  132. }
  133. /// <summary>
  134. /// Populates buffer with little endian number representation.
  135. /// </summary>
  136. /// <param name="number">The number to convert.</param>
  137. /// <param name="buffer">The buffer.</param>
  138. /// <param name="offset">The buffer offset.</param>
  139. protected static void UInt32ToLittleEndian(uint number, byte[] buffer, int offset)
  140. {
  141. buffer[offset] = (byte)(number);
  142. buffer[offset + 1] = (byte)(number >> 8);
  143. buffer[offset + 2] = (byte)(number >> 16);
  144. buffer[offset + 3] = (byte)(number >> 24);
  145. }
  146. /// <summary>
  147. /// Converts little endian bytes into number.
  148. /// </summary>
  149. /// <param name="buffer">The buffer.</param>
  150. /// <returns></returns>
  151. protected static uint LittleEndianToUInt32(byte[] buffer)
  152. {
  153. uint n = (uint)buffer[0];
  154. n |= (uint)buffer[1] << 8;
  155. n |= (uint)buffer[2] << 16;
  156. n |= (uint)buffer[3] << 24;
  157. return n;
  158. }
  159. /// <summary>
  160. /// Converts little endian bytes into number.
  161. /// </summary>
  162. /// <param name="buffer">The buffer.</param>
  163. /// <param name="offset">The buffer offset.</param>
  164. /// <returns></returns>
  165. protected static uint LittleEndianToUInt32(byte[] buffer, int offset)
  166. {
  167. uint n = (uint)buffer[offset];
  168. n |= (uint)buffer[offset + 1] << 8;
  169. n |= (uint)buffer[offset + 2] << 16;
  170. n |= (uint)buffer[offset + 3] << 24;
  171. return n;
  172. }
  173. /// <summary>
  174. /// Converts little endian bytes into number.
  175. /// </summary>
  176. /// <param name="buffer">The buffer.</param>
  177. /// <returns></returns>
  178. protected static ulong LittleEndianToUInt64(byte[] buffer)
  179. {
  180. uint lo = LittleEndianToUInt32(buffer);
  181. uint hi = LittleEndianToUInt32(buffer, 4);
  182. return ((ulong)hi << 32) | (ulong)lo;
  183. }
  184. /// <summary>
  185. /// Converts little endian bytes into number.
  186. /// </summary>
  187. /// <param name="buffer">The buffer.</param>
  188. /// <param name="offset">The buffer offset.</param>
  189. /// <returns></returns>
  190. protected static ulong LittleEndianToUInt64(byte[] buffer, int offset)
  191. {
  192. uint lo = LittleEndianToUInt32(buffer, offset);
  193. uint hi = LittleEndianToUInt32(buffer, offset + 4);
  194. return ((ulong)hi << 32) | (ulong)lo;
  195. }
  196. /// <summary>
  197. /// Populates buffer with little endian number representation.
  198. /// </summary>
  199. /// <param name="number">The number to convert.</param>
  200. /// <param name="buffer">The buffer.</param>
  201. protected static void UInt64ToLittleEndian(ulong number, byte[] buffer)
  202. {
  203. UInt32ToLittleEndian((uint)(number), buffer);
  204. UInt32ToLittleEndian((uint)(number >> 32), buffer, 4);
  205. }
  206. /// <summary>
  207. /// Populates buffer with little endian number representation.
  208. /// </summary>
  209. /// <param name="number">The number to convert.</param>
  210. /// <param name="buffer">The buffer.</param>
  211. /// <param name="offset">The buffer offset.</param>
  212. protected static void UInt64ToLittleEndian(ulong number, byte[] buffer, int offset)
  213. {
  214. UInt32ToLittleEndian((uint)(number), buffer, offset);
  215. UInt32ToLittleEndian((uint)(number >> 32), buffer, offset + 4);
  216. }
  217. #endregion
  218. }
  219. }