xref: /inferno-os/appl/cmd/idea.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement Idea;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsyth#
4*37da2899SCharles.Forsyth# Copyright © 2002 Vita Nuova Holdings Limited.  All rights reserved.
5*37da2899SCharles.Forsyth#
6*37da2899SCharles.Forsyth
7*37da2899SCharles.Forsythinclude "sys.m";
8*37da2899SCharles.Forsyth	sys: Sys;
9*37da2899SCharles.Forsythinclude "draw.m";
10*37da2899SCharles.Forsythinclude "bufio.m";
11*37da2899SCharles.Forsyth	bufio: Bufio;
12*37da2899SCharles.Forsyth	Iobuf: import bufio;
13*37da2899SCharles.Forsythinclude "keyring.m";
14*37da2899SCharles.Forsyth	keyring: Keyring;
15*37da2899SCharles.Forsyth
16*37da2899SCharles.ForsythIdea: module
17*37da2899SCharles.Forsyth{
18*37da2899SCharles.Forsyth	init: fn(nil: ref Draw->Context, argv: list of string);
19*37da2899SCharles.Forsyth};
20*37da2899SCharles.Forsyth
21*37da2899SCharles.Forsythdecerr(s: string)
22*37da2899SCharles.Forsyth{
23*37da2899SCharles.Forsyth	sys->fprint(sys->fildes(2), "decrypt error: %s (wrong password ?)\n", s);
24*37da2899SCharles.Forsyth	exit;
25*37da2899SCharles.Forsyth}
26*37da2899SCharles.Forsyth
27*37da2899SCharles.Forsythinit(nil: ref Draw->Context, argv: list of string)
28*37da2899SCharles.Forsyth{
29*37da2899SCharles.Forsyth	sys = load Sys Sys->PATH;
30*37da2899SCharles.Forsyth	stdin := sys->fildes(0);
31*37da2899SCharles.Forsyth	stdout := sys->fildes(1);
32*37da2899SCharles.Forsyth
33*37da2899SCharles.Forsyth	bufio = load Bufio Bufio->PATH;
34*37da2899SCharles.Forsyth	keyring = load Keyring Keyring->PATH;
35*37da2899SCharles.Forsyth
36*37da2899SCharles.Forsyth	obuf := array[8] of byte;
37*37da2899SCharles.Forsyth	buf := array[8] of byte;
38*37da2899SCharles.Forsyth	key := array[16] of byte;
39*37da2899SCharles.Forsyth
40*37da2899SCharles.Forsyth	argc := len argv;
41*37da2899SCharles.Forsyth	if((argc != 3 && argc != 4) || (hd tl argv != "-e" && hd tl argv != "-d") || len hd tl tl argv != 16){
42*37da2899SCharles.Forsyth		sys->fprint(sys->fildes(2), "usage: idea -[e | d] <16 char key> [inputfile]\n");
43*37da2899SCharles.Forsyth		exit;
44*37da2899SCharles.Forsyth	}
45*37da2899SCharles.Forsyth	dec := hd tl argv == "-d";
46*37da2899SCharles.Forsyth	if(argc == 4){
47*37da2899SCharles.Forsyth		s := hd tl tl tl argv;
48*37da2899SCharles.Forsyth		stdin = sys->open(s, Sys->OREAD);
49*37da2899SCharles.Forsyth		if(stdin == nil){
50*37da2899SCharles.Forsyth			sys->fprint(sys->fildes(2), "cannot open %s\n", s);
51*37da2899SCharles.Forsyth			exit;
52*37da2899SCharles.Forsyth		}
53*37da2899SCharles.Forsyth		if(dec){
54*37da2899SCharles.Forsyth			l := len s;
55*37da2899SCharles.Forsyth			if(s[l-3: l] != ".id"){
56*37da2899SCharles.Forsyth				sys->fprint(sys->fildes(2), "input file not a .id file\n");
57*37da2899SCharles.Forsyth				exit;
58*37da2899SCharles.Forsyth			}
59*37da2899SCharles.Forsyth			s = s[0: l-3];
60*37da2899SCharles.Forsyth		}
61*37da2899SCharles.Forsyth		else
62*37da2899SCharles.Forsyth			s += ".id";
63*37da2899SCharles.Forsyth		stdout = sys->create(s, Sys->OWRITE, 8r666);
64*37da2899SCharles.Forsyth		if(stdout == nil){
65*37da2899SCharles.Forsyth			sys->fprint(sys->fildes(2), "cannot create %s\n", s);
66*37da2899SCharles.Forsyth			exit;
67*37da2899SCharles.Forsyth		}
68*37da2899SCharles.Forsyth	}
69*37da2899SCharles.Forsyth	for(i := 0; i < 16; i++)
70*37da2899SCharles.Forsyth		key[i] = byte (hd tl tl argv)[i];
71*37da2899SCharles.Forsyth	is := keyring->ideasetup(key, nil);
72*37da2899SCharles.Forsyth	m := om := 0;
73*37da2899SCharles.Forsyth	bin := bufio->fopen(stdin, Bufio->OREAD);
74*37da2899SCharles.Forsyth	bout := bufio->fopen(stdout, Bufio->OWRITE);
75*37da2899SCharles.Forsyth	for(;;){
76*37da2899SCharles.Forsyth		n := bin.read(buf[m: ], 8-m);
77*37da2899SCharles.Forsyth		if(n <= 0)
78*37da2899SCharles.Forsyth			break;
79*37da2899SCharles.Forsyth		m += n;
80*37da2899SCharles.Forsyth		if(m == 8){
81*37da2899SCharles.Forsyth			keyring->ideaecb(is, buf, 8, dec);
82*37da2899SCharles.Forsyth			if(dec){	# leave last block around
83*37da2899SCharles.Forsyth				if(om > 0)
84*37da2899SCharles.Forsyth					bout.write(obuf, 8);
85*37da2899SCharles.Forsyth				obuf[0: ] = buf[0: 8];
86*37da2899SCharles.Forsyth				om = 8;
87*37da2899SCharles.Forsyth			}
88*37da2899SCharles.Forsyth			else
89*37da2899SCharles.Forsyth				bout.write(buf, 8);
90*37da2899SCharles.Forsyth			m = 0;
91*37da2899SCharles.Forsyth		}
92*37da2899SCharles.Forsyth	}
93*37da2899SCharles.Forsyth	if(dec){
94*37da2899SCharles.Forsyth		if(om != 8)
95*37da2899SCharles.Forsyth			decerr("no last block");
96*37da2899SCharles.Forsyth		if(m != 0)
97*37da2899SCharles.Forsyth			decerr("last block not 8 bytes long");
98*37da2899SCharles.Forsyth		m = int obuf[7];
99*37da2899SCharles.Forsyth		if(m < 0 || m > 7)
100*37da2899SCharles.Forsyth			decerr("bad modulus");
101*37da2899SCharles.Forsyth		for(i = m; i < 8-1; i++)
102*37da2899SCharles.Forsyth			if(obuf[i] != byte 0)
103*37da2899SCharles.Forsyth				decerr("byte not 0");
104*37da2899SCharles.Forsyth		bout.write(obuf, m);
105*37da2899SCharles.Forsyth	}
106*37da2899SCharles.Forsyth	else{
107*37da2899SCharles.Forsyth		for(i = m; i < 8; i++)
108*37da2899SCharles.Forsyth			buf[i] = byte 0;
109*37da2899SCharles.Forsyth		buf[7] = byte m;
110*37da2899SCharles.Forsyth		keyring->ideaecb(is, buf, 8, dec);
111*37da2899SCharles.Forsyth		bout.write(buf, 8);
112*37da2899SCharles.Forsyth	}
113*37da2899SCharles.Forsyth	bout.flush();
114*37da2899SCharles.Forsyth	bin.close();
115*37da2899SCharles.Forsyth	bout.close();
116*37da2899SCharles.Forsyth}
117