diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 3bccd1baa2a9d2d13c841a15264c6f804723048b..db87a2300c608958b64be712780de3744020d85b 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -4534,7 +4534,8 @@ typedef enum { SIGNER_COUNT = 5 // count flags } dap_sign_signer_file_t; -static int s_sign_file(const char *a_filename, dap_sign_signer_file_t a_flags, dap_sign_t **a_signed, dap_chain_hash_fast_t *a_hash); +static int s_sign_file(const char *a_filename, dap_sign_signer_file_t a_flags, const char *a_cert_name, + dap_sign_t **a_signed, dap_chain_hash_fast_t *a_hash); static char **s_parse_items(const char *a_str, char a_delimiter, int *a_count, const int a_only_digit); static int s_signer_cmd(int a_arg_index, int a_argc, char **a_argv, char **a_str_reply); static int s_check_cmd(int a_arg_index, int a_argc, char **a_argv, char **a_str_reply); @@ -4585,18 +4586,19 @@ int com_signer(int a_argc, char **a_argv, char **a_str_reply) return 0; } -static int s_get_key_from_file(const char *a_file, const char *a_mime, dap_sign_t **a_sign); +static int s_get_key_from_file(const char *a_file, const char *a_mime, const char *a_cert_name, dap_sign_t **a_sign); static int s_check_cmd(int a_arg_index, int a_argc, char **a_argv, char **a_str_reply) { int l_ret = 0; - enum {OPT_FILE, OPT_HASH, OPT_NET, OPT_MIME, + enum {OPT_FILE, OPT_HASH, OPT_NET, OPT_MIME, OPT_CERT, OPT_COUNT}; struct opts l_opts_check[] = { { "-file", OPT_FILE }, { "-hash", OPT_HASH }, { "-net", OPT_NET }, - { "-mime", OPT_MIME } + { "-mime", OPT_MIME }, + { "-cert", OPT_CERT } }; BUILD_BUG((sizeof(l_opts_check)/sizeof(struct opts)) != OPT_COUNT); @@ -4606,6 +4608,10 @@ static int s_check_cmd(int a_arg_index, int a_argc, char **a_argv, char **a_str_ dap_chain_node_cli_find_option_val(a_argv, a_arg_index, a_argc, l_opts_check[i].name, (const char **) &l_str_opts_check[i]); } + if (!l_str_opts_check[OPT_CERT]) { + dap_chain_node_cli_set_reply_text(a_str_reply, "%s need to be selected", l_opts_check[OPT_CERT].name); + return -1; + } dap_chain_net_t *l_network = dap_chain_net_by_name(l_str_opts_check[OPT_NET]); if (!l_network) { @@ -4643,9 +4649,9 @@ static int s_check_cmd(int a_arg_index, int a_argc, char **a_argv, char **a_str_ } if (l_str_opts_check[OPT_FILE]) { - l_ret = s_get_key_from_file(l_str_opts_check[OPT_FILE], l_str_opts_check[OPT_MIME], &l_sign); + l_ret = s_get_key_from_file(l_str_opts_check[OPT_FILE], l_str_opts_check[OPT_MIME], l_str_opts_check[OPT_CERT], &l_sign); if (!l_ret) { - return -1; + l_ret = -1; goto end; } @@ -4673,7 +4679,7 @@ end: return 0; } -static int s_get_key_from_file(const char *a_file, const char *a_mime, dap_sign_t **a_sign) +static int s_get_key_from_file(const char *a_file, const char *a_mime, const char *a_cert_name, dap_sign_t **a_sign) { char **l_items_mime = NULL; int l_items_mime_count = 0; @@ -4716,7 +4722,7 @@ static int s_get_key_from_file(const char *a_file, const char *a_mime, dap_sign_ dap_chain_hash_fast_t l_hash; - int l_ret = s_sign_file(a_file, l_flags_mime, a_sign, &l_hash); + int l_ret = s_sign_file(a_file, l_flags_mime, a_cert_name, a_sign, &l_hash); return l_ret; } @@ -4724,14 +4730,15 @@ static int s_get_key_from_file(const char *a_file, const char *a_mime, dap_sign_ static int s_signer_cmd(int a_arg_index, int a_argc, char **a_argv, char **a_str_reply) { enum { - OPT_FILE, OPT_MIME, OPT_NET, OPT_CHAIN, + OPT_FILE, OPT_MIME, OPT_NET, OPT_CHAIN, OPT_CERT, OPT_COUNT }; struct opts l_opts_signer[] = { { "-file", OPT_FILE }, { "-mime", OPT_MIME }, { "-net", OPT_NET }, - { "-chain", OPT_CHAIN } + { "-chain", OPT_CHAIN }, + { "-cert", OPT_CERT } }; BUILD_BUG((sizeof(l_opts_signer)/sizeof(struct opts)) != OPT_COUNT); @@ -4743,6 +4750,10 @@ static int s_signer_cmd(int a_arg_index, int a_argc, char **a_argv, char **a_str dap_chain_node_cli_find_option_val(a_argv, a_arg_index, a_argc, l_opts_signer[i].name, (const char **) &l_opts_sign[i]); } + if (!l_opts_sign[OPT_CERT]) { + dap_chain_node_cli_set_reply_text(a_str_reply, "%s need to be selected", l_opts_signer[OPT_CERT].name); + return -1; + } dap_chain_net_t *l_network = dap_chain_net_by_name(l_opts_sign[OPT_NET]); @@ -4763,9 +4774,9 @@ static int s_signer_cmd(int a_arg_index, int a_argc, char **a_argv, char **a_str dap_global_db_obj_t *l_objs = NULL; - l_ret = s_get_key_from_file(l_opts_sign[OPT_FILE], l_opts_sign[OPT_MIME], &l_sign); + l_ret = s_get_key_from_file(l_opts_sign[OPT_FILE], l_opts_sign[OPT_MIME], l_opts_sign[OPT_CERT], &l_sign); if (!l_ret) { - return -1; + l_ret = -1; goto end; } @@ -4898,7 +4909,8 @@ static uint8_t *s_concat_hash_and_mimetypes (dap_chain_hash_fast_t *a_chain, cha * @param a_flags * @return */ -static int s_sign_file(const char *a_filename, dap_sign_signer_file_t a_flags, dap_sign_t **a_signed, dap_chain_hash_fast_t *a_hash) +static int s_sign_file(const char *a_filename, dap_sign_signer_file_t a_flags, const char *a_cert_name, + dap_sign_t **a_signed, dap_chain_hash_fast_t *a_hash) { char **l_meta = NULL; uint32_t l_shift = 1; @@ -4941,13 +4953,12 @@ static int s_sign_file(const char *a_filename, dap_sign_signer_file_t a_flags, d int l_ret = 0; - dap_enc_key_t *l_key = dap_enc_key_new_generate(DAP_ENC_KEY_TYPE_SIG_DILITHIUM, NULL, 0, "file", 4, 0); - if (!l_key) { + dap_cert_t *l_cert = dap_cert_find_by_name(a_cert_name); + if (!l_cert) { DAP_FREE(l_buffer); return 0; } - if (!dap_hash_fast(l_buffer, l_file_content_size, a_hash)) { DAP_FREE(l_buffer); return 0; @@ -4960,7 +4971,7 @@ static int s_sign_file(const char *a_filename, dap_sign_signer_file_t a_flags, d return 0; } - *a_signed = dap_sign_create(l_key, l_data, l_full_size_for_sign, 0); + *a_signed = dap_sign_create(l_cert->enc_key, l_data, l_full_size_for_sign, 0); if (*a_signed == NULL) { DAP_FREE(l_buffer); return 0;