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

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * Functions to trace SSL protocol behavior in DEBUG builds.
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public
  5.  * License Version 1.1 (the "License"); you may not use this file
  6.  * except in compliance with the License. You may obtain a copy of
  7.  * the License at http://www.mozilla.org/MPL/
  8.  * 
  9.  * Software distributed under the License is distributed on an "AS
  10.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  11.  * implied. See the License for the specific language governing
  12.  * rights and limitations under the License.
  13.  * 
  14.  * The Original Code is the Netscape security libraries.
  15.  * 
  16.  * The Initial Developer of the Original Code is Netscape
  17.  * Communications Corporation.  Portions created by Netscape are 
  18.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  19.  * Rights Reserved.
  20.  * 
  21.  * Contributor(s):
  22.  * 
  23.  * Alternatively, the contents of this file may be used under the
  24.  * terms of the GNU General Public License Version 2 or later (the
  25.  * "GPL"), in which case the provisions of the GPL are applicable 
  26.  * instead of those above.  If you wish to allow use of your 
  27.  * version of this file only under the terms of the GPL and not to
  28.  * allow others to use your version of this file under the MPL,
  29.  * indicate your decision by deleting the provisions above and
  30.  * replace them with the notice and other provisions required by
  31.  * the GPL.  If you do not delete the provisions above, a recipient
  32.  * may use your version of this file under either the MPL or the
  33.  * GPL.
  34.  *
  35.  * $Id: ssltrace.c,v 1.1 2000/03/31 19:37:16 relyea%netscape.com Exp $
  36.  */
  37. #include <stdarg.h>
  38. #include "cert.h"
  39. #include "ssl.h"
  40. #include "sslimpl.h"
  41. #include "sslproto.h"
  42. #include "prprf.h"
  43. #if defined(DEBUG) || defined(TRACE)
  44. static const char *hex = "0123456789abcdef";
  45. static const char printable[257] = {
  46. "................" /* 0x */
  47. "................" /* 1x */
  48. " !"#$%&'()*+,-./" /* 2x */
  49. "0123456789:;<=>?" /* 3x */
  50. "@ABCDEFGHIJKLMNO" /* 4x */
  51. "PQRSTUVWXYZ[\]^_" /* 5x */
  52. "`abcdefghijklmno" /* 6x */
  53. "pqrstuvwxyz{|}~." /* 7x */
  54. "................" /* 8x */
  55. "................" /* 9x */
  56. "................" /* ax */
  57. "................" /* bx */
  58. "................" /* cx */
  59. "................" /* dx */
  60. "................" /* ex */
  61. "................" /* fx */
  62. };
  63. void ssl_PrintBuf(sslSocket *ss, const char *msg, const void *vp, int len)
  64. {
  65.     const unsigned char *cp = (const unsigned char *)vp;
  66.     char buf[80];
  67.     char *bp;
  68.     char *ap;
  69.     if (ss) {
  70. SSL_TRACE(("%d: SSL[%d]: %s [Len: %d]", SSL_GETPID(), ss->fd,
  71.    msg, len));
  72.     } else {
  73. SSL_TRACE(("%d: SSL: %s [Len: %d]", SSL_GETPID(), msg, len));
  74.     }
  75.     memset(buf, ' ', sizeof buf);
  76.     bp = buf;
  77.     ap = buf + 50;
  78.     while (--len >= 0) {
  79. unsigned char ch = *cp++;
  80. *bp++ = hex[(ch >> 4) & 0xf];
  81. *bp++ = hex[ch & 0xf];
  82. *bp++ = ' ';
  83. *ap++ = printable[ch];
  84. if (ap - buf >= 66) {
  85.     *ap = 0;
  86.     SSL_TRACE(("   %s", buf));
  87.     memset(buf, ' ', sizeof buf);
  88.     bp = buf;
  89.     ap = buf + 50;
  90. }
  91.     }
  92.     if (bp > buf) {
  93. *ap = 0;
  94. SSL_TRACE(("   %s", buf));
  95.     }
  96. }
  97. #define LEN(cp) (((cp)[0] << 8) | ((cp)[1]))
  98. static void PrintType(sslSocket *ss, char *msg)
  99. {
  100.     if (ss) {
  101. SSL_TRACE(("%d: SSL[%d]: dump-msg: %s", SSL_GETPID(), ss->fd,
  102.    msg));
  103.     } else {
  104. SSL_TRACE(("%d: SSL: dump-msg: %s", SSL_GETPID(), msg));
  105.     }
  106. }
  107. static void PrintInt(sslSocket *ss, char *msg, unsigned v)
  108. {
  109.     if (ss) {
  110. SSL_TRACE(("%d: SSL[%d]:           %s=%u", SSL_GETPID(), ss->fd,
  111.    msg, v));
  112.     } else {
  113. SSL_TRACE(("%d: SSL:           %s=%u", SSL_GETPID(), msg, v));
  114.     }
  115. }
  116. /* PrintBuf is just like ssl_PrintBuf above, except that:
  117.  * a) It prefixes each line of the buffer with "XX: SSL[xxx]           "
  118.  * b) It dumps only hex, not ASCII.
  119.  */
  120. static void PrintBuf(sslSocket *ss, char *msg, unsigned char *cp, int len)
  121. {
  122.     char buf[80];
  123.     char *bp;
  124.     if (ss) {
  125. SSL_TRACE(("%d: SSL[%d]:           %s [Len: %d]", 
  126.    SSL_GETPID(), ss->fd, msg, len));
  127.     } else {
  128. SSL_TRACE(("%d: SSL:           %s [Len: %d]", 
  129.    SSL_GETPID(), msg, len));
  130.     }
  131.     bp = buf;
  132.     while (--len >= 0) {
  133. unsigned char ch = *cp++;
  134. *bp++ = hex[(ch >> 4) & 0xf];
  135. *bp++ = hex[ch & 0xf];
  136. *bp++ = ' ';
  137. if (bp + 4 > buf + 50) {
  138.     *bp = 0;
  139.     if (ss) {
  140. SSL_TRACE(("%d: SSL[%d]:             %s",
  141.    SSL_GETPID(), ss->fd, buf));
  142.     } else {
  143. SSL_TRACE(("%d: SSL:             %s", SSL_GETPID(), buf));
  144.     }
  145.     bp = buf;
  146. }
  147.     }
  148.     if (bp > buf) {
  149. *bp = 0;
  150. if (ss) {
  151.     SSL_TRACE(("%d: SSL[%d]:             %s",
  152.        SSL_GETPID(), ss->fd, buf));
  153. } else {
  154.     SSL_TRACE(("%d: SSL:             %s", SSL_GETPID(), buf));
  155. }
  156.     }
  157. }
  158. void ssl_DumpMsg(sslSocket *ss, unsigned char *bp, unsigned len)
  159. {
  160.     switch (bp[0]) {
  161.       case SSL_MT_ERROR:
  162. PrintType(ss, "Error");
  163. PrintInt(ss, "error", LEN(bp+1));
  164. break;
  165.       case SSL_MT_CLIENT_HELLO:
  166. {
  167.     unsigned lcs = LEN(bp+3);
  168.     unsigned ls  = LEN(bp+5);
  169.     unsigned lc  = LEN(bp+7);
  170.     PrintType(ss, "Client-Hello");
  171.     PrintInt(ss, "version (Major)",                   bp[1]);
  172.     PrintInt(ss, "version (minor)",                   bp[2]);
  173.     PrintBuf(ss, "cipher-specs",         bp+9,        lcs);
  174.     PrintBuf(ss, "session-id",           bp+9+lcs,    ls);
  175.     PrintBuf(ss, "challenge",            bp+9+lcs+ls, lc);
  176. }
  177. break;
  178.       case SSL_MT_CLIENT_MASTER_KEY:
  179. {
  180.     unsigned lck = LEN(bp+4);
  181.     unsigned lek = LEN(bp+6);
  182.     unsigned lka = LEN(bp+8);
  183.     PrintType(ss, "Client-Master-Key");
  184.     PrintInt(ss, "cipher-choice",                       bp[1]);
  185.     PrintInt(ss, "key-length",                          LEN(bp+2));
  186.     PrintBuf(ss, "clear-key",            bp+10,         lck);
  187.     PrintBuf(ss, "encrypted-key",        bp+10+lck,     lek);
  188.     PrintBuf(ss, "key-arg",              bp+10+lck+lek, lka);
  189. }
  190. break;
  191.       case SSL_MT_CLIENT_FINISHED:
  192. PrintType(ss, "Client-Finished");
  193. PrintBuf(ss, "connection-id",            bp+1,          len-1);
  194. break;
  195.       case SSL_MT_SERVER_HELLO:
  196. {
  197.     unsigned lc = LEN(bp+5);
  198.     unsigned lcs = LEN(bp+7);
  199.     unsigned lci = LEN(bp+9);
  200.     PrintType(ss, "Server-Hello");
  201.     PrintInt(ss, "session-id-hit",                     bp[1]);
  202.     PrintInt(ss, "certificate-type",                   bp[2]);
  203.     PrintInt(ss, "version (Major)",                    bp[3]);
  204.     PrintInt(ss, "version (minor)",                    bp[3]);
  205.     PrintBuf(ss, "certificate",          bp+11,        lc);
  206.     PrintBuf(ss, "cipher-specs",         bp+11+lc,     lcs);
  207.     PrintBuf(ss, "connection-id",        bp+11+lc+lcs, lci);
  208. }
  209. break;
  210.       case SSL_MT_SERVER_VERIFY:
  211. PrintType(ss, "Server-Verify");
  212. PrintBuf(ss, "challenge",                bp+1,         len-1);
  213. break;
  214.       case SSL_MT_SERVER_FINISHED:
  215. PrintType(ss, "Server-Finished");
  216. PrintBuf(ss, "session-id",               bp+1,         len-1);
  217. break;
  218.       case SSL_MT_REQUEST_CERTIFICATE:
  219. PrintType(ss, "Request-Certificate");
  220. PrintInt(ss, "authentication-type",                    bp[1]);
  221. PrintBuf(ss, "certificate-challenge",    bp+2,         len-2);
  222. break;
  223.       case SSL_MT_CLIENT_CERTIFICATE:
  224. {
  225.     unsigned lc = LEN(bp+2);
  226.     unsigned lr = LEN(bp+4);
  227.     PrintType(ss, "Client-Certificate");
  228.     PrintInt(ss, "certificate-type",                   bp[1]);
  229.     PrintBuf(ss, "certificate",          bp+6,         lc);
  230.     PrintBuf(ss, "response",             bp+6+lc,      lr);
  231. }
  232. break;
  233.       default:
  234. ssl_PrintBuf(ss, "sending *unknown* message type", bp, len);
  235. return;
  236.     }
  237. }
  238. void
  239. ssl_Trace(const char *format, ... )
  240. {
  241.     char buf[2000]; 
  242.     va_list args;
  243.     va_start(args, format);
  244.     PR_vsnprintf(buf, sizeof(buf), format, args);
  245.     va_end(args);
  246.     puts(buf);
  247. }
  248. #endif