saferp_optimizer.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /* emits an optimized version of LTC_SAFER+ ... only does encrypt so far... */
  2. #include <stdio.h>
  3. #include <string.h>
  4. /* This is the "Armenian" Shuffle. It takes the input from b and stores it in b2 */
  5. #define SHUF\
  6. b2[0] = b[8]; b2[1] = b[11]; b2[2] = b[12]; b2[3] = b[15]; \
  7. b2[4] = b[2]; b2[5] = b[1]; b2[6] = b[6]; b2[7] = b[5]; \
  8. b2[8] = b[10]; b2[9] = b[9]; b2[10] = b[14]; b2[11] = b[13]; \
  9. b2[12] = b[0]; b2[13] = b[7]; b2[14] = b[4]; b2[15] = b[3]; memcpy(b, b2, sizeof(b));
  10. /* This is the inverse shuffle. It takes from b and gives to b2 */
  11. #define iSHUF(b, b2) \
  12. b2[0] = b[12]; b2[1] = b[5]; b2[2] = b[4]; b2[3] = b[15]; \
  13. b2[4] = b[14]; b2[5] = b[7]; b2[6] = b[6]; b2[7] = b[13]; \
  14. b2[8] = b[0]; b2[9] = b[9]; b2[10] = b[8]; b2[11] = b[1]; \
  15. b2[12] = b[2]; b2[13] = b[11]; b2[14] = b[10]; b2[15] = b[3]; memcpy(b, b2, sizeof(b));
  16. #define ROUND(b, i) \
  17. b[0] = (safer_ebox[(b[0] ^ skey->saferp.K[i][0]) & 255] + skey->saferp.K[i+1][0]) & 255; \
  18. b[1] = safer_lbox[(b[1] + skey->saferp.K[i][1]) & 255] ^ skey->saferp.K[i+1][1]; \
  19. b[2] = safer_lbox[(b[2] + skey->saferp.K[i][2]) & 255] ^ skey->saferp.K[i+1][2]; \
  20. b[3] = (safer_ebox[(b[3] ^ skey->saferp.K[i][3]) & 255] + skey->saferp.K[i+1][3]) & 255; \
  21. b[4] = (safer_ebox[(b[4] ^ skey->saferp.K[i][4]) & 255] + skey->saferp.K[i+1][4]) & 255; \
  22. b[5] = safer_lbox[(b[5] + skey->saferp.K[i][5]) & 255] ^ skey->saferp.K[i+1][5]; \
  23. b[6] = safer_lbox[(b[6] + skey->saferp.K[i][6]) & 255] ^ skey->saferp.K[i+1][6]; \
  24. b[7] = (safer_ebox[(b[7] ^ skey->saferp.K[i][7]) & 255] + skey->saferp.K[i+1][7]) & 255; \
  25. b[8] = (safer_ebox[(b[8] ^ skey->saferp.K[i][8]) & 255] + skey->saferp.K[i+1][8]) & 255; \
  26. b[9] = safer_lbox[(b[9] + skey->saferp.K[i][9]) & 255] ^ skey->saferp.K[i+1][9]; \
  27. b[10] = safer_lbox[(b[10] + skey->saferp.K[i][10]) & 255] ^ skey->saferp.K[i+1][10]; \
  28. b[11] = (safer_ebox[(b[11] ^ skey->saferp.K[i][11]) & 255] + skey->saferp.K[i+1][11]) & 255; \
  29. b[12] = (safer_ebox[(b[12] ^ skey->saferp.K[i][12]) & 255] + skey->saferp.K[i+1][12]) & 255; \
  30. b[13] = safer_lbox[(b[13] + skey->saferp.K[i][13]) & 255] ^ skey->saferp.K[i+1][13]; \
  31. b[14] = safer_lbox[(b[14] + skey->saferp.K[i][14]) & 255] ^ skey->saferp.K[i+1][14]; \
  32. b[15] = (safer_ebox[(b[15] ^ skey->saferp.K[i][15]) & 255] + skey->saferp.K[i+1][15]) & 255;
  33. int main(void)
  34. {
  35. int b[16], b2[16], x, y, z;
  36. /* -- ENCRYPT --- */
  37. for (x = 0; x < 16; x++) b[x] = x;
  38. /* emit encrypt preabmle */
  39. printf(
  40. "void saferp_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey)\n"
  41. "{\n"
  42. " int x;\n"
  43. " unsigned char b[16];\n"
  44. "\n"
  45. " LTC_ARGCHK(pt != NULL);\n"
  46. " LTC_ARGCHK(ct != NULL);\n"
  47. " LTC_ARGCHK(skey != NULL);\n"
  48. "\n"
  49. " /* do eight rounds */\n"
  50. " for (x = 0; x < 16; x++) {\n"
  51. " b[x] = pt[x];\n"
  52. " }\n");
  53. /* do 8 rounds of ROUND; LT; */
  54. for (x = 0; x < 8; x++) {
  55. /* ROUND(..., x*2) */
  56. for (y = 0; y < 16; y++) {
  57. printf("b[%d] = (safer_%cbox[(b[%d] %c skey->saferp.K[%d][%d]) & 255] %c skey->saferp.K[%d][%d]) & 255;\n",
  58. b[y], "elle"[y&3], b[y], "^++^"[y&3], x*2, y, "+^^+"[y&3], x*2+1, y);
  59. }
  60. /* LT */
  61. for (y = 0; y < 4; y++) {
  62. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[0], b[0], b[1], b[0], b[1]);
  63. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[2], b[2], b[3], b[3], b[2]);
  64. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[4], b[4], b[5], b[5], b[4]);
  65. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[6], b[6], b[7], b[7], b[6]);
  66. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[8], b[8], b[9], b[9], b[8]);
  67. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[10], b[10], b[11], b[11], b[10]);
  68. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[12], b[12], b[13], b[13], b[12]);
  69. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[14], b[14], b[15], b[15], b[14]);
  70. if (y < 3) {
  71. SHUF;
  72. }
  73. }
  74. }
  75. printf(
  76. " if (skey->saferp.rounds <= 8) {\n");
  77. /* finish */
  78. for (x = 0; x < 16; x++) {
  79. printf(
  80. " ct[%d] = (b[%d] %c skey->saferp.K[skey->saferp.rounds*2][%d]) & 255;\n",
  81. x, b[x], "^++^"[x&3], x);
  82. }
  83. printf(" return;\n }\n");
  84. /* 192-bit keys */
  85. printf(
  86. " /* 192-bit key? */\n"
  87. " if (skey->saferp.rounds > 8) {\n");
  88. /* do 4 rounds of ROUND; LT; */
  89. for (x = 8; x < 12; x++) {
  90. /* ROUND(..., x*2) */
  91. for (y = 0; y < 16; y++) {
  92. printf("b[%d] = (safer_%cbox[(b[%d] %c skey->saferp.K[%d][%d]) & 255] %c skey->saferp.K[%d][%d]) & 255;\n",
  93. b[y], "elle"[y&3], b[y], "^++^"[y&3], x*2, y, "+^^+"[y&3], x*2+1, y);
  94. }
  95. /* LT */
  96. for (y = 0; y < 4; y++) {
  97. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[0], b[0], b[1], b[0], b[1]);
  98. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[2], b[2], b[3], b[3], b[2]);
  99. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[4], b[4], b[5], b[5], b[4]);
  100. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[6], b[6], b[7], b[7], b[6]);
  101. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[8], b[8], b[9], b[9], b[8]);
  102. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[10], b[10], b[11], b[11], b[10]);
  103. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[12], b[12], b[13], b[13], b[12]);
  104. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[14], b[14], b[15], b[15], b[14]);
  105. if (y < 3) {
  106. SHUF;
  107. }
  108. }
  109. }
  110. printf("}\n");
  111. printf(
  112. " if (skey->saferp.rounds <= 12) {\n");
  113. /* finish */
  114. for (x = 0; x < 16; x++) {
  115. printf(
  116. " ct[%d] = (b[%d] %c skey->saferp.K[skey->saferp.rounds*2][%d]) & 255;\n",
  117. x, b[x], "^++^"[x&3], x);
  118. }
  119. printf(" return;\n }\n");
  120. /* 256-bit keys */
  121. printf(
  122. " /* 256-bit key? */\n"
  123. " if (skey->saferp.rounds > 12) {\n");
  124. /* do 4 rounds of ROUND; LT; */
  125. for (x = 12; x < 16; x++) {
  126. /* ROUND(..., x*2) */
  127. for (y = 0; y < 16; y++) {
  128. printf("b[%d] = (safer_%cbox[(b[%d] %c skey->saferp.K[%d][%d]) & 255] %c skey->saferp.K[%d][%d]) & 255;\n",
  129. b[y], "elle"[y&3], b[y], "^++^"[y&3], x*2, y, "+^^+"[y&3], x*2+1, y);
  130. }
  131. /* LT */
  132. for (y = 0; y < 4; y++) {
  133. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[0], b[0], b[1], b[0], b[1]);
  134. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[2], b[2], b[3], b[3], b[2]);
  135. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[4], b[4], b[5], b[5], b[4]);
  136. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[6], b[6], b[7], b[7], b[6]);
  137. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[8], b[8], b[9], b[9], b[8]);
  138. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[10], b[10], b[11], b[11], b[10]);
  139. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[12], b[12], b[13], b[13], b[12]);
  140. printf(" b[%d] = (b[%d] + (b[%d] = (b[%d] + b[%d]) & 255)) & 255;\n", b[14], b[14], b[15], b[15], b[14]);
  141. if (y < 3) {
  142. SHUF;
  143. }
  144. }
  145. }
  146. /* finish */
  147. for (x = 0; x < 16; x++) {
  148. printf(
  149. " ct[%d] = (b[%d] %c skey->saferp.K[skey->saferp.rounds*2][%d]) & 255;\n",
  150. x, b[x], "^++^"[x&3], x);
  151. }
  152. printf(" return;\n");
  153. printf(" }\n}\n\n");
  154. return 0;
  155. }
  156. /* ref: $Format:%D$ */
  157. /* git commit: $Format:%H$ */
  158. /* commit time: $Format:%ai$ */