in with the new

This commit is contained in:
rsc 2005-01-04 22:30:59 +00:00
parent 48bfee4e5b
commit b2ad2ef138
5 changed files with 310 additions and 144 deletions

93
src/cmd/acmeevent.c Normal file
View file

@ -0,0 +1,93 @@
#include <u.h>
#include <libc.h>
#include <bio.h>
int
getn(Biobuf *b)
{
int c, n;
n = 0;
while((c = Bgetc(b)) != -1 && '0'<=c && c<='9')
n = n*10+c-'0';
if(c != ' ')
sysfatal("bad number syntax");
return n;
}
char*
getrune(Biobuf *b, char *p)
{
int c;
char *q;
c = Bgetc(b);
if(c == -1)
sysfatal("eof");
q = p;
*q++ = c;
if(c >= Runeself){
while(!fullrune(p, q-p)){
c = Bgetc(b);
if(c == -1)
sysfatal("eof");
*q++ = c;
}
}
return q;
}
void
getevent(Biobuf *b, int *c1, int *c2, int *q0, int *q1, int *flag, int *nr, char *buf)
{
int i;
char *p;
*c1 = Bgetc(b);
if(*c1 == -1)
exits(0);
*c2 = Bgetc(b);
*q0 = getn(b);
*q1 = getn(b);
*flag = getn(b);
*nr = getn(b);
if(*nr >= 256)
sysfatal("event string too long");
p = buf;
for(i=0; i<*nr; i++)
p = getrune(b, p);
*p = 0;
if(Bgetc(b) != '\n')
sysfatal("expected newline");
}
void
main(void)
{
int c1, c2, q0, q1, eq0, eq1, flag, nr, x;
Biobuf b;
char buf[2000], buf2[2000], buf3[2000];
doquote = needsrcquote;
quotefmtinstall();
Binit(&b, 0, OREAD);
for(;;){
getevent(&b, &c1, &c2, &q0, &q1, &flag, &nr, buf);
eq0 = q0;
eq1 = q1;
buf2[0] = 0;
buf3[0] = 0;
if(flag & 2){
/* null string with non-null expansion */
getevent(&b, &x, &x, &eq0, &eq1, &x, &nr, buf);
}
if(flag & 8){
/* chorded argument */
getevent(&b, &x, &x, &x, &x, &x, &x, buf2);
getevent(&b, &x, &x, &x, &x, &x, &x, buf3);
}
print("event %c %c %d %d %d %d %d %d %q %q %q\n",
c1, c2, q0, q1, eq0, eq1, flag, nr, buf, buf2, buf3);
}
}

View file

