diff options
author | drochner <drochner@pkgsrc.org> | 2002-09-19 20:56:57 +0000 |
---|---|---|
committer | drochner <drochner@pkgsrc.org> | 2002-09-19 20:56:57 +0000 |
commit | 1c3a5708db37cbda7fc437b08ccf3774c91959d3 (patch) | |
tree | efa06c85a39f081968b391c74cc2b336cf79d6a1 | |
parent | 05a3be6ee79de1f1cb31b984839a328db3d6e73b (diff) | |
download | pkgsrc-1c3a5708db37cbda7fc437b08ccf3774c91959d3.tar.gz |
a little tool to send a password string to these cute USB flash disks;
makes them more usable under NetBSD
(by myself)
-rw-r--r-- | sysutils/easydiskpasswd/DESCR | 5 | ||||
-rw-r--r-- | sysutils/easydiskpasswd/Makefile | 19 | ||||
-rw-r--r-- | sysutils/easydiskpasswd/PLIST | 2 | ||||
-rw-r--r-- | sysutils/easydiskpasswd/files/Makefile | 10 | ||||
-rw-r--r-- | sysutils/easydiskpasswd/files/easydiskpasswd.c | 176 |
5 files changed, 212 insertions, 0 deletions
diff --git a/sysutils/easydiskpasswd/DESCR b/sysutils/easydiskpasswd/DESCR new file mode 100644 index 00000000000..1c33aa004bf --- /dev/null +++ b/sysutils/easydiskpasswd/DESCR @@ -0,0 +1,5 @@ +This is a tool to unlock a password protected USB "EasyDisk". +Formatting for password use and password setting still has to be done by +the Windows utilities. +This tool should be applied before mounting. +Use at own risk! diff --git a/sysutils/easydiskpasswd/Makefile b/sysutils/easydiskpasswd/Makefile new file mode 100644 index 00000000000..286c2d5cd38 --- /dev/null +++ b/sysutils/easydiskpasswd/Makefile @@ -0,0 +1,19 @@ +# $NetBSD: Makefile,v 1.1.1.1 2002/09/19 20:56:57 drochner Exp $ + +DISTNAME= easydiskpasswd-1.0 +CATEGORIES= sysutils +DISTFILES= # empty + +MAINTAINER= drochner@netbsd.org +COMMENT= tool to unlock a password protected USB "EasyDisk" + +WRKSRC= ${WRKDIR} +NO_CHECKSUM= yes + +# we depend on SCIOCCOMMAND and the "make" infrastructure +ONLY_FOR_PLATFORM= NetBSD-* + +do-extract: + ${CP} ${FILESDIR}/easydiskpasswd.c ${FILESDIR}/Makefile ${WRKSRC} + +.include "../../mk/bsd.pkg.mk" diff --git a/sysutils/easydiskpasswd/PLIST b/sysutils/easydiskpasswd/PLIST new file mode 100644 index 00000000000..c34ef64a934 --- /dev/null +++ b/sysutils/easydiskpasswd/PLIST @@ -0,0 +1,2 @@ +@comment $NetBSD: PLIST,v 1.1.1.1 2002/09/19 20:56:57 drochner Exp $ +bin/easydiskpasswd diff --git a/sysutils/easydiskpasswd/files/Makefile b/sysutils/easydiskpasswd/files/Makefile new file mode 100644 index 00000000000..940b271a3b3 --- /dev/null +++ b/sysutils/easydiskpasswd/files/Makefile @@ -0,0 +1,10 @@ +# $NetBSD: Makefile,v 1.1.1.1 2002/09/19 20:56:57 drochner Exp $ + +PROG= easydiskpasswd +NOMAN= sorry + +BINDIR= ${PREFIX}/bin +LDADD= -lutil +WARNS= 2 + +.include <bsd.prog.mk> diff --git a/sysutils/easydiskpasswd/files/easydiskpasswd.c b/sysutils/easydiskpasswd/files/easydiskpasswd.c new file mode 100644 index 00000000000..2de296bf3f0 --- /dev/null +++ b/sysutils/easydiskpasswd/files/easydiskpasswd.c @@ -0,0 +1,176 @@ +/* $NetBSD: easydiskpasswd.c,v 1.1.1.1 2002/09/19 20:56:57 drochner Exp $ */ +/* + * Copyright (c) 2002 + * Matthias Drochner. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +/* + * a tool to unlock a password protected USB "EasyDisk" (3SYSTEM) flash disk + */ + +#include <sys/types.h> +#include <sys/param.h> +#include <sys/scsiio.h> +#include <dev/scsipi/scsipi_all.h> +#include <util.h> +#include <string.h> +#include <fcntl.h> +#include <stdio.h> +#include <err.h> +#include <pwd.h> +#include <unistd.h> +#include <stdlib.h> +#include <errno.h> + +static int getstatus(int, int *); +static void usage(void); +int main(int, char **); + +/* SCSI command 0xff is in the "vendor defined" range */ +static const u_char cmd_getstatus[12] = {0xff, 0x01}; +static const u_char cmd_putpasswd[12] = {0xff, 0x05, 0x01}; + +static char passwdbuf[20] = " "; +static const char *defpasswd = "1111"; + +/* + * status: + * 1: OK, no password + * 5, 7: password unlocked + * 21: password, locked + */ +static int +getstatus(fd, statp) + int fd; + int *statp; +{ + int res; + struct scsireq cmd; + char status[1]; + + bzero(&cmd, sizeof(cmd)); + cmd.flags = SCCMD_READ; + cmd.timeout = 10000; + bcopy(cmd_getstatus, &cmd.cmd, 12); + cmd.cmdlen = 12; + cmd.databuf = status; + cmd.datalen = 1; + cmd.senselen = SENSEBUFLEN; + + res = ioctl(fd, SCIOCCOMMAND, &cmd); + if (res < 0) + err(2, "SCIOCCOMMAND"); + if (cmd.retsts == SCCMD_SENSE) + return (EINVAL); + else if (cmd.retsts != SCCMD_OK) + return (EIO); + + *statp = (unsigned char)status[0]; + return (0); +} + +static void +usage() +{ + fprintf(stderr, "%s [ -d | -p <passwd> ] disk\n", getprogname()); + exit(1); +} + +int +main(argc, argv) + int argc; + char **argv; +{ + int ch, fd, res, status; + char pathbuf[MAXPATHLEN]; + const char *passwd = 0; + struct scsireq cmd; + struct scsipi_sense_data *sd; + + while ((ch = getopt(argc, argv, "dp:")) != -1) + switch (ch) { + case 'd': + passwd = defpasswd; + break; + case 'p': + passwd = optarg; + break; + case '?': + default: + usage(); + } + argc -= optind; + argv += optind; + + if (argc != 1) + usage(); + + fd = opendisk(argv[0], O_RDWR, pathbuf, MAXPATHLEN, 0); + if (fd < 0) + err(2, "opendisk %s", argv[0]); + + res = getstatus(fd, &status); + if (res) + errx(2, "wrong device"); + if (status != 21) { + warnx("no password set, or unlocked"); + exit (0); + } + + if (!passwd) + passwd = getpass("flash disk password: "); + + bcopy(passwd, passwdbuf, MIN(strlen(passwd), 20)); + + bzero(&cmd, sizeof(cmd)); + cmd.flags = SCCMD_WRITE; + cmd.timeout = 10000; + bcopy(cmd_putpasswd, &cmd.cmd, 12); + cmd.cmdlen = 12; + cmd.databuf = passwdbuf; + cmd.datalen = 20; + cmd.datalen_used = 20; + cmd.senselen = SENSEBUFLEN; + + res = ioctl(fd, SCIOCCOMMAND, &cmd); + if (res < 0) + err(2, "SCIOCCOMMAND"); + + if (cmd.retsts == SCCMD_SENSE) { + sd = (struct scsipi_sense_data *)&cmd.sense; + if ((sd->flags & SSD_KEY) == SKEY_ILLEGAL_REQUEST) { + if (sd->add_sense_code == 0x24) + errx(3, "wrong password"); + if (sd->add_sense_code == 0x20) { + /* XXX shouldn't get here (caught above) */ + warnx("no password set"); + exit (0); + } + } + errx(2, "SCSI command error"); + } else if (cmd.retsts != SCCMD_OK) + errx(2, "scsi driver error %d", cmd.retsts); + + return (0); +} |