goid-tool: differ PAccess and SoCManager usage

This commit is contained in:
Frank Morgner 2019-01-30 09:27:19 +01:00
parent a8c84d490a
commit fc08d89247
4 changed files with 145 additions and 85 deletions

View File

@ -37,14 +37,15 @@ const char *gengetopt_args_info_help[] = {
" -V, --version Print version and exit",
" -r, --reader=STRING Number of the reader to use. By default, the\n first reader with a present card is used. If\n the arguement is an ATR, the reader with a\n matching card will be chosen.",
" -v, --verbose Use (several times) to be more verbose",
"\nSoCManager Applet:",
"\nReport bugs to https://github.com/OpenSC/OpenSC/issues\n\nWritten by Frank Morgner <frankmorgner@gmail.com>",
"\n Mode: soc\n Options for SoCManager Applet",
" -p, --verify-pin Verify PIN",
" -b, --verify-bio Verify finger print",
" --verify-pin-or-bio Verify PIN or finger print (user's choice)",
" --new-pin Change PIN",
" --new-bio Use (several times) to change one or more\n biometric templates",
" --info Dump Information about the SoCManager's\n configuration",
"\nPAccess Applet:",
"\n Mode: pxs\n Options for PAccess Applet",
" -c, --certificate=FILENAME Use (several times) to pass CV certificates",
" -k, --key=FILENAME Private key for the CV certificate",
" --print-cardid Print the card ID",
@ -62,7 +63,6 @@ const char *gengetopt_args_info_help[] = {
" --new-read-ac-chatbit=INDEX\n Required access bits in certificate's CHAT for\n reading newly created DGs",
" --new-write-ac=STRING Access condition for writing newly created DGs\n (possible values=\"always\", \"never\",\n \"ta\", \"sm\" default=`sm')",
" --new-write-ac-chatbit=INDEX\n Required access bits in certificate's CHAT for\n reading newly created DGs",
"\nReport bugs to https://github.com/OpenSC/OpenSC/issues\n\nWritten by Frank Morgner <frankmorgner@gmail.com>",
0
};
@ -119,6 +119,8 @@ void clear_given (struct gengetopt_args_info *args_info)
args_info->new_read_ac_chatbit_given = 0 ;
args_info->new_write_ac_given = 0 ;
args_info->new_write_ac_chatbit_given = 0 ;
args_info->pxs_mode_counter = 0 ;
args_info->soc_mode_counter = 0 ;
}
static
@ -171,47 +173,47 @@ void init_args_info(struct gengetopt_args_info *args_info)
args_info->verbose_help = gengetopt_args_info_help[3] ;
args_info->verbose_min = 0;
args_info->verbose_max = 0;
args_info->verify_pin_help = gengetopt_args_info_help[5] ;
args_info->verify_bio_help = gengetopt_args_info_help[6] ;
args_info->verify_pin_or_bio_help = gengetopt_args_info_help[7] ;
args_info->new_pin_help = gengetopt_args_info_help[8] ;
args_info->new_bio_help = gengetopt_args_info_help[9] ;
args_info->verify_pin_help = gengetopt_args_info_help[6] ;
args_info->verify_bio_help = gengetopt_args_info_help[7] ;
args_info->verify_pin_or_bio_help = gengetopt_args_info_help[8] ;
args_info->new_pin_help = gengetopt_args_info_help[9] ;
args_info->new_bio_help = gengetopt_args_info_help[10] ;
args_info->new_bio_min = 0;
args_info->new_bio_max = 0;
args_info->info_help = gengetopt_args_info_help[10] ;
args_info->certificate_help = gengetopt_args_info_help[12] ;
args_info->info_help = gengetopt_args_info_help[11] ;
args_info->certificate_help = gengetopt_args_info_help[13] ;
args_info->certificate_min = 0;
args_info->certificate_max = 0;
args_info->key_help = gengetopt_args_info_help[13] ;
args_info->print_cardid_help = gengetopt_args_info_help[14] ;
args_info->write_cardid_help = gengetopt_args_info_help[15] ;
args_info->print_paccessid_help = gengetopt_args_info_help[16] ;
args_info->write_paccessid_help = gengetopt_args_info_help[17] ;
args_info->read_dg_help = gengetopt_args_info_help[18] ;
args_info->key_help = gengetopt_args_info_help[14] ;
args_info->print_cardid_help = gengetopt_args_info_help[15] ;
args_info->write_cardid_help = gengetopt_args_info_help[16] ;
args_info->print_paccessid_help = gengetopt_args_info_help[17] ;
args_info->write_paccessid_help = gengetopt_args_info_help[18] ;
args_info->read_dg_help = gengetopt_args_info_help[19] ;
args_info->read_dg_min = 0;
args_info->read_dg_max = 0;
args_info->out_file_help = gengetopt_args_info_help[19] ;
args_info->out_file_help = gengetopt_args_info_help[20] ;
args_info->out_file_min = 0;
args_info->out_file_max = 0;
args_info->write_dg_help = gengetopt_args_info_help[20] ;
args_info->write_dg_help = gengetopt_args_info_help[21] ;
args_info->write_dg_min = 0;
args_info->write_dg_max = 0;
args_info->in_file_help = gengetopt_args_info_help[21] ;
args_info->in_file_help = gengetopt_args_info_help[22] ;
args_info->in_file_min = 0;
args_info->in_file_max = 0;
args_info->delete_dg_help = gengetopt_args_info_help[22] ;
args_info->delete_dg_help = gengetopt_args_info_help[23] ;
args_info->delete_dg_min = 0;
args_info->delete_dg_max = 0;
args_info->create_dg_help = gengetopt_args_info_help[23] ;
args_info->create_dg_help = gengetopt_args_info_help[24] ;
args_info->create_dg_min = 0;
args_info->create_dg_max = 0;
args_info->new_size_help = gengetopt_args_info_help[24] ;
args_info->new_read_ac_help = gengetopt_args_info_help[25] ;
args_info->new_read_ac_chatbit_help = gengetopt_args_info_help[26] ;
args_info->new_size_help = gengetopt_args_info_help[25] ;
args_info->new_read_ac_help = gengetopt_args_info_help[26] ;
args_info->new_read_ac_chatbit_help = gengetopt_args_info_help[27] ;
args_info->new_read_ac_chatbit_min = 0;
args_info->new_read_ac_chatbit_max = 0;
args_info->new_write_ac_help = gengetopt_args_info_help[27] ;
args_info->new_write_ac_chatbit_help = gengetopt_args_info_help[28] ;
args_info->new_write_ac_help = gengetopt_args_info_help[28] ;
args_info->new_write_ac_chatbit_help = gengetopt_args_info_help[29] ;
args_info->new_write_ac_chatbit_min = 0;
args_info->new_write_ac_chatbit_max = 0;
@ -764,34 +766,34 @@ cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *pro
if (check_multiple_option_occurrences(prog_name, args_info->verbose_given, args_info->verbose_min, args_info->verbose_max, "'--verbose' ('-v')"))
error_occurred = 1;
if (check_multiple_option_occurrences(prog_name, args_info->new_bio_given, args_info->new_bio_min, args_info->new_bio_max, "'--new-bio'"))
if (args_info->soc_mode_counter && check_multiple_option_occurrences(prog_name, args_info->new_bio_given, args_info->new_bio_min, args_info->new_bio_max, "'--new-bio'"))
error_occurred = 1;
if (check_multiple_option_occurrences(prog_name, args_info->certificate_given, args_info->certificate_min, args_info->certificate_max, "'--certificate' ('-c')"))
if (args_info->pxs_mode_counter && check_multiple_option_occurrences(prog_name, args_info->certificate_given, args_info->certificate_min, args_info->certificate_max, "'--certificate' ('-c')"))
error_occurred = 1;
if (check_multiple_option_occurrences(prog_name, args_info->read_dg_given, args_info->read_dg_min, args_info->read_dg_max, "'--read-dg'"))
if (args_info->pxs_mode_counter && check_multiple_option_occurrences(prog_name, args_info->read_dg_given, args_info->read_dg_min, args_info->read_dg_max, "'--read-dg'"))
error_occurred = 1;
if (check_multiple_option_occurrences(prog_name, args_info->out_file_given, args_info->out_file_min, args_info->out_file_max, "'--out-file'"))
if (args_info->pxs_mode_counter && check_multiple_option_occurrences(prog_name, args_info->out_file_given, args_info->out_file_min, args_info->out_file_max, "'--out-file'"))
error_occurred = 1;
if (check_multiple_option_occurrences(prog_name, args_info->write_dg_given, args_info->write_dg_min, args_info->write_dg_max, "'--write-dg'"))
if (args_info->pxs_mode_counter && check_multiple_option_occurrences(prog_name, args_info->write_dg_given, args_info->write_dg_min, args_info->write_dg_max, "'--write-dg'"))
error_occurred = 1;
if (check_multiple_option_occurrences(prog_name, args_info->in_file_given, args_info->in_file_min, args_info->in_file_max, "'--in-file'"))
if (args_info->pxs_mode_counter && check_multiple_option_occurrences(prog_name, args_info->in_file_given, args_info->in_file_min, args_info->in_file_max, "'--in-file'"))
error_occurred = 1;
if (check_multiple_option_occurrences(prog_name, args_info->delete_dg_given, args_info->delete_dg_min, args_info->delete_dg_max, "'--delete-dg'"))
if (args_info->pxs_mode_counter && check_multiple_option_occurrences(prog_name, args_info->delete_dg_given, args_info->delete_dg_min, args_info->delete_dg_max, "'--delete-dg'"))
error_occurred = 1;
if (check_multiple_option_occurrences(prog_name, args_info->create_dg_given, args_info->create_dg_min, args_info->create_dg_max, "'--create-dg'"))
if (args_info->pxs_mode_counter && check_multiple_option_occurrences(prog_name, args_info->create_dg_given, args_info->create_dg_min, args_info->create_dg_max, "'--create-dg'"))
error_occurred = 1;
if (check_multiple_option_occurrences(prog_name, args_info->new_read_ac_chatbit_given, args_info->new_read_ac_chatbit_min, args_info->new_read_ac_chatbit_max, "'--new-read-ac-chatbit'"))
if (args_info->pxs_mode_counter && check_multiple_option_occurrences(prog_name, args_info->new_read_ac_chatbit_given, args_info->new_read_ac_chatbit_min, args_info->new_read_ac_chatbit_max, "'--new-read-ac-chatbit'"))
error_occurred = 1;
if (check_multiple_option_occurrences(prog_name, args_info->new_write_ac_chatbit_given, args_info->new_write_ac_chatbit_min, args_info->new_write_ac_chatbit_max, "'--new-write-ac-chatbit'"))
if (args_info->pxs_mode_counter && check_multiple_option_occurrences(prog_name, args_info->new_write_ac_chatbit_given, args_info->new_write_ac_chatbit_min, args_info->new_write_ac_chatbit_max, "'--new-write-ac-chatbit'"))
error_occurred = 1;
@ -1682,6 +1684,29 @@ void update_multiple_arg(void *field, char ***orig_field,
}
}
static int check_modes(
int given1[], const char *options1[],
int given2[], const char *options2[])
{
int i = 0, j = 0, errors = 0;
while (given1[i] >= 0) {
if (given1[i]) {
while (given2[j] >= 0) {
if (given2[j]) {
++errors;
fprintf(stderr, "%s: option %s conflicts with option %s\n",
package_name, options1[i], options2[j]);
}
++j;
}
}
++i;
}
return errors;
}
int
cmdline_parser_internal (
int argc, char **argv, struct gengetopt_args_info *args_info,
@ -1807,6 +1832,7 @@ cmdline_parser_internal (
break;
case 'p': /* Verify PIN. */
args_info->soc_mode_counter += 1;
if (update_arg( 0 ,
@ -1819,6 +1845,7 @@ cmdline_parser_internal (
break;
case 'b': /* Verify finger print. */
args_info->soc_mode_counter += 1;
if (update_arg( 0 ,
@ -1831,6 +1858,7 @@ cmdline_parser_internal (
break;
case 'c': /* Use (several times) to pass CV certificates. */
args_info->pxs_mode_counter += 1;
if (update_multiple_arg_temp(&certificate_list,
&(local_args_info.certificate_given), optarg, 0, 0, ARG_STRING,
@ -1840,6 +1868,7 @@ cmdline_parser_internal (
break;
case 'k': /* Private key for the CV certificate. */
args_info->pxs_mode_counter += 1;
if (update_arg( (void *)&(args_info->key_arg),
@ -1856,6 +1885,7 @@ cmdline_parser_internal (
/* Verify PIN or finger print (user's choice). */
if (strcmp (long_options[option_index].name, "verify-pin-or-bio") == 0)
{
args_info->soc_mode_counter += 1;
if (update_arg( 0 ,
@ -1870,6 +1900,7 @@ cmdline_parser_internal (
/* Change PIN. */
else if (strcmp (long_options[option_index].name, "new-pin") == 0)
{
args_info->soc_mode_counter += 1;
if (update_arg( 0 ,
@ -1884,6 +1915,7 @@ cmdline_parser_internal (
/* Use (several times) to change one or more biometric templates. */
else if (strcmp (long_options[option_index].name, "new-bio") == 0)
{
args_info->soc_mode_counter += 1;
local_args_info.new_bio_given++;
@ -1891,6 +1923,7 @@ cmdline_parser_internal (
/* Dump Information about the SoCManager's configuration. */
else if (strcmp (long_options[option_index].name, "info") == 0)
{
args_info->soc_mode_counter += 1;
if (update_arg( 0 ,
@ -1905,6 +1938,7 @@ cmdline_parser_internal (
/* Print the card ID. */
else if (strcmp (long_options[option_index].name, "print-cardid") == 0)
{
args_info->pxs_mode_counter += 1;
if (update_arg( 0 ,
@ -1919,6 +1953,7 @@ cmdline_parser_internal (
/* Write the specified card ID. */
else if (strcmp (long_options[option_index].name, "write-cardid") == 0)
{
args_info->pxs_mode_counter += 1;
if (update_arg( (void *)&(args_info->write_cardid_arg),
@ -1933,6 +1968,7 @@ cmdline_parser_internal (
/* Print the PAccess ID. */
else if (strcmp (long_options[option_index].name, "print-paccessid") == 0)
{
args_info->pxs_mode_counter += 1;
if (update_arg( 0 ,
@ -1947,6 +1983,7 @@ cmdline_parser_internal (
/* Write the specified PAccess ID. */
else if (strcmp (long_options[option_index].name, "write-paccessid") == 0)
{
args_info->pxs_mode_counter += 1;
if (update_arg( (void *)&(args_info->write_paccessid_arg),
@ -1961,6 +1998,7 @@ cmdline_parser_internal (
/* Read the specified data group; use several times to read out multiple files. */
else if (strcmp (long_options[option_index].name, "read-dg") == 0)
{
args_info->pxs_mode_counter += 1;
if (update_multiple_arg_temp(&read_dg_list,
&(local_args_info.read_dg_given), optarg, 0, 0, ARG_INT,
@ -1972,6 +2010,7 @@ cmdline_parser_internal (
/* Write output to a file instead of printing it; use once for each use of `--read-dg'. */
else if (strcmp (long_options[option_index].name, "out-file") == 0)
{
args_info->pxs_mode_counter += 1;
if (update_multiple_arg_temp(&out_file_list,
&(local_args_info.out_file_given), optarg, 0, 0, ARG_STRING,
@ -1983,6 +2022,7 @@ cmdline_parser_internal (
/* Write the specified data group; use several times to write multiple files. */
else if (strcmp (long_options[option_index].name, "write-dg") == 0)
{
args_info->pxs_mode_counter += 1;
if (update_multiple_arg_temp(&write_dg_list,
&(local_args_info.write_dg_given), optarg, 0, 0, ARG_INT,
@ -1994,6 +2034,7 @@ cmdline_parser_internal (
/* Read input from a file; use once for each use of `--write-dg'. */
else if (strcmp (long_options[option_index].name, "in-file") == 0)
{
args_info->pxs_mode_counter += 1;
if (update_multiple_arg_temp(&in_file_list,
&(local_args_info.in_file_given), optarg, 0, 0, ARG_STRING,
@ -2005,6 +2046,7 @@ cmdline_parser_internal (
/* Delete the specified data group; use several times to delete multiple files. */
else if (strcmp (long_options[option_index].name, "delete-dg") == 0)
{
args_info->pxs_mode_counter += 1;
if (update_multiple_arg_temp(&delete_dg_list,
&(local_args_info.delete_dg_given), optarg, 0, 0, ARG_INT,
@ -2016,6 +2058,7 @@ cmdline_parser_internal (
/* Create the specified data group; use several times to create multiple files. */
else if (strcmp (long_options[option_index].name, "create-dg") == 0)
{
args_info->pxs_mode_counter += 1;
if (update_multiple_arg_temp(&create_dg_list,
&(local_args_info.create_dg_given), optarg, 0, 0, ARG_INT,
@ -2027,6 +2070,7 @@ cmdline_parser_internal (
/* File size of newly created DGs. */
else if (strcmp (long_options[option_index].name, "new-size") == 0)
{
args_info->pxs_mode_counter += 1;
if (update_arg( (void *)&(args_info->new_size_arg),
@ -2041,6 +2085,7 @@ cmdline_parser_internal (
/* Access condition for reading newly created DGs. */
else if (strcmp (long_options[option_index].name, "new-read-ac") == 0)
{
args_info->pxs_mode_counter += 1;
if (update_arg( (void *)&(args_info->new_read_ac_arg),
@ -2055,6 +2100,7 @@ cmdline_parser_internal (
/* Required access bits in certificate's CHAT for reading newly created DGs. */
else if (strcmp (long_options[option_index].name, "new-read-ac-chatbit") == 0)
{
args_info->pxs_mode_counter += 1;
if (update_multiple_arg_temp(&new_read_ac_chatbit_list,
&(local_args_info.new_read_ac_chatbit_given), optarg, 0, 0, ARG_INT,
@ -2066,6 +2112,7 @@ cmdline_parser_internal (
/* Access condition for writing newly created DGs. */
else if (strcmp (long_options[option_index].name, "new-write-ac") == 0)
{
args_info->pxs_mode_counter += 1;
if (update_arg( (void *)&(args_info->new_write_ac_arg),
@ -2080,6 +2127,7 @@ cmdline_parser_internal (
/* Required access bits in certificate's CHAT for reading newly created DGs. */
else if (strcmp (long_options[option_index].name, "new-write-ac-chatbit") == 0)
{
args_info->pxs_mode_counter += 1;
if (update_multiple_arg_temp(&new_write_ac_chatbit_list,
&(local_args_info.new_write_ac_chatbit_given), optarg, 0, 0, ARG_INT,
@ -2161,6 +2209,14 @@ cmdline_parser_internal (
args_info->new_write_ac_chatbit_given += local_args_info.new_write_ac_chatbit_given;
local_args_info.new_write_ac_chatbit_given = 0;
if (args_info->pxs_mode_counter && args_info->soc_mode_counter) {
int pxs_given[] = {args_info->certificate_given, args_info->key_given, args_info->print_cardid_given, args_info->write_cardid_given, args_info->print_paccessid_given, args_info->write_paccessid_given, args_info->read_dg_given, args_info->out_file_given, args_info->write_dg_given, args_info->in_file_given, args_info->delete_dg_given, args_info->create_dg_given, args_info->new_size_given, args_info->new_read_ac_given, args_info->new_read_ac_chatbit_given, args_info->new_write_ac_given, args_info->new_write_ac_chatbit_given, -1};
const char *pxs_desc[] = {"--certificate", "--key", "--print-cardid", "--write-cardid", "--print-paccessid", "--write-paccessid", "--read-dg", "--out-file", "--write-dg", "--in-file", "--delete-dg", "--create-dg", "--new-size", "--new-read-ac", "--new-read-ac-chatbit", "--new-write-ac", "--new-write-ac-chatbit", 0};
int soc_given[] = {args_info->verify_pin_given, args_info->verify_bio_given, args_info->verify_pin_or_bio_given, args_info->new_pin_given, args_info->new_bio_given, args_info->info_given, -1};
const char *soc_desc[] = {"--verify-pin", "--verify-bio", "--verify-pin-or-bio", "--new-pin", "--new-bio", "--info", 0};
error_occurred += check_modes(pxs_given, pxs_desc, soc_given, soc_desc);
}
if (check_required)
{
error_occurred += cmdline_parser_required2 (args_info, argv[0], additional_error);

View File

@ -147,6 +147,8 @@ struct gengetopt_args_info
unsigned int new_write_ac_given ; /**< @brief Whether new-write-ac was given. */
unsigned int new_write_ac_chatbit_given ; /**< @brief Whether new-write-ac-chatbit was given. */
int pxs_mode_counter; /**< @brief Counter for mode pxs */
int soc_mode_counter; /**< @brief Counter for mode soc */
} ;
/** @brief The additional parameters to pass to parser functions */

View File

@ -810,7 +810,9 @@ main(int argc, char **argv)
SC_TEST_GOTO_ERR(ctx, SC_LOG_DEBUG_VERBOSE_TOOL, r,
"Error connecting to card.");
if (!soc_main(ctx, card, &cmdline) || !paccess_main(ctx, card, &cmdline))
if (cmdline.soc_mode_counter && !soc_main(ctx, card, &cmdline))
goto err;
if (cmdline.pxs_mode_counter && !paccess_main(ctx, card, &cmdline))
goto err;
fail = 0;

View File

@ -8,78 +8,78 @@ option "verbose" v
"Use (several times) to be more verbose"
multiple optional
section "SoCManager Applet"
option "verify-pin" p
defmode "soc" modedesc="Options for SoCManager Applet"
modeoption "verify-pin" p
"Verify PIN"
optional
option "verify-bio" b
mode="soc" optional
modeoption "verify-bio" b
"Verify finger print"
optional
option "verify-pin-or-bio" -
mode="soc" optional
modeoption "verify-pin-or-bio" -
"Verify PIN or finger print (user's choice)"
optional
option "new-pin" -
mode="soc" optional
modeoption "new-pin" -
"Change PIN"
optional
option "new-bio" -
mode="soc" optional
modeoption "new-bio" -
"Use (several times) to change one or more biometric templates"
multiple optional
option "info" -
mode="soc" multiple optional
modeoption "info" -
"Dump Information about the SoCManager's configuration"
optional
mode="soc" optional
section "PAccess Applet"
option "certificate" c
defmode "pxs" modedesc="Options for PAccess Applet"
modeoption "certificate" c
"Use (several times) to pass CV certificates"
string multiple optional dependon="key" typestr="FILENAME"
option "key" k
string mode="pxs" multiple optional dependon="key" typestr="FILENAME"
modeoption "key" k
"Private key for the CV certificate"
string optional dependon="certificate" typestr="FILENAME"
option "print-cardid" -
string mode="pxs" optional dependon="certificate" typestr="FILENAME"
modeoption "print-cardid" -
"Print the card ID"
optional
option "write-cardid" -
mode="pxs" optional
modeoption "write-cardid" -
"Write the specified card ID"
string optional typestr="CARDID"
option "print-paccessid" -
string mode="pxs" optional typestr="CARDID"
modeoption "print-paccessid" -
"Print the PAccess ID"
optional
option "write-paccessid" -
mode="pxs" optional
modeoption "write-paccessid" -
"Write the specified PAccess ID"
string optional typestr="PACCESSID"
option "read-dg" -
string mode="pxs" optional typestr="PACCESSID"
modeoption "read-dg" -
"Read the specified data group; use several times to read out multiple files"
int optional multiple typestr="ID"
option "out-file" -
int mode="pxs" optional multiple typestr="ID"
modeoption "out-file" -
"Write output to a file instead of printing it; use once for each use of `--read-dg'"
string optional multiple typestr="FILENAME"
option "write-dg" -
string mode="pxs" optional multiple typestr="FILENAME"
modeoption "write-dg" -
"Write the specified data group; use several times to write multiple files"
int optional multiple typestr="ID"
option "in-file" -
int mode="pxs" optional multiple typestr="ID"
modeoption "in-file" -
"Read input from a file; use once for each use of `--write-dg'"
string optional multiple typestr="FILENAME"
option "delete-dg" -
string mode="pxs" optional multiple typestr="FILENAME"
modeoption "delete-dg" -
"Delete the specified data group; use several times to delete multiple files"
int optional multiple typestr="ID"
option "create-dg" -
int mode="pxs" optional multiple typestr="ID"
modeoption "create-dg" -
"Create the specified data group; use several times to create multiple files"
int optional multiple typestr="ID"
option "new-size" -
int mode="pxs" optional multiple typestr="ID"
modeoption "new-size" -
"File size of newly created DGs"
int optional dependon="create-dg" typestr="SIZE" default="256"
option "new-read-ac" -
int mode="pxs" optional dependon="create-dg" typestr="SIZE" default="256"
modeoption "new-read-ac" -
"Access condition for reading newly created DGs"
values="always","never","ta","sm" default="sm" optional dependon="create-dg"
option "new-read-ac-chatbit" -
values="always","never","ta","sm" default="sm" mode="pxs" optional dependon="create-dg"
modeoption "new-read-ac-chatbit" -
"Required access bits in certificate's CHAT for reading newly created DGs"
int optional dependon="create-dg" multiple typestr="INDEX"
option "new-write-ac" -
int mode="pxs" optional dependon="create-dg" multiple typestr="INDEX"
modeoption "new-write-ac" -
"Access condition for writing newly created DGs"
values="always","never","ta","sm" default="sm" optional dependon="create-dg"
option "new-write-ac-chatbit" -
values="always","never","ta","sm" default="sm" mode="pxs" optional dependon="create-dg"
modeoption "new-write-ac-chatbit" -
"Required access bits in certificate's CHAT for reading newly created DGs"
int optional dependon="create-dg" multiple typestr="INDEX"
int mode="pxs" optional dependon="create-dg" multiple typestr="INDEX"
text "
Report bugs to @PACKAGE_BUGREPORT@