convkeys2.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <mp.h>
  4. #include <libsec.h>
  5. #include <authsrv.h>
  6. #include "authcmdlib.h"
  7. char authkey[DESKEYLEN];
  8. int verb;
  9. int usepass;
  10. int convert(char*, char*, char*, int);
  11. int dofcrypt(int, char*, char*, int);
  12. void usage(void);
  13. void randombytes(uchar*, int);
  14. void
  15. main(int argc, char *argv[])
  16. {
  17. Dir *d;
  18. char *p, *np, *file, key[DESKEYLEN];
  19. int fd, len;
  20. ARGBEGIN{
  21. case 'v':
  22. verb = 1;
  23. break;
  24. case 'p':
  25. usepass = 1;
  26. break;
  27. default:
  28. usage();
  29. }ARGEND
  30. if(argc != 1)
  31. usage();
  32. file = argv[0];
  33. /* get original key */
  34. if(usepass){
  35. print("enter password file is encoded with\n");
  36. getpass(authkey, nil, 0, 1);
  37. } else
  38. getauthkey(authkey);
  39. print("enter password to reencode with\n");
  40. getpass(key, nil, 0, 1);
  41. fd = open(file, ORDWR);
  42. if(fd < 0)
  43. error("can't open %s: %r\n", file);
  44. d = dirfstat(fd);
  45. if(d == nil)
  46. error("can't stat %s: %r\n", file);
  47. len = d->length;
  48. p = malloc(len);
  49. if(!p)
  50. error("out of memory");
  51. np = malloc((len/OKEYDBLEN)*KEYDBLEN + KEYDBOFF);
  52. if(!np)
  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, np, key, len);
  57. if(verb)
  58. exits(0);
  59. if(pwrite(fd, np, len, 0) != len)
  60. error("can't write key file: %r\n");
  61. close(fd);
  62. exits(0);
  63. }
  64. void
  65. oldCBCencrypt(char *key7, char *p, int len)
  66. {
  67. uchar ivec[8];
  68. uchar key[8];
  69. DESstate s;
  70. memset(ivec, 0, 8);
  71. des56to64((uchar*)key7, key);
  72. setupDESstate(&s, key, ivec);
  73. desCBCencrypt((uchar*)p, len, &s);
  74. }
  75. int
  76. convert(char *p, char *np, char *key, int len)
  77. {
  78. int i, off, noff;
  79. if(len % OKEYDBLEN)
  80. fprint(2, "convkeys2: file odd length; not converting %d bytes\n",
  81. len % KEYDBLEN);
  82. len /= OKEYDBLEN;
  83. for(i = 0; i < len; i ++){
  84. off = i*OKEYDBLEN;
  85. noff = KEYDBOFF+i*(KEYDBLEN);
  86. decrypt(authkey, &p[off], OKEYDBLEN);
  87. memmove(&np[noff], &p[off], OKEYDBLEN);
  88. memset(&np[noff-SECRETLEN], 0, SECRETLEN);
  89. if(verb)
  90. print("%s\n", &p[off]);
  91. }
  92. randombytes((uchar*)np, KEYDBOFF);
  93. len = (len*KEYDBLEN) + KEYDBOFF;
  94. oldCBCencrypt(key, np, len);
  95. return len;
  96. }
  97. void
  98. usage(void)
  99. {
  100. fprint(2, "usage: convkeys2 keyfile\n");
  101. exits("usage");
  102. }
  103. void
  104. randombytes(uchar *p, int len)
  105. {
  106. int i, fd;
  107. fd = open("/dev/random", OREAD);
  108. if(fd < 0){
  109. fprint(2, "convkeys2: can't open /dev/random, using rand()\n");
  110. srand(time(0));
  111. for(i = 0; i < len; i++)
  112. p[i] = rand();
  113. return;
  114. }
  115. read(fd, p, len);
  116. close(fd);
  117. }