Counter Strike : Global Offensive Source Code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123 lines
3.3 KiB

  1. #include "pch.h"
  2. #include "gost.h"
  3. #include "misc.h"
  4. NAMESPACE_BEGIN(CryptoPP)
  5. // these are the S-boxes given in Applied Cryptography 2nd Ed., p. 333
  6. const byte GOST::Base::sBox[8][16]={
  7. {4, 10, 9, 2, 13, 8, 0, 14, 6, 11, 1, 12, 7, 15, 5, 3},
  8. {14, 11, 4, 12, 6, 13, 15, 10, 2, 3, 8, 1, 0, 7, 5, 9},
  9. {5, 8, 1, 13, 10, 3, 4, 2, 14, 15, 12, 7, 6, 0, 9, 11},
  10. {7, 13, 10, 1, 0, 8, 9, 15, 14, 4, 6, 12, 11, 2, 5, 3},
  11. {6, 12, 7, 1, 5, 15, 13, 8, 4, 10, 9, 14, 0, 3, 11, 2},
  12. {4, 11, 10, 0, 7, 2, 1, 13, 3, 6, 8, 5, 9, 12, 15, 14},
  13. {13, 11, 4, 1, 3, 15, 5, 9, 0, 10, 14, 7, 6, 8, 2, 12},
  14. {1, 15, 13, 0, 5, 7, 10, 4, 9, 2, 3, 14, 6, 11, 8, 12}};
  15. /* // these are the S-boxes given in the GOST source code listing in Applied
  16. // Cryptography 2nd Ed., p. 644. they appear to be from the DES S-boxes
  17. {13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 },
  18. { 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 },
  19. {12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 },
  20. { 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 },
  21. { 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 },
  22. {10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 },
  23. {15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 },
  24. {14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 }};
  25. */
  26. volatile bool GOST::Base::sTableCalculated = false;
  27. word32 GOST::Base::sTable[4][256];
  28. void GOST::Base::UncheckedSetKey(const byte *userKey, unsigned int length, const NameValuePairs &)
  29. {
  30. AssertValidKeyLength(length);
  31. PrecalculateSTable();
  32. GetUserKey(LITTLE_ENDIAN_ORDER, key.begin(), 8, userKey, KEYLENGTH);
  33. }
  34. void GOST::Base::PrecalculateSTable()
  35. {
  36. if (!sTableCalculated)
  37. {
  38. for (unsigned i = 0; i < 4; i++)
  39. for (unsigned j = 0; j < 256; j++)
  40. {
  41. word32 temp = sBox[2*i][j%16] | (sBox[2*i+1][j/16] << 4);
  42. sTable[i][j] = rotlMod(temp, 11+8*i);
  43. }
  44. sTableCalculated=true;
  45. }
  46. }
  47. #define f(x) ( t=x, \
  48. sTable[3][GETBYTE(t, 3)] ^ sTable[2][GETBYTE(t, 2)] \
  49. ^ sTable[1][GETBYTE(t, 1)] ^ sTable[0][GETBYTE(t, 0)] )
  50. typedef BlockGetAndPut<word32, LittleEndian> Block;
  51. void GOST::Enc::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
  52. {
  53. word32 n1, n2, t;
  54. Block::Get(inBlock)(n1)(n2);
  55. for (unsigned int i=0; i<3; i++)
  56. {
  57. n2 ^= f(n1+key[0]);
  58. n1 ^= f(n2+key[1]);
  59. n2 ^= f(n1+key[2]);
  60. n1 ^= f(n2+key[3]);
  61. n2 ^= f(n1+key[4]);
  62. n1 ^= f(n2+key[5]);
  63. n2 ^= f(n1+key[6]);
  64. n1 ^= f(n2+key[7]);
  65. }
  66. n2 ^= f(n1+key[7]);
  67. n1 ^= f(n2+key[6]);
  68. n2 ^= f(n1+key[5]);
  69. n1 ^= f(n2+key[4]);
  70. n2 ^= f(n1+key[3]);
  71. n1 ^= f(n2+key[2]);
  72. n2 ^= f(n1+key[1]);
  73. n1 ^= f(n2+key[0]);
  74. Block::Put(xorBlock, outBlock)(n2)(n1);
  75. }
  76. void GOST::Dec::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const
  77. {
  78. word32 n1, n2, t;
  79. Block::Get(inBlock)(n1)(n2);
  80. n2 ^= f(n1+key[0]);
  81. n1 ^= f(n2+key[1]);
  82. n2 ^= f(n1+key[2]);
  83. n1 ^= f(n2+key[3]);
  84. n2 ^= f(n1+key[4]);
  85. n1 ^= f(n2+key[5]);
  86. n2 ^= f(n1+key[6]);
  87. n1 ^= f(n2+key[7]);
  88. for (unsigned int i=0; i<3; i++)
  89. {
  90. n2 ^= f(n1+key[7]);
  91. n1 ^= f(n2+key[6]);
  92. n2 ^= f(n1+key[5]);
  93. n1 ^= f(n2+key[4]);
  94. n2 ^= f(n1+key[3]);
  95. n1 ^= f(n2+key[2]);
  96. n2 ^= f(n1+key[1]);
  97. n1 ^= f(n2+key[0]);
  98. }
  99. Block::Put(xorBlock, outBlock)(n2)(n1);
  100. }
  101. NAMESPACE_END