⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ntlmssp.cpp

📁 VXWORKS源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* ntlmssp.cpp - NT LM security implementation *//* Copyright (c) 1998 Wind River Systems, Inc. *//*modification history--------------------01s,17dec01,nel  Add include symbol for diab.01r,16jul01,dbs  fix unix-build includes01q,13jul01,dbs  fix up includes01p,09dec99,nel  SPR#33730. Merge T2 OPC fixes into T3 branch.01o,09dec99,nel  Mods to DES routines01n,19aug99,aim  change assert to VXDCOM_ASSERT01m,05aug99,dbs  add mutex around channel-map01l,19jul99,dbs  add more knowledge of packet layouts01k,13jul99,aim  syslog api changes01j,28jun99,dbs  remove defaultInstance method01i,24jun99,dbs  implement more of NTLM protocol01h,23jun99,dbs  create class for NTLM authn01g,26may99,dbs  adding more knowledge of protocol01f,26apr99,aim  added TRACE_CALL01e,20apr99,dbs  grand renaming01d,09apr99,drm  added diagnostic output01c,11mar99,dbs  add more hooks for authentication01b,02mar99,dbs  remove printf01a,15feb99,dbs  created*/#include <ctype.h>#include "ntlmssp.h"#include "SCM.h"#include "Syslog.h"#include "TraceCall.h"#include "private/comMisc.h"/* Include symbol for diab */extern "C" int include_vxdcom_ntlmssp (void)    {    return 0;    }////////////////////////////////////////////////////////////////////////////// Class statics...//NTLMSSP::USERTABLE NTLMSSP::s_userTable;//////////////////////////////////////////////////////////////////////////BYTE NTLMSSP::s_token [16] =    { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };BYTE NTLMSSP::s_defaultChallenge [] = "GO AWAY";//////////////////////////////////////////////////////////////////////////const BYTE NTLMSSP::DES::lmKey [NTLMSSP::DES::lmKeySize] =     {0x4b, 0x47, 0x53, 0x21, 0x40, 0x23, 0x24, 0x25};const BYTE NTLMSSP::DES::pc1 [NTLMSSP::DES::pc1Size] =    {    57, 49, 41, 33, 25, 17,  9,    1, 58, 50, 42, 34, 26, 18,    10,  2, 59, 51, 43, 35, 27,    19, 11,  3, 60, 52, 44, 36,    63, 55, 47, 39, 31, 23, 15,    7, 62, 54, 46, 38, 30, 22,    14,  6, 61, 53, 45, 37, 29,    21, 13,  5, 28, 20, 12,  4    };const BYTE NTLMSSP::DES::pc2 [NTLMSSP::DES::pc2Size] =    {    14, 17, 11, 24,  1,  5,    3, 28, 15,  6, 21, 10,    23, 19, 12,  4, 26,  8,    16,  7, 27, 20, 13,  2,    41, 52, 31, 37, 47, 55,    30, 40, 51, 45, 33, 48,    44, 49, 39, 56, 34, 53,    46, 42, 50, 36, 29, 32    };const BYTE NTLMSSP::DES::e [NTLMSSP::DES::eSize] =     {    32,  1,  2,  3,  4,  5,    4,  5,  6,  7,  8,  9,    8,  9, 10, 11, 12, 13,    12, 13, 14, 15, 16, 17,    16, 17, 18, 19, 20, 21,    20, 21, 22, 23, 24, 25,    24, 25, 26, 27, 28, 29,    28, 29, 30, 31, 32,  1    };const BYTE NTLMSSP::DES::p [NTLMSSP::DES::pSize] =     {    16,  7, 20, 21,    29, 12, 28, 17,    1, 15, 23, 26,    5, 18, 31, 10,    2,  8, 24, 14,    32, 27,  3,  9,    19, 13, 30,  6,    22, 11,  4, 25    };const BYTE NTLMSSP::DES::ip1 [NTLMSSP::DES::ip1Size] =    {    40,  8, 48, 16, 56, 24, 64, 32,    39,  7, 47, 15, 55, 23, 63, 31,    38,  6, 46, 14, 54, 22, 62, 30,    37,  5, 45, 13, 53, 21, 61, 29,    36,  4, 44, 12, 52, 20, 60, 28,    35,  3, 43, 11, 51, 19, 59, 27,    34,  2, 42, 10, 50, 18, 58, 26,    33,  1, 41,  9, 49, 17, 57, 25    };const BYTE NTLMSSP::DES::ip [ipSize] =    {    58, 50, 42, 34, 26, 18, 10,  2,    60, 52, 44, 36, 28, 20, 12,  4,    62, 54, 46, 38, 30, 22, 14,  6,    64, 56, 48, 40, 32, 24, 16,  8,    57, 49, 41, 33, 25, 17,  9,  1,    59, 51, 43, 35, 27, 19, 11,  3,    61, 53, 45, 37, 29, 21, 13,  5,    63, 55, 47, 39, 31, 23, 15,  7    };const BYTE NTLMSSP::DES::noOfLeftShifts [NTLMSSP::DES::leftShiftSize] =    {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};const BYTE NTLMSSP::DES::s [sSize][NTLMSSP::DES::sRowSize][NTLMSSP::DES::sColSize] =    {        {            {14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7},            {0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8},            {4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0},            {15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13}        },        {            {15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10},            {3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5},            {0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15},            {13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9}        },        {            {10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8},            {13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1},            {13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7},            {1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12}        },        {            {7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15},            {13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9},            {10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4},            {3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14}        },        {            {2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9},            {14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6},            {4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14},            {11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3}        },        {            {12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11},            {10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8},            {9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6},            {4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13}        },        {            {4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1},            {13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6},            {1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2},            {6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12}        },        {            {13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7},            {1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2},            {7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8},            {2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11}        }    };/////////////////////////////////////////////////////////////////////// // Des :: doHash - produce encrypted data from encryption tables// // This routine takes a key and input data and encypts it using the// DES algorithm.// // RETURNS: nothing// void NTLMSSP::DES::dohash    (    BYTE *          output, // encrypted data    const BYTE *    input,  // input data    const BYTE *    key     // encryption key    )    {    int     i;              // various counts    int     j;    int     k;    BYTE    fromPc1 [pc1Size];    BYTE    firstHalf [pc1Size / 2];    BYTE    secondHalf [pc1Size / 2];    BYTE    shiftedPc1 [pc1Size];    BYTE    fromPc2 [leftShiftSize][pc2Size];    BYTE    pIp [ipSize];    BYTE    pIpFirstHalf [ipSize / 2];    BYTE    pIpSecondHalf [ipSize / 2];    BYTE    fromIp [ipSize];    // permute pc1 with supplied key    permute(fromPc1, key, pc1, pc1Size);    for (i = 0; i < pc1Size / 2; i++)        firstHalf [i] = fromPc1 [i];    for (i = 0; i < pc1Size / 2; i++)        secondHalf [i] = fromPc1 [i + pc1Size / 2];    for ( i = 0; i < leftShiftSize; i++)        {        lshift(firstHalf, noOfLeftShifts [i], pc1Size / 2);        lshift(secondHalf, noOfLeftShifts [i], pc1Size / 2);        // merge two tables together for permute        memmove (shiftedPc1, firstHalf, pc1Size / 2);        memmove (shiftedPc1 + pc1Size / 2, secondHalf, pc1Size / 2);        permute(fromPc2 [i], shiftedPc1, pc2, pc2Size);         }    permute(pIp, input, ip, ipSize);    for (j = 0; j < ipSize / 2; j++)         {        pIpFirstHalf [j] = pIp [j];        pIpSecondHalf [j] = pIp [j + ipSize / 2];        }    for (i = 0; i < leftShiftSize; i++)         {        BYTE pIpShE [eSize];        BYTE pIpShEx [eSize];        BYTE t [8][6];        BYTE reverseT [pSize];        BYTE reverseTp [pSize];        BYTE t2 [pSize];        int  x;                 // only use for block xor        permute(pIpShE, pIpSecondHalf, e, eSize);        for (x = 0; x < eSize; x++)            pIpShEx [x] = pIpShE [x] ^ fromPc2 [i][x];        for (j = 0; j < 8; j++)            {            for (k = 0; k < 6; k++)                t [j][k] = pIpShEx [j * 6 + k];            }        for (j = 0; j < 8; j++)             {            int m, n;            m = (t [j][0] << 1) | t [j][5];            n = (t [j][1] << 3) | (t [j][2] << 2) | (t [j][3] << 1) | t [j][4];             for (k = 0; k < 4; k++)                 t [j][k] = (s [j][m][n] & (1 << (3 - k))) ? 1 : 0;             }        for (j = 0; j < 8; j++)            {            for (k = 0; k < 4; k++)                reverseT [j * 4 + k] = t [j][k];            }        permute(reverseTp, reverseT, p, pSize);        for (x = 0; x < pSize; x++)            t2 [x] = pIpFirstHalf [x] ^ reverseTp [x];        for (j = 0; j < ipSize / 2; j++)            pIpFirstHalf [j] = pIpSecondHalf [j];        for (j = 0; j < ipSize / 2; j++)            pIpSecondHalf [j] = t2 [j];    }    // merge two tables together for permute    memmove (fromIp, pIpSecondHalf, ipSize / 2);    memmove (fromIp + ipSize / 2, pIpFirstHalf, ipSize / 2);    permute(output, fromIp, ip1, ip1Size);    }/////////////////////////////////////////////////////////////////////// // Des :: hash - prepares key for doHash and compresses resulting//               data into 64 bit value.// // This routine is a wrapper routine around doHash. It modifies the// encryption key for use with doHash. It also compresses the resulting// table into 64 bits.// // RETURNS: nothing// void NTLMSSP::DES::hash     (    BYTE *          output,    // encrypted result    const BYTE *    input,     // input data    const BYTE *    key        // encryption key    )    {    int             i;    BYTE            outputBuffer [bufferSize];    BYTE            inputBuffer [bufferSize];    BYTE            keyBuffer [bufferSize];    BYTE            encryptKey [keySize];    encryptKey [0] = key [0] >> 1;    encryptKey [1] = ((key [0] & 0x01) << 6) | (key [1] >> 2);    encryptKey [2] = ((key [1] & 0x03) << 5) | (key [2] >> 3);    encryptKey [3] = ((key [2] & 0x07) << 4) | (key [3] >> 4);    encryptKey [4] = ((key [3] & 0x0F) << 3) | (key [4] >> 5);    encryptKey [5] = ((key [4] & 0x1F) << 2) | (key [5] >> 6);    encryptKey [6] = ((key [5] & 0x3F) << 1) | (key [6] >> 7);    encryptKey [7] = key [6] & 0x7F;    for (i = 0; i < 8; i++)         {        encryptKey[i] = (encryptKey [i] <<1);        }    for (i = 0; i < 64; i++)         {        // Load input and key buffers with cyclic repeat of encrypted key        inputBuffer [i] =             (input [i / keySize] & (1 << (7 - (i % keySize)))) ? 1 : 0;        keyBuffer [i] =             (encryptKey [i / keySize] & (1 << (7 - (i % keySize)))) ? 1 : 0;        // zero output buffer        outputBuffer [i] = 0;        }    dohash  (outputBuffer,             const_cast<const BYTE *> (inputBuffer),             const_cast<const BYTE *> (keyBuffer));    // zero first 8 bytes    for (i = 0; i < 8; i++)         {        output [i] = 0;        }    // compress outputBuffer from 64 bytes to 64 bits    for (i = 0; i < 64; i++)         {        if (outputBuffer [i])            output [i / 8] |= (1 << (7 - (i % 8)));        }    }//////////////////////////////////////////////////////////////////////////static void strupper (unsigned char *s)    {    while (*s)	{	if (islower (*s))	    *s = toupper (*s);	s++;	}    }////////////////////////////////////////////////////////////////////////////// NTLMSSP ctor -- establishes the authn and impersonation levels for// this particular instance...//NTLMSSP::NTLMSSP    (    DWORD	authnLvl,		// the authentication level    DWORD	impLvl			// the impersonation level    )      : m_authnLevel (authnLvl),	m_impLevel (impLvl)    {    if (m_authnLevel == RPC_C_AUTHN_LEVEL_DEFAULT)	m_authnLevel = g_defaultAuthnLevel;    if (m_impLevel == RPC_C_IMP_LEVEL_DEFAULT)	m_impLevel = g_defaultImpLevel;    }////////////////////////////////////////////////////////////////////////////// NTLMSSP dtor...//NTLMSSP::~NTLMSSP ()    {    }////////////////////////////////////////////////////////////////////////////// NTLMSSP::channelAdd -- adds an RPC-channel to the record, so its// status can be maintained when a client attempts to authenticate// over this channel...//void NTLMSSP::channelAdd (int cid)    {    // Default to ACCESS DENIED unless we are at lower level    HRESULT hrAuthn = E_ACCESSDENIED;        if (m_authnLevel == RPC_C_AUTHN_LEVEL_NONE)	hrAuthn = S_OK;    VxCritSec cs (m_mutex);    m_channelStatus [cid] = hrAuthn;    }////////////////////////////////////////////////////////////////////////////// NTLMSSP::channelRemove -- removes a channel from the records...//void NTLMSSP::channelRemove (int cid)    {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -