diff options
author | 2001-07-02 20:15:06 +0000 | |
---|---|---|
committer | 2001-07-02 20:15:06 +0000 | |
commit | fd5d99f21733a6d62e9dba83aba5d16714b57d9b (patch) | |
tree | 783b550e6b05bde63c18d6f264e6481aeaa1a56c | |
parent | sc7816 compatibility (diff) | |
download | wireguard-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.c | 53 | ||||
-rw-r--r-- | usr.bin/sectok/cyberflex.c | 111 | ||||
-rw-r--r-- | usr.bin/sectok/main.c | 25 | ||||
-rw-r--r-- | usr.bin/sectok/sc.h | 7 |
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, ¶m); + 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[]); |