/tinfoilhat.shmoo.com/
This commit is contained in:
parent
974ea68865
commit
ba45bc5a3e
BIN
roles/toxcore/overlay/Linux/usr/local/src/tinfoilhat.shmoo.com/source/gnupggrid
Executable file
BIN
roles/toxcore/overlay/Linux/usr/local/src/tinfoilhat.shmoo.com/source/gnupggrid
Executable file
Binary file not shown.
@ -0,0 +1,357 @@
|
||||
/* gpggrid : wrapper for gpg that lets you enter in the password
|
||||
* optionally stores passphrase in /tmp/ . This is fine if /tmp
|
||||
* is an encrypted ramdisk and this is a single user machine.
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright (c) 2002 Anonymous (anonymous @ nameless.cultists.net)
|
||||
Morten Poulsen <morten@afdelingp.dk>
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
* 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
|
||||
*/
|
||||
|
||||
/* CHANGES
|
||||
* 1.1 release, code was substantially improved by Morten Poulsen.
|
||||
* User options made somewhat clearer.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
|
||||
#define FILENAME "/tmp/P"
|
||||
#define PSIZE 256 /* max passphrase size */
|
||||
|
||||
#define OUT 0
|
||||
#define IN 1
|
||||
|
||||
/* I'm only allowing characters that most people might
|
||||
actually know what to do with:
|
||||
EOT, BEL &etc are out as is newline, which leaves us with ASCII
|
||||
8-10,32-128
|
||||
High ascii could be added, but I haven't checked for nastys
|
||||
*/
|
||||
|
||||
/* 94 plus 5 unprintables */
|
||||
static char printable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789{|}~[\\]^_`!\"#$%&\'()*+,-./:;<=>?@";
|
||||
/* ASCII order="!\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; */
|
||||
|
||||
char column[26];
|
||||
char row[9];
|
||||
char passphrase[PSIZE+2];
|
||||
char SHOWPF=0;
|
||||
|
||||
void buildgrid(char *rand) {
|
||||
int i, r;
|
||||
|
||||
printf (" ");
|
||||
for (i=0; i<26; i++) {
|
||||
column[i] = printable[0 + ((i+rand[0]) % 26)];
|
||||
printf("%c ", column[i]);
|
||||
}
|
||||
printf ("\n");
|
||||
|
||||
for (i=0; i<9; i++) {
|
||||
row[i] = printable[26 + ((i+rand[1]) % 26)];
|
||||
}
|
||||
|
||||
r = 0;
|
||||
for (i=0; i<strlen(printable); i++) {
|
||||
if ((i % 26) == 0) {
|
||||
printf ("\n");
|
||||
printf ("%c ", row[r++]);
|
||||
}
|
||||
printf ("%c ", printable[i]);
|
||||
}
|
||||
|
||||
/* UI is hard... Separate lines for these */
|
||||
printf ("\n%c Backspace", row[r++]);
|
||||
printf ("\n%c Tab", row[r++]);
|
||||
printf ("\n%c Enter (stop entering characters)", row[r++]);
|
||||
printf ("\n%c Space", row[r++]);
|
||||
printf ("\n%c Delete\n\n", row[r++]);
|
||||
}
|
||||
|
||||
|
||||
int getcoords (char *key) {
|
||||
char *count;
|
||||
int i;
|
||||
int x = 0, y = 0;
|
||||
char buffer[PSIZE];
|
||||
int M = 0;
|
||||
int xok = 0, yok = 0;
|
||||
|
||||
do {
|
||||
printf("Enter vertical row (lowercase) then horizontal column (UPPERCASE): ");
|
||||
count = fgets(buffer, PSIZE, stdin);
|
||||
|
||||
if (count) {
|
||||
for (i=0; i<9; i++) {
|
||||
if (buffer[0] == row[i]) {
|
||||
y = i;
|
||||
yok = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (i=0; i<26; i++) {
|
||||
if (buffer[1] == column[i]) {
|
||||
x = i;
|
||||
xok = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} while (!yok);
|
||||
|
||||
/* Be nice to people who accidentally press enter too early */
|
||||
while (!xok) {
|
||||
printf("Please enter horizontal column (UPPER CASE) grid letter: ");
|
||||
count = fgets(buffer, PSIZE, stdin);
|
||||
|
||||
if (count) {
|
||||
for (i=0; i<26; i++) {
|
||||
if (buffer[0] == column[i]) {
|
||||
x = i;
|
||||
xok = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
M = 26 * y + x;
|
||||
|
||||
if (M > 93) {
|
||||
switch (M/26) {
|
||||
case 4:
|
||||
strcpy(key, "Backspace");
|
||||
return 2;
|
||||
case 5:
|
||||
strcpy(key, "\t");
|
||||
return 1;
|
||||
case 6:
|
||||
strcpy(key, "\n");
|
||||
return 3;
|
||||
case 7:
|
||||
strcpy(key, " ");
|
||||
return 1;
|
||||
case 8:
|
||||
strcpy(key, "Delete");
|
||||
return 2;
|
||||
default:
|
||||
strcpy(key, "ERR");
|
||||
return -1;
|
||||
}
|
||||
|
||||
} else {
|
||||
*key = printable[M];
|
||||
/* printf ("%d You seem to have chosen %c,%c ,which is %c\n",M, y,x, *key);*/
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int getpassphrase() {
|
||||
char x;
|
||||
unsigned char crand[3];
|
||||
extern char passphrase[PSIZE+2];
|
||||
int check, c;
|
||||
int rs=-1;
|
||||
char thischar[12];
|
||||
char *curletter;
|
||||
struct stat statbuf;
|
||||
extern char SHOWPF;
|
||||
|
||||
curletter = passphrase;
|
||||
|
||||
/* initialize random source */
|
||||
if (stat("/dev/urandom", &statbuf) != 0 || !S_ISCHR(statbuf.st_mode)) {
|
||||
perror ("Can't find random source");
|
||||
exit(EXIT_FAILURE);
|
||||
} else {
|
||||
rs = open("/dev/urandom", O_RDONLY);
|
||||
if (rs < 0) {
|
||||
perror("Can't open random source");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
x=0; c=0;
|
||||
while (x != 3) {
|
||||
printf("\n\n\n\n\n");
|
||||
|
||||
if (SHOWPF == 2) {
|
||||
printf(">>%s\n\n", passphrase);
|
||||
}
|
||||
|
||||
check = read(rs, crand, 2);
|
||||
crand[0] = (crand[0] % 26);
|
||||
crand[1] = (crand[1] % 26);
|
||||
buildgrid(crand);
|
||||
|
||||
x = getcoords(thischar);
|
||||
|
||||
switch (x) {
|
||||
case 1:
|
||||
/* if not 257 */
|
||||
*curletter = *thischar;
|
||||
if (SHOWPF == 1) {
|
||||
printf ("Letter was %c\n\n", *curletter);
|
||||
}
|
||||
curletter++;
|
||||
break;
|
||||
case -1:
|
||||
printf ("please try again\n");
|
||||
break;
|
||||
case 2: /* DEL or backspace */
|
||||
if (curletter >= passphrase) {
|
||||
curletter--;
|
||||
*curletter = '\0';
|
||||
}
|
||||
break;
|
||||
case 3: /* Enter */
|
||||
/* should truncate passphrase at PSIZE. */
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int main (int argc, char **argv) {
|
||||
extern char passphrase[PSIZE+2];
|
||||
char buffer[PSIZE+4];
|
||||
char *count;
|
||||
ssize_t foo;
|
||||
extern char SHOWPF;
|
||||
char fd_name[6];
|
||||
int i, fd_out;
|
||||
char *exec_argv[(argc+4)]; /* BUG: hardcoded, but should be enough */
|
||||
struct stat statbuf;
|
||||
int p[2];
|
||||
|
||||
memset(&passphrase, 0, sizeof(passphrase));
|
||||
memset(&fd_name, 0, sizeof(fd_name));
|
||||
|
||||
/* check if we already have a cached passphrase */
|
||||
if ((fd_out = open(FILENAME, O_RDONLY)) > 0) {
|
||||
printf("Using stored passphrase.\n");
|
||||
read(fd_out, passphrase, (PSIZE+1));
|
||||
/* We don't need to check for errors. If it fails, the user is asked for
|
||||
passphrase anyway. */
|
||||
close(fd_out);
|
||||
}
|
||||
|
||||
if (strlen(passphrase) == 0) {
|
||||
/* Ask if we want to display the passphrase */
|
||||
printf("By default, you will see the last letter you entered. Do you\n");
|
||||
printf("want to display the entire passphrase on the screen instead?\n");
|
||||
printf("select y for full passphrase, n for no feedback, d for default\n");
|
||||
printf(" [y/n/D]\n");
|
||||
|
||||
count = fgets( buffer, PSIZE, stdin);
|
||||
switch (buffer[0]) {
|
||||
case 'y':
|
||||
case 'Y':
|
||||
SHOWPF = 2;
|
||||
break;
|
||||
case 'n':
|
||||
case 'N':
|
||||
SHOWPF = 0;
|
||||
break;
|
||||
default:
|
||||
SHOWPF = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
getpassphrase();
|
||||
|
||||
/* Ask if we want to save the passphrase */
|
||||
printf("\n\nGPGgrid can store your passphrase on the RAMdisk and re-use\n");
|
||||
printf("it later. This saves a lot of time, but does leave the passphrase vulnerable\n");
|
||||
printf("until reboot.\n");
|
||||
printf("Do you want to store the passphrase in /tmp ? [Y/n]\n");
|
||||
count = fgets(buffer, PSIZE, stdin);
|
||||
|
||||
if (buffer[0] != 'n' && buffer[0] != 'N') {
|
||||
|
||||
/* write to disk */
|
||||
printf ("Writing passphrase to disk.\n" );
|
||||
if ((stat(FILENAME, &statbuf) == 0) && (!S_ISREG(statbuf.st_mode))) {
|
||||
printf(FILENAME " is not a regular file\n");
|
||||
} else {
|
||||
if ((fd_out = open(FILENAME, O_RDWR|O_CREAT|O_TRUNC, 0600)) == -1) {
|
||||
perror("can't open passphrase file for writing") ;
|
||||
} else {
|
||||
foo = write(fd_out, passphrase, strlen(passphrase));
|
||||
if (foo != strlen(passphrase)) {
|
||||
perror("can't write out the passphrase");
|
||||
}
|
||||
close (fd_out) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (SHOWPF == 2) {
|
||||
printf("Final result: %s\n", passphrase);
|
||||
}
|
||||
|
||||
/* OK, we're ready to run GPG */
|
||||
|
||||
if (pipe(p) == -1) {
|
||||
perror("unable to create pipe");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
switch (fork()) {
|
||||
|
||||
case -1: /* failure */
|
||||
perror("unable to fork");
|
||||
exit(EXIT_FAILURE);
|
||||
|
||||
case 0: /* child */
|
||||
close(p[OUT]);
|
||||
write(p[IN], passphrase, strlen(passphrase));
|
||||
close(p[IN]);
|
||||
exit(EXIT_SUCCESS);
|
||||
|
||||
default: /* parent */
|
||||
close(p[IN]);
|
||||
sprintf(fd_name, "%d", p[OUT]);
|
||||
exec_argv[0] = "gnupg";
|
||||
exec_argv[1] = "--passphrase-fd";
|
||||
exec_argv[2] = fd_name;
|
||||
for (i=1; i<=argc; i++) { /* <= to get the NULL pointer too */
|
||||
exec_argv[i+2] = argv[i];
|
||||
}
|
||||
execvp("gnupg", exec_argv);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* never reached */
|
||||
return EXIT_FAILURE;
|
||||
|
||||
}
|
BIN
roles/toxcore/overlay/Linux/usr/local/src/tinfoilhat.shmoo.com/source/gpggrid
Executable file
BIN
roles/toxcore/overlay/Linux/usr/local/src/tinfoilhat.shmoo.com/source/gpggrid
Executable file
Binary file not shown.
@ -0,0 +1,338 @@
|
||||
/* gpggrid : wrapper for gpg that lets you enter in the password
|
||||
* optionally stores passphrase in /tmp/ . This is fine if /tmp
|
||||
* is an encrypted ramdisk and this is a single user machine.
|
||||
* Code is ugly, Error checking is missing. I != coder. If you are, fix it.
|
||||
* TODO:
|
||||
* Get by with less file opening & closing while still failing nicely?
|
||||
*/
|
||||
/*
|
||||
Copyright (c) 2002 Anonymous (anonymous @ nameless.cultists.net)
|
||||
All rights reserved.
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
||||
* 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define FILENAME "/tmp/P"
|
||||
/*max passphrase size */
|
||||
#define PSIZE 256
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
|
||||
/* I'm only allowing characters that most people might
|
||||
actually know what to do with:
|
||||
EOT, BEL &etc are out as is newline, which leaves us with ASCII
|
||||
8-10,32-128
|
||||
High ascii could be added, but I haven't checked for nastys
|
||||
*/
|
||||
|
||||
/* 94 plus 5 unprintables */
|
||||
static char printable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789{|}~[\\]^_`!\"#$%&\'()*+,-./:;<=>?@";
|
||||
/* ASCII order="!\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; */
|
||||
|
||||
char row[27];
|
||||
char column[10];
|
||||
char passphrase[PSIZE+2];
|
||||
char SHOWPF=0;
|
||||
|
||||
int buildgrid ( char * rand ) {
|
||||
unsigned char a, b, c ;
|
||||
char * xzero, * yzero;
|
||||
/* char check;*/
|
||||
int i;
|
||||
a = b = c =0;
|
||||
|
||||
/* print the static header */
|
||||
xzero = &printable[0] + rand[0];
|
||||
i = &printable[26] - xzero;
|
||||
snprintf(row, (size_t) (i+1), "%s", xzero);
|
||||
snprintf(&row[i], (size_t) (rand[0] +1), "%s", &printable[0]);
|
||||
printf ("\n ");
|
||||
for (i=0;i < 26; i++) {
|
||||
printf("%c ",row[i]);
|
||||
}
|
||||
printf ("\n");
|
||||
|
||||
yzero= &printable[26] +rand[1];
|
||||
i = &printable[52] - yzero ;
|
||||
if (i > 9) { i=9; }
|
||||
snprintf(column, (size_t) (i+1), "%s", yzero);
|
||||
if (i < 9) {
|
||||
snprintf(&column[i], (size_t) (10 -i ), "%s", &printable[26]);
|
||||
}
|
||||
for (i = 0; i < 94; i++) { /*sizeof printable */
|
||||
if ( (i%26) == 0) {
|
||||
printf ("\n");
|
||||
printf ("%c ", column[c]);
|
||||
c++;
|
||||
}
|
||||
printf ("%c ", printable[i]);
|
||||
}
|
||||
/* UI is hard... Separate lines for these */
|
||||
printf ("\n%c Backspace ", column[c++]);
|
||||
printf ("\n%c Tab ", column[c++]);
|
||||
printf ("\n%c Enter (stop entering characters) ", column[c++]);
|
||||
printf ("\n%c Space ", column[c++]);
|
||||
printf ("\n%c Delete\n\n", column[c++]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int getcords ( char * key) {
|
||||
char * count, *here;
|
||||
int i,ii;
|
||||
char x,y;
|
||||
char buffer[PSIZE];
|
||||
int M=0;
|
||||
|
||||
while ( y==0) {
|
||||
printf("Enter grid column (lowercase) then row (uppercase):");
|
||||
count = fgets( buffer, PSIZE, stdin);
|
||||
if( count != NULL) {
|
||||
for (i=0;i<9;i++){
|
||||
if ( column[i] == count[0]) {
|
||||
for (ii=0;ii<26;ii++){ /*or strstr*/
|
||||
if ( row[ii] == count[1]) {
|
||||
x=count[1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
y=count[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while ( x==0) {
|
||||
printf ("\nplease enter row (CAPS) grid letter: ");
|
||||
count = fgets( buffer, PSIZE, stdin);
|
||||
if( count != NULL) {
|
||||
for (i=0;i<26;i++){
|
||||
if ( row[i] == count[0]) {x=count[0];}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* figure out how many rows down we are */
|
||||
here = strchr(&column[0], (int) y);
|
||||
M = 26 * ( here - &column[0]);
|
||||
here = strchr(row,(int)x);
|
||||
M = M + (here - &row[0]);
|
||||
|
||||
if (M > 93) {
|
||||
switch (M/26) {
|
||||
case 4:
|
||||
strcpy(key,"Backspace");
|
||||
return 2;
|
||||
break;
|
||||
case 5:
|
||||
sprintf(key,"\t");
|
||||
return 1;
|
||||
break;
|
||||
case 6:
|
||||
strcpy(key,"\n"); /* good idea?, I doubt it */
|
||||
return 3;
|
||||
break;
|
||||
case 7:
|
||||
sprintf(key," ");
|
||||
return 1;
|
||||
break;
|
||||
case 8:
|
||||
strcpy(key,"Delete");
|
||||
return 2;
|
||||
break;
|
||||
default:
|
||||
strcpy(key,"ERR");
|
||||
return -1;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
*key = printable[M];
|
||||
/* printf ("%d You seem to have chosen %c,%c ,which is %c\n",M, y,x, *key);*/
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
void fillrand ( char * randbuf, int rs) {
|
||||
printf( "your random is %s", randbuf);
|
||||
}
|
||||
|
||||
int getpassphrase () {
|
||||
char x;
|
||||
unsigned char crand[3];
|
||||
extern char passphrase[PSIZE+2];
|
||||
int check, c;
|
||||
int rs=-1;
|
||||
char thischar[12];
|
||||
char * curletter;
|
||||
struct stat statbuf;
|
||||
extern char SHOWPF;
|
||||
curletter=passphrase;
|
||||
|
||||
/* initialize random source */
|
||||
if (stat("/dev/urandom", &statbuf) == 0 && S_ISCHR(statbuf.st_mode)) {
|
||||
rs= open("/dev/urandom", O_RDONLY );
|
||||
if ( rs < 0 ){
|
||||
perror ("Can't open random source ");
|
||||
exit;
|
||||
}
|
||||
} else {
|
||||
perror ("Can't find random source ");
|
||||
}
|
||||
|
||||
/*add count to check size is less than PSIZE */
|
||||
x=0; c=0;
|
||||
while (x != 3) {
|
||||
if (SHOWPF == 2) {
|
||||
printf("\n>>%s\n",passphrase);
|
||||
}
|
||||
/* reduce to 1 byte */
|
||||
check=read ( rs, crand,2);
|
||||
crand[0] = (crand[0] %26 );
|
||||
crand[1] = (crand[1] %26 );
|
||||
buildgrid (&crand[0]);
|
||||
x = getcords (&thischar[0]);
|
||||
|
||||
switch (x) {
|
||||
case 1:
|
||||
/* if not 257 */
|
||||
*curletter=thischar[0];
|
||||
printf ("\n\n\n\n\n");
|
||||
if (SHOWPF == 1) {
|
||||
printf ("Last letter was %c \n", *curletter);
|
||||
}
|
||||
curletter++;
|
||||
break;
|
||||
case -1:
|
||||
printf ("please try again \n");
|
||||
break;
|
||||
case 2: /* DEL or backspace */
|
||||
if ( curletter >= &passphrase[0]) {
|
||||
curletter--;
|
||||
*curletter='\0';
|
||||
}
|
||||
break;
|
||||
case 3: /* Enter */
|
||||
/* log size of passphrase here */
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int main (int argc, char *argv[]) {
|
||||
extern char passphrase[PSIZE+2];
|
||||
char buffer[PSIZE+4];
|
||||
char * count;
|
||||
ssize_t pushed, foo;
|
||||
extern char SHOWPF;
|
||||
char fd_name[6];
|
||||
int i, fd_out, fd_gpg;
|
||||
char *exec_argv[(argc+4)]; /* BUG: should be enough*/
|
||||
struct stat statbuf;
|
||||
|
||||
memset (&passphrase,NULL, sizeof(passphrase));
|
||||
memset (&fd_name,NULL, sizeof(fd_name));
|
||||
|
||||
/* check if we already have a cached passphrase */
|
||||
if ((fd_out= open (FILENAME,O_RDONLY, 0600)) == -1 ) {
|
||||
perror ("Damn, can't open passphrase file") ;
|
||||
} else {
|
||||
pushed = read ( fd_out, passphrase, (PSIZE+1) );
|
||||
/* BUG, don't find 1 char short */
|
||||
if ( pushed <0 ) {
|
||||
perror ("Whoah, writing went strange:");
|
||||
}
|
||||
close (fd_out);
|
||||
}
|
||||
|
||||
if (strlen(passphrase) ==0) {
|
||||
perror ("stat failed:");
|
||||
/* Ask if we want to display the passphrase */
|
||||
printf("By default, you will see the last letter you entered. Do you \nwant to display the entire passphrase on the screen instead? \n");
|
||||
printf ("select y for full passphrase, b for no feedback, n for default\n");
|
||||
printf (" [y/b/N]\n");
|
||||
|
||||
count = fgets( buffer, PSIZE, stdin);
|
||||
switch (count[0]) {
|
||||
case 'y':
|
||||
case 'Y':
|
||||
SHOWPF = 2;
|
||||
break;
|
||||
case 'b':
|
||||
case 'B':
|
||||
SHOWPF = 0;
|
||||
break;
|
||||
default:
|
||||
SHOWPF = 1;
|
||||
break;
|
||||
}
|
||||
getpassphrase();
|
||||
|
||||
/* Ask if we want to save the passphrase */
|
||||
|
||||
printf ("\n\n GPGgrid can store your passphrase on the RAMdisk and re-use \n it later. This saves a lot of time, but does leave the passphrase vulnerable \n until reboot.\n");
|
||||
|
||||
printf("Do you want to store the passphrase in RAM ? [Y/n]\n");
|
||||
count = fgets( buffer, PSIZE, stdin);
|
||||
if ( count[0] != 'n' && count[0] != 'N') {
|
||||
/* write to disk */
|
||||
printf ("writing to disk\n" );
|
||||
if (stat(FILENAME, &statbuf) == 0 && ( S_ISREG(statbuf.st_mode) )) {
|
||||
if ((fd_out= open (FILENAME,O_RDWR | O_CREAT |O_TRUNC , 0600)) == -1 ) {
|
||||
perror ("Damn, can't write passphrase file") ;
|
||||
}
|
||||
/* BUG: truly lame. Need a write wrapper program */
|
||||
pushed=strlen(passphrase);
|
||||
foo= write(fd_out, passphrase, strlen(passphrase));
|
||||
if (foo != pushed ) {
|
||||
perror ("can't write out the passphrase: ");
|
||||
}
|
||||
close (fd_out) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (SHOWPF == 2) {
|
||||
printf("Final result:: %s\n", &passphrase[0]);
|
||||
}
|
||||
|
||||
/* OK, we're ready to run GPG */
|
||||
printf ("Running GPG with %u args \n", argc);
|
||||
if ((fd_gpg= open (FILENAME,O_RDONLY, 0600)) == -1 ) {
|
||||
perror ("Damn, can't read passphrase file") ;
|
||||
}
|
||||
sprintf(&fd_name[0], "%d",fd_gpg);
|
||||
|
||||
exec_argv[0]="gpg";
|
||||
exec_argv[1]="--passphrase-fd";
|
||||
exec_argv[2]=&fd_name[0] ;
|
||||
for (i= 1; i <= argc ; i++) {
|
||||
exec_argv[i+2]=argv[i];
|
||||
}
|
||||
execvp ("gpg", exec_argv );
|
||||
return -1;
|
||||
}
|
@ -0,0 +1,357 @@
|
||||
/* gpggrid : wrapper for gpg that lets you enter in the password
|
||||
* optionally stores passphrase in /tmp/ . This is fine if /tmp
|
||||
* is an encrypted ramdisk and this is a single user machine.
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright (c) 2002 Anonymous (anonymous @ nameless.cultists.net)
|
||||
Morten Poulsen <morten@afdelingp.dk>
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
* 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
|
||||
*/
|
||||
|
||||
/* CHANGES
|
||||
* 1.1 release, code was substantially improved by Morten Poulsen.
|
||||
* User options made somewhat clearer.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
|
||||
#define FILENAME "/tmp/P"
|
||||
#define PSIZE 256 /* max passphrase size */
|
||||
|
||||
#define OUT 0
|
||||
#define IN 1
|
||||
|
||||
/* I'm only allowing characters that most people might
|
||||
actually know what to do with:
|
||||
EOT, BEL &etc are out as is newline, which leaves us with ASCII
|
||||
8-10,32-128
|
||||
High ascii could be added, but I haven't checked for nastys
|
||||
*/
|
||||
|
||||
/* 94 plus 5 unprintables */
|
||||
static char printable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789{|}~[\\]^_`!\"#$%&\'()*+,-./:;<=>?@";
|
||||
/* ASCII order="!\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; */
|
||||
|
||||
char column[26];
|
||||
char row[9];
|
||||
char passphrase[PSIZE+2];
|
||||
char SHOWPF=0;
|
||||
|
||||
void buildgrid(char *rand) {
|
||||
int i, r;
|
||||
|
||||
printf (" ");
|
||||
for (i=0; i<26; i++) {
|
||||
column[i] = printable[0 + ((i+rand[0]) % 26)];
|
||||
printf("%c ", column[i]);
|
||||
}
|
||||
printf ("\n");
|
||||
|
||||
for (i=0; i<9; i++) {
|
||||
row[i] = printable[26 + ((i+rand[1]) % 26)];
|
||||
}
|
||||
|
||||
r = 0;
|
||||
for (i=0; i<strlen(printable); i++) {
|
||||
if ((i % 26) == 0) {
|
||||
printf ("\n");
|
||||
printf ("%c ", row[r++]);
|
||||
}
|
||||
printf ("%c ", printable[i]);
|
||||
}
|
||||
|
||||
/* UI is hard... Separate lines for these */
|
||||
printf ("\n%c Backspace", row[r++]);
|
||||
printf ("\n%c Tab", row[r++]);
|
||||
printf ("\n%c Enter (stop entering characters)", row[r++]);
|
||||
printf ("\n%c Space", row[r++]);
|
||||
printf ("\n%c Delete\n\n", row[r++]);
|
||||
}
|
||||
|
||||
|
||||
int getcoords (char *key) {
|
||||
char *count;
|
||||
int i;
|
||||
int x = 0, y = 0;
|
||||
char buffer[PSIZE];
|
||||
int M = 0;
|
||||
int xok = 0, yok = 0;
|
||||
|
||||
do {
|
||||
printf("Enter vertical row (lowercase) then horizontal column (UPPERCASE): ");
|
||||
count = fgets(buffer, PSIZE, stdin);
|
||||
|
||||
if (count) {
|
||||
for (i=0; i<9; i++) {
|
||||
if (buffer[0] == row[i]) {
|
||||
y = i;
|
||||
yok = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (i=0; i<26; i++) {
|
||||
if (buffer[1] == column[i]) {
|
||||
x = i;
|
||||
xok = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} while (!yok);
|
||||
|
||||
/* Be nice to people who accidentally press enter too early */
|
||||
while (!xok) {
|
||||
printf("Please enter horizontal column (UPPER CASE) grid letter: ");
|
||||
count = fgets(buffer, PSIZE, stdin);
|
||||
|
||||
if (count) {
|
||||
for (i=0; i<26; i++) {
|
||||
if (buffer[0] == column[i]) {
|
||||
x = i;
|
||||
xok = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
M = 26 * y + x;
|
||||
|
||||
if (M > 93) {
|
||||
switch (M/26) {
|
||||
case 4:
|
||||
strcpy(key, "Backspace");
|
||||
return 2;
|
||||
case 5:
|
||||
strcpy(key, "\t");
|
||||
return 1;
|
||||
case 6:
|
||||
strcpy(key, "\n");
|
||||
return 3;
|
||||
case 7:
|
||||
strcpy(key, " ");
|
||||
return 1;
|
||||
case 8:
|
||||
strcpy(key, "Delete");
|
||||
return 2;
|
||||
default:
|
||||
strcpy(key, "ERR");
|
||||
return -1;
|
||||
}
|
||||
|
||||
} else {
|
||||
*key = printable[M];
|
||||
/* printf ("%d You seem to have chosen %c,%c ,which is %c\n",M, y,x, *key);*/
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int getpassphrase() {
|
||||
char x;
|
||||
unsigned char crand[3];
|
||||
extern char passphrase[PSIZE+2];
|
||||
int check, c;
|
||||
int rs=-1;
|
||||
char thischar[12];
|
||||
char *curletter;
|
||||
struct stat statbuf;
|
||||
extern char SHOWPF;
|
||||
|
||||
curletter = passphrase;
|
||||
|
||||
/* initialize random source */
|
||||
if (stat("/dev/urandom", &statbuf) != 0 || !S_ISCHR(statbuf.st_mode)) {
|
||||
perror ("Can't find random source");
|
||||
exit(EXIT_FAILURE);
|
||||
} else {
|
||||
rs = open("/dev/urandom", O_RDONLY);
|
||||
if (rs < 0) {
|
||||
perror("Can't open random source");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
x=0; c=0;
|
||||
while (x != 3) {
|
||||
printf("\n\n\n\n\n");
|
||||
|
||||
if (SHOWPF == 2) {
|
||||
printf(">>%s\n\n", passphrase);
|
||||
}
|
||||
|
||||
check = read(rs, crand, 2);
|
||||
crand[0] = (crand[0] % 26);
|
||||
crand[1] = (crand[1] % 26);
|
||||
buildgrid(crand);
|
||||
|
||||
x = getcoords(thischar);
|
||||
|
||||
switch (x) {
|
||||
case 1:
|
||||
/* if not 257 */
|
||||
*curletter = *thischar;
|
||||
if (SHOWPF == 1) {
|
||||
printf ("Letter was %c\n\n", *curletter);
|
||||
}
|
||||
curletter++;
|
||||
break;
|
||||
case -1:
|
||||
printf ("please try again\n");
|
||||
break;
|
||||
case 2: /* DEL or backspace */
|
||||
if (curletter >= passphrase) {
|
||||
curletter--;
|
||||
*curletter = '\0';
|
||||
}
|
||||
break;
|
||||
case 3: /* Enter */
|
||||
/* should truncate passphrase at PSIZE. */
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int main (int argc, char **argv) {
|
||||
extern char passphrase[PSIZE+2];
|
||||
char buffer[PSIZE+4];
|
||||
char *count;
|
||||
ssize_t foo;
|
||||
extern char SHOWPF;
|
||||
char fd_name[6];
|
||||
int i, fd_out;
|
||||
char *exec_argv[(argc+4)]; /* BUG: hardcoded, but should be enough */
|
||||
struct stat statbuf;
|
||||
int p[2];
|
||||
|
||||
memset(&passphrase, 0, sizeof(passphrase));
|
||||
memset(&fd_name, 0, sizeof(fd_name));
|
||||
|
||||
/* check if we already have a cached passphrase */
|
||||
if ((fd_out = open(FILENAME, O_RDONLY)) > 0) {
|
||||
printf("Using stored passphrase.\n");
|
||||
read(fd_out, passphrase, (PSIZE+1));
|
||||
/* We don't need to check for errors. If it fails, the user is asked for
|
||||
passphrase anyway. */
|
||||
close(fd_out);
|
||||
}
|
||||
|
||||
if (strlen(passphrase) == 0) {
|
||||
/* Ask if we want to display the passphrase */
|
||||
printf("By default, you will see the last letter you entered. Do you\n");
|
||||
printf("want to display the entire passphrase on the screen instead?\n");
|
||||
printf("select y for full passphrase, n for no feedback, d for default\n");
|
||||
printf(" [y/n/D]\n");
|
||||
|
||||
count = fgets( buffer, PSIZE, stdin);
|
||||
switch (buffer[0]) {
|
||||
case 'y':
|
||||
case 'Y':
|
||||
SHOWPF = 2;
|
||||
break;
|
||||
case 'n':
|
||||
case 'N':
|
||||
SHOWPF = 0;
|
||||
break;
|
||||
default:
|
||||
SHOWPF = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
getpassphrase();
|
||||
|
||||
/* Ask if we want to save the passphrase */
|
||||
printf("\n\nGPGgrid can store your passphrase on the RAMdisk and re-use\n");
|
||||
printf("it later. This saves a lot of time, but does leave the passphrase vulnerable\n");
|
||||
printf("until reboot.\n");
|
||||
printf("Do you want to store the passphrase in /tmp ? [Y/n]\n");
|
||||
count = fgets(buffer, PSIZE, stdin);
|
||||
|
||||
if (buffer[0] != 'n' && buffer[0] != 'N') {
|
||||
|
||||
/* write to disk */
|
||||
printf ("Writing passphrase to disk.\n" );
|
||||
if ((stat(FILENAME, &statbuf) == 0) && (!S_ISREG(statbuf.st_mode))) {
|
||||
printf(FILENAME " is not a regular file\n");
|
||||
} else {
|
||||
if ((fd_out = open(FILENAME, O_RDWR|O_CREAT|O_TRUNC, 0600)) == -1) {
|
||||
perror("can't open passphrase file for writing") ;
|
||||
} else {
|
||||
foo = write(fd_out, passphrase, strlen(passphrase));
|
||||
if (foo != strlen(passphrase)) {
|
||||
perror("can't write out the passphrase");
|
||||
}
|
||||
close (fd_out) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (SHOWPF == 2) {
|
||||
printf("Final result: %s\n", passphrase);
|
||||
}
|
||||
|
||||
/* OK, we're ready to run GPG */
|
||||
|
||||
if (pipe(p) == -1) {
|
||||
perror("unable to create pipe");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
switch (fork()) {
|
||||
|
||||
case -1: /* failure */
|
||||
perror("unable to fork");
|
||||
exit(EXIT_FAILURE);
|
||||
|
||||
case 0: /* child */
|
||||
close(p[OUT]);
|
||||
write(p[IN], passphrase, strlen(passphrase));
|
||||
close(p[IN]);
|
||||
exit(EXIT_SUCCESS);
|
||||
|
||||
default: /* parent */
|
||||
close(p[IN]);
|
||||
sprintf(fd_name, "%d", p[OUT]);
|
||||
exec_argv[0] = "gpg";
|
||||
exec_argv[1] = "--passphrase-fd";
|
||||
exec_argv[2] = fd_name;
|
||||
for (i=1; i<=argc; i++) { /* <= to get the NULL pointer too */
|
||||
exec_argv[i+2] = argv[i];
|
||||
}
|
||||
execvp("gpg", exec_argv);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* never reached */
|
||||
return EXIT_FAILURE;
|
||||
|
||||
}
|
@ -0,0 +1,357 @@
|
||||
/* gpggrid : wrapper for gpg that lets you enter in the password
|
||||
* optionally stores passphrase in /tmp/ . This is fine if /tmp
|
||||
* is an encrypted ramdisk and this is a single user machine.
|
||||
*/
|
||||
|
||||
/*
|
||||
Copyright (c) 2002 Anonymous (anonymous @ nameless.cultists.net)
|
||||
Morten Poulsen <morten@afdelingp.dk>
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
* 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 COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
|
||||
*/
|
||||
|
||||
/* CHANGES
|
||||
* 1.1 release, code was substantially improved by Morten Poulsen.
|
||||
* User options made somewhat clearer.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
|
||||
#define FILENAME "/tmp/P"
|
||||
#define PSIZE 256 /* max passphrase size */
|
||||
|
||||
#define OUT 0
|
||||
#define IN 1
|
||||
|
||||
/* I'm only allowing characters that most people might
|
||||
actually know what to do with:
|
||||
EOT, BEL &etc are out as is newline, which leaves us with ASCII
|
||||
8-10,32-128
|
||||
High ascii could be added, but I haven't checked for nastys
|
||||
*/
|
||||
|
||||
/* 94 plus 5 unprintables */
|
||||
static char printable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789{|}~[\\]^_`!\"#$%&\'()*+,-./:;<=>?@";
|
||||
/* ASCII order="!\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; */
|
||||
|
||||
char column[26];
|
||||
char row[9];
|
||||
char passphrase[PSIZE+2];
|
||||
char SHOWPF=0;
|
||||
|
||||
void buildgrid(char *rand) {
|
||||
int i, r;
|
||||
|
||||
printf (" ");
|
||||
for (i=0; i<26; i++) {
|
||||
column[i] = printable[0 + ((i+rand[0]) % 26)];
|
||||
printf("%c ", column[i]);
|
||||
}
|
||||
printf ("\n");
|
||||
|
||||
for (i=0; i<9; i++) {
|
||||
row[i] = printable[26 + ((i+rand[1]) % 26)];
|
||||
}
|
||||
|
||||
r = 0;
|
||||
for (i=0; i<strlen(printable); i++) {
|
||||
if ((i % 26) == 0) {
|
||||
printf ("\n");
|
||||
printf ("%c ", row[r++]);
|
||||
}
|
||||
printf ("%c ", printable[i]);
|
||||
}
|
||||
|
||||
/* UI is hard... Separate lines for these */
|
||||
printf ("\n%c Backspace", row[r++]);
|
||||
printf ("\n%c Tab", row[r++]);
|
||||
printf ("\n%c Enter (stop entering characters)", row[r++]);
|
||||
printf ("\n%c Space", row[r++]);
|
||||
printf ("\n%c Delete\n\n", row[r++]);
|
||||
}
|
||||
|
||||
|
||||
int getcoords (char *key) {
|
||||
char *count;
|
||||
int i;
|
||||
int x = 0, y = 0;
|
||||
char buffer[PSIZE];
|
||||
int M = 0;
|
||||
int xok = 0, yok = 0;
|
||||
|
||||
do {
|
||||
printf("Enter vertical row (lowercase) then horizontal column (UPPERCASE): ");
|
||||
count = fgets(buffer, PSIZE, stdin);
|
||||
|
||||
if (count) {
|
||||
for (i=0; i<9; i++) {
|
||||
if (buffer[0] == row[i]) {
|
||||
y = i;
|
||||
yok = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (i=0; i<26; i++) {
|
||||
if (buffer[1] == column[i]) {
|
||||
x = i;
|
||||
xok = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} while (!yok);
|
||||
|
||||
/* Be nice to people who accidentally press enter too early */
|
||||
while (!xok) {
|
||||
printf("Please enter horizontal column (UPPER CASE) grid letter: ");
|
||||
count = fgets(buffer, PSIZE, stdin);
|
||||
|
||||
if (count) {
|
||||
for (i=0; i<26; i++) {
|
||||
if (buffer[0] == column[i]) {
|
||||
x = i;
|
||||
xok = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
M = 26 * y + x;
|
||||
|
||||
if (M > 93) {
|
||||
switch (M/26) {
|
||||
case 4:
|
||||
strcpy(key, "Backspace");
|
||||
return 2;
|
||||
case 5:
|
||||
strcpy(key, "\t");
|
||||
return 1;
|
||||
case 6:
|
||||
strcpy(key, "\n");
|
||||
return 3;
|
||||
case 7:
|
||||
strcpy(key, " ");
|
||||
return 1;
|
||||
case 8:
|
||||
strcpy(key, "Delete");
|
||||
return 2;
|
||||
default:
|
||||
strcpy(key, "ERR");
|
||||
return -1;
|
||||
}
|
||||
|
||||
} else {
|
||||
*key = printable[M];
|
||||
/* printf ("%d You seem to have chosen %c,%c ,which is %c\n",M, y,x, *key);*/
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int getpassphrase() {
|
||||
char x;
|
||||
unsigned char crand[3];
|
||||
extern char passphrase[PSIZE+2];
|
||||
int check, c;
|
||||
int rs=-1;
|
||||
char thischar[12];
|
||||
char *curletter;
|
||||
struct stat statbuf;
|
||||
extern char SHOWPF;
|
||||
|
||||
curletter = passphrase;
|
||||
|
||||
/* initialize random source */
|
||||
if (stat("/dev/urandom", &statbuf) != 0 || !S_ISCHR(statbuf.st_mode)) {
|
||||
perror ("Can't find random source");
|
||||
exit(EXIT_FAILURE);
|
||||
} else {
|
||||
rs = open("/dev/urandom", O_RDONLY);
|
||||
if (rs < 0) {
|
||||
perror("Can't open random source");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
x=0; c=0;
|
||||
while (x != 3) {
|
||||
printf("\n\n\n\n\n");
|
||||
|
||||
if (SHOWPF == 2) {
|
||||
printf(">>%s\n\n", passphrase);
|
||||
}
|
||||
|
||||
check = read(rs, crand, 2);
|
||||
crand[0] = (crand[0] % 26);
|
||||
crand[1] = (crand[1] % 26);
|
||||
buildgrid(crand);
|
||||
|
||||
x = getcoords(thischar);
|
||||
|
||||
switch (x) {
|
||||
case 1:
|
||||
/* if not 257 */
|
||||
*curletter = *thischar;
|
||||
if (SHOWPF == 1) {
|
||||
printf ("Letter was %c\n\n", *curletter);
|
||||
}
|
||||
curletter++;
|
||||
break;
|
||||
case -1:
|
||||
printf ("please try again\n");
|
||||
break;
|
||||
case 2: /* DEL or backspace */
|
||||
if (curletter >= passphrase) {
|
||||
curletter--;
|
||||
*curletter = '\0';
|
||||
}
|
||||
break;
|
||||
case 3: /* Enter */
|
||||
/* should truncate passphrase at PSIZE. */
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int main (int argc, char **argv) {
|
||||
extern char passphrase[PSIZE+2];
|
||||
char buffer[PSIZE+4];
|
||||
char *count;
|
||||
ssize_t foo;
|
||||
extern char SHOWPF;
|
||||
char fd_name[6];
|
||||
int i, fd_out;
|
||||
char *exec_argv[(argc+4)]; /* BUG: hardcoded, but should be enough */
|
||||
struct stat statbuf;
|
||||
int p[2];
|
||||
|
||||
memset(&passphrase, 0, sizeof(passphrase));
|
||||
memset(&fd_name, 0, sizeof(fd_name));
|
||||
|
||||
/* check if we already have a cached passphrase */
|
||||
if ((fd_out = open(FILENAME, O_RDONLY)) > 0) {
|
||||
printf("Using stored passphrase.\n");
|
||||
read(fd_out, passphrase, (PSIZE+1));
|
||||
/* We don't need to check for errors. If it fails, the user is asked for
|
||||
passphrase anyway. */
|
||||
close(fd_out);
|
||||
}
|
||||
|
||||
if (strlen(passphrase) == 0) {
|
||||
/* Ask if we want to display the passphrase */
|
||||
printf("By default, you will see the last letter you entered. Do you\n");
|
||||
printf("want to display the entire passphrase on the screen instead?\n");
|
||||
printf("select y for full passphrase, n for no feedback, d for default\n");
|
||||
printf(" [y/n/D]\n");
|
||||
|
||||
count = fgets( buffer, PSIZE, stdin);
|
||||
switch (buffer[0]) {
|
||||
case 'y':
|
||||
case 'Y':
|
||||
SHOWPF = 2;
|
||||
break;
|
||||
case 'n':
|
||||
case 'N':
|
||||
SHOWPF = 0;
|
||||
break;
|
||||
default:
|
||||
SHOWPF = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
getpassphrase();
|
||||
|
||||
/* Ask if we want to save the passphrase */
|
||||
printf("\n\nGPGgrid can store your passphrase on the RAMdisk and re-use\n");
|
||||
printf("it later. This saves a lot of time, but does leave the passphrase vulnerable\n");
|
||||
printf("until reboot.\n");
|
||||
printf("Do you want to store the passphrase in /tmp ? [Y/n]\n");
|
||||
count = fgets(buffer, PSIZE, stdin);
|
||||
|
||||
if (buffer[0] != 'n' && buffer[0] != 'N') {
|
||||
|
||||
/* write to disk */
|
||||
printf ("Writing passphrase to disk.\n" );
|
||||
if ((stat(FILENAME, &statbuf) == 0) && (!S_ISREG(statbuf.st_mode))) {
|
||||
printf(FILENAME " is not a regular file\n");
|
||||
} else {
|
||||
if ((fd_out = open(FILENAME, O_RDWR|O_CREAT|O_TRUNC, 0600)) == -1) {
|
||||
perror("can't open passphrase file for writing") ;
|
||||
} else {
|
||||
foo = write(fd_out, passphrase, strlen(passphrase));
|
||||
if (foo != strlen(passphrase)) {
|
||||
perror("can't write out the passphrase");
|
||||
}
|
||||
close (fd_out) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (SHOWPF == 2) {
|
||||
printf("Final result: %s\n", passphrase);
|
||||
}
|
||||
|
||||
/* OK, we're ready to run GPG */
|
||||
|
||||
if (pipe(p) == -1) {
|
||||
perror("unable to create pipe");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
switch (fork()) {
|
||||
|
||||
case -1: /* failure */
|
||||
perror("unable to fork");
|
||||
exit(EXIT_FAILURE);
|
||||
|
||||
case 0: /* child */
|
||||
close(p[OUT]);
|
||||
write(p[IN], passphrase, strlen(passphrase));
|
||||
close(p[IN]);
|
||||
exit(EXIT_SUCCESS);
|
||||
|
||||
default: /* parent */
|
||||
close(p[IN]);
|
||||
sprintf(fd_name, "%d", p[OUT]);
|
||||
exec_argv[0] = "staticgpg";
|
||||
exec_argv[1] = "--passphrase-fd";
|
||||
exec_argv[2] = fd_name;
|
||||
for (i=1; i<=argc; i++) { /* <= to get the NULL pointer too */
|
||||
exec_argv[i+2] = argv[i];
|
||||
}
|
||||
execvp("staticgpg", exec_argv);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* never reached */
|
||||
return EXIT_FAILURE;
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user