1 #include <u.h> 2 #include <libc.h> 3 #include <auth.h> 4 #include "authsrv.h" 5 6 char authkey[DESKEYLEN]; 7 int verb; 8 int usepass; 9 10 int convert(char*, char*, int); 11 int dofcrypt(int, char*, char*, int); 12 void usage(void); 13 14 void 15 main(int argc, char *argv[]) 16 { 17 Dir d; 18 char *p, *file, key[DESKEYLEN]; 19 int fd, len; 20 21 ARGBEGIN{ 22 case 'v': 23 verb = 1; 24 break; 25 case 'p': 26 usepass = 1; 27 break; 28 default: 29 usage(); 30 }ARGEND 31 32 if(argc != 1) 33 usage(); 34 file = argv[0]; 35 36 /* get original key */ 37 if(usepass){ 38 print("enter password file is encoded with\n"); 39 getpass(authkey, 0); 40 } else 41 getauthkey(authkey); 42 print("enter password to reencode with\n"); 43 getpass(key, 0); 44 45 fd = open(file, ORDWR); 46 if(fd < 0) 47 error("can't open %s: %r\n", file); 48 if(dirfstat(fd, &d) < 0) 49 error("can't stat %s: %r\n", file); 50 len = d.length; 51 p = malloc(len); 52 if(!p) 53 error("out of memory"); 54 if(read(fd, p, len) != len) 55 error("can't read key file: %r\n"); 56 len = convert(p, key, len); 57 if(verb) 58 exits(0); 59 if(seek(fd, 0, 0) < 0 || write(fd, p, len) != len) 60 error("can't write key file: %r\n"); 61 close(fd); 62 exits(0); 63 } 64 65 int 66 convert(char *p, char *key, int len) 67 { 68 int i; 69 70 if(len % KEYDBLEN){ 71 fprint(2, "file odd length; not converting %d bytes\n", len % KEYDBLEN); 72 len -= len % KEYDBLEN; 73 } 74 for(i = 0; i < len; i += KEYDBLEN){ 75 decrypt(authkey, &p[i], KEYDBLEN); 76 if(verb) 77 print("%s\n", &p[i]); 78 else 79 encrypt(key, &p[i], KEYDBLEN); 80 } 81 return len; 82 } 83 84 void 85 usage(void) 86 { 87 fprint(2, "usage: convkeys keyfile\n"); 88 exits("usage"); 89 } 90