亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mocana_ssl.c

?? 嵌入式Linux系統用的web server,開源代碼,非常好用
?? C
字號:
/*
 * mocana_ssl.c
 *
 * Mocana Embedded SSL Server
 *   GoAhead integration layer
 *
 * Copyright Mocana Corp 2003. All Rights Reserved.
 *
 */


/******************************** Description *********************************/

/*
 *    This module implements a patch into the Mocana Embedded SSL Server.
 *
 */

#ifdef __ENABLE_MOCANA_SSL_SERVER__

/********************************* Includes ***********************************/

#include "mocana_ssl/common/moptions.h"
#include "mocana_ssl/common/mdefs.h"
#include "mocana_ssl/common/mtypes.h"
#include "mocana_ssl/common/merrors.h"
#include "mocana_ssl/common/mrtos.h"
#include "mocana_ssl/common/mtcp.h"
#include "mocana_ssl/common/mocana.h"
#include "mocana_ssl/common/random.h"
#include "mocana_ssl/ssl/ssl.h"

#include    "wsIntrn.h"
#include    "webs.h"
#include    "websSSL.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


/******************************* Definitions **********************************/

#ifdef __RTOS_VXWORKS__
#define SSL_CERTIFICATE_DER_FILE        "NVRAM:/ssl.der"
#define SSL_RSA_HOST_KEYS               "NVRAM:/sslkey.dat"
#else
#define SSL_CERTIFICATE_DER_FILE        "ssl.der"
#define SSL_RSA_HOST_KEYS               "sslkey.dat"
#endif

#define SSL_PORT                        SSL_DEFAULT_TCPIP_PORT
#define MAX_SSL_CONNECTIONS_ALLOWED     (10)
#define SSL_HELLO_TIMEOUT               (15000)
#define SSL_RECV_TIMEOUT                (300000)

#define SSL_EXAMPLE_KEY_SIZE            (1024 + 256)

static int      sslListenSock   = -1;            /* Listen socket */
static char*    pCertificate    = NULL;
static char*    pRsaKeyBlob     = NULL;


/******************************* Prototypes  **********************************/

int         websSSLAccept(int sid, char *ipaddr, int port, int listenSid);
static void websSSLSocketEvent(int sid, int mask, int iwp);
static int  websSSLReadEvent(webs_t wp);
static int  mocana_SSL_computeHostKeys(char** ppCertificate, unsigned int *pCertLength,
                                       char** ppRsaKeyBlob,  unsigned int *pKeyBlobLength);
static int  mocana_SSL_releaseHostKeys(char **ppCertificate, char **ppRsaKeyBlob);



/******************************************************************************/
/*
 *    Start up the SSL Context for the application, and start a listen on the
 *    SSL port (usually 443, and defined by SSL_PORT)
 *    Return 0 on success, -1 on failure.
 */

int websSSLOpen()
{
    unsigned int certLength;
    unsigned int rsaKeyBlobLength;

    if (0 > MOCANA_initMocana())
        return -1;

    if (0 > mocana_SSL_computeHostKeys(&pCertificate, &certLength, &pRsaKeyBlob, &rsaKeyBlobLength))
        return -1;

    if (0 > SSL_init(pCertificate, certLength, pRsaKeyBlob, rsaKeyBlobLength, MAX_SSL_CONNECTIONS_ALLOWED))
        return -1;

    SSL_sslSettings()->sslTimeOutHello      = SSL_HELLO_TIMEOUT;
    SSL_sslSettings()->sslTimeOutReceive    = SSL_RECV_TIMEOUT;

    sslListenSock = socketOpenConnection(NULL, SSL_PORT, websSSLAccept, SOCKET_BLOCK);

    if (sslListenSock < 0) {
        trace(2, T("SSL: Unable to open SSL socket on port <%d>!\n"),
            SSL_PORT);
        return -1;
    }

    return 0;
}


/******************************************************************************/
/*
 *    Accept a connection
 */

