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