Changeset 081bf9f in OpenSC


Ignore:
Timestamp:
06/11/11 07:33:30 (12 months ago)
Author:
Peter Marschall <peter@…>
Branches:
master, staging
Children:
aa7a5ae
Parents:
9c9317d
git-author:
Peter Marschall <peter@…> (06/02/11 13:39:12)
git-committer:
Peter Marschall <peter@…> (06/11/11 07:33:30)
Message:

opensc-explorer: consolidate string/hexdata parsing

  • add new function parse_string_or_hexdata() that parses a double-quoted string or a hex-data string (e.g: AA:BB:CC) into a buffer
  • use parse_string_or_hexdata() wherever strings or hexdata gets parsed into a buffer

Signed-off-by: Peter Marschall <peter@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/tools/opensc-explorer.c

    r9c9317d r081bf9f  
    187187 
    188188 
     189static int parse_string_or_hexdata(const char *in, u8 *out, size_t *outlen) 
     190{ 
     191        if (in == NULL) 
     192                return SC_ERROR_INVALID_ARGUMENTS; 
     193 
     194        if (*in == '"') { 
     195                u8 quote = *in++; 
     196                size_t count = 0; 
     197 
     198                while (*in != quote && *in != '\0' && count < *outlen) 
     199                        out[count++] = *in++; 
     200                if (*in == '\0') 
     201                        return SC_ERROR_INVALID_ARGUMENTS; 
     202                if (count >= *outlen) 
     203                        return SC_ERROR_BUFFER_TOO_SMALL; 
     204 
     205                *outlen = count; 
     206                return 0; 
     207        } 
     208        else 
     209                return sc_hex_to_bin(in, out, outlen); 
     210} 
     211 
    189212static int usage(int (*func)(int, char **)) 
    190213{ 
     
    774797        int r, tries_left = -1; 
    775798        u8 buf[64]; 
    776         const char *s; 
    777799        size_t buflen = sizeof(buf), i; 
    778800        struct sc_pin_cmd_data data; 
     
    808830                data.pin1.prompt = "Please enter PIN"; 
    809831                data.flags |= SC_PIN_CMD_USE_PINPAD; 
    810         } else if (argv[1][0] == '"') { 
    811                 for (s=argv[1]+1, i=0; i < sizeof(buf) && *s && *s != '"';i++)  
    812                         buf[i] = *s++; 
    813                 data.pin1.data = buf; 
    814                 data.pin1.len = i; 
    815832        } else { 
    816                 r = sc_hex_to_bin(argv[1], buf, &buflen);  
     833                r = parse_string_or_hexdata(argv[1], buf, &buflen); 
    817834                if (0 != r) { 
    818835                        printf("Invalid key value.\n"); 
     
    852869        u8 oldpin[30]; 
    853870        u8 newpin[30]; 
    854         const char *s; 
    855         size_t oldpinlen = sizeof(oldpin), i; 
     871        size_t oldpinlen = sizeof(oldpin); 
    856872        size_t newpinlen = sizeof(newpin); 
    857873 
     
    877893                oldpinlen = 0; 
    878894        } else { 
    879                 if (argv[0][0] == '"') { 
    880                         for (s = argv[0] + 1, i = 0; 
    881                              i < sizeof(oldpin) && *s && *s != '"'; i++)  
    882                                 oldpin[i] = *s++; 
    883                         oldpinlen = i; 
    884                 } else if (sc_hex_to_bin(argv[0], oldpin, &oldpinlen) != 0) { 
     895                if (parse_string_or_hexdata(argv[0], oldpin, &oldpinlen) != 0) { 
    885896                        printf("Invalid key value.\n"); 
    886897                        goto usage; 
     
    891902 
    892903        if (argc)   { 
    893                 if (argv[0][0] == '"') { 
    894                         for (s = argv[0] + 1, i = 0; 
    895                              i < sizeof(newpin) && *s && *s != '"'; i++)  
    896                                 newpin[i] = *s++; 
    897                         newpinlen = i; 
    898                 } else if (sc_hex_to_bin(argv[0], newpin, &newpinlen) != 0) { 
     904                if (parse_string_or_hexdata(argv[0], newpin, &newpinlen) != 0) { 
    899905                        printf("Invalid key value.\n"); 
    900906                        goto usage; 
     
    933939        u8 puk_buf[30], *puk = NULL; 
    934940        u8 newpin_buf[30], *newpin = NULL; 
    935         const char *s; 
    936         size_t puklen = sizeof(puk_buf), i; 
     941        size_t puklen = sizeof(puk_buf); 
    937942        size_t newpinlen = sizeof(newpin_buf); 
    938943 
     
    954959                puk = NULL; 
    955960        } else { 
    956                 if (argv[0][0] == '"') { 
    957                         for (s = argv[0] + 1, i = 0; 
    958                              i < sizeof(puk_buf) && *s && *s != '"'; i++)  
    959                                 puk_buf[i] = *s++; 
    960                         puklen = i; 
    961                 } else if (sc_hex_to_bin(argv[0], puk_buf, &puklen) != 0) { 
     961                if (parse_string_or_hexdata(argv[0], puk_buf, &puklen) != 0) { 
    962962                        printf("Invalid key value.\n"); 
    963963                        goto usage; 
     
    970970 
    971971        if (argc)   { 
    972                 if (argv[0][0] == '"') { 
    973                         for (s = argv[0] + 1, i = 0; 
    974                              i < sizeof(newpin_buf) && *s && *s != '"'; i++)  
    975                                 newpin_buf[i] = *s++; 
    976                         newpinlen = i; 
    977                 } else if (sc_hex_to_bin(argv[0], newpin_buf, &newpinlen) != 0) { 
     972                if (parse_string_or_hexdata(argv[0], newpin_buf, &newpinlen) != 0) { 
    978973                        printf("Invalid key value.\n"); 
    979974                        goto usage; 
     
    11301125{ 
    11311126        u8 buf[240]; 
    1132         int r, err = 1, in_len; 
     1127        size_t buflen = sizeof(buf); 
     1128        int r, err = 1; 
    11331129        int offs; 
    11341130        sc_path_t path; 
     
    11441140        in_str = argv[2]; 
    11451141        printf("in: %i; %s\n", offs, in_str); 
    1146         if (*in_str=='\"')   { 
    1147                 in_len = strlen(in_str)-2 >= sizeof(buf) ? sizeof(buf)-1 : strlen(in_str)-2; 
    1148                 strncpy((char *) buf, in_str+1, in_len); 
    1149         } else { 
    1150                 in_len = hex2binary(buf, sizeof(buf), in_str); 
    1151                 if (!in_len) { 
    1152                         printf("unable to parse hex value\n"); 
    1153                         return -1; 
    1154                 } 
     1142 
     1143        r = parse_string_or_hexdata(in_str, buf, &buflen); 
     1144        if (r < 0) { 
     1145                printf("unable to parse data\n"); 
     1146                return -1; 
    11551147        } 
    11561148 
     
    11661158        } 
    11671159 
    1168         r = sc_update_binary(card, offs, buf, in_len, 0); 
     1160        r = sc_update_binary(card, offs, buf, buflen, 0); 
    11691161        if (r < 0) { 
    11701162                printf("Cannot update %04X; return %i\n", file->id, r); 
Note: See TracChangeset for help on using the changeset viewer.