summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.bin/sectok/cmds.c65
-rw-r--r--usr.bin/sectok/cyberflex.c30
2 files changed, 53 insertions, 42 deletions
diff --git a/usr.bin/sectok/cmds.c b/usr.bin/sectok/cmds.c
index bf4eb04e60d..fb04bf4f27f 100644
--- a/usr.bin/sectok/cmds.c
+++ b/usr.bin/sectok/cmds.c
@@ -1,4 +1,4 @@
-/* $Id: cmds.c,v 1.10 2001/07/19 21:24:27 rees Exp $ */
+/* $Id: cmds.c,v 1.11 2001/07/20 15:52:54 rees Exp $ */
/*
* Smartcard commander.
@@ -41,7 +41,6 @@ such damages.
#include <signal.h>
#include <string.h>
#include <sectok.h>
-#include <sc7816.h>
#include "sc.h"
@@ -61,7 +60,7 @@ struct {
/* 7816-4 commands */
{ "apdu", "[ -c class ] ins p1 p2 p3 data ...", apdu },
- { "fid", "fid", selfid },
+ { "fid", "[ -v ] fid", selfid },
{ "isearch", "", isearch },
{ "class", "[ class ]", class },
{ "read", "[ -x ] filesize", dread },
@@ -166,7 +165,7 @@ int reset(int ac, char *av[])
n = sectok_reset(fd, rflags, atr, &sw);
if (vflag)
- parse_atr(fd, SCRV, atr, n, &param);
+ sectok_parse_atr(fd, STRV, atr, n, &param);
if (!sectok_swOK(sw)) {
printf("sectok_reset: %s\n", sectok_get_sw(sw));
dclose(0, NULL);
@@ -179,7 +178,7 @@ int reset(int ac, char *av[])
int dclose(int ac, char *av[])
{
if (fd >= 0) {
- scclose(fd);
+ sectok_close(fd);
fd = -1;
}
return 0;
@@ -235,39 +234,54 @@ int apdu(int ac, char *av[])
int selfid(int ac, char *av[])
{
- unsigned char fid[2];
- int sw;
+ unsigned char fid[2], obuf[256];
+ int i, n, olen = 0, sw;
- if (ac != 2) {
- printf("usage: f fid\n");
+ optind = optreset = 1;
+
+ while ((i = getopt(ac, av, "v")) != -1) {
+ switch (i) {
+ case 'v':
+ olen = sizeof obuf;
+ break;
+ }
+ }
+
+ if (ac - optind != 1) {
+ printf("usage: f [ -v ] fid\n");
return -1;
}
+ sectok_parse_fname(av[optind++], fid);
if (fd < 0 && reset(0, NULL) < 0)
return -1;
- sectok_parse_fname(av[1], fid);
- if (sectok_selectfile(fd, cla, fid, &sw) < 0) {
- printf("selectfile: %s\n", sectok_get_sw(sw));
+ n = sectok_apdu(fd, cla, 0xa4, 0, 0, 2, fid, olen, obuf, &sw);
+ if (!sectok_swOK(sw)) {
+ printf("Select %02x%02x: %s\n", fid[0], fid[1], sectok_get_sw(sw));
return -1;
}
+ if (olen)
+ sectok_dump_reply(obuf, n, sw);
+
return 0;
}
int isearch(int ac, char *av[])
{
- int i, r1, r2;
- unsigned char buf[256];
+ int i, r1, sw;
if (fd < 0 && reset(0, NULL) < 0)
return -1;
/* find instructions */
- for (i = 0; i < 0xff; i += 2)
- if (scread(fd, cla, i, 0, 0, 0, buf, &r1, &r2) == 0
- && r1 != 0x6d && r1 != 0x6e)
- printf("%02x %s %s\n", i, lookup_cmdname(i), get_r1r2s(r1, r2));
+ for (i = 0; i < 0xff; i += 2) {
+ sectok_apdu(fd, cla, i, 0, 0, 0, NULL, 0, NULL, &sw);
+ r1 = sectok_r1(sw);
+ if (r1 != 0x06 && r1 != 0x6d && r1 != 0x6e)
+ printf("%02x %s %s\n", i, sectok_get_ins(i), sectok_get_sw(sw));
+ }
return 0;
}
@@ -295,7 +309,7 @@ int dread(int ac, char *av[])
}
}
- if (ac - optind < 1) {
+ if (ac - optind != 1) {
printf("usage: read [ -x ] filesize\n");
return -1;
}
@@ -309,7 +323,7 @@ int dread(int ac, char *av[])
n = (fsize < CARDIOSIZE) ? fsize : CARDIOSIZE;
n = sectok_apdu(fd, cla, 0xb0, p3 >> 8, p3 & 0xff, 0, NULL, n, buf, &sw);
if (!sectok_swOK(sw)) {
- printf("read binary: %s\n", sectok_get_sw(sw));
+ printf("ReadBinary: %s\n", sectok_get_sw(sw));
break;
}
if (xflag) {
@@ -331,7 +345,7 @@ int dread(int ac, char *av[])
int dwrite(int ac, char *av[])
{
- int n, p3, r1, r2;
+ int n, p3, sw;
FILE *f;
unsigned char buf[CARDIOSIZE];
@@ -351,12 +365,9 @@ int dwrite(int ac, char *av[])
n = 0;
while ((p3 = fread(buf, 1, CARDIOSIZE, f)) > 0) {
- if (scwrite(fd, cla, 0xd6, n >> 8, n & 0xff, p3, buf, &r1, &r2) < 0) {
- printf("scwrite failed\n");
- break;
- }
- if (r1 != 0x90 && r1 != 0x61) {
- print_r1r2(r1, r2);
+ sectok_apdu(fd, cla, 0xd6, n >> 8, n & 0xff, p3, buf, 0, NULL, &sw);
+ if (!sectok_swOK(sw)) {
+ printf("UpdateBinary: %s\n", sectok_get_sw(sw));
break;
}
n += p3;
diff --git a/usr.bin/sectok/cyberflex.c b/usr.bin/sectok/cyberflex.c
index 4483983239a..d12a25f3f49 100644
--- a/usr.bin/sectok/cyberflex.c
+++ b/usr.bin/sectok/cyberflex.c
@@ -1,4 +1,4 @@
-/* $Id: cyberflex.c,v 1.10 2001/07/19 21:24:27 rees Exp $ */
+/* $Id: cyberflex.c,v 1.11 2001/07/20 15:52:54 rees Exp $ */
/*
copyright 1999, 2000
@@ -44,7 +44,6 @@ such damages.
#endif
#include <sha1.h>
#include <sectok.h>
-#include <sc7816.h>
#include "sc.h"
@@ -86,7 +85,7 @@ get_AUT0(int ac, char *av[], char *prompt, unsigned char *digest)
dflag = 1;
break;
case 'x':
- if (parse_input(optarg, digest, 8) != 8) {
+ if (sectok_parse_input(optarg, digest, 8) != 8) {
printf("AUT0 must be length 8\n");
return -1;
}
@@ -194,22 +193,23 @@ int jatr(int ac, char *av[])
unsigned char buf[64];
int n = 0, sw;
- if (fd < 0 && reset(0, NULL) < 0)
- return -1;
-
buf[n++] = 0x90;
buf[n++] = 0x94; /* TA1 */
buf[n++] = 0x40; /* TD1 */
buf[n++] = 0x28; /* TC2 (WWT=4sec) */
if (ac > optind) {
/* set historical bytes from command line */
- n += parse_input(av[1], &buf[n], 15);
+ n += sectok_parse_input(av[1], &buf[n], 15);
} else {
/* no historical bytes given, use default */
memmove(&buf[n], DFLTATR, sizeof DFLTATR);
n += sizeof DFLTATR;
}
buf[0] |= ((n - 2) & 0xf);
+
+ if (fd < 0 && reset(0, NULL) < 0)
+ return -1;
+
sectok_apdu(fd, cla, 0xfa, 0, 0, n, buf, 0, NULL, &sw);
if (!sectok_swOK(sw)) {
/* error */
@@ -531,10 +531,10 @@ int jload(int ac, char *av[])
while ((i = getopt(ac, av, "p:c:s:i:a:v")) != -1) {
switch (i) {
case 'p':
- parse_input(optarg, progID, 2);
+ sectok_parse_input(optarg, progID, 2);
break;
case 'c':
- parse_input(optarg, contID, 2);
+ sectok_parse_input(optarg, contID, 2);
break;
case 's':
sscanf(optarg, "%d", &cont_size);
@@ -543,7 +543,7 @@ int jload(int ac, char *av[])
sscanf(optarg, "%d", &inst_size);
break;
case 'a':
- aid_len = parse_input(optarg, aid, sizeof aid);
+ aid_len = sectok_parse_input(optarg, aid, sizeof aid);
break;
case 'v':
vflag = 1;
@@ -726,10 +726,10 @@ int junload(int ac, char *av[])
while ((i = getopt(ac, av, "p:c:v")) != -1) {
switch (i) {
case 'p':
- parse_input(optarg, progID, 2);
+ sectok_parse_input(optarg, progID, 2);
break;
case 'c':
- parse_input(optarg, contID, 2);
+ sectok_parse_input(optarg, contID, 2);
break;
case 'v':
vflag = 1;
@@ -796,10 +796,10 @@ int jselect(int ac, char *av[])
aid_len = 0;
break;
case 'p':
- parse_input(optarg, progID, 2);
+ sectok_parse_input(optarg, progID, 2);
break;
case 'c':
- parse_input(optarg, contID, 2);
+ sectok_parse_input(optarg, contID, 2);
break;
case 's':
sscanf(optarg, "%d", &cont_size);
@@ -808,7 +808,7 @@ int jselect(int ac, char *av[])
sscanf(optarg, "%d", &inst_size);
break;
case 'a':
- aid_len = parse_input(optarg, aid, sizeof aid);
+ aid_len = sectok_parse_input(optarg, aid, sizeof aid);
break;
case 'v':
vflag = 1;