excrypt_parve.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include "excrypt.h"
  4. void ExCryptParveEcb(const uint8_t* key, const uint8_t* sbox, const uint8_t* input, uint8_t* output)
  5. {
  6. uint8_t block[9];
  7. memcpy(block, input, 8);
  8. block[8] = block[0];
  9. for (int i = 8; i > 0; i--)
  10. {
  11. for (int j = 0; j < 8; j++)
  12. {
  13. uint8_t x = key[j] + block[j] + i;
  14. uint8_t y = sbox[x] + block[j + 1];
  15. block[j + 1] = ROTL8(y, 1);
  16. }
  17. block[0] = block[8];
  18. }
  19. memcpy(output, block, 8);
  20. }
  21. void ExCryptParveCbcMac(const uint8_t* key, const uint8_t* sbox, const uint8_t* iv, const uint8_t* input, uint32_t input_size, uint8_t* output)
  22. {
  23. uint64_t block;
  24. uint64_t temp;
  25. memcpy(&block, iv, 8);
  26. if (input_size >= 8)
  27. {
  28. for (uint32_t i = 0; i < input_size / 8; i++)
  29. {
  30. memcpy(&temp, input + (i * 8), sizeof(temp));
  31. block ^= temp;
  32. ExCryptParveEcb(key, sbox, (uint8_t*)&block, (uint8_t*)&block);
  33. }
  34. }
  35. memcpy(output, &block, 8);
  36. }
  37. void ExCryptChainAndSumMac(const uint32_t* cd, const uint32_t* ab, const uint32_t* input, uint32_t input_dwords, uint32_t* output)
  38. {
  39. uint64_t out0 = 0;
  40. uint64_t out1 = 0;
  41. uint32_t ab0 = SWAP32(ab[0]) % 0x7FFFFFFF;
  42. uint32_t ab1 = SWAP32(ab[1]) % 0x7FFFFFFF;
  43. uint32_t cd0 = SWAP32(cd[0]) % 0x7FFFFFFF;
  44. uint32_t cd1 = SWAP32(cd[1]) % 0x7FFFFFFF;
  45. for (uint32_t i = 0; i < input_dwords / 2; i++)
  46. {
  47. out0 += (uint64_t)SWAP32(input[0]) * 0xE79A9C1;
  48. out0 = (out0 % 0x7FFFFFFF) * ab0;
  49. out0 += ab1;
  50. out0 = out0 % 0x7FFFFFFF;
  51. out1 += out0;
  52. out0 = (uint64_t)(SWAP32(input[1]) + out0) * cd0;
  53. out0 = (out0 % 0x7FFFFFFF) + cd1;
  54. out0 = out0 % 0x7FFFFFFF;
  55. out1 += out0;
  56. input += 2;
  57. }
  58. out0 = SWAP32((out0 + ab1) % 0x7FFFFFFF);
  59. out1 = SWAP32((out1 + cd1) % 0x7FFFFFFF);
  60. memcpy(output, &out0, sizeof(uint32_t));
  61. memcpy(output+1, &out1, sizeof(uint32_t));
  62. // output[0] = SWAP32((out0 + ab1) % 0x7FFFFFFF);
  63. // output[1] = SWAP32((out1 + cd1) % 0x7FFFFFFF);
  64. }