ntlm.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. 3APA3A simpliest proxy server
  3. (c) 2002-2008 by ZARAZA <3APA3A@security.nnov.ru>
  4. please read License Agreement
  5. $Id: ntlm.c,v 1.9 2008/01/08 21:46:38 vlad Exp $
  6. */
  7. #include "proxy.h"
  8. struct ntlmchal {
  9. unsigned char sig[8];
  10. unsigned char messtype[4];
  11. unsigned char dom_len[2];
  12. unsigned char dom_max_len[2];
  13. unsigned char dom_offset[4];
  14. unsigned char flags[4];
  15. unsigned char challenge[8];
  16. unsigned char reserved[8];
  17. unsigned char addr_len[2];
  18. unsigned char addr_max_len[2];
  19. unsigned char addr_offset[4];
  20. unsigned char data[1];
  21. };
  22. struct ntlmreq {
  23. unsigned char sig[8];
  24. unsigned char messtype[4];
  25. unsigned char flags[4];
  26. unsigned char dom_len[2];
  27. unsigned char dom_max_len[2];
  28. unsigned char dom_offset[4];
  29. unsigned char pad1[2];
  30. unsigned char host_len[2];
  31. unsigned char host_max_len[2];
  32. unsigned char host_offset[4];
  33. unsigned char pad2[2];
  34. unsigned char data[1];
  35. };
  36. int text2unicode(const char * text, char * buf, int buflen){
  37. int count = 0;
  38. buflen = ((buflen>>1)<<1);
  39. if(!text || !buflen) return 0;
  40. do {
  41. buf[count++] = toupper(*text++);
  42. buf[count++] = '\0';
  43. } while (*text && count < buflen);
  44. return count;
  45. }
  46. void unicode2text(const char *unicode, char * buf, int len){
  47. int i;
  48. if(!unicode || !len) return;
  49. for(i=0; i<len; i++){
  50. buf[i] = unicode[(i<<1)];
  51. }
  52. buf[i] = 0;
  53. }
  54. void genchallenge(struct clientparam *param, char * challenge, char *buf){
  55. struct ntlmchal *chal;
  56. char tmpbuf[1024];
  57. char hostname[128];
  58. int len, i;
  59. chal = (struct ntlmchal *)tmpbuf;
  60. memset(chal, 0, 1024);
  61. memcpy(chal->sig, "NTLMSSP", 8);
  62. chal->messtype[0] = 2;
  63. gethostname(hostname, 128);
  64. hostname[15] = 0;
  65. len = (((int)strlen(hostname)) << 1);
  66. chal->dom_len[0] = len;
  67. chal->dom_max_len[0] = len;
  68. chal->dom_offset[0] = (unsigned char)((unsigned char *)chal->data - (unsigned char *)chal);
  69. chal->flags[0] = 0x03;
  70. chal->flags[1] = 0x82;
  71. chal->flags[2] = 0x81;
  72. chal->flags[3] = 0xA0;
  73. text2unicode(hostname, (char *)chal->data, 64);
  74. time((time_t *)challenge);
  75. memcpy(challenge+4, &param->sinc.sin_addr.s_addr, 4);
  76. challenge[1]^=param->sinc.sin_port;
  77. for(i = 0; i < 8; i++) challenge[i] ^= myrand(challenge, 8);
  78. memcpy(chal->challenge, challenge, 8);
  79. en64((unsigned char *)tmpbuf, (unsigned char *)buf, (int)((unsigned char *)chal->data - (unsigned char *)chal) + len);
  80. }