smbutil.c
上传用户:xxcykj
上传日期:2007-01-04
资源大小:727k
文件大小:6k
源码类别:

Email客户端

开发平台:

Unix_Linux

  1. #include <unistd.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <ctype.h>
  5. #include <assert.h>
  6. #include <string.h>
  7. #include "ntlm.h"
  8. #include "smbencrypt.h"
  9. #include "smbbyteorder.h"
  10. char versionString[] ="libntlm version 0.21";
  11. /* Utility routines that handle NTLM auth structures. */
  12. /* The [IS]VAL macros are to take care of byte order for non-Intel
  13.  * Machines -- I think this file is OK, but it hasn't been tested.
  14.  * The other files (the ones stolen from Samba) should be OK.
  15.  */
  16. /* I am not crazy about these macros -- they seem to have gotten
  17.  * a bit complex.  A new scheme for handling string/buffer fields
  18.  * in the structures probably needs to be designed
  19.  */
  20. #define AddBytes(ptr, header, buf, count) 
  21. if (buf && count) 
  22.   { 
  23.   SSVAL(&ptr->header.len,0,count); 
  24.   SSVAL(&ptr->header.maxlen,0,count); 
  25.   SIVAL(&ptr->header.offset,0,((ptr->buffer - ((uint8*)ptr)) + ptr->bufIndex)); 
  26.   memcpy(ptr->buffer+ptr->bufIndex, buf, count); 
  27.   ptr->bufIndex += count; 
  28.   } 
  29. else 
  30.   { 
  31.   ptr->header.len = 
  32.   ptr->header.maxlen = 0; 
  33.   SIVAL(&ptr->header.offset,0,ptr->bufIndex); 
  34.   } 
  35. }
  36. #define AddString(ptr, header, string) 
  37. char *p = string; 
  38. int len = 0; 
  39. if (p) len = strlen(p); 
  40. AddBytes(ptr, header, ((unsigned char*)p), len); 
  41. }
  42. #define AddUnicodeString(ptr, header, string) 
  43. char *p = string; 
  44. unsigned char *b = NULL; 
  45. int len = 0; 
  46. if (p) 
  47.   { 
  48.   len = strlen(p); 
  49.   b = strToUnicode(p); 
  50.   } 
  51. AddBytes(ptr, header, b, len*2); 
  52. }
  53. #define GetUnicodeString(structPtr, header) 
  54. unicodeToString(((char*)structPtr) + IVAL(&structPtr->header.offset,0) , SVAL(&structPtr->header.len,0)/2)
  55. #define GetString(structPtr, header) 
  56. toString((((char *)structPtr) + IVAL(&structPtr->header.offset,0)), SVAL(&structPtr->header.len,0))
  57. #define DumpBuffer(fp, structPtr, header) 
  58. dumpRaw(fp,((unsigned char*)structPtr)+IVAL(&structPtr->header.offset,0),SVAL(&structPtr->header.len,0))
  59. static void dumpRaw(FILE *fp, unsigned char *buf, size_t len)
  60.   {
  61.   int i;
  62.   
  63.   for (i=0; i<len; ++i)
  64.     fprintf(fp,"%02x ",buf[i]);
  65.     
  66.     fprintf(fp,"n");
  67.   }
  68. static char *unicodeToString(char *p, size_t len)
  69.   {
  70.   int i;
  71.   static char buf[1024];
  72.   assert(len+1 < sizeof buf);
  73.   
  74.   for (i=0; i<len; ++i)
  75.     {  
  76.     buf[i] = *p & 0x7f;
  77.     p += 2;
  78.     }
  79.   buf[i] = '';
  80.   return buf;
  81.   }
  82. static unsigned char *strToUnicode(char *p)
  83.   {
  84.   static unsigned char buf[1024];
  85.   size_t l = strlen(p);
  86.   int i = 0;
  87.   
  88.   assert(l*2 < sizeof buf);
  89.   
  90.   while (l--)
  91.     {
  92.     buf[i++] = *p++;
  93.     buf[i++] = 0;
  94.     }
  95.   
  96.   return buf;
  97.   }
  98. static unsigned char *toString(char *p, size_t len)
  99.   {
  100.   static unsigned char buf[1024];
  101.   
  102.   assert(len+1 < sizeof buf);
  103.   
  104.   memcpy(buf,p,len);
  105.   buf[len] = 0;
  106.   return buf;
  107.   }
  108. void dumpSmbNtlmAuthRequest(FILE *fp, tSmbNtlmAuthRequest *request)
  109.   {
  110.   fprintf(fp,"NTLM Request:n");
  111.   fprintf(fp,"      Ident = %sn",request->ident);
  112.   fprintf(fp,"      mType = %dn",IVAL(&request->msgType,0));
  113.   fprintf(fp,"      Flags = %08xn",IVAL(&request->flags,0));
  114.   fprintf(fp,"       User = %sn",GetString(request,user));
  115.   fprintf(fp,"     Domain = %sn",GetString(request,domain));
  116.   }
  117. void dumpSmbNtlmAuthChallenge(FILE *fp, tSmbNtlmAuthChallenge *challenge)
  118.   {
  119.   fprintf(fp,"NTLM Challenge:n");
  120.   fprintf(fp,"      Ident = %sn",challenge->ident);
  121.   fprintf(fp,"      mType = %dn",IVAL(&challenge->msgType,0));
  122.   fprintf(fp,"     Domain = %sn",GetUnicodeString(challenge,uDomain));
  123.   fprintf(fp,"      Flags = %08xn",IVAL(&challenge->flags,0));
  124.   fprintf(fp,"  Challenge = "); dumpRaw(fp, challenge->challengeData,8);
  125.   }
  126. void dumpSmbNtlmAuthResponse(FILE *fp, tSmbNtlmAuthResponse *response)
  127.   {
  128.   fprintf(fp,"NTLM Response:n");
  129.   fprintf(fp,"      Ident = %sn",response->ident);
  130.   fprintf(fp,"      mType = %dn",IVAL(&response->msgType,0));
  131.   fprintf(fp,"     LmResp = "); DumpBuffer(fp,response,lmResponse);
  132.   fprintf(fp,"     NTResp = "); DumpBuffer(fp,response,ntResponse);
  133.   fprintf(fp,"     Domain = %sn",GetUnicodeString(response,uDomain));
  134.   fprintf(fp,"       User = %sn",GetUnicodeString(response,uUser));
  135.   fprintf(fp,"        Wks = %sn",GetUnicodeString(response,uWks));
  136.   fprintf(fp,"       sKey = "); DumpBuffer(fp, response,sessionKey);
  137.   fprintf(fp,"      Flags = %08xn",IVAL(&response->flags,0));
  138.   }
  139. void buildSmbNtlmAuthRequest(tSmbNtlmAuthRequest *request, char *user, char *domain)
  140.   {
  141.     char *u = strdup(user);
  142.     char *p = strchr(u,'@');
  143.     
  144.     if (p)
  145.       {
  146.         if (!domain) 
  147.           domain = p+1;
  148.         *p = '';
  149.       }
  150.     
  151.     request->bufIndex = 0;
  152.     memcpy(request->ident,"NTLMSSP",8);
  153.     SIVAL(&request->msgType,0,1);
  154.     SIVAL(&request->flags,0,0x0000b207);  /* have to figure out what these mean */
  155.     AddString(request,user,u);
  156.     AddString(request,domain,domain);
  157.     free(u);
  158.   }
  159. void buildSmbNtlmAuthResponse(tSmbNtlmAuthChallenge *challenge, tSmbNtlmAuthResponse *response, char *user, char *password)
  160.   {
  161.     uint8 lmRespData[24];
  162.     uint8 ntRespData[24];
  163.     char *d = strdup(GetUnicodeString(challenge,uDomain));
  164.     char *domain = d;
  165.     char *u = strdup(user);
  166.     char *p = strchr(u,'@');
  167.     
  168.     if (p)
  169.       {
  170.         domain = p+1;
  171.         *p = '';
  172.       }
  173.     
  174.     SMBencrypt(password,   challenge->challengeData, lmRespData);
  175.     SMBNTencrypt(password, challenge->challengeData, ntRespData);
  176.     
  177.     response->bufIndex = 0;
  178.     memcpy(response->ident,"NTLMSSP",8);
  179.     SIVAL(&response->msgType,0,3);
  180.     
  181.     AddBytes(response,lmResponse,lmRespData,24);
  182.     AddBytes(response,ntResponse,ntRespData,24);
  183.     AddUnicodeString(response,uDomain,domain);
  184.     AddUnicodeString(response,uUser,u);
  185.     AddUnicodeString(response,uWks,u);
  186.     AddString(response,sessionKey,NULL);
  187.   
  188.     response->flags = challenge->flags;
  189.     
  190.     free(d);
  191.     free(u);
  192.   }
  193.