cmd_main.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. /*
  2. *******************************************************************************
  3. \file cmd_main.c
  4. \brief Command-line interface to Bee2: main
  5. \project bee2/cmd
  6. \created 2022.06.07
  7. \version 2022.11.03
  8. \copyright The Bee2 authors
  9. \license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
  10. *******************************************************************************
  11. */
  12. #include "cmd.h"
  13. #include <bee2/core/err.h>
  14. #include <bee2/core/str.h>
  15. #include <bee2/core/util.h>
  16. #include <stdio.h>
  17. /*
  18. *******************************************************************************
  19. Регистрация команд
  20. *******************************************************************************
  21. */
  22. typedef struct
  23. {
  24. const char* name; /*!< имя команды */
  25. const char* descr; /*!< описание команды */
  26. cmd_main_i fn; /*!< точка входа команды */
  27. } cmd_entry_t;
  28. static size_t _count = 0; /*< число команд */
  29. static cmd_entry_t _cmds[32]; /*< перечень команд */
  30. err_t cmdReg(const char* name, const char* descr, cmd_main_i fn)
  31. {
  32. size_t pos;
  33. // неверный формат?
  34. if (!strIsValid(name) || 0 == strLen(name) || strLen(name) > 8 ||
  35. !strIsValid(descr) || strLen(descr) > 60)
  36. return ERR_BAD_FORMAT;
  37. // команда уже зарегистрирована?
  38. for (pos = 0; pos < _count; ++pos)
  39. if (strEq(_cmds[pos].name, name))
  40. return ERR_CMD_EXISTS;
  41. // нет места?
  42. if (pos == COUNT_OF(_cmds))
  43. return ERR_OUTOFMEMORY;
  44. // зарегистрировать
  45. _cmds[pos].name = name;
  46. _cmds[pos].descr = descr;
  47. _cmds[pos].fn = fn;
  48. ++_count;
  49. return ERR_OK;
  50. }
  51. /*
  52. *******************************************************************************
  53. Справка
  54. *******************************************************************************
  55. */
  56. int cmdUsage()
  57. {
  58. size_t pos;
  59. // перечень команд
  60. printf(
  61. "Usage:\n"
  62. " bee2cmd {");
  63. for (pos = 0; pos + 1 < _count; ++pos)
  64. printf("%s|", _cmds[pos].name);
  65. printf("%s} ...\n", _cmds[pos].name);
  66. // краткая справка по каждой команде
  67. for (pos = 0; pos < _count; ++pos)
  68. printf(" %s%*s%s\n",
  69. _cmds[pos].name,
  70. (int)(12 - strLen(_cmds[pos].name)), "",
  71. _cmds[pos].descr);
  72. return -1;
  73. }
  74. /*
  75. *******************************************************************************
  76. Самопроверка подписи
  77. \remark Используется проверочный открытый ключ Q -- базовая точка G кривой
  78. bign-curve256v1: Q = G. Этому ключу соответствует личный ключ d = 1.
  79. *******************************************************************************
  80. */
  81. static err_t cmdSelfCheck()
  82. {
  83. static const octet pubkey[64] = {
  84. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  85. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  86. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  87. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  88. 0x93, 0x6A, 0x51, 0x04, 0x18, 0xCF, 0x29, 0x1E,
  89. 0x52, 0xF6, 0x08, 0xC4, 0x66, 0x39, 0x91, 0x78,
  90. 0x5D, 0x83, 0xD6, 0x51, 0xA3, 0xC9, 0xE4, 0x5C,
  91. 0x9F, 0xD6, 0x16, 0xFB, 0x3C, 0xFC, 0xF7, 0x6B,
  92. };
  93. return cmdSigSelfVerify(pubkey, sizeof(pubkey));
  94. }
  95. /*
  96. *******************************************************************************
  97. Инициализация
  98. *******************************************************************************
  99. */
  100. extern err_t verInit();
  101. extern err_t bsumInit();
  102. extern err_t pwdInit();
  103. extern err_t kgInit();
  104. extern err_t cvcInit();
  105. extern err_t sigInit();
  106. extern err_t esInit();
  107. extern err_t baccInit();
  108. #ifdef OS_WIN
  109. extern err_t stampInit();
  110. #endif
  111. err_t cmdInit()
  112. {
  113. err_t code;
  114. code = verInit();
  115. ERR_CALL_CHECK(code);
  116. code = bsumInit();
  117. ERR_CALL_CHECK(code);
  118. code = pwdInit();
  119. ERR_CALL_CHECK(code);
  120. code = kgInit();
  121. ERR_CALL_CHECK(code);
  122. code = cvcInit();
  123. ERR_CALL_CHECK(code);
  124. code = sigInit();
  125. ERR_CALL_CHECK(code);
  126. code = esInit();
  127. ERR_CALL_CHECK(code);
  128. code = baccInit();
  129. ERR_CALL_CHECK(code);
  130. #ifdef OS_WIN
  131. code = stampInit();
  132. ERR_CALL_CHECK(code);
  133. #endif
  134. return code;
  135. }
  136. /*
  137. *******************************************************************************
  138. Главная функция
  139. *******************************************************************************
  140. */
  141. int main(int argc, char* argv[])
  142. {
  143. err_t code;
  144. size_t pos;
  145. // старт
  146. code = cmdInit();
  147. if (code != ERR_OK)
  148. {
  149. printf("bee2cmd: %s\n", errMsg(code));
  150. return -1;
  151. }
  152. // справка
  153. if (argc < 2)
  154. return cmdUsage();
  155. // демонстрационный контроль целостности (результат игнорируется!)
  156. cmdSelfCheck();
  157. // обработка команды
  158. for (pos = 0; pos < _count; ++pos)
  159. if (strEq(argv[1], _cmds[pos].name))
  160. return _cmds[pos].fn(argc - 1, argv + 1);
  161. printf("bee2cmd: %s\n", errMsg(ERR_CMD_NOT_FOUND));
  162. return -1;
  163. }