📄 yassl_imp.cpp
字号:
{ hdr.type_ = ContentType(input[AUTO]); hdr.version_.major_ = input[AUTO]; hdr.version_.minor_ = input[AUTO]; // length byte tmp[2]; tmp[0] = input[AUTO]; tmp[1] = input[AUTO]; ato16(tmp, hdr.length_); return input;}// output operator for RecordLayerHeaderoutput_buffer& operator<<(output_buffer& output, const RecordLayerHeader& hdr){ output[AUTO] = hdr.type_; output[AUTO] = hdr.version_.major_; output[AUTO] = hdr.version_.minor_; // length byte tmp[2]; c16toa(hdr.length_, tmp); output[AUTO] = tmp[0]; output[AUTO] = tmp[1]; return output;}// virtual input operator for Messagesinput_buffer& operator>>(input_buffer& input, Message& msg){ return msg.set(input);}// virtual output operator for Messagesoutput_buffer& operator<<(output_buffer& output, const Message& msg){ return msg.get(output);}// input operator for HandShakeHeaderinput_buffer& operator>>(input_buffer& input, HandShakeHeader& hs){ hs.type_ = HandShakeType(input[AUTO]); hs.length_[0] = input[AUTO]; hs.length_[1] = input[AUTO]; hs.length_[2] = input[AUTO]; return input;}// output operator for HandShakeHeaderoutput_buffer& operator<<(output_buffer& output, const HandShakeHeader& hdr){ output[AUTO] = hdr.type_; output.write(hdr.length_, sizeof(hdr.length_)); return output;}// HandShake Header Processing functionvoid HandShakeHeader::Process(input_buffer& input, SSL& ssl){ ssl.verifyState(*this); const HandShakeFactory& hsf = ssl.getFactory().getHandShake(); mySTL::auto_ptr<HandShakeBase> hs(hsf.CreateObject(type_), ysDelete); if (!hs.get()) { ssl.SetError(factory_error); return; } hashHandShake(ssl, input, c24to32(length_)); input >> *hs; hs->Process(input, ssl);}ContentType HandShakeHeader::get_type() const{ return handshake;}uint16 HandShakeHeader::get_length() const{ return c24to32(length_);}HandShakeType HandShakeHeader::get_handshakeType() const{ return type_;}void HandShakeHeader::set_type(HandShakeType hst){ type_ = hst;}void HandShakeHeader::set_length(uint32 u32){ c32to24(u32, length_);}input_buffer& HandShakeHeader::set(input_buffer& in){ return in >> *this;}output_buffer& HandShakeHeader::get(output_buffer& out) const{ return out << *this;}int HandShakeBase::get_length() const{ return length_;}void HandShakeBase::set_length(int l){ length_ = l;}// for building buffer's type fieldHandShakeType HandShakeBase::get_type() const{ return no_shake;}input_buffer& HandShakeBase::set(input_buffer& in){ return in;} output_buffer& HandShakeBase::get(output_buffer& out) const{ return out;}void HandShakeBase::Process(input_buffer&, SSL&) {}input_buffer& HelloRequest::set(input_buffer& in){ return in;}output_buffer& HelloRequest::get(output_buffer& out) const{ return out;}void HelloRequest::Process(input_buffer&, SSL&){}HandShakeType HelloRequest::get_type() const{ return hello_request;}// input operator for CipherSpecinput_buffer& operator>>(input_buffer& input, ChangeCipherSpec& cs){ cs.type_ = CipherChoice(input[AUTO]); return input; }// output operator for CipherSpecoutput_buffer& operator<<(output_buffer& output, const ChangeCipherSpec& cs){ output[AUTO] = cs.type_; return output;}ChangeCipherSpec::ChangeCipherSpec() : type_(change_cipher_spec_choice){}input_buffer& ChangeCipherSpec::set(input_buffer& in){ return in >> *this;}output_buffer& ChangeCipherSpec::get(output_buffer& out) const{ return out << *this;}ContentType ChangeCipherSpec::get_type() const{ return change_cipher_spec;}uint16 ChangeCipherSpec::get_length() const{ return SIZEOF_ENUM;}// CipherSpec processing handlervoid ChangeCipherSpec::Process(input_buffer&, SSL& ssl){ ssl.useSecurity().use_parms().pending_ = false; if (ssl.getSecurity().get_resuming()) { if (ssl.getSecurity().get_parms().entity_ == client_end) buildFinished(ssl, ssl.useHashes().use_verify(), server); // server } else if (ssl.getSecurity().get_parms().entity_ == server_end) buildFinished(ssl, ssl.useHashes().use_verify(), client); // client}Alert::Alert(AlertLevel al, AlertDescription ad) : level_(al), description_(ad){}ContentType Alert::get_type() const{ return alert;}uint16 Alert::get_length() const{ return SIZEOF_ENUM * 2;}input_buffer& Alert::set(input_buffer& in){ return in >> *this;}output_buffer& Alert::get(output_buffer& out) const{ return out << *this;}// input operator for Alertinput_buffer& operator>>(input_buffer& input, Alert& a){ a.level_ = AlertLevel(input[AUTO]); a.description_ = AlertDescription(input[AUTO]); return input;}// output operator for Alertoutput_buffer& operator<<(output_buffer& output, const Alert& a){ output[AUTO] = a.level_; output[AUTO] = a.description_; return output;}// Alert processing handlervoid Alert::Process(input_buffer& input, SSL& ssl){ if (ssl.getSecurity().get_parms().pending_ == false) { // encrypted alert int aSz = get_length(); // alert size already read on input opaque verify[SHA_LEN]; const opaque* data = input.get_buffer() + input.get_current() - aSz; if (ssl.isTLS()) TLS_hmac(ssl, verify, data, aSz, alert, true); else hmac(ssl, verify, data, aSz, alert, true); // read mac and fill int digestSz = ssl.getCrypto().get_digest().get_digestSize(); opaque mac[SHA_LEN]; input.read(mac, digestSz); opaque fill; int padSz = ssl.getSecurity().get_parms().encrypt_size_ - aSz - digestSz; for (int i = 0; i < padSz; i++) fill = input[AUTO]; // verify if (memcmp(mac, verify, digestSz)) { ssl.SetError(verify_error); return; } } if (level_ == fatal) { ssl.useStates().useRecord() = recordNotReady; ssl.useStates().useHandShake() = handShakeNotReady; ssl.SetError(YasslError(description_)); }}Data::Data() : length_(0), buffer_(0), write_buffer_(0){}Data::Data(uint16 len, opaque* b) : length_(len), buffer_(b), write_buffer_(0){}Data::Data(uint16 len, const opaque* w) : length_(len), buffer_(0), write_buffer_(w){}input_buffer& Data::set(input_buffer& in){ return in;}output_buffer& Data::get(output_buffer& out) const{ return out << *this;}ContentType Data::get_type() const{ return application_data;}uint16 Data::get_length() const{ return length_;}const opaque* Data::get_buffer() const{ return write_buffer_;}void Data::set_length(uint16 l){ length_ = l;}opaque* Data::set_buffer(){ return buffer_;}// output operator for Dataoutput_buffer& operator<<(output_buffer& output, const Data& data){ output.write(data.write_buffer_, data.length_); return output;}// Process handler for Datavoid Data::Process(input_buffer& input, SSL& ssl){ int msgSz = ssl.getSecurity().get_parms().encrypt_size_; int pad = 0, padByte = 0; if (ssl.getSecurity().get_parms().cipher_type_ == block) { pad = *(input.get_buffer() + input.get_current() + msgSz - 1); padByte = 1; } int digestSz = ssl.getCrypto().get_digest().get_digestSize(); int dataSz = msgSz - digestSz - pad - padByte; opaque verify[SHA_LEN]; // read data if (dataSz) { input_buffer* data; ssl.addData(data = new (ys) input_buffer(dataSz)); input.read(data->get_buffer(), dataSz); data->add_size(dataSz); if (ssl.isTLS()) TLS_hmac(ssl, verify, data->get_buffer(), dataSz, application_data, true); else hmac(ssl, verify, data->get_buffer(), dataSz, application_data, true); } // read mac and fill opaque mac[SHA_LEN]; opaque fill; input.read(mac, digestSz); for (int i = 0; i < pad; i++) fill = input[AUTO]; if (padByte) fill = input[AUTO]; // verify if (dataSz) { if (memcmp(mac, verify, digestSz)) { ssl.SetError(verify_error); return; } } else ssl.get_SEQIncrement(true); // even though no data, increment verify}// virtual input operator for HandShakesinput_buffer& operator>>(input_buffer& input, HandShakeBase& hs){ return hs.set(input);}// virtual output operator for HandShakesoutput_buffer& operator<<(output_buffer& output, const HandShakeBase& hs){ return hs.get(output);}Certificate::Certificate(const x509* cert) : cert_(cert) { set_length(cert_->get_length() + 2 * CERT_HEADER); // list and cert size}const opaque* Certificate::get_buffer() const{ return cert_->get_buffer(); }// output operator for Certificateoutput_buffer& operator<<(output_buffer& output, const Certificate& cert){ uint sz = cert.get_length() - 2 * CERT_HEADER; opaque tmp[CERT_HEADER]; c32to24(sz + CERT_HEADER, tmp); output.write(tmp, CERT_HEADER); c32to24(sz, tmp); output.write(tmp, CERT_HEADER); output.write(cert.get_buffer(), sz); return output;}// certificate processing handlervoid Certificate::Process(input_buffer& input, SSL& ssl){ CertManager& cm = ssl.useCrypto().use_certManager(); uint32 list_sz; byte tmp[3]; tmp[0] = input[AUTO]; tmp[1] = input[AUTO]; tmp[2] = input[AUTO]; c24to32(tmp, list_sz); while (list_sz) { // cert size uint32 cert_sz; tmp[0] = input[AUTO]; tmp[1] = input[AUTO]; tmp[2] = input[AUTO]; c24to32(tmp, cert_sz); x509* myCert; cm.AddPeerCert(myCert = new (ys) x509(cert_sz)); input.read(myCert->use_buffer(), myCert->get_length()); list_sz -= cert_sz + CERT_HEADER; } if (int err = cm.Validate()) ssl.SetError(YasslError(err)); else if (ssl.getSecurity().get_parms().entity_ == client_end) ssl.useStates().useClient() = serverCertComplete;}Certificate::Certificate() : cert_(0){}input_buffer& Certificate::set(input_buffer& in){ return in;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -