chacha_merged.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. /*
  2. chacha-merged.c version 20080118
  3. D. J. Bernstein
  4. Public domain.
  5. */
  6. #include "ecrypt-sync.h"
  7. #include "ecrypt-portable.h"
  8. #define ROTATE(v,c) (ROTL32(v,c))
  9. #define XOR(v,w) ((v) ^ (w))
  10. #define PLUS(v,w) (U32V((v) + (w)))
  11. #define PLUSONE(v) (PLUS((v),1))
  12. #define QUARTERROUND(a,b,c,d) \
  13. a = PLUS(a,b); d = ROTATE(XOR(d,a),16); \
  14. c = PLUS(c,d); b = ROTATE(XOR(b,c),12); \
  15. a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); \
  16. c = PLUS(c,d); b = ROTATE(XOR(b,c), 7);
  17. void ECRYPT_init(void)
  18. {
  19. return;
  20. }
  21. static const char sigma[16] = "expand 32-byte k";
  22. static const char tau[16] = "expand 16-byte k";
  23. void ECRYPT_keysetup(ECRYPT_ctx *x,const u8 *k,u32 kbits,u32 ivbits)
  24. {
  25. (void)ivbits;
  26. const char *constants = (const char *)0;
  27. x->input[4] = U8TO32_LITTLE(k + 0);
  28. x->input[5] = U8TO32_LITTLE(k + 4);
  29. x->input[6] = U8TO32_LITTLE(k + 8);
  30. x->input[7] = U8TO32_LITTLE(k + 12);
  31. if (kbits == 256) { /* recommended */
  32. k += 16;
  33. constants = sigma;
  34. } else { /* kbits == 128 */
  35. constants = tau;
  36. }
  37. x->input[8] = U8TO32_LITTLE(k + 0);
  38. x->input[9] = U8TO32_LITTLE(k + 4);
  39. x->input[10] = U8TO32_LITTLE(k + 8);
  40. x->input[11] = U8TO32_LITTLE(k + 12);
  41. x->input[0] = U8TO32_LITTLE(constants + 0);
  42. x->input[1] = U8TO32_LITTLE(constants + 4);
  43. x->input[2] = U8TO32_LITTLE(constants + 8);
  44. x->input[3] = U8TO32_LITTLE(constants + 12);
  45. }
  46. void ECRYPT_ivsetup(ECRYPT_ctx *x,const u8 *iv)
  47. {
  48. x->input[12] = 0;
  49. x->input[13] = 0;
  50. x->input[14] = U8TO32_LITTLE(iv + 0);
  51. x->input[15] = U8TO32_LITTLE(iv + 4);
  52. }
  53. void ECRYPT_ctrsetup(ECRYPT_ctx *x,const u8 *ctr)
  54. {
  55. x->input[12] = U8TO32_LITTLE(ctr + 0);
  56. x->input[13] = U8TO32_LITTLE(ctr + 4);
  57. }
  58. void ECRYPT_encrypt_bytes(ECRYPT_ctx *x,const u8 *m,u8 *c,u32 bytes)
  59. {
  60. u32 x0 = 0, x1 = 0, x2 = 0, x3 = 0, x4 = 0, x5 = 0, x6 = 0, x7 = 0, x8 = 0, x9 = 0, x10 = 0, x11 = 0, x12 = 0, x13 = 0, x14 = 0, x15 = 0;
  61. u32 j0 = 0, j1 = 0, j2 = 0, j3 = 0, j4 = 0, j5 = 0, j6 = 0, j7 = 0, j8 = 0, j9 = 0, j10 = 0, j11 = 0, j12 = 0, j13 = 0, j14 = 0, j15 = 0;
  62. u8 *ctarget = 0;
  63. u8 tmp[64] = {0};
  64. int i = 0;
  65. if (!bytes) return;
  66. j0 = x->input[0];
  67. j1 = x->input[1];
  68. j2 = x->input[2];
  69. j3 = x->input[3];
  70. j4 = x->input[4];
  71. j5 = x->input[5];
  72. j6 = x->input[6];
  73. j7 = x->input[7];
  74. j8 = x->input[8];
  75. j9 = x->input[9];
  76. j10 = x->input[10];
  77. j11 = x->input[11];
  78. j12 = x->input[12];
  79. j13 = x->input[13];
  80. j14 = x->input[14];
  81. j15 = x->input[15];
  82. for (;;) {
  83. if (bytes < 64) {
  84. for (i = 0;i < (int)bytes;++i) tmp[i] = m[i];
  85. m = tmp;
  86. ctarget = c;
  87. c = tmp;
  88. }
  89. x0 = j0;
  90. x1 = j1;
  91. x2 = j2;
  92. x3 = j3;
  93. x4 = j4;
  94. x5 = j5;
  95. x6 = j6;
  96. x7 = j7;
  97. x8 = j8;
  98. x9 = j9;
  99. x10 = j10;
  100. x11 = j11;
  101. x12 = j12;
  102. x13 = j13;
  103. x14 = j14;
  104. x15 = j15;
  105. for (i = 20;i > 0;i -= 2) {
  106. QUARTERROUND( x0, x4, x8,x12)
  107. QUARTERROUND( x1, x5, x9,x13)
  108. QUARTERROUND( x2, x6,x10,x14)
  109. QUARTERROUND( x3, x7,x11,x15)
  110. QUARTERROUND( x0, x5,x10,x15)
  111. QUARTERROUND( x1, x6,x11,x12)
  112. QUARTERROUND( x2, x7, x8,x13)
  113. QUARTERROUND( x3, x4, x9,x14)
  114. }
  115. x0 = PLUS(x0,j0);
  116. x1 = PLUS(x1,j1);
  117. x2 = PLUS(x2,j2);
  118. x3 = PLUS(x3,j3);
  119. x4 = PLUS(x4,j4);
  120. x5 = PLUS(x5,j5);
  121. x6 = PLUS(x6,j6);
  122. x7 = PLUS(x7,j7);
  123. x8 = PLUS(x8,j8);
  124. x9 = PLUS(x9,j9);
  125. x10 = PLUS(x10,j10);
  126. x11 = PLUS(x11,j11);
  127. x12 = PLUS(x12,j12);
  128. x13 = PLUS(x13,j13);
  129. x14 = PLUS(x14,j14);
  130. x15 = PLUS(x15,j15);
  131. x0 = XOR(x0,U8TO32_LITTLE(m + 0));
  132. x1 = XOR(x1,U8TO32_LITTLE(m + 4));
  133. x2 = XOR(x2,U8TO32_LITTLE(m + 8));
  134. x3 = XOR(x3,U8TO32_LITTLE(m + 12));
  135. x4 = XOR(x4,U8TO32_LITTLE(m + 16));
  136. x5 = XOR(x5,U8TO32_LITTLE(m + 20));
  137. x6 = XOR(x6,U8TO32_LITTLE(m + 24));
  138. x7 = XOR(x7,U8TO32_LITTLE(m + 28));
  139. x8 = XOR(x8,U8TO32_LITTLE(m + 32));
  140. x9 = XOR(x9,U8TO32_LITTLE(m + 36));
  141. x10 = XOR(x10,U8TO32_LITTLE(m + 40));
  142. x11 = XOR(x11,U8TO32_LITTLE(m + 44));
  143. x12 = XOR(x12,U8TO32_LITTLE(m + 48));
  144. x13 = XOR(x13,U8TO32_LITTLE(m + 52));
  145. x14 = XOR(x14,U8TO32_LITTLE(m + 56));
  146. x15 = XOR(x15,U8TO32_LITTLE(m + 60));
  147. j12 = PLUSONE(j12);
  148. if (!j12) {
  149. j13 = PLUSONE(j13);
  150. /* stopping at 2^70 bytes per nonce is user's responsibility */
  151. }
  152. U32TO8_LITTLE(c + 0,x0);
  153. U32TO8_LITTLE(c + 4,x1);
  154. U32TO8_LITTLE(c + 8,x2);
  155. U32TO8_LITTLE(c + 12,x3);
  156. U32TO8_LITTLE(c + 16,x4);
  157. U32TO8_LITTLE(c + 20,x5);
  158. U32TO8_LITTLE(c + 24,x6);
  159. U32TO8_LITTLE(c + 28,x7);
  160. U32TO8_LITTLE(c + 32,x8);
  161. U32TO8_LITTLE(c + 36,x9);
  162. U32TO8_LITTLE(c + 40,x10);
  163. U32TO8_LITTLE(c + 44,x11);
  164. U32TO8_LITTLE(c + 48,x12);
  165. U32TO8_LITTLE(c + 52,x13);
  166. U32TO8_LITTLE(c + 56,x14);
  167. U32TO8_LITTLE(c + 60,x15);
  168. if (bytes <= 64) {
  169. if (bytes < 64) {
  170. for (i = 0;i < (int)bytes;++i) ctarget[i] = c[i];
  171. }
  172. x->input[12] = j12;
  173. x->input[13] = j13;
  174. return;
  175. }
  176. bytes -= 64;
  177. c += 64;
  178. m += 64;
  179. }
  180. }
  181. void ECRYPT_decrypt_bytes(ECRYPT_ctx *x,const u8 *c,u8 *m,u32 bytes)
  182. {
  183. ECRYPT_encrypt_bytes(x,c,m,bytes);
  184. }
  185. void ECRYPT_keystream_bytes(ECRYPT_ctx *x,u8 *stream,u32 bytes)
  186. {
  187. u32 i = 0;
  188. for (i = 0;i < bytes;++i) stream[i] = 0;
  189. ECRYPT_encrypt_bytes(x,stream,stream,bytes);
  190. }
  191. void hchacha20(ECRYPT_ctx *x,u8 *c)
  192. {
  193. u32 x0 = 0, x1 = 0, x2 = 0, x3 = 0, x4 = 0, x5 = 0, x6 = 0, x7 = 0, x8 = 0, x9 = 0, x10 = 0, x11 = 0, x12 = 0, x13 = 0, x14 = 0, x15 = 0;
  194. int i = 0;
  195. x0 = x->input[0];
  196. x1 = x->input[1];
  197. x2 = x->input[2];
  198. x3 = x->input[3];
  199. x4 = x->input[4];
  200. x5 = x->input[5];
  201. x6 = x->input[6];
  202. x7 = x->input[7];
  203. x8 = x->input[8];
  204. x9 = x->input[9];
  205. x10 = x->input[10];
  206. x11 = x->input[11];
  207. x12 = x->input[12];
  208. x13 = x->input[13];
  209. x14 = x->input[14];
  210. x15 = x->input[15];
  211. for (i = 20;i > 0;i -= 2) {
  212. QUARTERROUND( x0, x4, x8,x12)
  213. QUARTERROUND( x1, x5, x9,x13)
  214. QUARTERROUND( x2, x6,x10,x14)
  215. QUARTERROUND( x3, x7,x11,x15)
  216. QUARTERROUND( x0, x5,x10,x15)
  217. QUARTERROUND( x1, x6,x11,x12)
  218. QUARTERROUND( x2, x7, x8,x13)
  219. QUARTERROUND( x3, x4, x9,x14)
  220. }
  221. U32TO8_LITTLE(c + 0,x0);
  222. U32TO8_LITTLE(c + 4,x1);
  223. U32TO8_LITTLE(c + 8,x2);
  224. U32TO8_LITTLE(c + 12,x3);
  225. U32TO8_LITTLE(c + 16,x12);
  226. U32TO8_LITTLE(c + 20,x13);
  227. U32TO8_LITTLE(c + 24,x14);
  228. U32TO8_LITTLE(c + 28,x15);
  229. }