@ -1,144 +0,0 @@
/* encrypt file by writing
v2hdr,
16byte initialization vector,
AES-CBC(key, random | file),
HMAC_SHA1(md5(key), AES-CBC(random | file))
With CBC, if the first plaintext block is 0, the first ciphertext block is
E(IV). Using the overflow technique adopted for compatibility with cryptolib
makes the last cipertext block decryptable. Hence the random prefix to file.
*/
#include <u.h>
#include <libc.h>
#include <bio.h>
#include <mp.h>
#include <libsec.h>
enum{ CHK = 16, BUF = 4096 };
uchar v2hdr[AESbsize+1] = "AES CBC SHA1 2\n";
Biobuf bin;
Biobuf bout;
void
safewrite(uchar *buf, int n)
{
int i = Bwrite(&bout, buf, n);
if(i == n)
return;
fprint(2, "write error\n");
exits("write error");
}
void
saferead(uchar *buf, int n)
{
int i = Bread(&bin, buf, n);
if(i == n)
return;
fprint(2, "read error\n");
exits("read error");
}
int
main(int argc, char **argv)
{
int encrypt = 0; /* 0=decrypt, 1=encrypt */
int n, nkey;
char *hex, *msg = nil;
uchar key[AESmaxkey], key2[MD5dlen];
uchar buf[BUF+SHA1dlen]; /* assumption: CHK <= SHA1dlen */
AESstate aes;
DigestState *dstate;
if(argc!=2 || argv[1][0]!='-'){
fprint(2,"usage: HEX=key %s -d < cipher.aes > clear.txt\n", argv[0]);
fprint(2," or: HEX=key %s -e < clear.txt > cipher.aes\n", argv[0]);
exits("usage");
}
if(argv[1][1] == 'e')
encrypt = 1;
Binit(&bin, 0, OREAD);
Binit(&bout, 1, OWRITE);
if((hex = getenv("HEX")) == nil)
hex = getpass("enter key: ");
nkey = 0;
if(hex != nil)
nkey = strlen(hex);
if(nkey == 0 || (nkey&1) || nkey>2*AESmaxkey){
fprint(2,"key should be 32 hex digits\n");
exits("key");
}
nkey = dec16(key, sizeof key, hex, nkey);
md5(key, nkey, key2, 0); /* so even if HMAC_SHA1 is broken, encryption key is protected */
if(encrypt){
safewrite(v2hdr, AESbsize);
genrandom(buf,2*AESbsize); /* CBC is semantically secure if IV is unpredictable. */
setupAESstate(&aes, key, nkey, buf); /* use first AESbsize bytes as IV */
aesCBCencrypt(buf+AESbsize, AESbsize, &aes); /* use second AESbsize bytes as initial plaintext */
safewrite(buf, 2*AESbsize);
dstate = hmac_sha1(buf+AESbsize, AESbsize, key2, MD5dlen, 0, 0);
while(1){
n = Bread(&bin, buf, BUF);
if(n < 0){
msg = "read error";
goto Exit;
}
aesCBCencrypt(buf, n, &aes);
safewrite(buf, n);
dstate = hmac_sha1(buf, n, key2, MD5dlen, 0, dstate);
if(n < BUF)
break; /* EOF */
}
hmac_sha1(0, 0, key2, MD5dlen, buf, dstate);
safewrite(buf, SHA1dlen);
}else{ /* decrypt */
Bread(&bin, buf, AESbsize);
if(memcmp(buf, v2hdr, AESbsize) == 0){
saferead(buf, 2*AESbsize); /* read IV and random initial plaintext */
setupAESstate(&aes, key, nkey, buf);
dstate = hmac_sha1(buf+AESbsize, AESbsize, key2, MD5dlen, 0, 0);
aesCBCdecrypt(buf+AESbsize, AESbsize, &aes);
saferead(buf, SHA1dlen);
while((n = Bread(&bin, buf+SHA1dlen, BUF)) > 0){
dstate = hmac_sha1(buf, n, key2, MD5dlen, 0, dstate);
aesCBCdecrypt(buf, n, &aes);
safewrite(buf, n);
memmove(buf, buf+n, SHA1dlen); /* these bytes are not yet decrypted */
}
hmac_sha1(0, 0, key2, MD5dlen, buf+SHA1dlen, dstate);
if(memcmp(buf, buf+SHA1dlen, SHA1dlen) != 0){
msg = "decrypted file failed to authenticate!";
goto Exit;
}
}else{ /* compatibility with past mistake */
// if file was encrypted with bad aescbc use this:
// memset(key, 0, AESmaxkey);
// else assume we're decrypting secstore files
setupAESstate(&aes, key, 0, buf);
saferead(buf, CHK);
aesCBCdecrypt(buf, CHK, &aes);
while((n = Bread(&bin, buf+CHK, BUF)) > 0){
aesCBCdecrypt(buf+CHK, n, &aes);
safewrite(buf, n);
memmove(buf, buf+n, CHK);
}
if(memcmp(buf, "XXXXXXXXXXXXXXXX", CHK) != 0){
msg = "decrypted file failed to authenticate";
goto Exit;
}
}
}
Exit:
memset(key, 0, sizeof(key));
memset(key2, 0, sizeof(key2));
memset(buf, 0, sizeof(buf));
if(msg != nil)
fprint(2, "%s\n", msg);
exits(msg);
return 1; /* gcc */
}

64
src/cmd/delatex.lx Normal file
View file

