summaryrefslogtreecommitdiff
path: root/usr.bin/sectok
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/sectok')
-rw-r--r--usr.bin/sectok/cmds.c79
-rw-r--r--usr.bin/sectok/cyberflex.c168
-rw-r--r--usr.bin/sectok/sc.h4
3 files changed, 137 insertions, 114 deletions
diff --git a/usr.bin/sectok/cmds.c b/usr.bin/sectok/cmds.c
index d7a14adcea9..89d259db539 100644
--- a/usr.bin/sectok/cmds.c
+++ b/usr.bin/sectok/cmds.c
@@ -1,4 +1,4 @@
-/* $Id: cmds.c,v 1.3 2001/07/02 20:15:06 rees Exp $ */
+/* $Id: cmds.c,v 1.4 2001/07/16 21:02:21 rees Exp $ */
/*
* Smartcard commander.
@@ -48,42 +48,39 @@ such damages.
#define CARDIOSIZE 200
struct {
- char *cmd;
+ char *cmd, *help;
int (*action) (int ac, char *av[]);
} dispatch_table[] = {
/* Non-card commands */
- { "help", help },
- { "?", help },
- { "reset", reset },
- { "open", reset },
- { "close", dclose },
- { "quit", quit },
+ { "help", "[command]", help },
+ { "?", "[command]", help },
+ { "reset", "[ -1234ivf ]", reset },
+ { "open", "[ -1234ivf ]", reset },
+ { "close", "", dclose },
+ { "quit", "", quit },
/* 7816-4 commands */
- { "apdu", apdu },
- { "fid", selfid },
- { "isearch", isearch },
- { "class", class },
- { "read", dread },
- { "write", dwrite },
+ { "apdu", "[ -c class ] ins p1 p2 p3 data ...", apdu },
+ { "fid", "fid", selfid },
+ { "isearch", "", isearch },
+ { "class", "[ class ]", class },
+ { "read", "filesize", dread },
+ { "write", "input-filename", dwrite },
/* Cyberflex commands */
- { "ls", ls },
- { "create", jcreate },
- { "delete", jdelete },
- { "jdefault", jdefault },
- { "jatr", jatr },
- { "jdata", jdata },
- { "jaut", jaut },
- { "jload", jload },
- { "junload", junload },
- { "jselect", jselect },
- { "jdeselect", jdeselect },
- { NULL, NULL }
+ { "ls", "", ls },
+ { "create", "fid size", jcreate },
+ { "delete", "fid", jdelete },
+ { "jdefault", "[ -d ]", jdefault },
+ { "jatr", "", jatr },
+ { "jdata", "", jdata },
+ { "jaut", "[ -v ]", jaut },
+ { "jload", "[ -p progID ] [ -c contID ] [ -s cont_size ] [ -i inst_size ] [ -a aid ] filename", jload },
+ { "junload", "[ -p progID ] [ -c contID ]", junload },
+ { "jselect", "[ -a aid ]", jselect },
+ { "jdeselect", "", jdeselect },
+ { NULL, NULL, NULL }
};
-/*
- { "", },
-*/
int dispatch(int ac, char *av[])
{
@@ -107,11 +104,21 @@ int dispatch(int ac, char *av[])
int help(int ac, char *av[])
{
- int i;
+ int i, j;
- for (i = 0; dispatch_table[i].cmd; i++) {
- if (strlen(dispatch_table[i].cmd) > 1)
+ if (ac < 2) {
+ for (i = 0; dispatch_table[i].cmd; i++)
printf("%s\n", dispatch_table[i].cmd);
+ } else {
+ for (j = 1; j < ac; j++) {
+ for (i = 0; dispatch_table[i].cmd; i++)
+ if (!strncmp(av[j], dispatch_table[i].cmd, strlen(av[0])))
+ break;
+ if (dispatch_table[i].help)
+ printf("%s %s\n", dispatch_table[i].cmd, dispatch_table[i].help);
+ else
+ printf("no help on \"%s\"\n", av[j]);
+ }
}
return 0;
@@ -153,11 +160,9 @@ int reset(int ac, char *av[])
}
}
+ aut0_vfyd = 0;
+
n = scxreset(fd, rflags, atr, &sw);
- if (n && !vflag) {
- printf("atr ");
- dump_reply(atr, n, 0, 0);
- }
if (vflag)
parse_atr(fd, SCRV, atr, n, &param);
if (sw != SCEOK) {
@@ -198,7 +203,7 @@ int apdu(int ac, char *av[])
}
if (ac - optind < 4) {
- printf("usage: apdu [ -c cla ] ins p1 p2 p3 data ...\n");
+ printf("usage: apdu [ -c class ] ins p1 p2 p3 data ...\n");
return -1;
}
diff --git a/usr.bin/sectok/cyberflex.c b/usr.bin/sectok/cyberflex.c
index df50de5c1d4..2d62728f45e 100644
--- a/usr.bin/sectok/cyberflex.c
+++ b/usr.bin/sectok/cyberflex.c
@@ -1,4 +1,4 @@
-/* $Id: cyberflex.c,v 1.3 2001/07/02 20:15:06 rees Exp $ */
+/* $Id: cyberflex.c,v 1.4 2001/07/16 21:02:21 rees Exp $ */
/*
copyright 1999, 2000
@@ -59,6 +59,8 @@ static unsigned char key_fid[] = {0x00, 0x11};
static unsigned char DFLTATR[] = {0x81, 0x10, 0x06, 0x01};
static unsigned char AUT0[] = {0xad, 0x9f, 0x61, 0xfe, 0xfa, 0x20, 0xce, 0x63};
+int aut0_vfyd;
+
/* default signed applet key of Cyberflex Access */
static des_cblock app_key = {0x6A, 0x21, 0x36, 0xF5, 0xD8, 0x0C, 0x47, 0x83};
@@ -84,10 +86,35 @@ char *filestruct[] = {
"program",
};
+int jaut(int ac, char *av[])
+{
+ int i, r, vflag = 0;
+
+ if (fd < 0)
+ reset(ac, av);
+
+ while ((i = getopt(ac, av, "v")) != -1) {
+ switch (i) {
+ case 'v':
+ vflag = 1;
+ break;
+ }
+ }
+
+ cla = cyberflex_inq_class(fd);
+ if (vflag)
+ printf("Class %02x\n", cla);
+
+ r = cyberflex_verify_AUT0(fd, cla, AUT0, sizeof AUT0);
+ if (r >= 0)
+ aut0_vfyd = 1;
+ return r;
+}
+
int jdefault(int ac, char *av[])
{
unsigned char buf[8];
- int i, p1 = 4, r1, r2;
+ int i, p1 = 4, sw;
optind = optreset = 1;
@@ -101,11 +128,13 @@ int jdefault(int ac, char *av[])
if (fd < 0)
reset(0, NULL);
+ if (!aut0_vfyd)
+ jaut(0, NULL);
- scwrite(fd, cla, 0x08, p1, 0, 0, buf, &r1, &r2);
- if (r1 != 0x90) {
+ sectok_apdu(fd, cla, 0x08, p1, 0, 0, buf, 0, NULL, &sw);
+ if (!sectok_swOK(sw)) {
/* error */
- print_r1r2(r1, r2);
+ sectok_print_sw(sw);
return -1;
}
return 0;
@@ -114,7 +143,7 @@ int jdefault(int ac, char *av[])
int jatr(int ac, char *av[])
{
unsigned char buf[64];
- int n = 0, r1, r2;
+ int n = 0, sw;
if (fd < 0)
reset(0, NULL);
@@ -132,10 +161,10 @@ int jatr(int ac, char *av[])
n += sizeof DFLTATR;
}
buf[0] |= ((n - 2) & 0xf);
- scwrite(fd, cla, 0xfa, 0, 0, n, buf, &r1, &r2);
- if (r1 != 0x90) {
+ sectok_apdu(fd, cla, 0xfa, 0, 0, n, buf, 0, NULL, &sw);
+ if (!sectok_swOK(sw)) {
/* error */
- print_r1r2(r1, r2);
+ sectok_print_sw(sw);
return -1;
}
return 0;
@@ -144,13 +173,13 @@ int jatr(int ac, char *av[])
int jdata(int ac, char *av[])
{
unsigned char buf[32];
- int i, r1, r2;
+ int i, sw;
if (fd < 0)
reset(0, NULL);
- scread(fd, cla, 0xca, 0, 1, 0x16, buf, &r1, &r2);
- if (r1 == 0x90) {
+ sectok_apdu(fd, cla, 0xca, 0, 1, 0, NULL, 0x16, buf, &sw);
+ if (sectok_swOK(sw)) {
printf("serno ");
for (i = 0; i < 6; i++)
printf("%02x ", buf[i]);
@@ -164,7 +193,7 @@ int jdata(int ac, char *av[])
printf("crypto %9.9s class %02x\n", &buf[10], buf[19]);
} else {
/* error */
- print_r1r2(r1, r2);
+ sectok_print_sw(sw);
}
return 0;
}
@@ -173,7 +202,7 @@ int jdata(int ac, char *av[])
int ls(int ac, char *av[])
{
- int p2, f0, f1, r1, r2;
+ int p2, f0, f1, sw;
char ftype[32], fname[6];
unsigned char buf[JDIRSIZE];
@@ -181,9 +210,9 @@ int ls(int ac, char *av[])
reset(0, NULL);
for (p2 = 0; ; p2++) {
- if (scread(fd, cla, 0xa8, 0, p2, JDIRSIZE, buf, &r1, &r2) < 0)
+ if (sectok_apdu(fd, cla, 0xa8, 0, p2, 0, NULL, JDIRSIZE, buf, &sw) < 0)
break;
- if (r1 != 0x90)
+ if (!sectok_swOK(sw))
break;
f0 = buf[4];
f1 = buf[5];
@@ -222,6 +251,8 @@ int jcreate(int ac, char *av[])
if (fd < 0)
reset(0, NULL);
+ if (!aut0_vfyd)
+ jaut(0, NULL);
if (cyberflex_create_file(fd, cla, fid, fsize, 3, &sw) < 0) {
printf("create_file: %s\n", sectok_get_sw(sw));
@@ -245,6 +276,8 @@ int jdelete(int ac, char *av[])
if (fd < 0)
reset(0, NULL);
+ if (!aut0_vfyd)
+ jaut(0, NULL);
if (cyberflex_delete_file(fd, cla, fid, &sw) < 0) {
printf("delete_file: %s\n", sectok_get_sw(sw));
@@ -254,16 +287,6 @@ int jdelete(int ac, char *av[])
return 0;
}
-int jaut(int ac, char *av[])
-{
- if (fd < 0)
- reset(0, NULL);
-
- cla = cyberflex_inq_class(fd);
- printf("Class %02x\n", cla);
- return cyberflex_verify_AUT0(fd, cla, AUT0, sizeof AUT0);
-}
-
#define MAX_BUF_SIZE 256
#define MAX_APP_SIZE 4096
#define MAX_APDU_SIZE 0xfa
@@ -331,7 +354,7 @@ int jload(int ac, char *av[])
char progname[5], contname[5];
unsigned char app_data[MAX_APP_SIZE],
data[MAX_BUF_SIZE];
- int i, j, fd_app, size, rv, sw, r1, r2;
+ int i, j, fd_app, size, rv, sw;
des_cblock tmp;
des_key_schedule schedule;
@@ -340,6 +363,8 @@ int jload(int ac, char *av[])
if (fd < 0)
reset(0, NULL);
+ if (!aut0_vfyd)
+ jaut(0, NULL);
sectok_fmt_fid(progname, progID[0], progID[1]);
sectok_fmt_fid(contname, contID[0], contID[1]);
@@ -407,10 +432,10 @@ int jload(int ac, char *av[])
printf ("\n");
/* select the default loader */
- rv = scwrite(fd, cla, 0xa4, 0x04, 0, 0, NULL, &r1, &r2);
- if (r1 != 0x90 && r1 != 0x61) {
+ rv = sectok_apdu(fd, cla, 0xa4, 0x04, 0, 0, NULL, 0, NULL, &sw);
+ if (!sectok_swOK(sw)) {
/* error */
- printf("can't select default loader: %s\n", get_r1r2s(r1, r2));
+ printf("can't select default loader: %s\n", sectok_get_sw(sw));
return -1;
}
@@ -433,36 +458,29 @@ int jload(int ac, char *av[])
if (size - i > MAX_APDU_SIZE) send_size = MAX_APDU_SIZE;
else send_size = size - i;
- rv = scwrite(fd, cla, 0xd6,
- i / 256, /* offset, upper byte */
- i % 256, /* offset, lower byte */
- send_size,
- app_data + i, /* program file */
- &r1, &r2);
+ rv = sectok_apdu(fd, cla, 0xd6, i / 256, i % 256, send_size, app_data + i, 0, NULL, &sw);
- if (r1 != 0x90 && r1 != 0x61) {
+ if (!sectok_swOK(sw)) {
/* error */
- printf("updating binary %s: %s\n", progname, get_r1r2s(r1, r2));
+ printf("updating binary %s: %s\n", progname, sectok_get_sw(sw));
return -1;
}
}
/* manage program .. validate */
- rv = scwrite(fd, cla, 0x0a, 01, 0, 0x08,
- tmp, /* signature */
- &r1, &r2);
+ rv = sectok_apdu(fd, cla, 0x0a, 01, 0, 0x08, tmp, 0, NULL, &sw);
- if (r1 != 0x90 && r1 != 0x61) {
+ if (!sectok_swOK(sw)) {
/* error */
- printf("validating applet in %s: %s\n", progname, get_r1r2s(r1, r2));
+ printf("validating applet in %s: %s\n", progname, sectok_get_sw(sw));
return -1;
}
/* select the default loader */
- rv = scwrite(fd, cla, 0xa4, 0x04, 0, 0, NULL, &r1, &r2);
- if (r1 != 0x90 && r1 != 0x61) {
+ rv = sectok_apdu(fd, cla, 0xa4, 0x04, 0, 0, NULL, 0, NULL, &sw);
+ if (!sectok_swOK(sw)) {
/* error */
- printf("selecting default loader: %s\n", get_r1r2s(r1, r2));
+ printf("selecting default loader: %s\n", sectok_get_sw(sw));
return -1;
}
@@ -489,10 +507,10 @@ int jload(int ac, char *av[])
for (i = 0; i < aid_len; i++) data[i + 11] = (unsigned int)aid[i];
/* AID (7777777777) */
- rv = scwrite(fd, cla, 0x0c, 0x13, 0, 11 + aid_len, data, &r1, &r2);
- if (r1 != 0x90 && r1 != 0x61) {
+ rv = sectok_apdu(fd, cla, 0x0c, 0x13, 0, 11 + aid_len, data, 0, NULL, &sw);
+ if (!sectok_swOK(sw)) {
/* error */
- printf("executing install() method in applet %s: %s\n", progname, get_r1r2s(r1, r2));
+ printf("executing install() method in applet %s: %s\n", progname, sectok_get_sw(sw));
return -1;
}
@@ -503,26 +521,21 @@ int jload(int ac, char *av[])
int junload(int ac, char *av[])
{
char progname[5], contname[5];
- int sw, r1, r2, rv;
+ int sw, rv;
if (analyze_load_options(ac, av) < 0)
return -1;
if (fd < 0)
reset(0, NULL);
+ if (!aut0_vfyd)
+ jaut(0, NULL);
sectok_fmt_fid(progname, progID[0], progID[1]);
sectok_fmt_fid(contname, contID[0], contID[1]);
printf ("program ID %s\n", progname);
printf ("container ID %s\n", contname);
- /*printf ("AID ");
- for (i = 0 ; i < aid_len ; i ++ ) {
- printf ("%02x", (unsigned char)aid[i]);
- }
- printf ("\n");*/
-
- /*printf ("unload applet\n");*/
/* select 3f.00 (root) */
if (sectok_selectfile(fd, cla, root_fid, &sw) < 0) {
@@ -534,10 +547,10 @@ int junload(int ac, char *av[])
if (sectok_selectfile(fd, cla, progID, &sw) >= 0) {
/* manage program -- reset */
- rv = scwrite(fd, cla, 0x0a, 02, 0, 0x0, NULL, &r1, &r2);
- if (rv < 0 || (r1 != 0x90 && r1 != 0x61)) {
+ rv = sectok_apdu(fd, cla, 0x0a, 02, 0, 0, NULL, 0, NULL, &sw);
+ if (!sectok_swOK(sw)) {
/* error */
- printf("resetting applet: %s\n", get_r1r2s(r1, r2));
+ printf("resetting applet: %s\n", sectok_get_sw(sw));
}
/* delete program file */
@@ -555,7 +568,7 @@ int junload(int ac, char *av[])
int jselect(int ac, char *av[])
{
- int i, r1, r2, rv;
+ int i, sw, rv;
unsigned char data[MAX_BUF_SIZE];
optind = optreset = 1;
@@ -578,15 +591,15 @@ int jselect(int ac, char *av[])
even with F0 card, select applet APDU (00 a4 04)
only accepts class byte 00 (not f0) */
- rv = scwrite(fd, cla, 0xa4, 0x04, 0, aid_len, data, &r1, &r2);
- if (r1 != 0x90 && r1 != 0x61) {
+ rv = sectok_apdu(fd, cla, 0xa4, 0x04, 0, aid_len, data, 0, NULL, &sw);
+ if (!sectok_swOK(sw)) {
/* error */
printf ("selecting the cardlet: ");
for (i = 0 ; i < aid_len ; i ++ ) {
printf ("%02x", (unsigned char)aid[i]);
}
printf ("\n");
- print_r1r2 (r1, r2);
+ sectok_print_sw(sw);
return -1;
}
@@ -616,7 +629,7 @@ int jdeselect(int ac, char *av[])
/* download DES keys into 3f.00/00.11 */
int cyberflex_load_key (int fd, unsigned char *buf)
{
- int sw, r1, r2, rv, argc = 0, i, j, tmp;
+ int sw, rv, argc = 0, i, j, tmp;
unsigned char *token;
unsigned char data[MAX_BUF_SIZE];
unsigned char key[BLOCK_SIZE];
@@ -651,6 +664,9 @@ int cyberflex_load_key (int fd, unsigned char *buf)
return -1;
}
+ if (!aut0_vfyd)
+ jaut(0, NULL);
+
/* Now let's do it. :) */
/* add the AUT0 */
@@ -691,11 +707,10 @@ int cyberflex_load_key (int fd, unsigned char *buf)
}
/* all righty, now let's send it to the card! :) */
- rv = scwrite(fd, cla, 0xd6, 0, 0, KEY_BLOCK_SIZE * (argc + 2) + 2,
- data, &r1, &r2);
- if (r1 != 0x90 && r1 != 0x61) {
+ rv = sectok_apdu(fd, cla, 0xd6, 0, 0, KEY_BLOCK_SIZE * (argc + 2) + 2, data, 0, NULL, &sw);
+ if (!sectok_swOK(sw)) {
/* error */
- printf("writing the key file 00.11: %s\n", get_r1r2s(r1, r2));
+ printf("writing the key file 00.11: %s\n", sectok_get_sw(sw));
return -1;
}
@@ -705,11 +720,12 @@ int cyberflex_load_key (int fd, unsigned char *buf)
/* download AUT0 key into 3f.00/00.11 */
int load_AUT0(int fd, unsigned char *buf)
{
- int sw, r1, r2, rv, i, tmp;
+ int sw, rv, i, tmp;
unsigned char data[MAX_BUF_SIZE];
unsigned char key[BLOCK_SIZE];
- printf ("load AUT0\n");
+ if (!aut0_vfyd)
+ jaut(0, NULL);
printf ("ca_load_AUT0 buf=%s\n", buf);
@@ -742,11 +758,10 @@ int load_AUT0(int fd, unsigned char *buf)
return -1;
/* all righty, now let's send it to the card! :) */
- rv = scwrite(fd, cla, 0xd6, 0, 0, KEY_BLOCK_SIZE,
- data, &r1, &r2);
- if (r1 != 0x90 && r1 != 0x61) {
+ rv = sectok_apdu(fd, cla, 0xd6, 0, 0, KEY_BLOCK_SIZE, data, 0, NULL, &sw);
+ if (!sectok_swOK(sw)) {
/* error */
- printf("writing the key file 00.11: %s\n", get_r1r2s(r1, r2));
+ printf("writing the key file 00.11: %s\n", sectok_get_sw(sw));
return -1;
}
@@ -785,6 +800,9 @@ int cyberflex_load_rsa(int fd, unsigned char *buf)
}
#endif
+ if (!aut0_vfyd)
+ jaut(0, NULL);
+
rv = cyberflex_load_rsa_priv(fd, cla, key_fid, NUM_RSA_KEY_ELEMENTS, RSA_BIT_LEN,
key_elements, &sw);
diff --git a/usr.bin/sectok/sc.h b/usr.bin/sectok/sc.h
index db22ba2914e..cb91d7f1314 100644
--- a/usr.bin/sectok/sc.h
+++ b/usr.bin/sectok/sc.h
@@ -1,4 +1,4 @@
-/* $Id: sc.h,v 1.2 2001/07/02 20:15:07 rees Exp $ */
+/* $Id: sc.h,v 1.3 2001/07/16 21:02:22 rees Exp $ */
/*
* Smartcard commander.
@@ -35,7 +35,7 @@ if it has been or is hereafter advised of the possibility of
such damages.
*/
-extern int port, fd, cla;
+extern int port, fd, cla, aut0_vfyd;
extern FILE *cmdf;
int dispatch(int ac, char *av[]);