int websSSLAccept(int sid, char *ipaddr, int port, int listenSid)
{
    webs_t    wp;
    int        wid;

    a_assert(ipaddr && *ipaddr);
    a_assert(sid >= 0);
    a_assert(port >= 0);

/*
 *    Allocate a new handle for this accepted connection. This will allocate
 *    a webs_t structure in the webs[] list
 */
    if ((wid = websAlloc(sid)) < 0) {
        return -1;
    }
    wp = webs[wid];
    a_assert(wp);
    wp->listenSid = listenSid;

    ascToUni(wp->ipaddr, ipaddr, min(sizeof(wp->ipaddr), strlen(ipaddr)+1));

/*
 *    Check if this is a request from a browser on this system. This is useful
 *    to know for permitting administrative operations only for local access
 */
    if (gstrcmp(wp->ipaddr, T("127.0.0.1")) == 0 ||
            gstrcmp(wp->ipaddr, websIpaddr) == 0 ||
            gstrcmp(wp->ipaddr, websHost) == 0) {
        wp->flags |= WEBS_LOCAL_REQUEST;
    }
/*
 *    Since the acceptance came in on this channel, it must be secure
 */
    wp->flags |= WEBS_SECURE;

/*
 *    Arrange for websSocketEvent to be called when read data is available
 */
    socketCreateHandler(sid, SOCKET_READABLE, websSSLSocketEvent, (int) wp);

/*
 *    Arrange for a timeout to kill hung requests
 */
    wp->timeout = emfSchedCallback(WEBS_TIMEOUT, websTimeout, (void *) wp);
    trace(8, T("webs: accept request\n"));
    return 0;
}


/******************************************************************************/
/*
 *    Perform a read of the SSL socket
 */

int websSSLRead(websSSL_t *wsp, char_t *buf, int len)
{
    int     numBytesReceived;
    int     rc;

    a_assert(wsp);
    a_assert(buf);

    if ((rc = SSL_recv(wsp->mocanaConnectionInstance, buf, len, &numBytesReceived)) < 0)
    {
        if (0 > rc)
            rc = -1;

        return rc;
    }

    return numBytesReceived;
}


/******************************************************************************/
/*
 *    The webs socket handler.  Called in response to I/O. We just pass control
 *    to the relevant read or write handler. A pointer to the webs structure
 *    is passed as an (int) in iwp.
 */

static void websSSLSocketEvent(int sid, int mask, int iwp)
{
    webs_t    wp;

    wp = (webs_t) iwp;
    a_assert(wp);

    if (! websValid(wp)) {
        return;
    }

    if (mask & SOCKET_READABLE) {
        websSSLReadEvent(wp);
    }
    if (mask & SOCKET_WRITABLE) {
        if (wp->writeSocket) {
            (*wp->writeSocket)(wp);
        }
    }
}


/******************************************************************************/
/*
 *    Handler for SSL Read Events
 */

static int websSSLReadEvent (webs_t wp)
{
    int            ret = 07, sock;
    socket_t    *sptr;
    int         connectionInstance;

    a_assert (wp);
    a_assert(websValid(wp));

    sptr = socketPtr(wp->sid);
    a_assert(sptr);

    sock = sptr->sock;

/*
 *    Create a new SSL session for this web request
 */

    connectionInstance = SSL_acceptConnection(sock);

    if (0 > connectionInstance)
    {
#ifdef __ENABLE_ALL_DEBUGGING__
        printf("websSSLReadEvent: SSL_acceptConnection failed. %d\n", connectionInstance);
#endif

        /* SSL error: cleanup */
        websTimeoutCancel(wp);
        socketCloseConnection(wp->sid);
        websFree(wp);

        return -1;
    }

/*
 *    Create the SSL data structure in the wp.
 */
    wp->wsp = balloc(B_L, sizeof(websSSL_t));
    a_assert (wp->wsp);

    (wp->wsp)->mocanaConnectionInstance = connectionInstance;
    (wp->wsp)->wp                       = wp;

/*
 *    Call the default Read Event
 */
    websReadEvent(wp);

    return ret;
}


/******************************************************************************/
/*
 *    Return TRUE if websSSL has been opened
 */

int websSSLIsOpen()
{
    return (sslListenSock != -1);
}


/******************************************************************************/
/*
 *    Perform a gets of the SSL socket, returning an balloc'ed string
 *
 *    Get a string from a socket. This returns data in *buf in a malloced string
 *    after trimming the '\n'. If there is zero bytes returned, *buf will be set
 *    to NULL. If doing non-blocking I/O, it returns -1 for error, EOF or when
 *    no complete line yet read. If doing blocking I/O, it will block until an
 *    entire line is read. If a partial line is read socketInputBuffered or
 *    socketEof can be used to distinguish between EOF and partial line still
 *    buffered. This routine eats and ignores carriage returns.
 */

