summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrees <rees@openbsd.org>2001-07-02 20:15:06 +0000
committerrees <rees@openbsd.org>2001-07-02 20:15:06 +0000
commitfd5d99f21733a6d62e9dba83aba5d16714b57d9b (patch)
tree783b550e6b05bde63c18d6f264e6481aeaa1a56c
parentsc7816 compatibility (diff)
downloadwireguard-openbsd-fd5d99f21733a6d62e9dba83aba5d16714b57d9b.tar.xz
wireguard-openbsd-fd5d99f21733a6d62e9dba83aba5d16714b57d9b.zip
libsectok functions now take status word instead of bytes
add create, delete, isearch
-rw-r--r--usr.bin/sectok/cmds.c53
-rw-r--r--usr.bin/sectok/cyberflex.c111
-rw-r--r--usr.bin/sectok/main.c25
-rw-r--r--usr.bin/sectok/sc.h7
4 files changed, 142 insertions, 54 deletions
diff --git a/usr.bin/sectok/cmds.c b/usr.bin/sectok/cmds.c
index f1e359020f1..d7a14adcea9 100644
--- a/usr.bin/sectok/cmds.c
+++ b/usr.bin/sectok/cmds.c
@@ -1,4 +1,4 @@
-/* $Id: cmds.c,v 1.2 2001/06/28 21:29:44 rees Exp $ */
+/* $Id: cmds.c,v 1.3 2001/07/02 20:15:06 rees Exp $ */
/*
* Smartcard commander.
@@ -41,6 +41,7 @@ such damages.
#include <signal.h>
#include <string.h>
#include <sectok.h>
+#include <sc7816.h>
#include "sc.h"
@@ -61,12 +62,15 @@ struct {
/* 7816-4 commands */
{ "apdu", apdu },
{ "fid", selfid },
+ { "isearch", isearch },
{ "class", class },
{ "read", dread },
{ "write", dwrite },
/* Cyberflex commands */
{ "ls", ls },
+ { "create", jcreate },
+ { "delete", jdelete },
{ "jdefault", jdefault },
{ "jatr", jatr },
{ "jdata", jdata },
@@ -115,8 +119,9 @@ int help(int ac, char *av[])
int reset(int ac, char *av[])
{
- int i, n, port = 0, oflags = SCODSR, rflags = 0, err;
- unsigned char buf[34];
+ int i, n, oflags = 0, rflags = 0, vflag = 0, sw;
+ unsigned char atr[34];
+ struct scparam param;
optind = optreset = 1;
@@ -129,10 +134,10 @@ int reset(int ac, char *av[])
port = i - '1';
break;
case 'i':
- oflags &= ~SCODSR;
+ oflags |= STONOWAIT;
break;
case 'v':
- rflags |= SCRV;
+ vflag = 1;
break;
case 'f':
rflags |= SCRFORCE;
@@ -141,20 +146,22 @@ int reset(int ac, char *av[])
}
if (fd < 0) {
- fd = scopen(0, oflags, &err);
+ fd = sectok_open(port, oflags, &sw);
if (fd < 0) {
- printf("%s\n", scerrtab[err]);
+ sectok_print_sw(sw);
return -1;
}
}
- n = scxreset(fd, rflags, buf, &err);
- if (n && !(rflags & SCRV)) {
+ n = scxreset(fd, rflags, atr, &sw);
+ if (n && !vflag) {
printf("atr ");
- dump_reply(buf, n, 0, 0);
+ dump_reply(atr, n, 0, 0);
}
- if (err != SCEOK) {
- printf("%s\n", scerrtab[err]);
+ if (vflag)
+ parse_atr(fd, SCRV, atr, n, &param);
+ if (sw != SCEOK) {
+ printf("%s\n", scerrtab[sw]);
return -1;
}
@@ -228,7 +235,7 @@ int apdu(int ac, char *av[])
int selfid(int ac, char *av[])
{
unsigned char fid[2];
- int r1, r2;
+ int sw;
if (ac != 2) {
printf("usage: f fid\n");
@@ -239,14 +246,30 @@ int selfid(int ac, char *av[])
reset(0, NULL);
sectok_parse_fname(av[1], fid);
- if (sectok_selectfile(fd, cla, fid, &r1, &r2) < 0) {
- printf("selectfile: %s\n", get_r1r2s(r1, r2));
+ if (sectok_selectfile(fd, cla, fid, &sw) < 0) {
+ printf("selectfile: %s\n", sectok_get_sw(sw));
return -1;
}
return 0;
}
+int isearch(int ac, char *av[])
+{
+ int i, r1, r2;
+ unsigned char buf[256];
+
+ if (fd < 0)
+ reset(0, NULL);
+
+ /* 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));
+ return 0;
+}
+
int class(int ac, char *av[])
{
if (ac > 1)
diff --git a/usr.bin/sectok/cyberflex.c b/usr.bin/sectok/cyberflex.c
index e7e22c9a23d..df50de5c1d4 100644
--- a/usr.bin/sectok/cyberflex.c
+++ b/usr.bin/sectok/cyberflex.c
@@ -1,4 +1,4 @@
-/* $Id: cyberflex.c,v 1.2 2001/06/28 21:29:45 rees Exp $ */
+/* $Id: cyberflex.c,v 1.3 2001/07/02 20:15:06 rees Exp $ */
/*
copyright 1999, 2000
@@ -42,6 +42,7 @@ such damages.
#include <des.h>
#endif
#include <sectok.h>
+#include <sc7816.h>
#include "sc.h"
@@ -206,6 +207,53 @@ int ls(int ac, char *av[])
return 0;
}
+int jcreate(int ac, char *av[])
+{
+ unsigned char fid[2];
+ int sw, fsize;
+
+ if (ac != 3) {
+ printf("usage: create fid size\n");
+ return -1;
+ }
+
+ sectok_parse_fname(av[1], fid);
+ sscanf(av[2], "%d", &fsize);
+
+ if (fd < 0)
+ reset(0, NULL);
+
+ if (cyberflex_create_file(fd, cla, fid, fsize, 3, &sw) < 0) {
+ printf("create_file: %s\n", sectok_get_sw(sw));
+ return -1;
+ }
+
+ return 0;
+}
+
+int jdelete(int ac, char *av[])
+{
+ unsigned char fid[2];
+ int sw;
+
+ if (ac != 2) {
+ printf("usage: delete fid\n");
+ return -1;
+ }
+
+ sectok_parse_fname(av[1], fid);
+
+ if (fd < 0)
+ reset(0, NULL);
+
+ if (cyberflex_delete_file(fd, cla, fid, &sw) < 0) {
+ printf("delete_file: %s\n", sectok_get_sw(sw));
+ return -1;
+ }
+
+ return 0;
+}
+
int jaut(int ac, char *av[])
{
if (fd < 0)
@@ -283,7 +331,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, r1, r2;
+ int i, j, fd_app, size, rv, sw, r1, r2;
des_cblock tmp;
des_key_schedule schedule;
@@ -367,13 +415,13 @@ int jload(int ac, char *av[])
}
/* select 3f.00 (root) */
- if (sectok_selectfile(fd, cla, root_fid, &r1, &r2) < 0)
+ if (sectok_selectfile(fd, cla, root_fid, &sw) < 0)
return -1;
/* create program file */
- if (cyberflex_create_file(fd, cla, progID, size, 3, &r1, &r2) < 0) {
+ if (cyberflex_create_file(fd, cla, progID, size, 3, &sw) < 0) {
/* error */
- printf("can't create %s: %s\n", progname, get_r1r2s(r1, r2));
+ printf("can't create %s: %s\n", progname, sectok_get_sw(sw));
return -1;
}
@@ -455,7 +503,7 @@ int jload(int ac, char *av[])
int junload(int ac, char *av[])
{
char progname[5], contname[5];
- int r1, r2, rv;
+ int sw, r1, r2, rv;
if (analyze_load_options(ac, av) < 0)
return -1;
@@ -477,11 +525,13 @@ int junload(int ac, char *av[])
/*printf ("unload applet\n");*/
/* select 3f.00 (root) */
- if (sectok_selectfile(fd, cla, root_fid, &r1, &r2) < 0)
+ if (sectok_selectfile(fd, cla, root_fid, &sw) < 0) {
+ printf("can't select root: %s\n", sectok_get_sw(sw));
return -1;
+ }
/* select program file */
- if (sectok_selectfile(fd, cla, progID, &r1, &r2) >= 0) {
+ if (sectok_selectfile(fd, cla, progID, &sw) >= 0) {
/* manage program -- reset */
rv = scwrite(fd, cla, 0x0a, 02, 0, 0x0, NULL, &r1, &r2);
@@ -491,14 +541,14 @@ int junload(int ac, char *av[])
}
/* delete program file */
- if (cyberflex_delete_file(fd, cla, progID[0], progID[1], &r1, &r2) < 0)
- printf("delete_file %s: %s\n", progname, get_r1r2s(r1, r2));
+ if (cyberflex_delete_file(fd, cla, progID, &sw) < 0)
+ printf("delete_file %s: %s\n", progname, sectok_get_sw(sw));
} else
printf ("no program file... proceed to delete data container\n");
/* delete data container */
- if (cyberflex_delete_file(fd, cla, contID[0], contID[1], &r1, &r2) < 0)
- printf("delete_file %s: %s\n", contname, get_r1r2s(r1, r2));
+ if (cyberflex_delete_file(fd, cla, contID, &sw) < 0)
+ printf("delete_file %s: %s\n", contname, sectok_get_sw(sw));
return 0;
}
@@ -522,12 +572,6 @@ int jselect(int ac, char *av[])
printf ("%02x", (unsigned char)aid[i]);
printf ("\n");
- /* select data container (77.78) */
- /*rv = sectok_selectfile (fd, cla, root_fid, 0);
- if (rv < 0) return rv;
- rv = sectok_selectfile (fd, cla, contID, 0);
- if (rv < 0) return rv;*/
-
/* select the cardlet (7777777777) */
for (i = 0; i < aid_len; i++) data[i] = (unsigned char)aid[i];
/* quick hack in select_applet()
@@ -551,16 +595,15 @@ int jselect(int ac, char *av[])
int jdeselect(int ac, char *av[])
{
- int r1, r2, rv;
+ int sw;
if (fd < 0)
reset(0, NULL);
- rv = scwrite(fd, cla, 0xa4, 0x04, 0, 0x00, NULL, &r1, &r2);
- if (r1 != 0x90 && r1 != 0x61) {
+ sectok_apdu(fd, cla, 0xa4, 0x04, 0, 0, NULL, 0, NULL, &sw);
+ if (!sectok_swOK(sw)) {
/* error */
- printf ("selecting the default loader: ");
- print_r1r2 (r1, r2);
+ printf("selecting default loader: %s\n", sectok_get_sw(sw));
return -1;
}
@@ -573,7 +616,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 r1, r2, rv, argc = 0, i, j, tmp;
+ int sw, r1, r2, rv, argc = 0, i, j, tmp;
unsigned char *token;
unsigned char data[MAX_BUF_SIZE];
unsigned char key[BLOCK_SIZE];
@@ -636,12 +679,16 @@ int cyberflex_load_key (int fd, unsigned char *buf)
printf ("\n");
/* select 3f.00 (root) */
- if (sectok_selectfile(fd, cla, root_fid, &r1, &r2) < 0)
+ if (sectok_selectfile(fd, cla, root_fid, &sw) < 0) {
+ printf("select root: %s\n", sectok_get_sw(sw));
return -1;
+ }
/* select 00.11 (key file) */
- if (sectok_selectfile(fd, cla, key_fid, &r1, &r2) < 0)
+ if (sectok_selectfile(fd, cla, key_fid, &sw) < 0) {
+ printf("select key file: %s\n", sectok_get_sw(sw));
return -1;
+ }
/* all righty, now let's send it to the card! :) */
rv = scwrite(fd, cla, 0xd6, 0, 0, KEY_BLOCK_SIZE * (argc + 2) + 2,
@@ -658,7 +705,7 @@ 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 r1, r2, rv, i, tmp;
+ int sw, r1, r2, rv, i, tmp;
unsigned char data[MAX_BUF_SIZE];
unsigned char key[BLOCK_SIZE];
@@ -687,11 +734,11 @@ int load_AUT0(int fd, unsigned char *buf)
printf ("\n");
/* select 3f.00 (root) */
- if (sectok_selectfile(fd, cla, root_fid, &r1, &r2) < 0)
+ if (sectok_selectfile(fd, cla, root_fid, &sw) < 0)
return -1;
/* select 00.11 (key file) */
- if (sectok_selectfile(fd, cla, key_fid, &r1, &r2) < 0)
+ if (sectok_selectfile(fd, cla, key_fid, &sw) < 0)
return -1;
/* all righty, now let's send it to the card! :) */
@@ -709,7 +756,7 @@ int load_AUT0(int fd, unsigned char *buf)
/* download RSA private key into 3f.00/00.12 */
int cyberflex_load_rsa(int fd, unsigned char *buf)
{
- int rv, r1, r2, i, j, tmp;
+ int rv, sw, i, j, tmp;
static unsigned char key_fid[] = {0x00, 0x12};
static char *key_names[NUM_RSA_KEY_ELEMENTS]= {"p", "q", "1/p mod q",
"d mod (p-1)", "d mod (q-1)"};
@@ -739,10 +786,10 @@ int cyberflex_load_rsa(int fd, unsigned char *buf)
#endif
rv = cyberflex_load_rsa_priv(fd, cla, key_fid, NUM_RSA_KEY_ELEMENTS, RSA_BIT_LEN,
- key_elements, &r1, &r2);
+ key_elements, &sw);
if (rv < 0)
- printf("load_rsa_priv: %s\n", get_r1r2s(r1, r2));
+ printf("load_rsa_priv: %s\n", sectok_get_sw(sw));
for (i = 0; i < NUM_RSA_KEY_ELEMENTS; i++)
free(key_elements[i]);
diff --git a/usr.bin/sectok/main.c b/usr.bin/sectok/main.c
index 1e96b5b6bd9..e40de8ada4c 100644
--- a/usr.bin/sectok/main.c
+++ b/usr.bin/sectok/main.c
@@ -1,4 +1,4 @@
-/* $Id: main.c,v 1.1 2001/06/27 19:41:45 rees Exp $ */
+/* $Id: main.c,v 1.2 2001/07/02 20:15:07 rees Exp $ */
/*
* Smartcard commander.
@@ -40,6 +40,7 @@ such damages.
#include <stdio.h>
#include <signal.h>
#include <string.h>
+#include <errno.h>
#include <sectok.h>
#include "sc.h"
@@ -47,6 +48,8 @@ such damages.
#define MAXTOKENS 300
#define CARDIOSIZE 200
+void onintr(int sigraised);
+
const char usage[] =
"Usage: sectok [-1234hHf:s:]\n"
" 1 - 4 : specify card reader number\n"
@@ -55,7 +58,7 @@ const char usage[] =
" h : this message\n"
;
-int fd = -1, cla, sleepytime;
+int port, fd = -1, cla, sleepytime, interrupted;
FILE *cmdf;
int
@@ -63,7 +66,7 @@ main(ac, av)
int ac;
char *av[];
{
- int i, port, tc;
+ int i, tc;
char buf[256], *scriptfile = NULL, *tp, *tv[MAXTOKENS];
while ((i = getopt(ac, av, "1234c:d:f:Hhs:")) != -1) {
@@ -105,9 +108,12 @@ char *av[];
/* Interactive mode, or script file */
+ signal(SIGINT, onintr);
+
/* The Main Loop */
while (1) {
fflush(stdout);
+ interrupted = 0;
if (sleepytime)
usleep(sleepytime * 1000);
if (cmdf == stdin) {
@@ -115,8 +121,12 @@ char *av[];
fflush(stderr);
}
- if (!fgets(buf, sizeof buf, cmdf))
- break;
+ if (!fgets(buf, sizeof buf, cmdf)) {
+ if (interrupted)
+ continue;
+ else
+ break;
+ }
if (cmdf != stdin)
printf("sectok> %s", buf);
@@ -131,3 +141,8 @@ char *av[];
exit(0);
}
+
+void onintr(int sigraised)
+{
+ interrupted++;
+}
diff --git a/usr.bin/sectok/sc.h b/usr.bin/sectok/sc.h
index 6cc2e38a5ea..db22ba2914e 100644
--- a/usr.bin/sectok/sc.h
+++ b/usr.bin/sectok/sc.h
@@ -1,4 +1,4 @@
-/* $Id: sc.h,v 1.1 2001/06/27 19:41:46 rees Exp $ */
+/* $Id: sc.h,v 1.2 2001/07/02 20:15:07 rees Exp $ */
/*
* Smartcard commander.
@@ -35,7 +35,7 @@ if it has been or is hereafter advised of the possibility of
such damages.
*/
-extern int fd, cla;
+extern int port, fd, cla;
extern FILE *cmdf;
int dispatch(int ac, char *av[]);
@@ -45,10 +45,13 @@ int dclose(int ac, char *av[]);
int quit(int ac, char *av[]);
int apdu(int ac, char *av[]);
int selfid(int ac, char *av[]);
+int isearch(int ac, char *av[]);
int class(int ac, char *av[]);
int dread(int ac, char *av[]);
int dwrite(int ac, char *av[]);
int ls(int ac, char *av[]);
+int jcreate(int ac, char *av[]);
+int jdelete(int ac, char *av[]);
int jdefault(int ac, char *av[]);
int jatr(int ac, char *av[]);
int jdata(int ac, char *av[]);