@ -0,0 +1,64 @@
/* Make this with: lex delatex.lex; cc lex.yy.c -ll -o delatex */
L [A-Za-z]
%Start Display Math Normal Tag
%%
<Normal>\' {yyleng--; yymore(); /* ignore apostrophes */}
<Normal>{L}+\\- {yyleng-=2; yymore(); /* ignore hyphens */}
<Normal>[a-z]/[^A-Za-z] ; /* ignore single letter "words" */
<Normal>[A-Z]+ ; /* ignore words all in uppercase */
<Normal>{L}+('{L}*)*{L} {printf("%s\n",yytext); /* any other letter seq is a word */}
<Normal>"%".* ; /* ignore comments */
<Normal>\\{L}+ ; /* ignore other control sequences */
<Normal>"\\begin{" BEGIN Tag; /* ignore this and up to next "}" */
<Normal>"\\bibitem{" BEGIN Tag;
<Normal>"\\bibliography{" BEGIN Tag;
<Normal>"\\bibstyle{" BEGIN Tag;
<Normal>"\\cite{" BEGIN Tag;
<Normal>"\\end{" BEGIN Tag;
<Normal>"\\include{" BEGIN Tag;
<Normal>"\\includeonly{" BEGIN Tag;
<Normal>"\\input{" BEGIN Tag;
<Normal>"\\label{" BEGIN Tag;
<Normal>"\\pageref{" BEGIN Tag;
<Normal>"\\ref{" BEGIN Tag;
<Tag>[^}] ; /* ignore things up to next "}" */
<Tag>"}" BEGIN Normal;
<Normal>[0-9]+ ; /* ignore numbers */
<Normal>"\\(" BEGIN Math; /* begin latex math mode */
<Math>"\\)" BEGIN Normal; /* end latex math mode */
<Math>.|\\[^)]|\n ; /* ignore anything else in latex math mode */
<Normal>"\\[" BEGIN Display; /* now in Latex display mode */
<Display>[^$]|\\[^\]] ; /* ignore most things in display math mode */
<Display>"\\]" BEGIN Normal; /* get out of Display math mode */
<Normal>\\. ; /* ignore other single character control sequences */
<Normal>\\\n ; /* more of the same */
<Normal>\n|. ; /* ignore anything else, a character at a time */
%%
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char **argv)
{
int i;
BEGIN Normal; /* Starts yylex off in the right state */
if (argc==1) {
yyin = stdin;
yylex();
}
else for (i=1; i<argc; i++) {
yyin = fopen(argv[i],"r");
if (yyin==NULL) {
fprintf(stderr,"can't open %s\n",argv[i]);
exit(1);
}
yylex();
}
exit(0);
}
int
yywrap(void)
{
return 1;
}

62
src/cmd/dial.c Normal file
View file

@ -0,0 +1,62 @@
#include <u.h>
#include <libc.h>
void
usage(void)
{
fprint(2, "usage: dial [-e] addr\n");
exits("usage");
}
void
killer(void *x, char *msg)
{
USED(x);
if(strcmp(msg, "kill") == 0)
exits(0);
noted(NDFLT);
}
void
main(int argc, char **argv)
{
int fd, pid;
char buf[8192];
int n, waitforeof;
notify(killer);
waitforeof = 0;
ARGBEGIN{
case 'e':
waitforeof = 1;
break;
default:
usage();
}ARGEND
if(argc != 1)
usage();
if((fd = dial(argv[0], nil, nil, nil)) < 0)
sysfatal("dial: %r");
switch(pid = fork()){
case -1:
sysfatal("fork: %r");
case 0:
while((n = read(0, buf, sizeof buf)) > 0)
if(write(0, buf, n) < 0)
break;
if(!waitforeof)
postnote(PNPROC, getppid(), "kill");
exits(nil);
}
while((n = read(fd, buf, sizeof buf)) > 0)
if(write(1, buf, n) < 0)
break;
postnote(PNPROC, pid, "kill");
waitpid();
exits(0);
}

91
src/cmd/read.c Normal file
View file

@ -0,0 +1,91 @@
#include <u.h>
#include <libc.h>
int multi;
int nlines;
char *status = nil;
int
line(int fd, char *file)
{
char c;
int m, n, nalloc;
char *buf;
nalloc = 0;
buf = nil;
for(m=0; ; ){
n = read(fd, &c, 1);
if(n < 0){
fprint(2, "read: error reading %s: %r\n", file);
exits("read error");
}
if(n == 0){
if(m == 0)
status = "eof";
break;
}
if(m == nalloc){
nalloc += 1024;
buf = realloc(buf, nalloc);
if(buf == nil){
fprint(2, "read: malloc error: %r\n");
exits("malloc");
}
}
buf[m++] = c;
if(c == '\n')
break;
}
if(m > 0)
write(1, buf, m);
free(buf);
return m;
}
void
lines(int fd, char *file)
{
do{
if(line(fd, file) == 0)
break;
}while(multi || --nlines>0);
}
void
main(int argc, char *argv[])
{
int i, fd;
char *s;
ARGBEGIN{
case 'm':
multi = 1;
break;
case 'n':
s = ARGF();
if(s){
nlines = atoi(s);
break;
}
/* fall through */
default:
fprint(2, "usage: read [-m] [-n nlines] [files...]\n");
exits("usage");
}ARGEND
if(argc == 0)
lines(0, "<stdin>");
else
for(i=0; i<argc; i++){
fd = open(argv[i], OREAD);
if(fd < 0){
fprint(2, "read: can't open %s: %r\n", argv[i]);
exits("open");
}
lines(fd, argv[i]);
close(fd);
}
exits(status);
}