dongle.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:6k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  */
  33. #include "secutil.h"
  34. #include "sechash.h"
  35. #ifdef XP_UNIX
  36. #include <unistd.h>
  37. #include <netdb.h>
  38. #include <sys/types.h>
  39. #include <netinet/in.h>
  40. #endif
  41. #ifdef XP_WIN
  42. #include <windows.h>
  43. #include <winsock.h>
  44. #include <sys/types.h>
  45. #include <sys/stat.h>
  46. #endif
  47. #ifdef XP_MAC
  48. #include <unistd.h>
  49. #endif
  50. #ifdef XP_UNIX
  51. #include "prnetdb.h"
  52. #else
  53. #define PRHostEnt struct hostent
  54. #define PR_NETDB_BUF_SIZE 5
  55. #endif
  56. static RC4Context *
  57. sec_MakeDongleKey(void)
  58. {
  59.     RC4Context *rc4;
  60.     char hostname[64];
  61.     PRHostEnt hpbuf, *hent;
  62.     char dbbuf[PR_NETDB_BUF_SIZE];
  63.     int ipaddr;
  64.     struct stat s;
  65.     int found = 1; /* Whether /vmunix, etc. found */
  66.     unsigned char *buf, *totalbuf;
  67.     MD5Context *md5 = 0;
  68.     unsigned char digest[16];
  69.     unsigned int digestLen;
  70.     /* NOTE: Fix MAC and WIN to stat something comparable to kernel on UNIX */
  71. #ifdef XP_MAC
  72.     return NULL;
  73. #elif defined(XP_WIN)
  74.     return NULL;
  75. #endif
  76.     /* gather system data */
  77.     if( gethostname( hostname, 64 ) < 0 ) {
  78. return(NULL);
  79.     }
  80. #ifdef XP_UNIX
  81. #ifndef NSPR20
  82.     hent = PR_gethostbyname(hostname, &hpbuf, dbbuf, sizeof(dbbuf), 0);
  83. #else
  84.     if (PR_GetHostByName(hostname, dbbuf, sizeof(dbbuf), &hpbuf) == PR_SUCCESS)
  85. hent = &hpbuf;
  86.     else
  87. hent = NULL;
  88. #endif
  89. #else
  90.     hent = gethostbyname(hostname);
  91. #endif
  92.     if (hent == NULL) {
  93. return(NULL);
  94.     }
  95.     ipaddr = htonl(((struct in_addr *)hent->h_addr)->s_addr);
  96.     /*
  97.     ** /unix         IRIX & AIX & SCO
  98.     ** /vmunix       SunOS & OSF
  99.     ** /kernel/unix  Solaris
  100.     ** /vmlinuz      Linux
  101.     ** /hp-ux        HP-UX
  102.     ** /bsd          BSD
  103.     */
  104.     if ( (stat("/unix", &s) == -1 ) && (stat("/vmunix", &s) == -1) &&
  105.  (stat("/bsd", &s) == -1) && (stat("kernel/unix", &s)== -1) &&
  106.  (stat("/hp-ux", &s) == -1) && (stat("/vmlinuz", &s) == -1) ) {
  107. found = 0;
  108.     }
  109.       
  110.     buf = totalbuf = (unsigned char *)
  111. XP_CALLOC(1, 1000 + sizeof(ipaddr) + sizeof(s) + PORT_Strlen(hostname));
  112.     
  113.     if ( buf == 0 ) {
  114. return(NULL);
  115.     }
  116.     PORT_Memcpy(buf, hostname, PORT_Strlen(hostname));
  117.     buf += PORT_Strlen(hostname);
  118.     
  119.     PORT_Memcpy(buf, &ipaddr, sizeof(ipaddr));
  120.     buf += sizeof(ipaddr);
  121.    
  122.     if (found) {
  123. PORT_Memcpy(buf, &s.st_mode, sizeof(s.st_mode));
  124. buf += sizeof(s.st_mode);
  125.     
  126. PORT_Memcpy(buf, &s.st_ino, sizeof(s.st_ino));
  127. buf += sizeof(s.st_ino);
  128. PORT_Memcpy(buf, &s.st_dev, sizeof(s.st_dev));
  129. buf += sizeof(s.st_dev);
  130. PORT_Memcpy(buf, &s.st_mtime, sizeof(s.st_mtime));
  131. buf += sizeof(s.st_mtime);
  132.     }
  133.     /* Digest the system info using MD5 */
  134.     md5 = MD5_NewContext();
  135.     if (md5 == NULL) {
  136. return (NULL);
  137.     }
  138.     MD5_Begin(md5);
  139.     MD5_Update(md5, totalbuf, PORT_Strlen((char *)totalbuf));
  140.     MD5_End(md5, digest, &digestLen, MD5_LENGTH);
  141.     /* Make an RC4 key using the digest */
  142.     rc4 = RC4_CreateContext(digest, digestLen);
  143.     /* Zero out information */
  144.     MD5_DestroyContext(md5, PR_TRUE);
  145.     PORT_Memset(digest, 0 , sizeof(digest));
  146.    
  147.     return(rc4);
  148. }
  149. extern unsigned char *
  150. SEC_ReadDongleFile(int fd)
  151. {
  152.     RC4Context *rc4;
  153.     struct stat s;
  154.     unsigned char *inbuf, *pw;
  155.     int nb;
  156.     unsigned int pwlen, inlen;
  157.     SECStatus rv;
  158.     
  159.     rc4 = sec_MakeDongleKey();
  160.     if (rc4 == NULL) {
  161. return(0);
  162.     }
  163.     /* get size of file */
  164.     if ( fstat(fd, &s) < 0 ) {
  165. return(0);
  166.     }
  167.     inlen = s.st_size;
  168.     
  169.     inbuf = (unsigned char *) PORT_Alloc(inlen);
  170.     if (!inbuf) {
  171. return(0);
  172.     }
  173.     nb = read(fd, (char *)inbuf, inlen);
  174.     if (nb != inlen) {
  175. return(0);
  176.     }
  177.     pw = (unsigned char *) PORT_Alloc(inlen);
  178.     if (pw == 0) {
  179. return(0);
  180.     }
  181.     rv = RC4_Decrypt(rc4, pw, &pwlen, inlen, inbuf, inlen);
  182.     if (rv) {
  183. return(0);
  184.     }
  185.     PORT_Free(inbuf);
  186.     return(pw);
  187. }
  188. extern SECStatus
  189. SEC_WriteDongleFile(int fd, unsigned char *pw)
  190. {
  191.     RC4Context *rc4;
  192.     unsigned char *outbuf;
  193.     unsigned int outlen;
  194.     SECStatus rv;
  195.     int nb;
  196.     
  197.     rc4 = sec_MakeDongleKey();
  198.     if (rc4 == NULL) {
  199. return(SECFailure);
  200.     }
  201.     outbuf = (unsigned char *) PORT_Alloc(PORT_Strlen((char *)pw) + 1);
  202.     if (!outbuf) {
  203. return(SECFailure);
  204.     }
  205.     rv = RC4_Encrypt(rc4, outbuf, &outlen, PORT_Strlen((char *)pw), pw,
  206.      PORT_Strlen((char *)pw));
  207.     if (rv) {
  208. return(SECFailure);
  209.     }
  210.     RC4_DestroyContext(rc4, PR_TRUE);
  211.     nb = write(fd, (char *)outbuf, outlen);
  212.     if (nb != outlen) {
  213. return(SECFailure);
  214.     }
  215.     PORT_Free(outbuf);
  216.     return(SECSuccess);
  217. }