int    websSSLGets(websSSL_t *wsp, char_t **buf)
{
    socket_t    *sp;
    ringq_t        *lq;
    char        c;
    int            rc, len;
    webs_t      wp;
    int         sid;
    int         mci;
    int         numBytesReceived;

    a_assert(wsp);
    a_assert(buf);

    *buf = NULL;

    wp  = wsp->wp;
    sid = wp->sid;
    mci = wsp->mocanaConnectionInstance;

    if ((sp = socketPtr(sid)) == NULL) {
        return -1;
    }
    lq = &sp->lineBuf;

    while (1) {

        if ((rc = SSL_recv(mci, &c, 1, &numBytesReceived)) < 0)
        {
            if (0 > rc)
                rc = -1;

            return rc;
        }

        if (numBytesReceived == 0) {
/*
 *            If there is a partial line and we are at EOF, pretend we saw a '\n'
 */
            if (ringqLen(lq) > 0 && (sp->flags & SOCKET_EOF)) {
                c = '\n';
            } else {
                continue;
            }
        }
/*
 *        If a newline is seen, return the data excluding the new line to the
 *        caller. If carriage return is seen, just eat it.
 */
        if (c == '\n') {
            len = ringqLen(lq);
            if (len > 0) {
                *buf = ballocAscToUni((char *)lq->servp, len);
            } else {
                *buf = NULL;
            }
            ringqFlush(lq);
            return len;

        } else if (c == '\r') {
            continue;
        }
        ringqPutcA(lq, c);
    }
    return 0;
}


/******************************************************************************/
/*
 *    Perform a write to the SSL socket
 */

int websSSLWrite(websSSL_t *wsp, char_t *buf, int len)
{
    int sslBytesSent;

    a_assert(wsp);
    a_assert(buf);

    if (wsp == NULL) {
        return -1;
    }

    sslBytesSent = SSL_send(wsp->mocanaConnectionInstance, buf, len);

    if (0 > sslBytesSent)
        sslBytesSent = -1;

    return sslBytesSent;
}


/******************************************************************************/
/*
 *    Return Eof for the underlying socket
 */

int websSSLEof(websSSL_t *wsp)
{
    webs_t      wp;
    int         sid;

    a_assert(wsp);

    wp  = wsp->wp;
    sid = wp->sid;

    return socketEof(sid);
}


/******************************************************************************/
/*
 *   Flush stub for compatibility
 */
int websSSLFlush(websSSL_t *wsp)
{
    a_assert(wsp);

    /* Autoflush - do nothing */
    return 0;
}


/******************************************************************************/
/*
 *    Free SSL resources
 */

int websSSLFree(websSSL_t *wsp)
{
    int status;
    if (NULL != wsp)
    {
        int mci;

        mci = wsp->mocanaConnectionInstance;

        status = SSL_closeConnection(mci);

        if (0 > status)
            status = -1;

        /* Free memory here.... */
        bfree(B_L, wsp);
    }

    return status;
}


/******************************************************************************/
/*
 *    Stops the SSL system
 */

void websSSLClose()
{
    SSL_shutdown();
    mocana_SSL_releaseHostKeys(&pCertificate, &pRsaKeyBlob);
    SSL_releaseTables();
    MOCANA_freeMocana();
}


/******************************************************************************/

static int
mocana_SSL_testHostKeys(char** ppCertificate, unsigned int *pCertLength,
                         char** ppRsaKeyBlob,  unsigned int *pKeyBlobLength)
{
    int             status;

    if (0 > (status = MOCANA_readFile(SSL_CERTIFICATE_DER_FILE, ppCertificate, pCertLength)))
        goto exit;

    status = MOCANA_readFile(SSL_RSA_HOST_KEYS, ppRsaKeyBlob, pKeyBlobLength);

exit:
    return status;
}


/******************************************************************************/

static int
mocana_SSL_releaseHostKeys(char **ppCertificate, char **ppRsaKeyBlob)
{
    MOCANA_freeReadFile(ppCertificate);
    MOCANA_freeReadFile(ppRsaKeyBlob);

    return 0;
}


/******************************************************************************/

static int
mocana_SSL_computeHostKeys(char** ppCertificate, unsigned int *pCertLength,
                            char** ppRsaKeyBlob,  unsigned int *pKeyBlobLength)
{
    int   status;

    *ppCertificate = NULL;
    *ppRsaKeyBlob  = NULL;

    /* check for pre-existing set of host keys */
    if (0 > (status = mocana_SSL_testHostKeys(ppCertificate, pCertLength, ppRsaKeyBlob, pKeyBlobLength)))
    {
#ifdef __ENABLE_ALL_DEBUGGING__
        printf("mocana_SSL_computeHostKeys: host keys do not exist, computing new key pair.\n");
#endif

        /* if not, compute new host keys */
        if (0 > (status = SSL_generateCertificate(ppCertificate, pCertLength, ppRsaKeyBlob, pKeyBlobLength, SSL_EXAMPLE_KEY_SIZE)))
            goto exit;

        if (0 > (status = MOCANA_writeFile(SSL_CERTIFICATE_DER_FILE, *ppCertificate, *pCertLength)))
            goto exit;

        status = MOCANA_writeFile(SSL_RSA_HOST_KEYS, *ppRsaKeyBlob, *pKeyBlobLength);

#ifdef __ENABLE_ALL_DEBUGGING__
        printf("mocana_SSL_computeHostKeys: host key computation completed.\n");
#endif
    }

exit:
    if (0 > status)
        SSL_freeCertificate(ppCertificate, ppRsaKeyBlob);

    return status;
}


/******************************************************************************/

