convkeys2.c 2.4 KB

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