From d29e450734e37c90fc04b587da2b7a236d9ef316 Mon Sep 17 00:00:00 2001 From: Hal Finney Date: Sun, 27 Feb 2005 10:33:00 -0800 Subject: [PATCH] v1.2.0 --- client/connio.c | 108 ++++++++- client/rpow.i | 482 +++++++++++++------------------------- client/rpowcli.c | 289 ++++++----------------- client/rpowclient.c | 190 +++++---------- client/rpowclient.h | 20 +- client/rpowutil.c | 156 ++++++++++++ scc/installed/certvalid.o | Bin 2496 -> 0 bytes scc/installed/cryptchan.o | Bin 6040 -> 0 bytes scc/installed/dbverify.o | Bin 6772 -> 0 bytes scc/installed/gbignum.o | Bin 11848 -> 0 bytes scc/installed/hmac.o | Bin 2496 -> 0 bytes scc/installed/keygen.o | Bin 6924 -> 0 bytes scc/installed/persist.o | Bin 11836 -> 0 bytes scc/installed/rpio.o | Bin 3132 -> 0 bytes scc/installed/rpow.exe | Bin 246931 -> 0 bytes scc/installed/rpow.o | Bin 5484 -> 0 bytes scc/installed/rpowsign.o | Bin 4464 -> 0 bytes scc/installed/rpowutil.o | Bin 5380 -> 0 bytes server/Makefile | 2 +- server/dbproof.c | 2 + server/rpowsrv.c | 35 +-- 21 files changed, 580 insertions(+), 704 deletions(-) delete mode 100644 scc/installed/certvalid.o delete mode 100644 scc/installed/cryptchan.o delete mode 100644 scc/installed/dbverify.o delete mode 100644 scc/installed/gbignum.o delete mode 100644 scc/installed/hmac.o delete mode 100644 scc/installed/keygen.o delete mode 100644 scc/installed/persist.o delete mode 100644 scc/installed/rpio.o delete mode 100755 scc/installed/rpow.exe delete mode 100644 scc/installed/rpow.o delete mode 100644 scc/installed/rpowsign.o delete mode 100644 scc/installed/rpowutil.o diff --git a/client/connio.c b/client/connio.c index 9d2be54..56c662c 100644 --- a/client/connio.c +++ b/client/connio.c @@ -266,7 +266,7 @@ getstat (char *target, int port, FILE *fout) long rc; struct encstate encdata; unsigned long statbuflen; - int s; + int s; unsigned char cmd; unsigned short cmdbuflen; unsigned char *encbuf1; @@ -618,23 +618,115 @@ dumpbuf (FILE *f, unsigned char *buf, int len, int printoff, int breaklines) printf ("\n"); } +/* Support SOCKS V5 for anonymity */ +static int +dosocksconnect (char *target, int port) +{ + SOCKET s; + struct sockaddr_in sockaddr; + struct hostent *targetinfo; + int hostlen = strlen(target); + unsigned char msg[300]; + + if (hostlen + 7 > sizeof(msg)) { + fprintf (stderr, "Host name %s is too long\n", target); + return -1; + } + + s = socket(AF_INET, SOCK_STREAM, 0); + if (s < 0) { + perror ("socket"); + return -1; + } + sockaddr.sin_family = AF_INET; + sockaddr.sin_port = htons(socksport); + if (!(targetinfo = gethostbyname(sockshost))) { + fprintf (stderr, "Unknown SOCKS host machine name %s\n", sockshost); + return -1; + } + if (!targetinfo->h_addr_list) { + fprintf (stderr, "No address information available for %s\n", + target); + return -1; + } + sockaddr.sin_addr.s_addr = **(u_long **)targetinfo->h_addr_list; + + if (connect (s, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) < 0) { + perror ("connect"); + return -1; + } + + /* See RFC 1928 for SOCKS V5 */ + msg[0] = 5; /* version */ + msg[1] = 1; /* number of authenticator methods */ + msg[2] = 0; /* 0 means no authentication */ + if (send (s, msg, 3, 0) != 3) { + perror ("send"); + return -1; + } + + /* Reply: version, selected auth */ + if (recv (s, msg, 2, 0) != 2) { + perror ("recv"); + return -1; + } + + if (msg[0] != 5 || msg[1] != 0) { + fprintf (stderr, "Unable to authenticate to SOCKS server %s\n", + sockshost); + return -1; + } + + msg[0] = 5; /* version */ + msg[1] = 1; /* command: connect(1) */ + msg[2] = 0; /* reserved */ + msg[3] = 3; /* address type */ + msg[4] = (unsigned char)hostlen; + strcpy (msg+5, target); + msg[5+hostlen] = (unsigned char)(port >> 8); + msg[6+hostlen] = (unsigned char)port; + + if (send (s, msg, hostlen+7, 0) != hostlen+7) { + perror ("send"); + return -1; + } + + if (recv (s, msg, sizeof(msg), 0) < 7) { + perror ("recv"); + return -1; + } + + if (msg[0] != 5 || msg[1] != 0) { + fprintf (stderr, "Socks error %d\n", msg[1]); + return -1; + } + + /* Success! */ + + return s; +} + static int doconnect (char *target, int port) { - SOCKET s; - struct sockaddr_in sockaddr; + SOCKET s; + struct sockaddr_in sockaddr; struct hostent *targetinfo; #if defined(_WIN32) WSAStartup (0x0101, &ws); #endif - s = socket(AF_INET, SOCK_STREAM, 0); - if (s < 0) { + + if (usesocks) + return dosocksconnect (target, port); + + s = socket(AF_INET, SOCK_STREAM, 0); + if (s < 0) { perror ("socket"); return -1; - } - sockaddr.sin_family = AF_INET; - sockaddr.sin_port = htons(port); + } + sockaddr.sin_family = AF_INET; + sockaddr.sin_port = htons(port); if (!(targetinfo = gethostbyname(target))) { fprintf (stderr, "Unknown target machine name\n"); return -1; diff --git a/client/rpow.i b/client/rpow.i index 3a5e4ed..781ed80 100644 --- a/client/rpow.i +++ b/client/rpow.i @@ -1,4 +1,5 @@ %module rpow +%include "carrays.i" %{ #include @@ -35,15 +36,22 @@ typedef struct rpow { int idlen; } rpow; +/* Define new_rpowarray(n), delete_rpowarray(arr), + * rpowarray_getitem(arr,n), rpowarray_setitem(arr,n,val) + */ +%array_functions(rpow *, rpowarray) -/* File names for keys */ -extern char *rpowfile; -extern char *signfile; -extern char *commfile; +int +nexchange(rpow *rpout[], rpow *rpin[], int nin, int ov1, int ov2=0, int ov3=0, +int ov4=0, int ov5=0, int ov6=0, int ov7=0, int ov8=0, int ov9=0, int ov10=0); + +int +zexchange(rpow *rp1, rpow *rp2, rpow *rp3, rpow *rp4=0, rpow *rp5=0, +rpow *rp6=0, rpow *rp7=0, rpow *rp8=0, rpow *rp9=0, rpow *rp10=0, rpow *rp11=0, +rpow *rp12=0, rpow *rp13=0, rpow *rp14=0, rpow *rp15=0, rpow *rp16=0, +rpow *rp17=0, rpow *rp18=0, rpow *rp19=0, rpow *rp20=0, rpow *rp21=0); -/* Host and port for server */ -extern char targethost[256]; -extern int targetport; +void rpow_free(rpow *rp); %inline %{ @@ -52,32 +60,6 @@ extern int targetport; pubkey signkey; - -static void -_dolock (FILE *f) -{ - int err; - struct flock l; - extern int errno; - l.l_start = l.l_len = 0; - l.l_pid = 0; - l.l_type = F_WRLCK; - l.l_whence = SEEK_SET; - while (fcntl (fileno(f), F_SETLKW, &l) < 0 && errno == EINTR) - ; -} - -static void -_dounlock (FILE *f) -{ - struct flock l; - l.l_start = l.l_len = 0; - l.l_pid = 0; - l.l_type = F_UNLCK; - l.l_whence = SEEK_SET; - fcntl (fileno(f), F_SETLK, &l); -} - rpow * gen(int value) { @@ -103,175 +85,153 @@ exchange(rpow *rpin) return rpout; } -rpow * -join2(rpow *rpin1, rpow *rpin2) -{ - rpow *rpout = NULL; - rpow *rpins[2]; - int outval; - int status; - - if (rpin1 == NULL || rpin2 == NULL - || rpin2->value != rpin1->value) - return NULL; - outval = rpin1->value+1; - - rpins[0] = rpin1; - rpins[1] = rpin2; - - status = server_exchange (&rpout, targethost, targetport, 2, rpins, 1, - &outval, &signkey); - if (status != 0) - return NULL; - return rpout; -} - -rpow * -join4(rpow *rpin1, rpow *rpin2, rpow *rpin3, rpow *rpin4) -{ - rpow *rpout = NULL; - rpow *rpins[4]; - int outval; - int status; - - if (rpin1 == NULL || rpin2 == NULL || rpin3 == NULL || rpin4 == NULL - || rpin2->value != rpin1->value || rpin3->value != rpin1->value - || rpin4->value != rpin1->value) - return NULL; - outval = rpin1->value+2; - - rpins[0] = rpin1; - rpins[1] = rpin2; - rpins[2] = rpin3; - rpins[3] = rpin4; - - status = server_exchange (&rpout, targethost, targetport, 4, rpins, 1, - &outval, &signkey); - if (status != 0) - return NULL; - return rpout; -} - -rpow * -join8(rpow *rpin1, rpow *rpin2, rpow *rpin3, rpow *rpin4, rpow *rpin5, rpow *rpin6, rpow *rpin7, rpow *rpin8) -{ - rpow *rpout = NULL; - rpow *rpins[8]; - int outval; - int status; - - if (rpin1 == NULL || rpin2 == NULL || rpin3 == NULL || rpin4 == NULL - || rpin5 == NULL || rpin6 == NULL || rpin7 == NULL || rpin8 == NULL - || rpin2->value != rpin1->value || rpin3->value != rpin1->value - || rpin4->value != rpin1->value || rpin5->value != rpin1->value - || rpin6->value != rpin1->value || rpin7->value != rpin1->value - || rpin8->value != rpin1->value) - return NULL; - outval = rpin1->value+3; - - rpins[0] = rpin1; - rpins[1] = rpin2; - rpins[2] = rpin3; - rpins[3] = rpin4; - rpins[4] = rpin5; - rpins[5] = rpin6; - rpins[6] = rpin7; - rpins[7] = rpin8; - - status = server_exchange (&rpout, targethost, targetport, 8, rpins, 1, - &outval, &signkey); - if (status != 0) - return NULL; - return rpout; -} - -typedef struct rpows { - rpow *rp1, *rp2, *rp3, *rp4, *rp5, *rp6, *rp7, *rp8; -} rpows; - -rpows * -split2(rpow *rpin) +/* This lets you do nexchange(rpo, rpi, 4, 23, 23) to turn 4 22's to 2 23's */ +int +nexchange(rpow *rpout[], rpow *rpin[], int nin, int ov1, int ov2, int ov3, +int ov4, int ov5, int ov6, int ov7, int ov8, int ov9, int ov10) { - rpows *rpp; - rpow *rpouts[2]; - int outvals[2]; + int outvals[10]; + int nout; int status; - if (rpin == NULL || rpin->value == RPOW_VALUE_MIN) - return NULL; - - outvals[0] = outvals[1] = rpin->value-1; - rpouts[0] = rpouts[1] = NULL; - - status = server_exchange (rpouts, targethost, targetport, 1, &rpin, 2, - outvals, &signkey); - if (status != 0) - return NULL; - - rpp = malloc(sizeof(rpows)); - rpp->rp1 = rpouts[0]; - rpp->rp2 = rpouts[1]; - return rpp; + if (nin > 10) + return -1; + nout = 0; + outvals[nout++] = ov1; + if (ov2) + outvals[nout++] = ov2; + if (ov3) + outvals[nout++] = ov3; + if (ov4) + outvals[nout++] = ov4; + if (ov5) + outvals[nout++] = ov5; + if (ov6) + outvals[nout++] = ov6; + if (ov7) + outvals[nout++] = ov7; + if (ov8) + outvals[nout++] = ov8; + if (ov9) + outvals[nout++] = ov9; + if (ov10) + outvals[nout++] = ov10; + + status = server_exchange (rpout, targethost, targetport, nin, rpin, + nout, outvals, &signkey); + return status; } -rpows * -split4(rpow *rpin) +int +zexchange(rpow *rp1, rpow *rp2, rpow *rp3, rpow *rp4, rpow *rp5, +rpow *rp6, rpow *rp7, rpow *rp8, rpow *rp9, rpow *rp10, rpow *rp11, +rpow *rp12, rpow *rp13, rpow *rp14, rpow *rp15, rpow *rp16, +rpow *rp17, rpow *rp18, rpow *rp19, rpow *rp20, rpow *rp21) { - rpows *rpp; - rpow *rpouts[4]; - int outvals[4]; + rpow *rpi[10]; + rpow *rpo[10]; + rpow *rpout[10]; + int outvals[10]; + int nin = 0; + int nout = 0; int status; + int i; - if (rpin == NULL || rpin->value <= RPOW_VALUE_MIN+1) - return NULL; - - outvals[0] = outvals[1] = outvals[2] = outvals[3] = rpin->value-2; - rpouts[0] = rpouts[1] = rpouts[2] = rpouts[3] = NULL; - - status = server_exchange (rpouts, targethost, targetport, 1, &rpin, 4, - outvals, &signkey); - if (status != 0) - return NULL; - - rpp = malloc(sizeof(rpows)); - rpp->rp1 = rpouts[0]; - rpp->rp2 = rpouts[1]; - rpp->rp3 = rpouts[2]; - rpp->rp4 = rpouts[3]; - return rpp; -} - -rpows * -split8(rpow *rpin) -{ - rpows *rpp; - rpow *rpouts[8]; - int outvals[8]; - int status; + do { + if (rp1) rpi[nin++] = rp1; else break; + if (rp2) rpi[nin++] = rp2; else break; + if (rp3) rpi[nin++] = rp3; else break; + if (rp4) rpi[nin++] = rp4; else break; + if (rp5) rpi[nin++] = rp5; else break; + if (rp6) rpi[nin++] = rp6; else break; + if (rp7) rpi[nin++] = rp7; else break; + if (rp8) rpi[nin++] = rp8; else break; + if (rp9) rpi[nin++] = rp9; else break; + if (rp10) rpi[nin++] = rp10; else break; + if (rp11) rpi[nin++] = rp11; else break; + if (rp12) rpi[nin++] = rp12; else break; + if (rp13) rpi[nin++] = rp13; else break; + if (rp14) rpi[nin++] = rp14; else break; + if (rp15) rpi[nin++] = rp15; else break; + if (rp16) rpi[nin++] = rp16; else break; + if (rp17) rpi[nin++] = rp17; else break; + if (rp18) rpi[nin++] = rp18; else break; + if (rp19) rpi[nin++] = rp19; else break; + if (rp20) rpi[nin++] = rp20; else break; + if (rp21) rpi[nin++] = rp21; else break; + } while (0); + + nout = -nin - 2; + + do { + if (++nout >= 0) if (rp1) rpo[nout] = rp1; else break; + if (++nout >= 0) if (rp2) rpo[nout] = rp2; else break; + if (++nout >= 0) if (rp3) rpo[nout] = rp3; else break; + if (++nout >= 0) if (rp4) rpo[nout] = rp4; else break; + if (++nout >= 0) if (rp5) rpo[nout] = rp5; else break; + if (++nout >= 0) if (rp6) rpo[nout] = rp6; else break; + if (++nout >= 0) if (rp7) rpo[nout] = rp7; else break; + if (++nout >= 0) if (rp8) rpo[nout] = rp8; else break; + if (++nout >= 0) if (rp9) rpo[nout] = rp9; else break; + if (++nout >= 0) if (rp10) rpo[nout] = rp10; else break; + if (++nout >= 0) if (rp11) rpo[nout] = rp11; else break; + if (++nout >= 0) if (rp12) rpo[nout] = rp12; else break; + if (++nout >= 0) if (rp13) rpo[nout] = rp13; else break; + if (++nout >= 0) if (rp14) rpo[nout] = rp14; else break; + if (++nout >= 0) if (rp15) rpo[nout] = rp15; else break; + if (++nout >= 0) if (rp16) rpo[nout] = rp16; else break; + if (++nout >= 0) if (rp17) rpo[nout] = rp17; else break; + if (++nout >= 0) if (rp18) rpo[nout] = rp18; else break; + if (++nout >= 0) if (rp19) rpo[nout] = rp19; else break; + if (++nout >= 0) if (rp20) rpo[nout] = rp20; else break; + if (++nout >= 0) if (rp21) rpo[nout] = rp21; else break; + } while (0); + + if (nin < 1 || nin > 10 || nout < 1 || nout > 10) + return -1; - if (rpin == NULL || rpin->value <= RPOW_VALUE_MIN+2) - return NULL; + for (i=0; ivalue; + for (i=0; ivalue); + printf ("0 "); + for (i=0; ivalue); + printf ("\n"); - outvals[0] = outvals[1] = outvals[2] = outvals[3] = - outvals[4] = outvals[5] = outvals[6] = outvals[7] = rpin->value-3; - rpouts[0] = rpouts[1] = rpouts[2] = rpouts[3] = - rpouts[4] = rpouts[5] = rpouts[6] = rpouts[7] = NULL; + status = server_exchange (rpout, targethost, targetport, nin, rpi, + nout, outvals, &signkey); - status = server_exchange (rpouts, targethost, targetport, 1, &rpin, 8, - outvals, &signkey); if (status != 0) - return NULL; + return status; + + nout = -nin - 2; + + do { + if (++nout >= 0) if (rp1) *rp1 = *rpout[nout]; + if (++nout >= 0) if (rp2) *rp2 = *rpout[nout]; + if (++nout >= 0) if (rp3) *rp3 = *rpout[nout]; + if (++nout >= 0) if (rp4) *rp4 = *rpout[nout]; + if (++nout >= 0) if (rp5) *rp5 = *rpout[nout]; + if (++nout >= 0) if (rp6) *rp6 = *rpout[nout]; + if (++nout >= 0) if (rp7) *rp7 = *rpout[nout]; + if (++nout >= 0) if (rp8) *rp8 = *rpout[nout]; + if (++nout >= 0) if (rp9) *rp9 = *rpout[nout]; + if (++nout >= 0) if (rp10) *rp10 = *rpout[nout]; + if (++nout >= 0) if (rp11) *rp11 = *rpout[nout]; + if (++nout >= 0) if (rp12) *rp12 = *rpout[nout]; + if (++nout >= 0) if (rp13) *rp13 = *rpout[nout]; + if (++nout >= 0) if (rp14) *rp14 = *rpout[nout]; + if (++nout >= 0) if (rp15) *rp15 = *rpout[nout]; + if (++nout >= 0) if (rp16) *rp16 = *rpout[nout]; + if (++nout >= 0) if (rp17) *rp17 = *rpout[nout]; + if (++nout >= 0) if (rp18) *rp18 = *rpout[nout]; + if (++nout >= 0) if (rp19) *rp19 = *rpout[nout]; + if (++nout >= 0) if (rp20) *rp20 = *rpout[nout]; + if (++nout >= 0) if (rp21) *rp21 = *rpout[nout]; + } while (0); - rpp = malloc(sizeof(rpows)); - rpp->rp1 = rpouts[0]; - rpp->rp2 = rpouts[1]; - rpp->rp3 = rpouts[2]; - rpp->rp4 = rpouts[3]; - rpp->rp5 = rpouts[4]; - rpp->rp6 = rpouts[5]; - rpp->rp7 = rpouts[6]; - rpp->rp8 = rpouts[7]; - return rpp; + return 0; } @@ -279,87 +239,10 @@ split8(rpow *rpin) int store (rpow *rp) { - FILE *fout; - rpowio *rpout; - - fout = fopen (rpowfile, "ab"); - if (fout == NULL) - { - fprintf (stderr, "Unable to write rpow to %s\n", rpowfile); - return -1; - } - _dolock (fout); - rpout = rp_new_from_file (fout); - rpow_write (rp, rpout); - _dounlock (fout); - fclose (fout); - rp_free (rpout); - return 0; + return rpow_to_store(rp); } -/* Find an rpow in the rpows file and return it */ -static rpow * -rpow_load (int value) -{ - FILE *fin; - rpowio *rpio; - rpow *rp = NULL; - unsigned char *buf; - long fpos = 0; - long fposprev = 0; - int bufsize = 1000; - int nr; - - fin = fopen (rpowfile, "r+b"); - if (fin == NULL) - { - fprintf (stderr, "Unable to open rpow data file %s\n", rpowfile); - return NULL; - } - _dolock (fin); - rpio = rp_new_from_file (fin); - - for ( ; ; ) - { - rp = rpow_read (rpio); - fposprev = fpos; - fpos = ftell (fin); - if (rp == NULL || rp->value == value) - break; - rpow_free (rp); - } - - if (rp == NULL) - { - _dounlock (fin); - fclose (fin); - rp_free (rpio); - return NULL; - } - - /* Delete entry from file */ - buf = malloc (bufsize); - for ( ; ; ) - { - fseek (fin, fpos, SEEK_SET); - nr = fread (buf, 1, bufsize, fin); - if (nr == 0) - break; - fseek (fin, fposprev, SEEK_SET); - fwrite (buf, 1, nr, fin); - fpos += nr; - fposprev += nr; - } - free (buf); - - ftruncate (fileno(fin), (off_t)fposprev); - _dounlock (fin); - fclose (fin); - rp_free (rpio); - - return rp; -} /* Helper for load - break num outval items to create numo of size outval */ static int dobreakval (int num, int val, int numo, int outval) @@ -374,7 +257,7 @@ static int dobreakval (int num, int val, int numo, int outval) for (i=0; ivalue == tval) - ++count; - rpow_free (rp); + fprintf (stderr, "Unable to open rpow data store\n"); + exit (1); } - - _dounlock (fin); - fclose (fin); - rp_free (rpio); + + count = counts[tval - RPOW_VALUE_MIN]; if (count != 0) break; @@ -468,10 +331,10 @@ load (int value) { rpow *rp; - if ((rp = rpow_load(value)) == NULL) + if ((rp = rpow_from_store(value)) == NULL) { if (dobreak (value) == 0) - rp = rpow_load(value); + rp = rpow_from_store(value); } return rp; } @@ -480,37 +343,18 @@ load (int value) int countvals (int val) { - FILE *fin = fopen (rpowfile, "rb"); - rpowio *rpio; - rpow *rp = NULL; - int count = 0; + int counts[RPOW_VALUE_MAX - RPOW_VALUE_MIN + 1]; if (val < RPOW_VALUE_MIN || val > RPOW_VALUE_MAX) return 0; - if (fin == NULL) + if (rpow_count(counts) < 0) { - fprintf (stderr, "Unable to open rpow data file %s\n", rpowfile); + fprintf (stderr, "Unable to open rpow data storen"); return 0; } - _dolock (fin); - rpio = rp_new_from_file (fin); - - for ( ; ; ) - { - rp = rpow_read (rpio); - if (rp == NULL) - break; - if (rp->value == val) - ++count; - rpow_free (rp); - } - - _dounlock (fin); - fclose (fin); - rp_free (rpio); - return count; + return counts[val-RPOW_VALUE_MIN]; } char * diff --git a/client/rpowcli.c b/client/rpowcli.c index 401fba5..e41648e 100644 --- a/client/rpowcli.c +++ b/client/rpowcli.c @@ -30,128 +30,14 @@ #include #include -#include #include -#include #include "rpowcli.h" -#if defined(_WIN32) -#define ftruncate chsize -#endif - #define RPOW_VERSION "RPOW client version 1.1.0" static pubkey signkey; -static void -dolock (FILE *f) -{ -#ifndef _WIN32 - struct flock l; - l.l_start = l.l_len = 0; - l.l_pid = 0; - l.l_type = F_WRLCK; - l.l_whence = SEEK_SET; - while (fcntl (fileno(f), F_SETLKW, &l) < 0 && errno == EINTR) - ; -#endif -} - -static void -dounlock (FILE *f) -{ -#ifndef _WIN32 - struct flock l; - l.l_start = l.l_len = 0; - l.l_pid = 0; - l.l_type = F_UNLCK; - l.l_whence = SEEK_SET; - fcntl (fileno(f), F_SETLK, &l); -#endif -} - -static void -rpow_to_file (rpow *rp, const char *fname) -{ - FILE *fout; - rpowio *rpout; - - fout = fopen (fname, "ab"); - if (fout == NULL) - { - fprintf (stderr, "Unable to write rpow to %s\n", fname); - exit (1); - } - dolock (fout); - fseek (fout, 0, SEEK_END); - rpout = rp_new_from_file (fout); - rpow_write (rp, rpout); - dounlock (fout); - fclose (fout); - rp_free (rpout); -} - - -static rpow * rpow_from_file (int value, const char *fname) -{ - FILE *fin; - rpowio *rpio; - rpow *rp = NULL; - uchar *buf; - long fpos = 0; - long fposprev = 0; - int bufsize = 1000; - int nr; - - fin = fopen (fname, "r+b"); - if (fin == NULL) - { - fprintf (stderr, "Unable to open rpow data file %s\n", fname); - exit (1); - } - dolock (fin); - rpio = rp_new_from_file (fin); - - for ( ; ; ) - { - rp = rpow_read (rpio); - fposprev = fpos; - fpos = ftell (fin); - if (rp == NULL || rp->value == value) - break; - rpow_free (rp); - } - - if (rp == NULL) - { - dounlock (fin); - return NULL; - } - - /* Delete entry from file */ - buf = malloc (bufsize); - for ( ; ; ) - { - fseek (fin, fpos, SEEK_SET); - nr = fread (buf, 1, bufsize, fin); - if (nr == 0) - break; - fseek (fin, fposprev, SEEK_SET); - fwrite (buf, 1, nr, fin); - fpos += nr; - fposprev += nr; - } - free (buf); - - ftruncate (fileno(fin), (off_t)fposprev); - dounlock (fin); - fclose (fin); - rp_free (rpio); - - return rp; -} - static int dogen (char *target, int port, int value) @@ -163,8 +49,8 @@ dogen (char *target, int port, int value) rp = rpow_gen (value, signkey.cardid); if (rp == NULL) { - fprintf (stderr, "Unable to generate a coin of value %d\n", value); - exit (2); + fprintf (stderr, "Unable to generate an rpow of value %d\n", value); + exit (-1); } err = server_exchange (&rpnew, target, port, 1, &rp, 1, &value, &signkey); @@ -172,13 +58,14 @@ dogen (char *target, int port, int value) exit (err); rpow_free (rp); - rpow_to_file (rpnew, rpowfile); + if (rpow_to_store (rpnew) < 0) + fprintf (stderr, "Error, unable to store rpow\n"); return 0; } -/* Continue to generate coins until interrupted; consolidate them too */ +/* Continue to generate rpows until interrupted; consolidate them too */ static int dogencontin (char *target, int port) { @@ -203,16 +90,16 @@ printf ("Using hashcash core %s\n", hashcash_core_name(hashcash_core())); rp[numgen++] = rpow_gen (genval, signkey.cardid); if (rp == NULL) { - fprintf (stderr, "Unable to generate a coin of value %d\n", genval); + fprintf (stderr, "Unable to generate an rpow of value %d\n", genval); exit (2); } -printf ("Generated a coin of value %d\n", genval); +printf ("Generated an rpow of value %d\n", genval); if (numgen == 8) { int i; outval = genval + 3; -printf ("Exchanging %d coins of value %d for one of value %d\n", numgen, genval, outval); +printf ("Exchanging %d rpows of value %d for one of value %d\n", numgen, genval, outval); err = server_exchange (&rpnew, target, port, numgen, rp, 1, &outval, &signkey); if (err != 0) @@ -224,10 +111,11 @@ putchar ('\n');} } for (i=0; i= 0) - rpow_to_file (rp[i], rpowfile); + { + if (rpow_to_store (rp[i]) < 0) + fprintf (stderr, "Error, unable to store rpow\n"); + } return -1; } } @@ -266,51 +157,35 @@ static int doconsolval (char *target, int port, int num, int val, int outval) if (err != 0) { for (i=0; ivalue == val) - ++count; - rpow_free (rp); - } - - dounlock (fin); - fclose (fin); - rp_free (rpio); + count = counts[val - RPOW_VALUE_MIN]; while (count >= 8 && val+3 <= RPOW_VALUE_MAX) { @@ -336,6 +211,7 @@ static int doconsol (char *target, int port) count -= 2; } } + return 0; } static int doin (char *target, int port) @@ -390,7 +266,8 @@ static int doin (char *target, int port) exit (err); rpow_free (rp); - rpow_to_file (rpnew, rpowfile); + if (rpow_to_store (rpnew) < 0) + fprintf (stderr, "Error, unable to store rpow\n"); printf ("Received rpow item of value %d\n", rpnew->value); return rpnew->value; @@ -411,12 +288,15 @@ static int dobreakval (char *target, int port, int num, int val, for (i=0; i= 0) - rpow_to_file (rp[i], rpowfile); + { + if (rpow_to_store (rp[i]) < 0) + fprintf (stderr, "Error, unable to store rpow\n"); + } return -1; } } @@ -428,53 +308,39 @@ static int dobreakval (char *target, int port, int num, int val, if (err != 0) { for (i=0; ivalue == tval) - ++count; - rpow_free (rp); - } - - dounlock (fin); - fclose (fin); - rp_free (rpio); + + count = counts[tval - RPOW_VALUE_MIN]; if (count != 0) break; @@ -508,11 +374,11 @@ static int doout (char *target, int port, int value) int ptrlen; int outlen; - rp = rpow_from_file (value, rpowfile); + rp = rpow_from_store (value); if (rp == NULL) { if (dobreak (target, port, value) < 0 || - (rp = rpow_from_file (value, rpowfile)) == NULL ) + (rp = rpow_from_store (value)) == NULL ) { fprintf (stderr, "Unable to find RPOW of value %d\n", value); exit (2); @@ -547,12 +413,15 @@ static int doexch (char *target, int port, int nin, int *invals, for (i=0; i 0) - rpow_to_file (rp[i], rpowfile); + { + if (rpow_to_store (rp[i]) < 0) + fprintf (stderr, "Error, unable to store rpow\n"); + } exit (2); } } @@ -563,13 +432,17 @@ static int doexch (char *target, int port, int nin, int *invals, { /* Try putting the ones back we puled out */ for (i=0; ivalue < RPOW_VALUE_MIN || rp->value > RPOW_VALUE_MAX) - { - fprintf (stderr, - "Skipping rpow with invalid value %d\n", rp->value); - } else { - ++expcounts[rp->value - RPOW_VALUE_MIN]; - ++count; - } - } + printf ("%d rpows in rpow data store:\n", count); - printf ("%d rpows in rpow data file %s:\n", count, rpowfile); - for (exp=0; exp 0) - printf (" value %2d: %d\n", RPOW_VALUE_MIN+exp, expcounts[exp]); + if (expcounts[exp-RPOW_VALUE_MIN] > 0) + printf (" value %2d: %d\n", exp, expcounts[exp-RPOW_VALUE_MIN]); } - dounlock (fin); - fclose (fin); - rp_free (rpio); return 0; } diff --git a/client/rpowclient.c b/client/rpowclient.c index 1962b97..da5a9d2 100644 --- a/client/rpowclient.c +++ b/client/rpowclient.c @@ -63,6 +63,11 @@ char *commfile; char targethost[256]; int targetport = DEFAULTPORT; +/* SOCKS V5 host and port, optional */ +int usesocks = 0; +char sockshost[256]; +int socksport; + /* Temporary, the one public signing key we know about */ pubkey signpubkey; @@ -178,115 +183,6 @@ signpubkey = *signkey; return 0; } -/* Higher level functions for simplified exchanges */ -rpow * -rpow_exchange_even (rpow *rpin, char *target, int port, pubkey *signkey) -{ - rpow *rpout = NULL; - int outval = rpin->value; - int status; - - status = server_exchange (&rpout, target, port, 1, &rpin, 1, &outval, signkey); - if (status != 0) - return NULL; - return rpout; -} - -rpow * -rpow_exchange_bigger (rpow *rpin1, rpow *rpin2, char *target, int port, pubkey *signkey) -{ - rpow *rpout = NULL; - rpow *rpins[2]; - int outval = rpin1->value+1; - int status; - - if (rpin2->value != rpin1->value) - return NULL; - - rpins[0] = rpin1; - rpins[1] = rpin2; - - status = server_exchange (&rpout, target, port, 2, rpins, 1, &outval, signkey); - if (status != 0) - return NULL; - return rpout; -} - -rpow * -rpow_exchange_bigger4 (rpow *rpin1, rpow *rpin2, rpow *rpin3, rpow *rpin4, char *target, - int port, pubkey *signkey) -{ - rpow *rpout = NULL; - rpow *rpins[4]; - int outval = rpin1->value+2; - int status; - - if (rpin2->value != rpin1->value || rpin3->value != rpin1->value - || rpin4->value != rpin1->value) - return NULL; - - rpins[0] = rpin1; - rpins[1] = rpin2; - rpins[2] = rpin3; - rpins[3] = rpin4; - - status = server_exchange (&rpout, target, port, 4, rpins, 1, &outval, signkey); - if (status != 0) - return NULL; - return rpout; -} - -rpow * -rpow_exchange_bigger8 (rpow *rpin1, rpow *rpin2, rpow *rpin3, rpow *rpin4, rpow *rpin5, - rpow *rpin6, rpow *rpin7, rpow *rpin8, char *target, int port, pubkey *signkey) -{ - rpow *rpout = NULL; - rpow *rpins[8]; - int outval = rpin1->value+3; - int status; - - if (rpin2->value != rpin1->value || rpin3->value != rpin1->value - || rpin4->value != rpin1->value || rpin5->value != rpin1->value - || rpin5->value != rpin1->value || rpin5->value != rpin1->value - || rpin5->value != rpin1->value) - return NULL; - - rpins[0] = rpin1; - rpins[1] = rpin2; - rpins[2] = rpin3; - rpins[3] = rpin4; - rpins[4] = rpin5; - rpins[5] = rpin6; - rpins[6] = rpin7; - rpins[7] = rpin8; - - status = server_exchange (&rpout, target, port, 8, rpins, 1, &outval, signkey); - if (status != 0) - return NULL; - return rpout; -} - -rpow * -rpow_exchange_smaller (rpow **rpout2, rpow *rpin, char *target, int port, pubkey *signkey) -{ - rpow *rpouts[2]; - int outvals[2]; - int status; - - *rpout2 = NULL; - if (rpin->value == RPOW_VALUE_MIN) - return NULL; - - outvals[0] = outvals[1] = rpin->value-1; - rpouts[0] = rpouts[1] = NULL; - - status = server_exchange (rpouts, target, port, 1, &rpin, 2, outvals, signkey); - if (status != 0) - return NULL; - *rpout2 = rpouts[1]; - return rpouts[0]; -} - static void server_write (int npow, rpow **rpows, int npend, rpowpend **rpends, @@ -374,6 +270,7 @@ readconfig (char *fname) FILE *f = fopen (fname, "r"); char *host, *pport; char *key, *val; + int gothost = 0; if (f == NULL) { @@ -381,34 +278,65 @@ readconfig (char *fname) exit (1); } - readconfigline (f, &key, &val); - if (key == NULL) - { - fprintf (stderr, "Missing host entry in config file %s\n", fname); - exit (1); - } - if (strcasecmp (key, "host") != 0) + for ( ; ; ) { - fprintf (stderr, "Unrecognized keyword %s in config file %s\n", - key, fname); - exit (1); + readconfigline (f, &key, &val); + if (key == NULL && val == NULL) + break; + if (strcasecmp (key, "host") == 0) + { + host = val; + pport = strchr (host, ':'); + if (pport != NULL) + { + *pport++ = '\0'; + targetport = atoi(pport); + if (targetport <= 0 || targetport >= 65536) + { + fprintf (stderr, "Illegal port number %d in config file %s\n", + targetport, fname); + exit (1); + } + } + strcpy (targethost, host); + gothost = 1; + } + else if (strcasecmp (key, "socks5") == 0) + { + host = val; + pport = strchr (host, ':'); + if (pport == NULL) + { + fprintf (stderr, "Missing socks port number in config file %s\n", + fname); + exit (1); + } + *pport++ = '\0'; + socksport = atoi(pport); + if (socksport <= 0 || socksport >= 65536) + { + fprintf (stderr, "Illegal socks port number %d in config file %s\n", + socksport, fname); + exit (1); + } + strcpy (sockshost, host); + usesocks = 1; + } + else + { + fprintf (stderr, "Unrecognized keyword %s in config file %s\n", + key, fname); + exit (1); + } } fclose (f); - host = val; - pport = strchr (host, ':'); - if (pport != NULL) + + if (!gothost) { - *pport++ = '\0'; - targetport = atoi(pport); - if (targetport <= 0 || targetport >= 65536) - { - fprintf (stderr, "Illegal port number %d in config file %s\n", - targetport, fname); - exit (1); - } + fprintf (stderr, "Missing host entry in config file %s\n", fname); + exit (1); } - strcpy (targethost, host); } void diff --git a/client/rpowclient.h b/client/rpowclient.h index 9cf0f9a..d874076 100644 --- a/client/rpowclient.h +++ b/client/rpowclient.h @@ -81,21 +81,16 @@ extern char *commfile; extern char targethost[256]; extern int targetport; +/* Optional SOCKS V5 host and port */ +extern int usesocks; +extern char sockshost[256]; +extern int socksport; + /* rpowclient.c */ int server_exchange (rpow **rpout, char *target, int port, int nin, rpow **rpin, int nout, int *outvals, pubkey *signkey); -rpow *rpow_exchange_even (rpow *rpin, char *target, int port, pubkey *signkey); -rpow *rpow_exchange_bigger (rpow *rpin1, rpow *rpin2, char *target, int port, - pubkey *signkey); -rpow *rpow_exchange_bigger4 (rpow *rpin1, rpow *rpin2, rpow *rpin3, rpow *rpin4, - char *target, int port, pubkey *signkey); -rpow *rpow_exchange_bigger8 (rpow *rpin1, rpow *rpin2, rpow *rpin3, rpow *rpin4, - rpow *rpin5, rpow *rpin6, rpow *rpin7, rpow *rpin8, char *target, int port, - pubkey *signkey); -rpow *rpow_exchange_smaller (rpow **rpout2, rpow *rpin, char *target, int port, - pubkey *signkey); void initfilenames (void); /* connio.c */ @@ -122,7 +117,7 @@ int bnwrite( gbignum *bn, rpowio *rpio ); void pubkey_read (pubkey *key, char *file); void pubkey_write (pubkey *key, char *file); -/* rpow.c */ +/* rpowutil.c */ rpow *rpow_gen (int value, unsigned char *cardid); int rpow_write(rpow *, rpowio *); @@ -132,6 +127,9 @@ rpow *rpow_from_string (char *str); rpow *rpow_from_buf (unsigned *bytesused, unsigned char *buf, unsigned inlen); unsigned char *rpow_to_buf (unsigned *outlen, rpow *rp); char *rpow_to_string (rpow *rp); +rpow * rpow_from_store (int value); +int rpow_to_store (rpow *rp); +int rpow_count (int counts[]); unsigned char * hc_to_buffer (char *buf, int *pbuflen); diff --git a/client/rpowutil.c b/client/rpowutil.c index d95519f..531e77b 100644 --- a/client/rpowutil.c +++ b/client/rpowutil.c @@ -32,10 +32,17 @@ #include #include #include +#include #include "rpowcli.h" #include "hashcash.h" + +#if defined(_WIN32) +#define ftruncate chsize +#endif + + #if defined(_WIN32) #define ntohl(x) ((((x)>>24)&0xff)|(((x)>>8)&0xff00)| \ (((x)&0xff00)<<8)|(((x)&0xff)<<24)) @@ -862,3 +869,152 @@ rpow_valid_pk (rpow *rp) return stat; } #endif + + + +static void +dolock (FILE *f) +{ +#ifndef _WIN32 + struct flock l; + l.l_start = l.l_len = 0; + l.l_pid = 0; + l.l_type = F_WRLCK; + l.l_whence = SEEK_SET; + while (fcntl (fileno(f), F_SETLKW, &l) < 0 && errno == EINTR) + ; +#endif +} + +static void +dounlock (FILE *f) +{ +#ifndef _WIN32 + struct flock l; + l.l_start = l.l_len = 0; + l.l_pid = 0; + l.l_type = F_UNLCK; + l.l_whence = SEEK_SET; + fcntl (fileno(f), F_SETLK, &l); +#endif +} + +int +rpow_to_store (rpow *rp) +{ + FILE *fout; + rpowio *rpout; + + fout = fopen (rpowfile, "ab"); + if (fout == NULL) + { + return -1; + } + dolock (fout); + fseek (fout, 0, SEEK_END); + rpout = rp_new_from_file (fout); + rpow_write (rp, rpout); + dounlock (fout); + fclose (fout); + rp_free (rpout); + return 0; +} + + +rpow * +rpow_from_store (int value) +{ + FILE *fin; + rpowio *rpio; + rpow *rp = NULL; + uchar *buf; + long fpos = 0; + long fposprev = 0; + int bufsize = 1000; + int nr; + + fin = fopen (rpowfile, "r+b"); + if (fin == NULL) + { + return NULL; + } + dolock (fin); + rpio = rp_new_from_file (fin); + + for ( ; ; ) + { + rp = rpow_read (rpio); + fposprev = fpos; + fpos = ftell (fin); + if (rp == NULL || rp->value == value) + break; + rpow_free (rp); + } + + if (rp == NULL) + { + dounlock (fin); + return NULL; + } + + /* Delete entry from file */ + buf = malloc (bufsize); + for ( ; ; ) + { + fseek (fin, fpos, SEEK_SET); + nr = fread (buf, 1, bufsize, fin); + if (nr == 0) + break; + fseek (fin, fposprev, SEEK_SET); + fwrite (buf, 1, nr, fin); + fpos += nr; + fposprev += nr; + } + free (buf); + + ftruncate (fileno(fin), (off_t)fposprev); + dounlock (fin); + fclose (fin); + rp_free (rpio); + + return rp; +} + +/* Fill in the counts array with how many rpows in the store of each value */ +int +rpow_count (int counts[RPOW_VALUE_MAX - RPOW_VALUE_MIN + 1]) +{ + FILE *fin = fopen (rpowfile, "r+b"); + rpowio *rpio; + rpow *rp = NULL; + int nexps = RPOW_VALUE_MAX - RPOW_VALUE_MIN + 1; + int exp; + int rcount = 0; + + memset (counts, 0, (RPOW_VALUE_MAX-RPOW_VALUE_MIN+1)*sizeof(int)); + + if (fin == NULL) + return -1; + + dolock (fin); + rpio = rp_new_from_file (fin); + + for ( ; ; ) + { + rp = rpow_read (rpio); + if (rp == NULL) + break; + if (rp->value < RPOW_VALUE_MIN || rp->value > RPOW_VALUE_MAX) + { + /* Skip invalid rpow */ + } else { + ++counts[rp->value - RPOW_VALUE_MIN]; + ++rcount; + } + } + + dounlock (fin); + fclose (fin); + rp_free (rpio); + return rcount; +} diff --git a/scc/installed/certvalid.o b/scc/installed/certvalid.o deleted file mode 100644 index 2419a8a5de75be789ed99505302cce93e10be20e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2496 zcma)7Z)_7~7=LdqTOHLFQl$xl%(&ntrncMA0aJnHHZ%-s>spM~rE~||Xt&wkF&0U}VGur+nKmPTM9 zE$ql%Bw-J^o`)pwu`;pz{3Fyl_6@Mw;*@hvHSE&t4cs-|^Ao7K>q={0`Kjh1Dp#Cp zq)M}{UCHPDDm`r#0X52-shXa&~wiwi!*UcHHI!eml zL7!bP(33W_%gNKJ<{SXwu;nxM*U=zcDFH+|4<`0H=>tHx!PQ>h8oaD z#i9hQLk~D~OicE>0Ux-=}4_lGSFkm*+R-7^6vOZwI z`i$B28MBY@(+I-4nHHH2qB7n&tK-s=)#+(zG13+!pUQ3MF-I$tjPn`F$qke^eJ6C*F#F&Ap9Te)gks{Cqs%WC1Bt1tF1 z%&dJ|D$RVzG0|4cyzGd60kx+0{ARlB6mC_MRVnr5Gzxv?61#olbn2^L?AGve`*t5p zKELy`o0m_wemA(e<>((jUwCulUygORHgtXTz1Kz^0O3HG*XQy22(&act*NYT+1yrB zS?gK7%2QWa>-GA)b-q=V)kz^PL{mZyW1iGNLX2($7n4QaX-cB7TVx)XdWupQ9sDuv}4BqfNY3NyO$xC=^En&JNj~(M7fC?@t87U7wlG$V34`C z2>5YM$ZKH7n?~TK9dXS2V{)R1J}9XNPvW8aoOlS&j+eov&Ov9A8PCKfpRKpDy9HBE zeD0r;@aznPt$GbJJ{+qs0QH9cwX}DVP3(od6-lGmR0%9L0AD~@4V-W*_$F*BY+$g* zWSMt37EBA-5mC&=@b4%>{Y`!OU>@Ez52xqh{qyh<;7U9hJd4=90{v}GqWEV_08aSZ zd6>n7q_`^@@9OZx*p67NwjEcauPZKecvx?$Gn(qGt@D{uy>G@mDhl!FfRJRdP9e54 z7LVd`=?bwo(J{x2?GQxD66=h1^|0+pL0}0X5li$DO9>)N#bR65hlFI;_5qgCud1$T z5yU3AtxpZ~#8@I4kN1MXv2Or-p!-G!;ah@XxJ&$L^b}`JcsX&{)e=WOjrcQ+{RhZ@udV<9 diff --git a/scc/installed/cryptchan.o b/scc/installed/cryptchan.o deleted file mode 100644 index d83b4050640688d272ca028f9027f2114ce5b393..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6040 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 diff --git a/scc/installed/dbverify.o b/scc/installed/dbverify.o deleted file mode 100644 index d16adf3696056b659aaa22ca8656aecb3800fa3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6772 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 Q2pRv4i1?ohJ4D3)0ZfF=G5`Po diff --git a/scc/installed/keygen.o b/scc/installed/keygen.o deleted file mode 100644 index d62f4111529918579b7ca3881d6cfe00e464e514..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6924 zcmb7I3vg7`89ti@jk=HpL9wNF2o823dut}DE5L1gt zmmR#l+#0P^I)zF{QJkSuM!=+6>uORKrZ`PU+cG1qPOY6#Xsc~Xqpohh|D6A9HkY>8 zJG1-U@0|bq=YO5Y?p9;uT)J zP=}KWj~Bu+_GFDmJs6)F7VAI>QI_5{wXb{C?KF{DLl7RNZPDc%S5yXqQH z)Y;zxJ?rmoJkgK3N}Y>PQEl;MjYGPSlB3o-4MW;D)^8aHwc25)cF?LluvW)R8h}E2 zvPhuMs@+#4fB==|qf@*~my8yUU0a%uO|u5QOP5v`O{U5N@h{A$T54=PW!5+{S`@Mt z4plp~1A01S^|a(V_V6HAhuQ4qzL$qQT-62c$zG^}Mo=6{tJZQ66#={9$O>n(NEwGz zE)VHwa4wI?T;9&PtR2?oUXaV$(?wllb2;iHM)h%C%?D*tF}KX?YMIy4tZ|a^YOnEG z$KkbIKYj5l$w`ar14*B~YR=;0$?=OcOmtyk5!9rN zlPaDk^|UgcdEA=%do#?5nkJbv-kK%`MeH@KXo%XDv}FfVVkGro=*uO{dz+A ze_`7Xse^k1l33|JXv{uv5B9_ce60R${q&AG+Zx)0_8`|by-mo-$qBOKr$G^&Eq1NX zn(D_(cKj54d#TAGmDYrDc(*>|!#DO;vam=&YJfsK1L3fx0cxJUGqQC3XI`M8=anM+ zP9GNVGJh&ldh-lKVe>SMx>K6brw%0l8C%KkrHQ@k7uYY#m#vE+sS4dnzlAR6=pXS7 z*VLr6yQH|n>J9wD{6NO}1#dPh13 z0_jXydJ)`5z1uQH*&PFytN8wmT)06Edq^I%&OuV~I0@Kksc!ph(r2X);G6TH{3Y`L zDN*BMoc_yW97Y$JXE~KIdL&)!=)aUJ`v(|oS z557Ip(LzS-UF4osV!f8?rx@pZX_7is+up~Ca58#nR+SHLv8*i>-l<2Bl(qK|l-e?K z%=wkEg&_4^@6h@kJq)rE5Q?*Adz4^c+Vn*0Rw2_oYy3%M?+z{S`QO zEKO^0-LdoufXJp#65z?E2l3{?3dp8kFSMQFH=G65uG1j@D~GrHtO;Y+5-e^LZPVq- zYn$fCsr8zy#0v8Dy+xbrFR&D8pBu(BdS{n@J&O*x^z7S9bq(R#l53kNRob#x#}@CCVNqVwlU&0a;c2> z+8iI9R@SZ^ai-q{gXX z^VFF83Qmk%KItRN9AiYUAA~P?D|~Fj&k?pPpByRcHT<|;l$P}_^=nDgSYk3H(Jk}V zcNWv1olw+Ll{wMhBkx92YV3wms;&#_ChoINd6zCwzXmw}REPPv-@ATM&3~yCyJ6@A zw&79)njYj?R900~RuNgXV#Q5?*{klTEf37ASiG=eeqdf@WmV<;s)d2sF*9NY<7T-K z74h!&M6d~%h$(E*Zwd3>gs6aMg?bAI6G2hY6pxFFj?RQBDngy@?Pf=UCi`U1ry)i* zUc%z^Tl1+2OaOE#pl237m&rHv6`3jo{U9ViX*|i%`wh(LVnNU8B3;C_K8gp)7t2j2 z0e-aHjo_E+Mj+{&&7AT_;*}3*cjJ{wbBBF99-O$v!p|Q22H6i3% zbF8zyu_@WC*ydm)X*PCtn2N@eP3omR87UI)>Wqa2O(L}ykNmnB>r^}z>wyA?WA~DK<~UL!q@b%WgBfSD77VESNBt#k)H~qB({M<6XgMq%lV0L(y&$U9)Vg z7}SP>v2bfxb*{wmr8RJSFdU91n_!5HN4#}IM|7izZft~yXrzI`&1T#T#mq!pY=Am5 zmI$>3TRZf0i4|y3Mv?chJZ374%XEc13*yzu#PVcwvl&~76HyI;fs_ZHm;Oripq^+S zEJ58YX8a0cJ!325HwiK52aI%?^56{k5piq)eav5C{wg63ms8yS2X6nE5PGgf{gzA? z;zpncXT);iu;UKKyBKM|_TYev5XTw2jqoa5+8Cc8yjqB#F#ennKkk3U_&Y{gKP5O6 zuEaW_{+Wywj5jgf$`~hvJzE(cX57d4EaS_Jza@lU=NSJ5r1;S9DT>c!K;l<2uOx*3 z%Lwtm$2vmz5$E^fjTtf(6#k>hf_B=xzb{r)RJDz8rVg4%PYm9F*o?$%C z_#u$&n1o9p*|Cx_Nr-tLA%q>zFdtz49+2!P!^MlRn-F%~4g*YS6r-U-UN{Jb`yu*t;}~aKEk-4@dY61JxLsPy+Isx_#PqZ ztpsOd$ro^UBt(5o0g~MHgg4;cOzoIwIrCM-F|Lt$n0bWxCgO8oA0a+z!nr~`NBBjo z8^TKXM+m(iar*?!N%5Y=xRCKKLX6u?h|BqR2{G;}B)~udjSwqhREnUOCPAzSs{$FI3N?}@sdgdeV?q-0)%oDVC43Dd zOow;Py4r(#T6e8WtJUr5_MmiEJ*mM2wr&?V*0KdXpwuSfDtHivC1v(`?)|-!$tx)Q zvFFr%kHhmmzu$B3{oRlEzQ6m%b-so3TrQWgFPF+t15BxJk29W|HB43`RHiD6{b9q0 zTVbduFOBRvY55+F`L>qy_9v4`(6}$t+{bz%yYgVD(4LrYOJrAq&bV)jElziLM0WKz zdMsZ@%(otzRE5y=SFlW)?PPpOW~9qoYHBv^B(%s_y3tf=xkU8YM&jpbp**d6gt-;X zWkx!4(<3z%THEW<(eEy;+|y;P;8;XH9FKwM@%3|v(6Hs}FR9PQy|kYl?F>)EI3&aU zCc3Uhh5OQUOY>IIKnL~EBudO!nsJT$5?0QgR!)bN^Vk?P zx7dhZi(Sq@;ElOiZd5&~DOh+AMQ1Kav`=~!ttiBgb}C}WGlo!O_cc4xee+zX*1VgV zy>2Z~ET7GZ%6c)POX#|x(rEYBQJGeAO_f}<+I>mtjEhxwc_L?rX8rXny-*YNjB`-n zk+UPR9$t%3cY5KPav*XzBXZW;-WKi5+Vm7Gk%Vh)O(fx7`}Ip3g1P_4a)#Z5`1E{! ziRWg-=g!SYnVV4qb2I8oFgFPM|HIsj9GIJ-n1F%jrm)lUAJE&OelL{Z@hLCG{@fFN z<6JVC56V4JlM*Ys7dCsJ>2J)md>@%zLG}*r)yZjQBa7~a7Ch^vxtEzDb+Kr-wn4@X zQ7cO7GZBxJ?{9QlT2oTbM_60a_O85FVMIK5Mm*CldOIqf;JO5@`x3Mn7o|1Z)bYC3z;!kM{ij$-daCYH+E zPBto?{0&MF3y}PM1#z2(bryJRlzx|sX<&;ranC}&8E?EyLaaYDBJg%OLB2e z+EEh$6xq>(;ZZmr#M{PiIG26BQY*Zs(~pS$q#0eFfU={>@NgYTUkF|db)zb;Xmp*g z+0f;1%PP?A&#~*nJe8DJSiZv;_(Ow2O)tYW-Z#pQIT=2j3?E7bEft%ygB6w#(V*4d zYcF{$n}Kr^&n?qvu)Q=~>r{+(C_*=}%CeK@G{Spduf0;ZD$PRF!*#5V&rWL1;@yow zmXR~_5H5h{o-WKsE*|r-x;}?KcEIxQw)2z7hXr_a!kIn3LtKei zKjmBn9N5%AVRo~kS71?MZTJo++q^p08Ay1zMxY7hA~uY%E@zHzM=|s!2XD;fbJ=S; zi=!b=*gd{pw%OzRkPt6B9G{aJ^PNO3rW-xJ!*pPRusCz&_-Z#cV(0su+>NLQ?@gRB z52fWjBFc*XOqWMgGVR@5w};9HG9+2wS<&@SK8c^=!4o0aQ zb)i@;R83lRsLt#w@ePjFe$|^%xE~!Xkox1^zd5}x=IxksVZEz!#%qE7x>enE49AdK z928A^y8GOXv7q*J>3sJ&gs-=h{$x1Qiq>M5kmf!>NDY==QGe^w8(CcY>{X>DlAv}E zfkI_)PjjpuH5%*XG1eI?J090?-)g7!sx482U zxa;GhMF03oN<~#Zc%5^aon`e`iq{dU9;Ne4v9$_QEKh5!J8nKlY;?@c#6-#Bdafy1 zLFR!EU5S#Z2RJzpaqPgcGKsa~v+Fs8KA*Rkd6`~0cwb1X7IV3M0mfore_-g19z9BW z0r2dmH;TqljcKPIvyF1-8poKlVc>HPwn-0mqanI+JJ-nJnaK12FP?t9cyO+fw+`Pq zoonzm<6OX-C~0&#yzRsF8|m0g^NiWwlDHFfhBD&|rbf=V@Sfot;Mh25;$?{$`@+n9 zhIPbBruKSICzJ6dy#wE@yv!lY)VPrX#Cq<@+HyY@gymUhc{W?)qwKa7^u*4b-WNHN z5lJT3mPhx5)7GbQv z$z$LY9s@_k$Hd0!s!#8aWzRK_an80_&J(sVXWIp=GtRdAJI-6cDs>sVwL!&>O@50%q}2Smb8pL=JpWr|Q}T-PXH3tZmRD3zP*^anaC+Y4fWOIK74%P0 zDnGcoIaE~*3Am1}PGzjl2bC+cn8 z%V}*=XzOmlJr7s*MO}_ffNY!BEc|%S-JI86=NE34X?Dg$Yy!fklFqFH~MSXWoq z&{EZ;>H>Z`t6N(`cI&~Kn)&`vNlEcSw2>mSgR5I=5PfBfe`RG|ptZTuG_RY584c7b zyNa5sKrLc7)VLtgZ6UD;_=BzCK#gA^MPNUIZGncC5P}Z{YN|pi=nqMG)A-!hmb!*z zs@dOM)3#doFo+(SNC+zf4d|e>WeBW#G-_%}F|6o{iN30~*2q{HnlZyPFs?PNXh09A z?%>MSK&@`JxlPr!qA+Ge24qgSuFfAQMk-@!uBrFeEU&Gu!+fLPHU27y>I&L7g69Ebf_I5@=X)Pn&6y^IBD?Lbd*2 zElRC!3n^_XGQeT9GrqRvs=BG6rFNMgQ{JSw)a-_I7=fym+REzHA%BqFTUxp>&)(FOl(DS|NMq>305qiESssDE(^alk$BI0@dA0l$6 ziFjmPc!s9{-AMFi645T-L$og<5xOUVuJKAePsG9HMe)BW_TQ5u zSNfQUJ?K-~^N_D%pP}AML~@lwgq`2a+}9vq70&(KeXUYAlS6+S5&Ahq=;s5ezeji( z`L#+_lS9wX1Jt(>p$`M8ZxH&_4yF{#oHKkYB6RZgS}UL+tx$ z$K(yen6V!2oAi$(qMq?U)-zG~4dkfjR&wZXCqh3@{CCq2eW~#K$e~|G4t+Bb`mp#P zq#yc?!ncq^|6_9KpC&^8y!dy}5B)2`yU3y6OAh^8MCjiU|9kX9e@yrZa_G;IL+`;$ zka{l>{T&UY{tDq&lS4n19Qq<6^tXxs4*H>=FMJU>^tI&BHHf{1_Un||PL6t*C(-{4 z@$aM`^>hmFCPzJQl0*M{BJ}Ty|Bv)T|FQ5-$)V>dpZZ}$=tmRLudzVtCkUTN4*l)q z&=(V-Unu^2>4*M4;g#gjH<3dhAVUA3_}9@7{bu17IrM)=4*fq6p?_NZ|3p9ZJB0rm zIrO{9q5lmL`nSY?kbdaj6W&J-Jr9u74I!eR!+{*D?;)bSePVwL$hh7Sev}+>eM%19pTzFQVUoJxK-QN{ z4&626&`lA0KJC!mB77D(bc@KLD--+uv_n@dyq+Aob>z@(5_^nxj7OK)e=YXCw4?k1 z;qQ>6{Kw=de_HJQv_t2?!HjVa2U2$>Ids>FeKPIP6$rnD9J+hSp}SA)OKFF$PIwbJ zbnWEOMaBMo+M#Et&mMn8|PVXn;ecUYgC@~*-1o7)iJtz1gu>gN@A|feyi-->+ z9{^eZFnmLD7b$f)kbIWlO4^Z+tP}o2@<~elj)=p@8RB$&YeQYkBfdq1{Q)BKl8wY$ zFh0V6PW*;azZAZkh&bOAJVLxxsZRtmkV}#02wqQ|q0}_NJBaB2y@Hj*o0R&V_#YJ9 zO1us8BK&89za!4V_yb*kq0}iN#`i4k$d|H^ld&IDiTQZX0jZlUSStQ{B0kD&p&jKd za^zv#i5QoE5&KKzsCN(f9he7l)Za^l?!U!;iimdlX}=TSE#RZ>8o^0GmMFu9KSd@{Ev!#hwxp(-xKU5&O!fy?z!kcu~?}o$U!+i^MQmu#t9* z&-aD@lzcw+AtK^_hjxt1d*oA*w~Boj-aTx0GLZ2W2)~Pn_DX19fc_CtPn+OI`cdCz za@6;@*ncYcOTiw&qeRr-2ju!bOT0=cg`Apkj{(v?j);24(~f!<5wV_^3vMPZQtH=0 z>c`^Q;B)g0Ao-ob|5CVLcue>s!v9|Q%Yv_q{jl&p;X{$*v)*hV+qp{kLc!%kjNe}o ru^ysC%y+lg_X-{qd|&W{pbKNl@?OC!1Sbj>3eFPzrr@^)>jeK71>pH} diff --git a/scc/installed/rpio.o b/scc/installed/rpio.o deleted file mode 100644 index 4f7bfd015ec0d691c9400f13a6ba6c4ae7afa0e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3132 zcma)8U1*zC7(Qvfrr&B@vn|%*28*z2yUv)j-E?k>E;RMRjk3^GooP(lueG&lLVlVR ze=!91@fqBOcp>7IdZi$GGY}!rqAToTtPF}U5Oh$O7gM$pSRg*{`ANTqqCN2SInR6E z^Pcy-Kd1R%=#{X;;b3Ywn3HWW#xA+U${>dx*3R14sCm2i*P*d!#ER)w-d$X|7ul%Q z>vi*2Ovl7@s9Id{6<4Z}5zcK3wQ{V6H7l$aE83~Bw%7+XM`fgbLhN)ES3IRkzWoX; z*6;L{7nx9XRLrneT&c}z5eS?vX*jHFS2Q?>UB#-FA2F-Wuuf*5+|g{CFx$=5l*ut` zs5)XZ>Udu_;lJl(HFp4>(<=8(?A>b@1uJD^{la*Bb=lnHadA^z-gB2nYu2!C#kJn$ z;sb55^(WzDE#hn&InRwb;yU^KK+7M6!Fs+Xu0Mp}c%G*m6!t?d4mN**u(X-qBRq(j zo7R^7lWU7D<{BbHwxc%Nr(!kkzmSQo2N6$Fjn?xzSH&4(oo=$hZ(_TL$Zu_KaE^(@ zBB)U{^OY(crEhuctI_hXTcsN5>nME+d3mf0QMJZ-5WEP2mn*|jmkffrj%=AI1&V|> zA1jX?lj_@I)=>Y=8P(0G3Y@<@93b_zrVw|Y7p^$Qb&79WuyRMoy?F%GCBe7dGln{@ zM%2~#6`n#8NZ5R}M<6d3x~vc?*n29ZE%wS%8xSdUQnD&}T|~V1vQR{^g?RmXqYyZq zGFlGh%`(!n9ohN>Ed0XDq`=!po1IB%nkJw?epqW)wF_%#<)>+*eb(e1BTCJCK zv&C{WeD?C!&{?YF=s|3>Lc^`*`_a)J^R6?bQ#7~)T6r3_C&Zwu$f04-O-2&(@}Ob=#{ed8n;ZW!~U(fKl(OzG_ z|KxH1fUiFg2nGg%$9+8+W8O$)jb6t5*`;JIF#*hF1iqzaIpboE`Jw6;v#CTb!Tb~1 zEb}jh6Uw%G^Kcu{{QKnfKD4eHOL;dw;FUdjnnwlocJN=JwX#W)Y?99btWyH zf!>hRAy9gREjD=#`+D#Zx7*u*;19^uQ1%p8XqRj3@4Au`ZvVwV+mPw%MM7Sa{(k~~1WBO!AbXzy-vB4O#J>Snz@L%)XJ8e) zQ}Pv{2VpuY`8D8a@HZvD3H$(TFn>vorCD{PeuBz>&-j0vlHN30eNG z@IGrnJyWf;px>V+e2B4U3EjvA;lub%OSqS@?L5x-B^fqp^G2+t5g{wg8%FA&1+ zms0)%A@o)W(Wo~huM!@>hy1so7$1{3ObC0662F#six5qEU*bWu5Bd2rA@naw{*~m{ zC9g>yM4gadFB0P1vyvwzzANRIB>$Wcet$;@`!}WhPeSbPMjg?5P-2V_{(MXb{bh;& E0u*J({Qv*} diff --git a/scc/installed/rpow.exe b/scc/installed/rpow.exe deleted file mode 100755 index d1adfdfd18288993211b35bd709b69c99ad4d4d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246931 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±xgu;N?cLloZyFI4<3 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 R?Y2zvdvh-v6!la3&i9|plHJdB*JNMmZ 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 dm4wKfU4+PkW%(egk diff --git a/server/Makefile b/server/Makefile index 71cbaa0..7f63c6d 100644 --- a/server/Makefile +++ b/server/Makefile @@ -1,7 +1,7 @@ # Makefile for host 4758 applications # Remember to set SCCTK_FS_ROOT!! -SCCTK_FS_ROOT=/scctk +SCCTK_FS_ROOT=../../scctk CFLAGS = -g -c -D_LINUX_ -I. -I../common \ -I$(SCCTK_FS_ROOT)/include/env/linux -I$(SCCTK_FS_ROOT)/include/host \ diff --git a/server/dbproof.c b/server/dbproof.c index 701fe6c..bd8b1be 100644 --- a/server/dbproof.c +++ b/server/dbproof.c @@ -269,6 +269,7 @@ gettimeofday(&pt,NULL); *proof = db->nodeinfo; if (prooflen) *prooflen = (uchar *)db->nodeptr - db->nodeinfo; +printf ("New DB root hash: "); dumpbuf (treehash, HASHSIZE); return found; } @@ -282,6 +283,7 @@ gettimeofday(&pt,NULL); memcpy (db->newnode.childhash[1], newnodehash, HASHSIZE); ++db->depth; assert (db->depth <= MAXDEPTH); +printf ("Splitting top node, increasing DB depth to %d\n", db->depth); /* Write out new top node */ newtopnodenum = dbnodeseek (db, 0, SEEK_END, NONLEAF); diff --git a/server/rpowsrv.c b/server/rpowsrv.c index 523e8e3..f7f00c0 100644 --- a/server/rpowsrv.c +++ b/server/rpowsrv.c @@ -64,7 +64,7 @@ DEFAGENT; #define UNBLOCK 0 /* How long to wait on incoming connections */ -#define TIMEOUTSECS 2 +#define TIMEOUTSECS 3 unsigned char bigbuf[CHAINSIZE]; unsigned char chainbuf[CHAINSIZE]; @@ -76,7 +76,7 @@ int alarmflag; sccAdapterHandle_t handle; sccRB_t rb; -static void dumpbuf (unsigned char *buf, int len); +void dumpbuf (unsigned char *buf, int len); static int nread (int fd, void *buf, unsigned count); long SCC_CALL _sccRequest(sccAdapterHandle_t adapter_handle, sccRB_t *request_block); static int dokeygen (int numdbs); @@ -545,11 +545,11 @@ dolisten (int port, int numdbs) int found; unsigned char *proof; unsigned prooflen; - SOCKET s, s1; + SOCKET s, s1; unsigned char cmd; - struct sockaddr_in sockaddr, otheraddr; + struct sockaddr_in sockaddr, otheraddr; int otheraddrsize = sizeof(otheraddr); - int reuseflag = -1; + int reuseflag = -1; unsigned char roothashbuf[HASHSIZE]; unsigned int fileid; FILE *fchain; @@ -586,15 +586,15 @@ unsigned int debug3[100]; #endif /* Begin listening on socket */ - s = socket(AF_INET, SOCK_STREAM, 0); - if (s < 0) { + s = socket(AF_INET, SOCK_STREAM, 0); + if (s < 0) { perror ("socket"); exit (2); - } - sockaddr.sin_family = AF_INET; - sockaddr.sin_port = htons((short)port); + } + sockaddr.sin_family = AF_INET; + sockaddr.sin_port = htons((short)port); sockaddr.sin_addr.s_addr = INADDR_ANY; - setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &reuseflag, sizeof(reuseflag)); + setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &reuseflag, sizeof(reuseflag)); if (bind (s, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) < 0) { perror ("bind"); exit (2); @@ -750,8 +750,11 @@ rb.pInBuffer[3] = (unsigned char *)debug3; proof = NULL; found = 1; } else { +printf ("Host querying DB %d with hash ", fileid); +dumpbuf (bigbuf, HASHSIZE); +printf ("Host expects DB root hash "); +dumpbuf (roothashbuf, HASHSIZE); found = testdbandset (db[fileid], &proof, &prooflen, bigbuf); -printf ("Host querying DB %d, found = %d\n", fileid, found); } /* Send the proof */ @@ -804,6 +807,7 @@ rb.pInBuffer[3] = (unsigned char *)debug3; close (s1); break; } + fflush (stdout); } /* never gets here */ @@ -817,7 +821,7 @@ rb.pInBuffer[3] = (unsigned char *)debug3; } -static void +void dumpbuf (unsigned char *buf, int len) { int i; @@ -825,11 +829,14 @@ dumpbuf (unsigned char *buf, int len) for (i=0; i