apdu_test.c 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /*
  2. *******************************************************************************
  3. \file apdu_test.c
  4. \brief Tests for APDU formats
  5. \project bee2/test
  6. \created 2022.10.31
  7. \version 2023.03.07
  8. \copyright The Bee2 authors
  9. \license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
  10. *******************************************************************************
  11. */
  12. #include <bee2/core/apdu.h>
  13. #include <bee2/core/hex.h>
  14. #include <bee2/core/mem.h>
  15. #include <bee2/core/str.h>
  16. #include <bee2/core/util.h>
  17. /*
  18. *******************************************************************************
  19. Тестирование
  20. - used https://habr.com/ru/post/439574/
  21. *******************************************************************************
  22. */
  23. bool_t apduTest()
  24. {
  25. octet stack[2048];
  26. apdu_cmd_t* cmd = (apdu_cmd_t*)stack;
  27. apdu_cmd_t* cmd1 = (apdu_cmd_t*)(stack + 1024);
  28. apdu_resp_t* resp = (apdu_resp_t*)stack;
  29. apdu_resp_t* resp1 = (apdu_resp_t*)(stack + 1024);
  30. octet apdu[1024];
  31. size_t count;
  32. size_t count1;
  33. // cmd: точечный тест
  34. memSetZero(cmd, sizeof(apdu_cmd_t));
  35. cmd->cla = 0x00, cmd->ins = 0xA4, cmd->p1 = 0x04, cmd->p2 = 0x04;
  36. cmd->cdf_len = 4, cmd->rdf_len = 256;
  37. hexTo(cmd->cdf, "54657374");
  38. count = apduCmdEnc(0, cmd);
  39. ASSERT(count < sizeof(apdu));
  40. if (count != 10 || apduCmdEnc(apdu, cmd) != count ||
  41. !hexEq(apdu, "00A40404045465737400"))
  42. return FALSE;
  43. count1 = apduCmdDec(0, apdu, count);
  44. ASSERT(count1 < sizeof(stack) / 2);
  45. if (count1 != sizeof(apdu_cmd_t) + 4 ||
  46. apduCmdDec(cmd1, apdu, count) != count1 ||
  47. !memEq(cmd, cmd1, count1))
  48. return FALSE;
  49. // cmd: сочетания длин
  50. cmd->cla = 0x00, cmd->ins = 0xA4, cmd->p1 = 0x04, cmd->p2 = 0x04;
  51. memSet(cmd->cdf, 0x36, 257);
  52. for (cmd->cdf_len = 0; cmd->cdf_len <= 257; ++cmd->cdf_len)
  53. for (cmd->rdf_len = 0; cmd->rdf_len <= 257; ++cmd->rdf_len)
  54. {
  55. count = apduCmdEnc(0, cmd);
  56. ASSERT(count < sizeof(apdu));
  57. if (apduCmdEnc(apdu, cmd) != count)
  58. return FALSE;
  59. count1 = apduCmdDec(0, apdu, count);
  60. ASSERT(count1 < sizeof(stack) / 2);
  61. if (apduCmdDec(cmd1, apdu, count) != count1 ||
  62. !memEq(cmd, cmd1, count1))
  63. return FALSE;
  64. }
  65. // resp: точечный тест
  66. memSetZero(resp, sizeof(apdu_resp_t));
  67. resp->sw1 = 0x90, resp->sw2 = 0x00;
  68. cmd->rdf_len = 20;
  69. hexTo(resp->rdf, "E012C00401FF8010C00402FF8010C00403FF8010");
  70. count = apduRespEnc(0, resp);
  71. ASSERT(count < sizeof(apdu));
  72. if (count != 22 || apduRespEnc(apdu, resp) != count ||
  73. !hexEq(apdu, "E012C00401FF8010C00402FF8010C00403FF80109000"))
  74. return FALSE;
  75. count1 = apduRespDec(0, apdu, count);
  76. ASSERT(count1 < sizeof(stack) / 2);
  77. if (count1 != sizeof(apdu_resp_t) + 20 ||
  78. apduRespDec(resp1, apdu, count) != count1 ||
  79. !memEq(resp, resp1, count1))
  80. return FALSE;
  81. // все нормально
  82. return TRUE;
  83. }