Changeset 081bf9f in OpenSC
- Timestamp:
- 06/11/11 07:33:30 (12 months ago)
- 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)
- File:
-
- 1 edited
-
src/tools/opensc-explorer.c (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/tools/opensc-explorer.c
r9c9317d r081bf9f 187 187 188 188 189 static 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 189 212 static int usage(int (*func)(int, char **)) 190 213 { … … 774 797 int r, tries_left = -1; 775 798 u8 buf[64]; 776 const char *s;777 799 size_t buflen = sizeof(buf), i; 778 800 struct sc_pin_cmd_data data; … … 808 830 data.pin1.prompt = "Please enter PIN"; 809 831 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;815 832 } else { 816 r = sc_hex_to_bin(argv[1], buf, &buflen);833 r = parse_string_or_hexdata(argv[1], buf, &buflen); 817 834 if (0 != r) { 818 835 printf("Invalid key value.\n"); … … 852 869 u8 oldpin[30]; 853 870 u8 newpin[30]; 854 const char *s; 855 size_t oldpinlen = sizeof(oldpin), i; 871 size_t oldpinlen = sizeof(oldpin); 856 872 size_t newpinlen = sizeof(newpin); 857 873 … … 877 893 oldpinlen = 0; 878 894 } 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) { 885 896 printf("Invalid key value.\n"); 886 897 goto usage; … … 891 902 892 903 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) { 899 905 printf("Invalid key value.\n"); 900 906 goto usage; … … 933 939 u8 puk_buf[30], *puk = NULL; 934 940 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); 937 942 size_t newpinlen = sizeof(newpin_buf); 938 943 … … 954 959 puk = NULL; 955 960 } 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) { 962 962 printf("Invalid key value.\n"); 963 963 goto usage; … … 970 970 971 971 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) { 978 973 printf("Invalid key value.\n"); 979 974 goto usage; … … 1130 1125 { 1131 1126 u8 buf[240]; 1132 int r, err = 1, in_len; 1127 size_t buflen = sizeof(buf); 1128 int r, err = 1; 1133 1129 int offs; 1134 1130 sc_path_t path; … … 1144 1140 in_str = argv[2]; 1145 1141 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; 1155 1147 } 1156 1148 … … 1166 1158 } 1167 1159 1168 r = sc_update_binary(card, offs, buf, in_len, 0);1160 r = sc_update_binary(card, offs, buf, buflen, 0); 1169 1161 if (r < 0) { 1170 1162 printf("Cannot update %04X; return %i\n", file->id, r);
Note: See TracChangeset
for help on using the changeset viewer.
