Rework of the ep11 token config file parsing:
- Remove BLACKLIST parsing code (was never supported by
  ep11 library anyway)
- Improve WHITELIST parsing of the adapter/domain pair.
  Now the numbers can be given in decimal, octal or hex.

Signed-off-by: Harald Freudenberger <fre...@linux.vnet.ibm.com>
---
 usr/lib/pkcs11/ep11_stdll/ep11_specific.c | 60 ++++++++++++-------------------
 usr/lib/pkcs11/ep11_stdll/ep11tok.conf    | 14 ++++++--
 2 files changed, 34 insertions(+), 40 deletions(-)

diff --git a/usr/lib/pkcs11/ep11_stdll/ep11_specific.c 
b/usr/lib/pkcs11/ep11_stdll/ep11_specific.c
index 7e484b0..b264b8c 100644
--- a/usr/lib/pkcs11/ep11_stdll/ep11_specific.c
+++ b/usr/lib/pkcs11/ep11_stdll/ep11_specific.c
@@ -3864,23 +3864,20 @@ CK_RV ep11tok_get_mechanism_info(CK_MECHANISM_TYPE type,
 /* used for reading in the adapter config file,
  * converts a 'token' to a number, returns 0 with success
  */
-static inline short check_n(char *nptr, int j, int *apqn_i)
+static inline short check_n(char *nptr, int *apqn_i)
 {
-       char *endptr;
-       long int num = strtol(nptr, &endptr, 10);
+       int num;
 
-       if (*endptr != '\0') {
-               TRACE_ERROR("%s invalid number '%s' (%d)\n", __func__, nptr, j);
+       if (sscanf(nptr, "%i", &num) != 1) {
+               TRACE_ERROR("%s invalid number '%s'\n", __func__, nptr);
                return -1;
        }
 
        if (num < 0 || num > 255) {
-               TRACE_ERROR("%s invalid number '%s' %d(%d)\n",
-                           __func__, nptr, (int)num, j);
+               TRACE_ERROR("%s invalid number '%s' %d\n", __func__, nptr, num);
                return -1;
        } else if (*apqn_i < 0 || *apqn_i >= MAX_APQN*2) {
-               TRACE_ERROR("%s invalid amount of numbers %d(%d)\n",
-                           __func__, (int)num, j);
+               TRACE_ERROR("%s invalid amount of numbers %d\n", __func__, num);
                return -1;
        } else {
                /* insert number into target variable */
@@ -3895,12 +3892,10 @@ static inline short check_n(char *nptr, int j, int 
*apqn_i)
 static int read_adapter_config_file(const char* conf_name)
 {
        FILE *ap_fp = NULL;       /* file pointer adapter config file */
-       int ap_file_size = 0;     /* size adapter config file */
+       int i, ap_file_size = 0;     /* size adapter config file */
        char *token, *str;
        char filebuf[EP11_CFG_FILE_SIZE];
        char line[1024];
-       int i, j;
-       int blackmode = 0;
        int whitemode = 0;
        int anymode   = 0;
        int apqn_i = 0;     /* how many APQN numbers */
@@ -3908,9 +3903,8 @@ static int read_adapter_config_file(const char* conf_name)
        char fname[PATH_MAX];
        int rc = 0;
 
-       if (ep11_initialized) {
+       if (ep11_initialized)
                return 0;
-       }
 
        memset(fname, 0, PATH_MAX);
 
@@ -4001,24 +3995,19 @@ static int read_adapter_config_file(const char* 
conf_name)
         * please note, we still accept the LOGLEVEL entry
         * for compatibility reasons but just ignore it.
         */
-       for (i=0, j=0, str=filebuf; rc == 0; str=NULL) {
+       for (i=0, str=filebuf; rc == 0; str=NULL) {
                /* strtok tokenizes the string,
                 * delimiters are newline and whitespace.
                 */
                token = strtok(str, "\n\t ");
 
                if (i == 0) {
-                       /* expecting APQN_WHITELIST or APQN_BLACKLIST
-                        * or APQN_ANY or LOGLEVEL or eof.
-                        */
+                       /* expecting APQN_WHITELIST or APQN_ANY or LOGLEVEL or 
eof */
                        if (token == NULL)
                                break;
                        if (strncmp(token, "APQN_WHITELIST", 14) == 0) {
                                whitemode = 1;
                                i = 1;
-                       } else if (strncmp(token, "APQN_BLACKLIST", 14) == 0) {
-                               blackmode = 1;
-                               i = 1;
                        } else if (strncmp(token, "APQN_ANY", 8) == 0) {
                                anymode = 1;
                                i = 0;
@@ -4027,8 +4016,8 @@ static int read_adapter_config_file(const char* conf_name)
                        else {
                                /* syntax error */
                                TRACE_ERROR("%s Expected APQN_WHITELIST or"
-                                           " APQN_BLACKLIST or APQN_ANY or 
LOGLEVEL"
-                                           " keyword, found '%s' in 
configfile\n",
+                                           " APQN_ANY or LOGLEVEL keyword,"
+                                           " found '%s' in configfile\n",
                                            __func__, token);
                                rc = APQN_FILE_SYNTAX_ERROR_0;
                                break;
@@ -4040,7 +4029,7 @@ static int read_adapter_config_file(const char* conf_name)
                        if (strncmp(token, "END", 3) == 0)
                                i = 0;
                        else {
-                               if (check_n(token, j, &apqn_i) < 0) {
+                               if (check_n(token, &apqn_i) < 0) {
                                        rc = APQN_FILE_SYNTAX_ERROR_1;
                                        break;
                                }
@@ -4056,7 +4045,7 @@ static int read_adapter_config_file(const char* conf_name)
                                rc = APQN_FILE_SYNTAX_ERROR_2;
                                break;
                        }
-                       if (check_n(token, j, &apqn_i) < 0) {
+                       if (check_n(token, &apqn_i) < 0) {
                                rc = APQN_FILE_SYNTAX_ERROR_3;
                                break;
                        }
@@ -4068,7 +4057,6 @@ static int read_adapter_config_file(const char* conf_name)
                                break;
                        }
                        i = 1;
-                       j++;
                } else if (i == 3) {
                        /* expecting log level value
                         * (a number in the range 0...9)
@@ -4089,11 +4077,11 @@ static int read_adapter_config_file(const char* 
conf_name)
 
        /* do some checks: */
        if (rc == 0) {
-               if ( !(whitemode || blackmode || anymode)) {
+               if ( !(whitemode || anymode)) {
                        TRACE_ERROR("%s At least one APQN mode needs to be 
present in configfile:"
-                                   " APQN_WHITEMODE or APQN_BLACKMODE or 
APQN_ANY\n", __func__);
+                                   " APQN_WHITEMODE or APQN_ANY\n", __func__);
                        rc = APQN_FILE_NO_APQN_MODE;
-               } else if (whitemode || blackmode) {
+               } else if (whitemode) {
                        /* at least one APQN needs to be defined */
                        if (ep11_targets.length < 1) {
                                TRACE_ERROR("%s At least one APQN needs to be 
defined in the configfile\n",
@@ -4103,21 +4091,17 @@ static int read_adapter_config_file(const char* 
conf_name)
                }
        }
 
-       /* log the white- or blacklist of APQNs */
-       if (rc == 0 && (whitemode || blackmode)) {
-               TRACE_INFO("%s %s with %d APQNs defined:\n",
-                          __func__, blackmode ? "blacklist" : "whitelist",
-                          ep11_targets.length);
+       /* log the whitelist of APQNs */
+       if (rc == 0 && whitemode) {
+               TRACE_INFO("%s whitelist with %d APQNs defined:\n",
+                          __func__, ep11_targets.length);
                for (i=0; i < ep11_targets.length; i++) {
-                       TRACE_INFO(" APQN %d: %d %d\n", i,
+                       TRACE_INFO(" APQN entry %d: adapter=%d domain=%d\n", i,
                                   ep11_targets.apqns[2*i],
                                   ep11_targets.apqns[2*i+1]);
                }
        }
 
-       if (blackmode == 1)
-               ep11_targets.length *= -1;
-
        ep11_initialized = TRUE;
        return rc;
 }
diff --git a/usr/lib/pkcs11/ep11_stdll/ep11tok.conf 
b/usr/lib/pkcs11/ep11_stdll/ep11tok.conf
index 10b118f..5b0b7ea 100644
--- a/usr/lib/pkcs11/ep11_stdll/ep11tok.conf
+++ b/usr/lib/pkcs11/ep11_stdll/ep11tok.conf
@@ -5,13 +5,23 @@
 # adapter/domain pairs installed and configured on your system.
 #
 # There are 2 ways to specify the crypto adapters:
-#   1) explicitly list of ap-qid/domain-id pairs
+#   1) explicitly list of adapter/domain pairs
 #
 #      APQN_WHITELIST
-#      08 13
+#       8 13
 #      10 13
 #      END
 #
+#      The adapter and domain may be given in decimal,
+#      octal (with leading 0) or hexadecimal (with leading 0x):
+#
+#      APQN_WHITELIST
+#       8    0x0d
+#       0x0a 13
+#      END
+#
+#      Valid adapter and domain values are in the range 0...255
+#
 #   2) any available crypto adapters
 #
 #      APQN_ANY
-- 
2.7.4


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opencryptoki-tech mailing list
Opencryptoki-tech@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opencryptoki-tech

Reply via email to