📄 yassl_imp.cpp
字号:
return in;
}
output_buffer& Certificate::get(output_buffer& out) const
{
return out << *this;
}
HandShakeType Certificate::get_type() const
{
return certificate;
}
ServerDHParams::ServerDHParams()
: pSz_(0), gSz_(0), pubSz_(0), p_(0), g_(0), Ys_(0)
{}
ServerDHParams::~ServerDHParams()
{
ysArrayDelete(Ys_);
ysArrayDelete(g_);
ysArrayDelete(p_);
}
int ServerDHParams::get_pSize() const
{
return pSz_;
}
int ServerDHParams::get_gSize() const
{
return gSz_;
}
int ServerDHParams::get_pubSize() const
{
return pubSz_;
}
const opaque* ServerDHParams::get_p() const
{
return p_;
}
const opaque* ServerDHParams::get_g() const
{
return g_;
}
const opaque* ServerDHParams::get_pub() const
{
return Ys_;
}
opaque* ServerDHParams::alloc_p(int sz)
{
p_ = NEW_YS opaque[pSz_ = sz];
return p_;
}
opaque* ServerDHParams::alloc_g(int sz)
{
g_ = NEW_YS opaque[gSz_ = sz];
return g_;
}
opaque* ServerDHParams::alloc_pub(int sz)
{
Ys_ = NEW_YS opaque[pubSz_ = sz];
return Ys_;
}
int ServerKeyBase::get_length() const
{
return 0;
}
opaque* ServerKeyBase::get_serverKey() const
{
return 0;
}
// input operator for ServerHello
input_buffer& operator>>(input_buffer& input, ServerHello& hello)
{
// Protocol
hello.server_version_.major_ = input[AUTO];
hello.server_version_.minor_ = input[AUTO];
// Random
input.read(hello.random_, RAN_LEN);
// Session
hello.id_len_ = input[AUTO];
input.read(hello.session_id_, ID_LEN);
// Suites
hello.cipher_suite_[0] = input[AUTO];
hello.cipher_suite_[1] = input[AUTO];
// Compression
hello.compression_method_ = CompressionMethod(input[AUTO]);
return input;
}
// output operator for ServerHello
output_buffer& operator<<(output_buffer& output, const ServerHello& hello)
{
// Protocol
output[AUTO] = hello.server_version_.major_;
output[AUTO] = hello.server_version_.minor_;
// Random
output.write(hello.random_, RAN_LEN);
// Session
output[AUTO] = hello.id_len_;
output.write(hello.session_id_, ID_LEN);
// Suites
output[AUTO] = hello.cipher_suite_[0];
output[AUTO] = hello.cipher_suite_[1];
// Compression
output[AUTO] = hello.compression_method_;
return output;
}
// Server Hello processing handler
void ServerHello::Process(input_buffer&, SSL& ssl)
{
ssl.set_pending(cipher_suite_[1]);
ssl.set_random(random_, server_end);
ssl.set_sessionID(session_id_);
if (ssl.getSecurity().get_resuming())
if (memcmp(session_id_, ssl.getSecurity().get_resume().GetID(),
ID_LEN) == 0) {
ssl.set_masterSecret(ssl.getSecurity().get_resume().GetSecret());
if (ssl.isTLS())
ssl.deriveTLSKeys();
else
ssl.deriveKeys();
ssl.useStates().useClient() = serverHelloDoneComplete;
return;
}
else {
ssl.useSecurity().set_resuming(false);
ssl.useLog().Trace("server denied resumption");
}
ssl.useStates().useClient() = serverHelloComplete;
}
ServerHello::ServerHello()
{
memset(random_, 0, RAN_LEN);
memset(session_id_, 0, ID_LEN);
}
ServerHello::ServerHello(ProtocolVersion pv)
: server_version_(pv)
{
memset(random_, 0, RAN_LEN);
memset(session_id_, 0, ID_LEN);
}
input_buffer& ServerHello::set(input_buffer& in)
{
return in >> *this;
}
output_buffer& ServerHello::get(output_buffer& out) const
{
return out << *this;
}
HandShakeType ServerHello::get_type() const
{
return server_hello;
}
const opaque* ServerHello::get_random() const
{
return random_;
}
// Server Hello Done processing handler
void ServerHelloDone::Process(input_buffer&, SSL& ssl)
{
ssl.useStates().useClient() = serverHelloDoneComplete;
}
ServerHelloDone::ServerHelloDone()
{
set_length(0);
}
input_buffer& ServerHelloDone::set(input_buffer& in)
{
return in;
}
output_buffer& ServerHelloDone::get(output_buffer& out) const
{
return out;
}
HandShakeType ServerHelloDone::get_type() const
{
return server_hello_done;
}
int ClientKeyBase::get_length() const
{
return 0;
}
opaque* ClientKeyBase::get_clientKey() const
{
return 0;
}
// input operator for Client Hello
input_buffer& operator>>(input_buffer& input, ClientHello& hello)
{
// Protocol
hello.client_version_.major_ = input[AUTO];
hello.client_version_.minor_ = input[AUTO];
// Random
input.read(hello.random_, RAN_LEN);
// Session
hello.id_len_ = input[AUTO];
if (hello.id_len_) input.read(hello.session_id_, ID_LEN);
// Suites
byte tmp[2];
tmp[0] = input[AUTO];
tmp[1] = input[AUTO];
ato16(tmp, hello.suite_len_);
input.read(hello.cipher_suites_, hello.suite_len_);
// Compression
hello.comp_len_ = input[AUTO];
hello.compression_methods_ = CompressionMethod(input[AUTO]);
return input;
}
// output operaotr for Client Hello
output_buffer& operator<<(output_buffer& output, const ClientHello& hello)
{
// Protocol
output[AUTO] = hello.client_version_.major_;
output[AUTO] = hello.client_version_.minor_;
// Random
output.write(hello.random_, RAN_LEN);
// Session
output[AUTO] = hello.id_len_;
if (hello.id_len_) output.write(hello.session_id_, ID_LEN);
// Suites
byte tmp[2];
c16toa(hello.suite_len_, tmp);
output[AUTO] = tmp[0];
output[AUTO] = tmp[1];
output.write(hello.cipher_suites_, hello.suite_len_);
// Compression
output[AUTO] = hello.comp_len_;
output[AUTO] = hello.compression_methods_;
return output;
}
// Client Hello processing handler
void ClientHello::Process(input_buffer&, SSL& ssl)
{
if (ssl.isTLS() && client_version_.minor_ == 0) {
ssl.useSecurity().use_connection().TurnOffTLS();
ProtocolVersion pv = ssl.getSecurity().get_connection().version_;
ssl.useSecurity().use_parms().SetSuites(pv); // reset w/ SSL suites
}
ssl.set_random(random_, client_end);
while (id_len_) { // trying to resume
SSL_SESSION* session = GetSessions().lookup(session_id_);
if (!session) {
ssl.useLog().Trace("session lookup failed");
break;
}
ssl.set_session(session);
ssl.useSecurity().set_resuming(true);
ssl.matchSuite(session->GetSuite(), SUITE_LEN);
ssl.set_pending(ssl.getSecurity().get_parms().suite_[1]);
ssl.set_masterSecret(session->GetSecret());
opaque serverRandom[RAN_LEN];
ssl.getCrypto().get_random().Fill(serverRandom, sizeof(serverRandom));
ssl.set_random(serverRandom, server_end);
if (ssl.isTLS())
ssl.deriveTLSKeys();
else
ssl.deriveKeys();
ssl.useStates().useServer() = clientKeyExchangeComplete;
return;
}
ssl.matchSuite(cipher_suites_, suite_len_);
ssl.set_pending(ssl.getSecurity().get_parms().suite_[1]);
ssl.useStates().useServer() = clientHelloComplete;
}
input_buffer& ClientHello::set(input_buffer& in)
{
return in >> *this;
}
output_buffer& ClientHello::get(output_buffer& out) const
{
return out << *this;
}
HandShakeType ClientHello::get_type() const
{
return client_hello;
}
const opaque* ClientHello::get_random() const
{
return random_;
}
ClientHello::ClientHello()
{
memset(random_, 0, RAN_LEN);
}
ClientHello::ClientHello(ProtocolVersion pv)
: client_version_(pv)
{
memset(random_, 0, RAN_LEN);
}
// output operator for ServerKeyExchange
output_buffer& operator<<(output_buffer& output, const ServerKeyExchange& sk)
{
output.write(sk.getKey(), sk.getKeyLength());
return output;
}
// Server Key Exchange processing handler
void ServerKeyExchange::Process(input_buffer& input, SSL& ssl)
{
createKey(ssl);
if (ssl.GetError()) return;
server_key_->read(ssl, input);
ssl.useStates().useClient() = serverKeyExchangeComplete;
}
ServerKeyExchange::ServerKeyExchange(SSL& ssl)
{
createKey(ssl);
}
ServerKeyExchange::ServerKeyExchange()
: server_key_(0)
{}
ServerKeyExchange::~ServerKeyExchange()
{
ysDelete(server_key_);
}
void ServerKeyExchange::build(SSL& ssl)
{
server_key_->build(ssl);
set_length(server_key_->get_length());
}
const opaque* ServerKeyExchange::getKey() const
{
return server_key_->get_serverKey();
}
int ServerKeyExchange::getKeyLength() const
{
return server_key_->get_length();
}
input_buffer& ServerKeyExchange::set(input_buffer& in)
{
return in; // process does
}
output_buffer& ServerKeyExchange::get(output_buffer& out) const
{
return out << *this;
}
HandShakeType ServerKeyExchange::get_type() const
{
return server_key_exchange;
}
// CertificateRequest
CertificateRequest::CertificateRequest()
: typeTotal_(0)
{
memset(certificate_types_, 0, sizeof(certificate_types_));
}
CertificateRequest::~CertificateRequest()
{
mySTL::for_each(certificate_authorities_.begin(),
certificate_authorities_.end(),
del_ptr_zero()) ;
}
void CertificateRequest::Build()
{
certificate_types_[0] = rsa_sign;
certificate_types_[1] = dss_sign;
typeTotal_ = 2;
uint16 authCount = 0;
uint16 authSz = 0;
for (int j = 0; j < authCount; j++) {
int sz = REQUEST_HEADER + MIN_DIS_SIZE;
DistinguishedName dn;
certificate_authorities_.push_back(dn = NEW_YS byte[sz]);
opaque tmp[REQUEST_HEADER];
c16toa(MIN_DIS_SIZE, tmp);
memcpy(dn, tmp, sizeof(tmp));
// fill w/ junk for now
memcpy(dn, tmp, MIN_DIS_SIZE);
authSz += sz;
}
set_length(SIZEOF_ENUM + typeTotal_ + REQUEST_HEADER + authSz);
}
input_buffer& CertificateRequest::set(input_buffer& in)
{
return in >> *this;
}
output_buffer& CertificateRequest::get(output_buffer& out) const
{
return out << *this;
}
// input operator for CertificateRequest
input_buffer& operator>>(input_buffer& input, CertificateRequest& request)
{
// types
request.typeTotal_ = input[AUTO];
for (int i = 0; i < request.typeTotal_; i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -