📄 yassl_imp.cpp
字号:
request.certificate_types_[i] = ClientCertificateType(input[AUTO]); byte tmp[REQUEST_HEADER]; input.read(tmp, sizeof(tmp)); uint16 sz; ato16(tmp, sz); // authorities while (sz) { uint16 dnSz; input.read(tmp, sizeof(tmp)); ato16(tmp, dnSz); DistinguishedName dn; request.certificate_authorities_.push_back(dn = new (ys) byte[REQUEST_HEADER + dnSz]); memcpy(dn, tmp, REQUEST_HEADER); input.read(&dn[REQUEST_HEADER], dnSz); sz -= dnSz + REQUEST_HEADER; } return input;}// output operator for CertificateRequestoutput_buffer& operator<<(output_buffer& output, const CertificateRequest& request){ // types output[AUTO] = request.typeTotal_; for (int i = 0; i < request.typeTotal_; i++) output[AUTO] = request.certificate_types_[i]; // authorities opaque tmp[REQUEST_HEADER]; c16toa(request.get_length() - SIZEOF_ENUM - request.typeTotal_ - REQUEST_HEADER, tmp); output.write(tmp, sizeof(tmp)); mySTL::list<DistinguishedName>::const_iterator first = request.certificate_authorities_.begin(); mySTL::list<DistinguishedName>::const_iterator last = request.certificate_authorities_.end(); while (first != last) { uint16 sz; ato16(*first, sz); output.write(*first, sz + REQUEST_HEADER); ++first; } return output;}// CertificateRequest processing handlervoid CertificateRequest::Process(input_buffer&, SSL& ssl){ ssl.useCrypto().use_certManager().setSendVerify();}HandShakeType CertificateRequest::get_type() const{ return certificate_request;}// CertificateVerify CertificateVerify::CertificateVerify() : signature_(0){}CertificateVerify::~CertificateVerify(){ ysArrayDelete(signature_);}void CertificateVerify::Build(SSL& ssl){ build_certHashes(ssl, hashes_); uint16 sz = 0; byte len[VERIFY_HEADER]; mySTL::auto_ptr<byte> sig(ysArrayDelete); // sign const CertManager& cert = ssl.getCrypto().get_certManager(); if (cert.get_keyType() == rsa_sa_algo) { RSA rsa(cert.get_privateKey(), cert.get_privateKeyLength(), false); sz = rsa.get_cipherLength() + VERIFY_HEADER; sig.reset(new (ys) byte[sz]); c16toa(sz - VERIFY_HEADER, len); memcpy(sig.get(), len, VERIFY_HEADER); rsa.sign(sig.get() + VERIFY_HEADER, hashes_.md5_, sizeof(Hashes), ssl.getCrypto().get_random()); } else { // DSA DSS dss(cert.get_privateKey(), cert.get_privateKeyLength(), false); sz = DSS_SIG_SZ + DSS_ENCODED_EXTRA + VERIFY_HEADER; sig.reset(new (ys) byte[sz]); c16toa(sz - VERIFY_HEADER, len); memcpy(sig.get(), len, VERIFY_HEADER); dss.sign(sig.get() + VERIFY_HEADER, hashes_.sha_, SHA_LEN, ssl.getCrypto().get_random()); byte encoded[DSS_SIG_SZ + DSS_ENCODED_EXTRA]; TaoCrypt::EncodeDSA_Signature(sig.get() + VERIFY_HEADER, encoded); memcpy(sig.get() + VERIFY_HEADER, encoded, sizeof(encoded)); } set_length(sz); signature_ = sig.release();}input_buffer& CertificateVerify::set(input_buffer& in){ return in >> *this;}output_buffer& CertificateVerify::get(output_buffer& out) const{ return out << *this;}// input operator for CertificateVerifyinput_buffer& operator>>(input_buffer& input, CertificateVerify& request){ byte tmp[VERIFY_HEADER]; input.read(tmp, sizeof(tmp)); uint16 sz = 0; ato16(tmp, sz); request.set_length(sz); request.signature_ = new (ys) byte[sz]; input.read(request.signature_, sz); return input;}// output operator for CertificateVerifyoutput_buffer& operator<<(output_buffer& output, const CertificateVerify& verify){ output.write(verify.signature_, verify.get_length()); return output;}// CertificateVerify processing handlervoid CertificateVerify::Process(input_buffer&, SSL& ssl){ const Hashes& hashVerify = ssl.getHashes().get_certVerify(); const CertManager& cert = ssl.getCrypto().get_certManager(); if (cert.get_peerKeyType() == rsa_sa_algo) { RSA rsa(cert.get_peerKey(), cert.get_peerKeyLength()); if (!rsa.verify(hashVerify.md5_, sizeof(hashVerify), signature_, get_length())) ssl.SetError(verify_error); } else { // DSA byte decodedSig[DSS_SIG_SZ]; TaoCrypt::DecodeDSA_Signature(decodedSig, signature_, get_length()); DSS dss(cert.get_peerKey(), cert.get_peerKeyLength()); if (!dss.verify(hashVerify.sha_, SHA_LEN, decodedSig, get_length())) ssl.SetError(verify_error); }}HandShakeType CertificateVerify::get_type() const{ return certificate_verify;}// output operator for ClientKeyExchangeoutput_buffer& operator<<(output_buffer& output, const ClientKeyExchange& ck){ output.write(ck.getKey(), ck.getKeyLength()); return output;}// Client Key Exchange processing handlervoid ClientKeyExchange::Process(input_buffer& input, SSL& ssl){ createKey(ssl); if (ssl.GetError()) return; client_key_->read(ssl, input); if (ssl.getCrypto().get_certManager().verifyPeer()) build_certHashes(ssl, ssl.useHashes().use_certVerify()); ssl.useStates().useServer() = clientKeyExchangeComplete;}ClientKeyExchange::ClientKeyExchange(SSL& ssl){ createKey(ssl);}ClientKeyExchange::ClientKeyExchange() : client_key_(0){}ClientKeyExchange::~ClientKeyExchange(){ ysDelete(client_key_);}void ClientKeyExchange::build(SSL& ssl) { client_key_->build(ssl); set_length(client_key_->get_length());}const opaque* ClientKeyExchange::getKey() const{ return client_key_->get_clientKey();}int ClientKeyExchange::getKeyLength() const{ return client_key_->get_length();}input_buffer& ClientKeyExchange::set(input_buffer& in){ return in;}output_buffer& ClientKeyExchange::get(output_buffer& out) const{ return out << *this;}HandShakeType ClientKeyExchange::get_type() const{ return client_key_exchange;}// input operator for Finishedinput_buffer& operator>>(input_buffer& input, Finished&){ /* do in process */ return input; }// output operator for Finishedoutput_buffer& operator<<(output_buffer& output, const Finished& fin){ if (fin.get_length() == FINISHED_SZ) { output.write(fin.hashes_.md5_, MD5_LEN); output.write(fin.hashes_.sha_, SHA_LEN); } else // TLS_FINISHED_SZ output.write(fin.hashes_.md5_, TLS_FINISHED_SZ); return output;}// Finished processing handlervoid Finished::Process(input_buffer& input, SSL& ssl){ // verify hashes const Finished& verify = ssl.getHashes().get_verify(); uint finishedSz = ssl.isTLS() ? TLS_FINISHED_SZ : FINISHED_SZ; input.read(hashes_.md5_, finishedSz); if (memcmp(&hashes_, &verify.hashes_, finishedSz)) { ssl.SetError(verify_error); return; } // read verify mac opaque verifyMAC[SHA_LEN]; uint macSz = finishedSz + HANDSHAKE_HEADER; if (ssl.isTLS()) TLS_hmac(ssl, verifyMAC, input.get_buffer() + input.get_current() - macSz, macSz, handshake, true); else hmac(ssl, verifyMAC, input.get_buffer() + input.get_current() - macSz, macSz, handshake, true); // read mac and fill opaque mac[SHA_LEN]; // max size int digestSz = ssl.getCrypto().get_digest().get_digestSize(); input.read(mac, digestSz); opaque fill; int padSz = ssl.getSecurity().get_parms().encrypt_size_ - HANDSHAKE_HEADER - finishedSz - digestSz; for (int i = 0; i < padSz; i++) fill = input[AUTO]; // verify mac if (memcmp(mac, verifyMAC, digestSz)) { ssl.SetError(verify_error); return; } // update states ssl.useStates().useHandShake() = handShakeReady; if (ssl.getSecurity().get_parms().entity_ == client_end) ssl.useStates().useClient() = serverFinishedComplete; else ssl.useStates().useServer() = clientFinishedComplete;}Finished::Finished(){ set_length(FINISHED_SZ);}uint8* Finished::set_md5(){ return hashes_.md5_;}uint8* Finished::set_sha(){ return hashes_.sha_;}input_buffer& Finished::set(input_buffer& in){ return in >> *this;}output_buffer& Finished::get(output_buffer& out) const{ return out << *this;}HandShakeType Finished::get_type() const{ return finished;}void clean(volatile opaque* p, uint sz, RandomPool& ran){ uint i(0); for (i = 0; i < sz; ++i) p[i] = 0; ran.Fill(const_cast<opaque*>(p), sz); for (i = 0; i < sz; ++i) p[i] = 0;}Connection::Connection(ProtocolVersion v, RandomPool& ran) : pre_master_secret_(0), sequence_number_(0), peer_sequence_number_(0), pre_secret_len_(0), send_server_key_(false), master_clean_(false), TLS_(v.major_ >= 3 && v.minor_ >= 1), version_(v), random_(ran) {}Connection::~Connection() { CleanMaster(); CleanPreMaster(); ysArrayDelete(pre_master_secret_);}void Connection::AllocPreSecret(uint sz) { pre_master_secret_ = new (ys) opaque[pre_secret_len_ = sz];}void Connection::TurnOffTLS(){ TLS_ = false; version_.minor_ = 0;}// wipeout master secretvoid Connection::CleanMaster(){ if (!master_clean_) { volatile opaque* p = master_secret_; clean(p, SECRET_LEN, random_); master_clean_ = true; }}// wipeout pre master secretvoid Connection::CleanPreMaster(){ if (pre_master_secret_) { volatile opaque* p = pre_master_secret_; clean(p, pre_secret_len_, random_); ysArrayDelete(pre_master_secret_); pre_master_secret_ = 0; }}// Create functions for message factoryMessage* CreateCipherSpec() { return new (ys) ChangeCipherSpec; }Message* CreateAlert() { return new (ys) Alert; }Message* CreateHandShake() { return new (ys) HandShakeHeader; }Message* CreateData() { return new (ys) Data; }// Create functions for handshake factoryHandShakeBase* CreateHelloRequest() { return new (ys) HelloRequest; }HandShakeBase* CreateClientHello() { return new (ys) ClientHello; }HandShakeBase* CreateServerHello() { return new (ys) ServerHello; }HandShakeBase* CreateCertificate() { return new (ys) Certificate; }HandShakeBase* CreateServerKeyExchange() { return new (ys) ServerKeyExchange;}HandShakeBase* CreateCertificateRequest() { return new (ys) CertificateRequest; }HandShakeBase* CreateServerHelloDone() { return new (ys) ServerHelloDone; }HandShakeBase* CreateCertificateVerify() { return new (ys) CertificateVerify;}HandShakeBase* CreateClientKeyExchange() { return new (ys) ClientKeyExchange;}HandShakeBase* CreateFinished() { return new (ys) Finished; }// Create functions for server key exchange factoryServerKeyBase* CreateRSAServerKEA() { return new (ys) RSA_Server; }ServerKeyBase* CreateDHServerKEA() { return new (ys) DH_Server; }ServerKeyBase* CreateFortezzaServerKEA() { return new (ys) Fortezza_Server; }// Create functions for client key exchange factoryClientKeyBase* CreateRSAClient() { return new (ys) EncryptedPreMasterSecret; }ClientKeyBase* CreateDHClient() { return new (ys) ClientDiffieHellmanPublic; }ClientKeyBase* CreateFortezzaClient() { return new (ys) FortezzaKeys; }// Constructor calls this to Register compile time callbacksvoid InitMessageFactory(MessageFactory& mf){ mf.Reserve(4); mf.Register(alert, CreateAlert); mf.Register(change_cipher_spec, CreateCipherSpec); mf.Register(handshake, CreateHandShake); mf.Register(application_data, CreateData);}// Constructor calls this to Register compile time callbacksvoid InitHandShakeFactory(HandShakeFactory& hsf){ hsf.Reserve(10); hsf.Register(hello_request, CreateHelloRequest); hsf.Register(client_hello, CreateClientHello); hsf.Register(server_hello, CreateServerHello); hsf.Register(certificate, CreateCertificate); hsf.Register(server_key_exchange, CreateServerKeyExchange); hsf.Register(certificate_request, CreateCertificateRequest); hsf.Register(server_hello_done, CreateServerHelloDone); hsf.Register(certificate_verify, CreateCertificateVerify); hsf.Register(client_key_exchange, CreateClientKeyExchange); hsf.Register(finished, CreateFinished);}// Constructor calls this to Register compile time callbacksvoid InitServerKeyFactory(ServerKeyFactory& skf){ skf.Reserve(3); skf.Register(rsa_kea, CreateRSAServerKEA); skf.Register(diffie_hellman_kea, CreateDHServerKEA); skf.Register(fortezza_kea, CreateFortezzaServerKEA);}// Constructor calls this to Register compile time callbacksvoid InitClientKeyFactory(ClientKeyFactory& ckf){ ckf.Reserve(3); ckf.Register(rsa_kea, CreateRSAClient); ckf.Register(diffie_hellman_kea, CreateDHClient); ckf.Register(fortezza_kea, CreateFortezzaClient);}} // namespace
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -