tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

ssltrace.c (2800B)


      1 /*
      2 * Functions to trace SSL protocol behavior in DEBUG builds.
      3 *
      4 * This Source Code Form is subject to the terms of the Mozilla Public
      5 * License, v. 2.0. If a copy of the MPL was not distributed with this
      6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      7 #include <stdarg.h>
      8 #include "cert.h"
      9 #include "pk11func.h"
     10 #include "ssl.h"
     11 #include "sslimpl.h"
     12 #include "sslproto.h"
     13 #include "prprf.h"
     14 
     15 #if defined(DEBUG) || defined(TRACE)
     16 static const char *hex = "0123456789abcdef";
     17 
     18 static const char printable[257] = {
     19    "................"  /* 0x */
     20    "................"  /* 1x */
     21    " !\"#$%&'()*+,-./" /* 2x */
     22    "0123456789:;<=>?"  /* 3x */
     23    "@ABCDEFGHIJKLMNO"  /* 4x */
     24    "PQRSTUVWXYZ[\\]^_" /* 5x */
     25    "`abcdefghijklmno"  /* 6x */
     26    "pqrstuvwxyz{|}~."  /* 7x */
     27    "................"  /* 8x */
     28    "................"  /* 9x */
     29    "................"  /* ax */
     30    "................"  /* bx */
     31    "................"  /* cx */
     32    "................"  /* dx */
     33    "................"  /* ex */
     34    "................"  /* fx */
     35 };
     36 
     37 void
     38 ssl_PrintBuf(const sslSocket *ss, const char *msg, const void *vp, int len)
     39 {
     40    const unsigned char *cp = (const unsigned char *)vp;
     41    char buf[80];
     42    char *bp;
     43    char *ap;
     44 
     45    if (ss) {
     46        SSL_TRACE(("%d: SSL[%d]: %s [Len: %d]", SSL_GETPID(), ss->fd,
     47                   msg, len));
     48    } else {
     49        SSL_TRACE(("%d: SSL: %s [Len: %d]", SSL_GETPID(), msg, len));
     50    }
     51 
     52    if (!cp) {
     53        SSL_TRACE(("   <NULL>"));
     54        return;
     55    }
     56 
     57    memset(buf, ' ', sizeof buf);
     58    bp = buf;
     59    ap = buf + 50;
     60    while (--len >= 0) {
     61        unsigned char ch = *cp++;
     62        *bp++ = hex[(ch >> 4) & 0xf];
     63        *bp++ = hex[ch & 0xf];
     64        *bp++ = ' ';
     65        *ap++ = printable[ch];
     66        if (ap - buf >= 66) {
     67            *ap = 0;
     68            SSL_TRACE(("   %s", buf));
     69            memset(buf, ' ', sizeof buf);
     70            bp = buf;
     71            ap = buf + 50;
     72        }
     73    }
     74    if (bp > buf) {
     75        *ap = 0;
     76        SSL_TRACE(("   %s", buf));
     77    }
     78 }
     79 
     80 void
     81 ssl_Trace(const char *format, ...)
     82 {
     83    char buf[2000];
     84    va_list args;
     85 
     86    if (ssl_trace_iob) {
     87        va_start(args, format);
     88        PR_vsnprintf(buf, sizeof(buf), format, args);
     89        va_end(args);
     90 
     91        fputs(buf, ssl_trace_iob);
     92        fputs("\n", ssl_trace_iob);
     93    }
     94 }
     95 
     96 void
     97 ssl_PrintKey(const sslSocket *ss, const char *msg, PK11SymKey *key)
     98 {
     99    SECStatus rv;
    100    SECItem *rawkey;
    101 
    102    rv = PK11_ExtractKeyValue(key);
    103    if (rv != SECSuccess) {
    104        ssl_Trace("Could not extract key for %s", msg);
    105        return;
    106    }
    107    rawkey = PK11_GetKeyData(key);
    108    if (!rawkey) {
    109        ssl_Trace("Could not extract key for %s", msg);
    110        return;
    111    }
    112    ssl_PrintBuf(ss, msg, rawkey->data, rawkey->len);
    113 }
    114 #endif