#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
2020国产精品| 日韩电影在线一区二区| 亚洲国产精品尤物yw在线观看| 青青国产91久久久久久| 狠狠网亚洲精品| 制服丝袜成人动漫| 亚洲手机成人高清视频| 国产精品亚洲第一区在线暖暖韩国 | 日韩中文欧美在线| 91麻豆国产精品久久| 国产亚洲欧美日韩俺去了| 亚洲成人免费观看| 91久久精品日日躁夜夜躁欧美| 欧美激情在线看| 久久99国产精品尤物| 欧美一区二区视频在线观看2020 | 国产91色综合久久免费分享| 777色狠狠一区二区三区| 一区二区三区小说| 91麻豆高清视频| 国产精品黄色在线观看| 国产91富婆露脸刺激对白| 久久精品视频一区| 国产一区二区三区观看| 久久午夜电影网| 国产一区不卡视频| 久久精品一区二区三区不卡牛牛| 毛片av一区二区| 精品精品欲导航| 精品一区二区av| 精品国产免费视频| 精品夜夜嗨av一区二区三区| 欧美一区二区三区影视| 日本视频在线一区| 日韩精品一区二| 国产精品资源网| 国产精品美女久久久久久久| 成人av电影免费在线播放| 中文字幕巨乱亚洲| 99久久er热在这里只有精品15| 中文字幕一区二| 色婷婷综合久久久久中文| 一区二区三区毛片| 欧美一区二区视频免费观看| 美洲天堂一区二卡三卡四卡视频| 欧美第一区第二区| 国产剧情一区二区| ...av二区三区久久精品| 色老汉av一区二区三区| 婷婷开心激情综合| 精品国产青草久久久久福利| 成人综合在线网站| 一级日本不卡的影视| 91精品在线免费观看| 韩国v欧美v亚洲v日本v| 中文字幕在线观看一区二区| 91福利精品第一导航| 全国精品久久少妇| 中文字幕av资源一区| 欧美综合天天夜夜久久| 日本系列欧美系列| 日本一区二区免费在线观看视频 | 国产精品自产自拍| 亚洲一二三区在线观看| 久久久久国产精品厨房| 91老师国产黑色丝袜在线| 日本免费新一区视频| 中文字幕乱码久久午夜不卡 | 青青草原综合久久大伊人精品| 欧美电影免费观看高清完整版| 成人h动漫精品| 天天色图综合网| 国产精品久久久爽爽爽麻豆色哟哟| 欧美视频精品在线观看| 国产美女在线观看一区| 亚洲成a人片在线观看中文| 久久精品人人做| 69av一区二区三区| 91在线播放网址| 国产在线播放一区二区三区| 亚洲国产视频一区二区| 国产日韩精品一区二区三区| 欧美日韩国产乱码电影| av动漫一区二区| 国产在线精品一区二区三区不卡 | 欧美日韩国产一级片| 国产制服丝袜一区| 秋霞国产午夜精品免费视频| 一区二区三区不卡视频| 中文字幕国产一区| 精品国精品国产| 91精品久久久久久久久99蜜臂 | 成人手机电影网| 久久99九九99精品| 日韩中文字幕1| 亚洲电影视频在线| 亚洲一区二区五区| 综合亚洲深深色噜噜狠狠网站| 精品国产乱码久久久久久久| 欧美日韩免费观看一区三区| www.欧美日韩国产在线| 国产高清精品久久久久| 国产在线播放一区| 久久99精品久久久久久久久久久久| 亚洲一区二区三区四区五区黄| 国产精品国产三级国产aⅴ原创 | 水野朝阳av一区二区三区| 亚洲男人天堂av| 亚洲另类一区二区| 综合激情成人伊人| 亚洲欧美日韩久久精品| 亚洲视频在线一区| 亚洲精品免费在线| 有坂深雪av一区二区精品| 亚洲视频在线一区| 亚洲国产你懂的| 亚洲第一激情av| 日韩不卡一区二区三区| 美女视频黄 久久| 蜜臀久久99精品久久久久宅男| 日日夜夜一区二区| 日韩电影一区二区三区四区| 日本一区中文字幕| 精品综合免费视频观看| 韩国女主播成人在线| 成人免费观看av| 日本高清不卡在线观看| 欧美日韩精品综合在线| 欧美一区国产二区| 欧美v日韩v国产v| 国产精品电影一区二区| 一区二区三区在线观看网站| 亚洲午夜久久久久| 久久激五月天综合精品| 福利91精品一区二区三区| 99re这里只有精品6| 欧美精品在线观看一区二区| 日韩欧美一级精品久久| 国产欧美精品一区二区色综合 | 成人欧美一区二区三区白人 | 成人avav影音| 欧美在线色视频| 欧美精品一区二区三| 中文字幕在线观看不卡视频| 亚洲国产日韩综合久久精品| 国内精品视频一区二区三区八戒| 盗摄精品av一区二区三区| 欧美日韩一区成人| 久久丝袜美腿综合| 亚洲精品欧美激情| 国内精品国产成人国产三级粉色| 99麻豆久久久国产精品免费优播| 欧美性生活影院| 久久久久久久av麻豆果冻| 一级女性全黄久久生活片免费| 国产做a爰片久久毛片| 欧美日韩一级片网站| 国产女主播一区| 免费在线一区观看| 色婷婷久久久亚洲一区二区三区 | 在线不卡a资源高清| 欧美国产精品劲爆| 日韩av在线播放中文字幕| 99久久久精品| 久久综合色综合88| 亚洲一卡二卡三卡四卡无卡久久| 国产乱人伦偷精品视频不卡 | 久久不见久久见免费视频7| 97se狠狠狠综合亚洲狠狠| 精品美女一区二区三区| 亚洲国产aⅴ天堂久久| av影院午夜一区| 久久久久久久久蜜桃| 爽好久久久欧美精品| 欧美色图激情小说| 成人免费一区二区三区在线观看| 久久99日本精品| 日韩一区二区免费电影| 亚洲在线观看免费| 色综合色综合色综合色综合色综合 | 日韩欧美一卡二卡| 三级成人在线视频| 欧美日韩在线观看一区二区| 国产精品久久久久久久蜜臀| 九九热在线视频观看这里只有精品| 欧美日韩一区二区在线视频| 亚洲精品成人在线| www.欧美色图| 1区2区3区欧美| 91亚洲精品久久久蜜桃| 国产精品久久久久久久浪潮网站| 国产乱理伦片在线观看夜一区| 欧美本精品男人aⅴ天堂| 日本欧美加勒比视频| 欧美乱熟臀69xxxxxx| 亚洲成av人片| 7777精品伊人久久久大香线蕉经典版下载 | 久久久久久久久伊人| 国产一区欧美日韩| 久久综合色一综合色88|