convkeys.c 2.3 KB

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