gost-s-box.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. /* gost-s-box.c - GOST 28147-89 S-Box expander
  2. * Copyright (C) 2013 Dmitry Eremin-Solenikov
  3. *
  4. * This file is part of Libgcrypt.
  5. *
  6. * Libgcrypt is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU Lesser General Public License as
  8. * published by the Free Software Foundation; either version 2.1 of
  9. * the License, or (at your option) any later version.
  10. *
  11. * Libgcrypt is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with this program; if not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #define DIM(v) (sizeof(v)/sizeof((v)[0]))
  22. struct gost_sbox
  23. {
  24. const char *name;
  25. const char *oid;
  26. unsigned int keymeshing;
  27. unsigned char sbox[16*8];
  28. } gost_sboxes[] = {
  29. { "test_3411", "1.2.643.2.2.30.0", 0,
  30. {
  31. 0x4, 0xE, 0x5, 0x7, 0x6, 0x4, 0xD, 0x1,
  32. 0xA, 0xB, 0x8, 0xD, 0xC, 0xB, 0xB, 0xF,
  33. 0x9, 0x4, 0x1, 0xA, 0x7, 0xA, 0x4, 0xD,
  34. 0x2, 0xC, 0xD, 0x1, 0x1, 0x0, 0x1, 0x0,
  35. 0xD, 0x6, 0xA, 0x0, 0x5, 0x7, 0x3, 0x5,
  36. 0x8, 0xD, 0x3, 0x8, 0xF, 0x2, 0xF, 0x7,
  37. 0x0, 0xF, 0x4, 0x9, 0xD, 0x1, 0x5, 0xA,
  38. 0xE, 0xA, 0x2, 0xF, 0x8, 0xD, 0x9, 0x4,
  39. 0x6, 0x2, 0xE, 0xE, 0x4, 0x3, 0x0, 0x9,
  40. 0xB, 0x3, 0xF, 0x4, 0xA, 0x6, 0xA, 0x2,
  41. 0x1, 0x8, 0xC, 0x6, 0x9, 0x8, 0xE, 0x3,
  42. 0xC, 0x1, 0x7, 0xC, 0xE, 0x5, 0x7, 0xE,
  43. 0x7, 0x0, 0x6, 0xB, 0x0, 0x9, 0x6, 0x6,
  44. 0xF, 0x7, 0x0, 0x2, 0x3, 0xC, 0x8, 0xB,
  45. 0x5, 0x5, 0x9, 0x5, 0xB, 0xF, 0x2, 0x8,
  46. 0x3, 0x9, 0xB, 0x3, 0x2, 0xE, 0xC, 0xC,
  47. }
  48. },
  49. { "CryptoPro_3411", "1.2.643.2.2.30.1", 0,
  50. {
  51. 0xA, 0x5, 0x7, 0x4, 0x7, 0x7, 0xD, 0x1,
  52. 0x4, 0xF, 0xF, 0xA, 0x6, 0x6, 0xE, 0x3,
  53. 0x5, 0x4, 0xC, 0x7, 0x4, 0x2, 0x4, 0xA,
  54. 0x6, 0x0, 0xE, 0xC, 0xB, 0x4, 0x1, 0x9,
  55. 0x8, 0x2, 0x9, 0x0, 0x9, 0xD, 0x7, 0x5,
  56. 0x1, 0xD, 0x4, 0xF, 0xC, 0x9, 0x0, 0xB,
  57. 0x3, 0xB, 0x1, 0x2, 0x2, 0xF, 0x5, 0x4,
  58. 0x7, 0x9, 0x0, 0x8, 0xA, 0x0, 0xA, 0xF,
  59. 0xD, 0x1, 0x3, 0xE, 0x1, 0xA, 0x3, 0x8,
  60. 0xC, 0x7, 0xB, 0x1, 0x8, 0x1, 0xC, 0x6,
  61. 0xE, 0x6, 0x5, 0x6, 0x0, 0x5, 0x8, 0x7,
  62. 0x0, 0x3, 0x2, 0x5, 0xE, 0xB, 0xF, 0xE,
  63. 0x9, 0xC, 0x6, 0xD, 0xF, 0x8, 0x6, 0xD,
  64. 0x2, 0xE, 0xA, 0xB, 0xD, 0xE, 0x2, 0x0,
  65. 0xB, 0xA, 0x8, 0x9, 0x3, 0xC, 0x9, 0x2,
  66. 0xF, 0x8, 0xD, 0x3, 0x5, 0x3, 0xB, 0xC,
  67. }
  68. },
  69. { "Test_89", "1.2.643.2.2.31.0", 0,
  70. {
  71. 0x4, 0xC, 0xD, 0xE, 0x3, 0x8, 0x9, 0xC,
  72. 0x2, 0x9, 0x8, 0x9, 0xE, 0xF, 0xB, 0x6,
  73. 0xF, 0xF, 0xE, 0xB, 0x5, 0x6, 0xC, 0x5,
  74. 0x5, 0xE, 0xC, 0x2, 0x9, 0xB, 0x0, 0x2,
  75. 0x9, 0x8, 0x7, 0x5, 0x6, 0x1, 0x3, 0xB,
  76. 0x1, 0x1, 0x3, 0xF, 0x8, 0x9, 0x6, 0x0,
  77. 0x0, 0x3, 0x9, 0x7, 0x0, 0xC, 0x7, 0x9,
  78. 0x8, 0xA, 0xA, 0x1, 0xD, 0x5, 0x5, 0xD,
  79. 0xE, 0x2, 0x1, 0x0, 0xA, 0xD, 0x4, 0x3,
  80. 0x3, 0x7, 0x5, 0xD, 0xB, 0x3, 0x8, 0xE,
  81. 0xB, 0x4, 0x2, 0xC, 0x7, 0x7, 0xE, 0x7,
  82. 0xC, 0xD, 0x4, 0x6, 0xC, 0xA, 0xF, 0xA,
  83. 0xD, 0x6, 0x6, 0xA, 0x2, 0x0, 0x1, 0xF,
  84. 0x7, 0x0, 0xF, 0x4, 0x1, 0xE, 0xA, 0x4,
  85. 0xA, 0xB, 0x0, 0x3, 0xF, 0x2, 0x2, 0x1,
  86. 0x6, 0x5, 0xB, 0x8, 0x4, 0x4, 0xD, 0x8,
  87. }
  88. },
  89. { "CryptoPro_A", "1.2.643.2.2.31.1", 1,
  90. {
  91. 0x9, 0x3, 0xE, 0xE, 0xB, 0x3, 0x1, 0xB,
  92. 0x6, 0x7, 0x4, 0x7, 0x5, 0xA, 0xD, 0xA,
  93. 0x3, 0xE, 0x6, 0xA, 0x1, 0xD, 0x2, 0xF,
  94. 0x2, 0x9, 0x2, 0xC, 0x9, 0xC, 0x9, 0x5,
  95. 0x8, 0x8, 0xB, 0xD, 0x8, 0x1, 0x7, 0x0,
  96. 0xB, 0xA, 0x3, 0x1, 0xD, 0x2, 0xA, 0xC,
  97. 0x1, 0xF, 0xD, 0x3, 0xF, 0x0, 0x6, 0xE,
  98. 0x7, 0x0, 0x8, 0x9, 0x0, 0xB, 0x0, 0x8,
  99. 0xA, 0x5, 0xC, 0x0, 0xE, 0x7, 0x8, 0x6,
  100. 0x4, 0x2, 0xF, 0x2, 0x4, 0x5, 0xC, 0x2,
  101. 0xE, 0x6, 0x5, 0xB, 0x2, 0x9, 0x4, 0x3,
  102. 0xF, 0xC, 0xA, 0x4, 0x3, 0x4, 0x5, 0x9,
  103. 0xC, 0xB, 0x0, 0xF, 0xC, 0x8, 0xF, 0x1,
  104. 0x0, 0x4, 0x7, 0x8, 0x7, 0xF, 0x3, 0x7,
  105. 0xD, 0xD, 0x1, 0x5, 0xA, 0xE, 0xB, 0xD,
  106. 0x5, 0x1, 0x9, 0x6, 0x6, 0x6, 0xE, 0x4,
  107. }
  108. },
  109. { "CryptoPro_B", "1.2.643.2.2.31.2", 1,
  110. {
  111. 0x8, 0x0, 0xE, 0x7, 0x2, 0x8, 0x5, 0x0,
  112. 0x4, 0x1, 0xC, 0x5, 0x7, 0x3, 0x2, 0x4,
  113. 0xB, 0x2, 0x0, 0x0, 0xC, 0x2, 0xA, 0xB,
  114. 0x1, 0xA, 0xA, 0xD, 0xF, 0x6, 0xB, 0xE,
  115. 0x3, 0x4, 0x9, 0xB, 0x9, 0x4, 0x9, 0x8,
  116. 0x5, 0xD, 0x2, 0x6, 0x5, 0xD, 0x1, 0x3,
  117. 0x0, 0x5, 0xD, 0x1, 0xA, 0xE, 0xC, 0x7,
  118. 0x9, 0xC, 0xB, 0x2, 0xB, 0xB, 0x3, 0x1,
  119. 0x2, 0x9, 0x7, 0x3, 0x1, 0xC, 0x7, 0xA,
  120. 0xE, 0x7, 0x5, 0xA, 0x4, 0x1, 0x4, 0x2,
  121. 0xA, 0x3, 0x8, 0xC, 0x0, 0x7, 0xD, 0x9,
  122. 0xC, 0xF, 0xF, 0xF, 0xD, 0xF, 0x0, 0x6,
  123. 0xD, 0xB, 0x3, 0x4, 0x6, 0xA, 0x6, 0xF,
  124. 0x6, 0x8, 0x6, 0xE, 0x8, 0x0, 0xF, 0xD,
  125. 0x7, 0x6, 0x1, 0x9, 0xE, 0x9, 0x8, 0x5,
  126. 0xF, 0xE, 0x4, 0x8, 0x3, 0x5, 0xE, 0xC,
  127. }
  128. },
  129. { "CryptoPro_C", "1.2.643.2.2.31.3", 1,
  130. {
  131. 0x1, 0x0, 0x8, 0x3, 0x8, 0xC, 0xA, 0x7,
  132. 0xB, 0x1, 0x2, 0x6, 0xD, 0x9, 0x9, 0x4,
  133. 0xC, 0x7, 0x5, 0x0, 0xB, 0xB, 0x6, 0x0,
  134. 0x2, 0xD, 0x0, 0x1, 0x0, 0x1, 0x8, 0x5,
  135. 0x9, 0xB, 0x4, 0x5, 0x4, 0x8, 0xD, 0xA,
  136. 0xD, 0x4, 0x9, 0xD, 0x5, 0xE, 0xE, 0x2,
  137. 0x0, 0x5, 0xF, 0xA, 0x1, 0x2, 0x2, 0xF,
  138. 0xF, 0x2, 0xA, 0x8, 0x2, 0x4, 0x0, 0xE,
  139. 0x4, 0x8, 0x3, 0xB, 0x9, 0x7, 0xF, 0xC,
  140. 0x5, 0xE, 0x7, 0x2, 0x3, 0x3, 0x3, 0x6,
  141. 0x8, 0xF, 0xC, 0x9, 0xC, 0x6, 0x5, 0x1,
  142. 0xE, 0xC, 0xD, 0x7, 0xE, 0x5, 0xB, 0xB,
  143. 0xA, 0x9, 0x6, 0xE, 0x6, 0xA, 0x4, 0xD,
  144. 0x7, 0xA, 0xE, 0xF, 0xF, 0x0, 0x1, 0x9,
  145. 0x6, 0x6, 0x1, 0xC, 0xA, 0xF, 0xC, 0x3,
  146. 0x3, 0x3, 0xB, 0x4, 0x7, 0xD, 0x7, 0x8,
  147. }
  148. },
  149. { "CryptoPro_D", "1.2.643.2.2.31.4", 1,
  150. {
  151. 0xF, 0xB, 0x1, 0x1, 0x0, 0x8, 0x3, 0x1,
  152. 0xC, 0x6, 0xC, 0x5, 0xC, 0x0, 0x0, 0xA,
  153. 0x2, 0x3, 0xB, 0xE, 0x8, 0xF, 0x6, 0x6,
  154. 0xA, 0x4, 0x0, 0xC, 0x9, 0x3, 0xF, 0x8,
  155. 0x6, 0xC, 0xF, 0xA, 0xD, 0x2, 0x1, 0xF,
  156. 0x4, 0xF, 0xE, 0x7, 0x2, 0x5, 0xE, 0xB,
  157. 0x5, 0xE, 0x6, 0x0, 0xA, 0xE, 0x9, 0x0,
  158. 0x0, 0x2, 0x5, 0xD, 0xB, 0xB, 0x2, 0x4,
  159. 0x7, 0x7, 0xA, 0x6, 0x7, 0x1, 0xD, 0xC,
  160. 0x9, 0xD, 0xD, 0x2, 0x3, 0xA, 0x8, 0x3,
  161. 0xE, 0x8, 0x4, 0xB, 0x6, 0x4, 0xC, 0x5,
  162. 0xD, 0x0, 0x8, 0x4, 0x5, 0x7, 0x4, 0x9,
  163. 0x1, 0x5, 0x9, 0x9, 0x4, 0xC, 0xB, 0x7,
  164. 0xB, 0xA, 0x3, 0x3, 0xE, 0x9, 0xA, 0xD,
  165. 0x8, 0x9, 0x7, 0xF, 0xF, 0xD, 0x5, 0x2,
  166. 0x3, 0x1, 0x2, 0x8, 0x1, 0x6, 0x7, 0xE,
  167. }
  168. },
  169. { "TC26_Z", "1.2.643.7.1.2.5.1.1", 1,
  170. {
  171. 0xc, 0x6, 0xb, 0xc, 0x7, 0x5, 0x8, 0x1,
  172. 0x4, 0x8, 0x3, 0x8, 0xf, 0xd, 0xe, 0x7,
  173. 0x6, 0x2, 0x5, 0x2, 0x5, 0xf, 0x2, 0xe,
  174. 0x2, 0x3, 0x8, 0x1, 0xa, 0x6, 0x5, 0xd,
  175. 0xa, 0x9, 0x2, 0xd, 0x8, 0x9, 0x6, 0x0,
  176. 0x5, 0xa, 0xf, 0x4, 0x1, 0x2, 0x9, 0x5,
  177. 0xb, 0x5, 0xa, 0xf, 0x6, 0xc, 0x1, 0x8,
  178. 0x9, 0xc, 0xd, 0x6, 0xd, 0xa, 0xc, 0x3,
  179. 0xe, 0x1, 0xe, 0x7, 0x0, 0xb, 0xf, 0x4,
  180. 0x8, 0xe, 0x1, 0x0, 0x9, 0x7, 0x4, 0xf,
  181. 0xd, 0x4, 0x7, 0xa, 0x3, 0x8, 0xb, 0xa,
  182. 0x7, 0x7, 0x4, 0x5, 0xe, 0x1, 0x0, 0x6,
  183. 0x0, 0xb, 0xc, 0x3, 0xb, 0x4, 0xd, 0x9,
  184. 0x3, 0xd, 0x9, 0xe, 0x4, 0x3, 0xa, 0xc,
  185. 0xf, 0x0, 0x6, 0x9, 0x2, 0xe, 0x3, 0xb,
  186. 0x1, 0xf, 0x0, 0xb, 0xc, 0x0, 0x7, 0x2,
  187. }
  188. },
  189. };
  190. int main(int argc, char **argv)
  191. {
  192. unsigned int i, j, s;
  193. FILE *f;
  194. if (argc == 1)
  195. f = stdin;
  196. else
  197. f = fopen(argv[1], "w");
  198. if (!f)
  199. {
  200. perror("fopen");
  201. exit(1);
  202. }
  203. for (s = 0; s < DIM(gost_sboxes); s++)
  204. {
  205. unsigned char *sbox = gost_sboxes[s].sbox;
  206. fprintf (f, "static const u32 sbox_%s[4*256] =\n {", gost_sboxes[s].name);
  207. for (i = 0; i < 4; i++) {
  208. fprintf (f, "\n /* %d */\n ", i);
  209. for (j = 0; j < 256; j++) {
  210. unsigned int val;
  211. if (j % 4 == 0 && j != 0)
  212. fprintf (f, "\n ");
  213. val = sbox[ (j & 0xf) * 8 + 2 * i + 0] |
  214. (sbox[ (j >> 4) * 8 + 2 * i + 1] << 4);
  215. val <<= (8*i);
  216. val = (val << 11) | (val >> 21);
  217. fprintf (f, " 0x%08x,", val);
  218. }
  219. }
  220. fprintf (f, "\n };\n\n");
  221. }
  222. fprintf (f, "static struct\n{\n const char *oid;\n const u32 *sbox;\n const int keymeshing;\n} gost_oid_map[] = {\n");
  223. for (s = 0; s < DIM(gost_sboxes); s++)
  224. {
  225. fprintf (f, " { \"%s\", sbox_%s, %d },\n", gost_sboxes[s].oid, gost_sboxes[s].name, gost_sboxes[s].keymeshing );
  226. }
  227. fprintf(f, " { NULL, NULL, 0 }\n};\n");
  228. fclose (f);
  229. return 0;
  230. }