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

📄 handshake.cpp

📁 mysql-5.0.33源码包
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        bool              needHdr = false;        if (static_cast<uint>(RECORD_HEADER) > buffer.get_remaining())            needHdr = true;        else {        buffer >> hdr;        ssl.verifyState(hdr);        }        // make sure we have enough input in buffer to process this record        if (needHdr || hdr.length_ > buffer.get_remaining()) {            // put header in front for next time processing            uint extra = needHdr ? 0 : RECORD_HEADER;            uint sz = buffer.get_remaining() + extra;            ssl.useBuffers().SetRawInput(NEW_YS input_buffer(sz,                      buffer.get_buffer() + buffer.get_current() - extra, sz));            return 1;        }        while (buffer.get_current() < hdr.length_ + RECORD_HEADER + offset) {            // each message in record, can be more than 1 if not encrypted            if (ssl.getSecurity().get_parms().pending_ == false) // cipher on                decrypt_message(ssl, buffer, hdr.length_);                            mySTL::auto_ptr<Message> msg(mf.CreateObject(hdr.type_));            if (!msg.get()) {                ssl.SetError(factory_error);                return 0;            }            buffer >> *msg;            msg->Process(buffer, ssl);            if (ssl.GetError())                return 0;        }        offset += hdr.length_ + RECORD_HEADER;    }    return 0;}// process input requestsvoid processReply(SSL& ssl){    if (ssl.GetError()) return;    if (DoProcessReply(ssl))        // didn't complete process        if (!ssl.getSocket().IsNonBlocking()) {            // keep trying now, blocking ok            while (!ssl.GetError())                if (DoProcessReply(ssl) == 0) break;    }        else            // user will have try again later, non blocking            ssl.SetError(YasslError(SSL_ERROR_WANT_READ));}// send client_hello, no bufferingvoid sendClientHello(SSL& ssl){    ssl.verifyState(serverNull);    if (ssl.GetError()) return;    ClientHello       ch(ssl.getSecurity().get_connection().version_,                         ssl.getSecurity().get_connection().compression_);    RecordLayerHeader rlHeader;    HandShakeHeader   hsHeader;    output_buffer     out;    buildClientHello(ssl, ch);    ssl.set_random(ch.get_random(), client_end);    buildHeaders(ssl, hsHeader, rlHeader, ch);    buildOutput(out, rlHeader, hsHeader, ch);    hashHandShake(ssl, out);    ssl.Send(out.get_buffer(), out.get_size());}// send client key exchangevoid sendClientKeyExchange(SSL& ssl, BufferOutput buffer){    ssl.verifyState(serverHelloDoneComplete);    if (ssl.GetError()) return;    ClientKeyExchange ck(ssl);    ck.build(ssl);    ssl.makeMasterSecret();    RecordLayerHeader rlHeader;    HandShakeHeader   hsHeader;    mySTL::auto_ptr<output_buffer> out(NEW_YS output_buffer);    buildHeaders(ssl, hsHeader, rlHeader, ck);    buildOutput(*out.get(), rlHeader, hsHeader, ck);    hashHandShake(ssl, *out.get());    if (buffer == buffered)        ssl.addBuffer(out.release());    else        ssl.Send(out->get_buffer(), out->get_size());}// send server key exchangevoid sendServerKeyExchange(SSL& ssl, BufferOutput buffer){    if (ssl.GetError()) return;    ServerKeyExchange sk(ssl);    sk.build(ssl);    RecordLayerHeader rlHeader;    HandShakeHeader   hsHeader;    mySTL::auto_ptr<output_buffer> out(NEW_YS output_buffer);    buildHeaders(ssl, hsHeader, rlHeader, sk);    buildOutput(*out.get(), rlHeader, hsHeader, sk);    hashHandShake(ssl, *out.get());    if (buffer == buffered)        ssl.addBuffer(out.release());    else        ssl.Send(out->get_buffer(), out->get_size());}// send change ciphervoid sendChangeCipher(SSL& ssl, BufferOutput buffer){    if (ssl.getSecurity().get_parms().entity_ == server_end)        if (ssl.getSecurity().get_resuming())            ssl.verifyState(clientKeyExchangeComplete);        else            ssl.verifyState(clientFinishedComplete);    if (ssl.GetError()) return;    ChangeCipherSpec ccs;    RecordLayerHeader rlHeader;    buildHeader(ssl, rlHeader, ccs);    mySTL::auto_ptr<output_buffer> out(NEW_YS output_buffer);    buildOutput(*out.get(), rlHeader, ccs);       if (buffer == buffered)        ssl.addBuffer(out.release());    else        ssl.Send(out->get_buffer(), out->get_size());}// send finishedvoid sendFinished(SSL& ssl, ConnectionEnd side, BufferOutput buffer){    if (ssl.GetError()) return;    Finished fin;    buildFinished(ssl, fin, side == client_end ? client : server);    mySTL::auto_ptr<output_buffer> out(NEW_YS output_buffer);    cipherFinished(ssl, fin, *out.get());                   // hashes handshake    if (ssl.getSecurity().get_resuming()) {        if (side == server_end)            buildFinished(ssl, ssl.useHashes().use_verify(), client); // client    }    else {        if (!ssl.getSecurity().GetContext()->GetSessionCacheOff())        GetSessions().add(ssl);  // store session        if (side == client_end)            buildFinished(ssl, ssl.useHashes().use_verify(), server); // server    }       ssl.useSecurity().use_connection().CleanMaster();    if (buffer == buffered)        ssl.addBuffer(out.release());    else        ssl.Send(out->get_buffer(), out->get_size());}// send dataint sendData(SSL& ssl, const void* buffer, int sz){    if (ssl.GetError() == YasslError(SSL_ERROR_WANT_READ))        ssl.SetError(no_error);    ssl.verfiyHandShakeComplete();    if (ssl.GetError()) return -1;    int sent = 0;    for (;;) {        int len = min(sz - sent, MAX_RECORD_SIZE);        output_buffer out;        input_buffer tmp;        Data data;        if (ssl.CompressionOn()) {            if (Compress(static_cast<const opaque*>(buffer) + sent, len,                         tmp) == -1) {                ssl.SetError(compress_error);                return -1;            }            data.SetData(tmp.get_size(), tmp.get_buffer());        }        else            data.SetData(len, static_cast<const opaque*>(buffer) + sent);        buildMessage(ssl, out, data);        ssl.Send(out.get_buffer(), out.get_size());        if (ssl.GetError()) return -1;        sent += len;        if (sent == sz) break;    }    ssl.useLog().ShowData(sent, true);    return sent;}// send alertint sendAlert(SSL& ssl, const Alert& alert){    output_buffer out;    buildAlert(ssl, out, alert);    ssl.Send(out.get_buffer(), out.get_size());    return alert.get_length();}// process input dataint receiveData(SSL& ssl, Data& data, bool peek){    if (ssl.GetError() == YasslError(SSL_ERROR_WANT_READ))        ssl.SetError(no_error);    ssl.verfiyHandShakeComplete();    if (ssl.GetError()) return -1;    if (!ssl.bufferedData())        processReply(ssl);    if (peek)        ssl.PeekData(data);    else    ssl.fillData(data);    ssl.useLog().ShowData(data.get_length());    if (ssl.GetError()) return -1;    if (data.get_length() == 0 && ssl.getSocket().WouldBlock()) {        ssl.SetError(YasslError(SSL_ERROR_WANT_READ));        return SSL_WOULD_BLOCK;    }    return data.get_length(); }// send server hellovoid sendServerHello(SSL& ssl, BufferOutput buffer){    if (ssl.getSecurity().get_resuming())        ssl.verifyState(clientKeyExchangeComplete);    else        ssl.verifyState(clientHelloComplete);    if (ssl.GetError()) return;    ServerHello       sh(ssl.getSecurity().get_connection().version_,                         ssl.getSecurity().get_connection().compression_);    RecordLayerHeader rlHeader;    HandShakeHeader   hsHeader;    mySTL::auto_ptr<output_buffer> out(NEW_YS output_buffer);    buildServerHello(ssl, sh);    ssl.set_random(sh.get_random(), server_end);    buildHeaders(ssl, hsHeader, rlHeader, sh);    buildOutput(*out.get(), rlHeader, hsHeader, sh);    hashHandShake(ssl, *out.get());    if (buffer == buffered)        ssl.addBuffer(out.release());    else        ssl.Send(out->get_buffer(), out->get_size());}// send server hello donevoid sendServerHelloDone(SSL& ssl, BufferOutput buffer){    if (ssl.GetError()) return;    ServerHelloDone   shd;    RecordLayerHeader rlHeader;    HandShakeHeader   hsHeader;    mySTL::auto_ptr<output_buffer> out(NEW_YS output_buffer);    buildHeaders(ssl, hsHeader, rlHeader, shd);    buildOutput(*out.get(), rlHeader, hsHeader, shd);    hashHandShake(ssl, *out.get());    if (buffer == buffered)        ssl.addBuffer(out.release());    else        ssl.Send(out->get_buffer(), out->get_size());}// send certificatevoid sendCertificate(SSL& ssl, BufferOutput buffer){    if (ssl.GetError()) return;    Certificate       cert(ssl.getCrypto().get_certManager().get_cert());    RecordLayerHeader rlHeader;    HandShakeHeader   hsHeader;    mySTL::auto_ptr<output_buffer> out(NEW_YS output_buffer);    buildHeaders(ssl, hsHeader, rlHeader, cert);    buildOutput(*out.get(), rlHeader, hsHeader, cert);    hashHandShake(ssl, *out.get());    if (buffer == buffered)        ssl.addBuffer(out.release());    else        ssl.Send(out->get_buffer(), out->get_size());}// send certificate requestvoid sendCertificateRequest(SSL& ssl, BufferOutput buffer){    if (ssl.GetError()) return;    CertificateRequest request;    request.Build();    RecordLayerHeader  rlHeader;    HandShakeHeader    hsHeader;    mySTL::auto_ptr<output_buffer> out(NEW_YS output_buffer);    buildHeaders(ssl, hsHeader, rlHeader, request);    buildOutput(*out.get(), rlHeader, hsHeader, request);    hashHandShake(ssl, *out.get());    if (buffer == buffered)        ssl.addBuffer(out.release());    else        ssl.Send(out->get_buffer(), out->get_size());}// send certificate verifyvoid sendCertificateVerify(SSL& ssl, BufferOutput buffer){    if (ssl.GetError()) return;    CertificateVerify  verify;    verify.Build(ssl);    RecordLayerHeader  rlHeader;    HandShakeHeader    hsHeader;    mySTL::auto_ptr<output_buffer> out(NEW_YS output_buffer);    buildHeaders(ssl, hsHeader, rlHeader, verify);    buildOutput(*out.get(), rlHeader, hsHeader, verify);    hashHandShake(ssl, *out.get());    if (buffer == buffered)        ssl.addBuffer(out.release());    else        ssl.Send(out->get_buffer(), out->get_size());}} // namespace

⌨️ 快捷键说明

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