convkeys.c 2.3 KB

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