yassl_imp.cpp
来自「一个不错的关于手机模块程序This page contains everythi」· C++ 代码 · 共 2,104 行 · 第 1/4 页
CPP
2,104 行
// input operator for RecordLayerHeader, adjust stream
input_buffer& operator>>(input_buffer& input, RecordLayerHeader& hdr)
{
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 RecordLayerHeader
output_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 Messages
input_buffer& operator>>(input_buffer& input, Message& msg)
{
return msg.set(input);
}
// virtual output operator for Messages
output_buffer& operator<<(output_buffer& output, const Message& msg)
{
return msg.get(output);
}
// input operator for HandShakeHeader
input_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 HandShakeHeader
output_buffer& operator<<(output_buffer& output, const HandShakeHeader& hdr)
{
output[AUTO] = hdr.type_;
output.write(hdr.length_, sizeof(hdr.length_));
return output;
}
// HandShake Header Processing function
void 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 field
HandShakeType 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 CipherSpec
input_buffer& operator>>(input_buffer& input, ChangeCipherSpec& cs)
{
cs.type_ = CipherChoice(input[AUTO]);
return input;
}
// output operator for CipherSpec
output_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 handler
void 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 Alert
input_buffer& operator>>(input_buffer& input, Alert& a)
{
a.level_ = AlertLevel(input[AUTO]);
a.description_ = AlertDescription(input[AUTO]);
return input;
}
// output operator for Alert
output_buffer& operator<<(output_buffer& output, const Alert& a)
{
output[AUTO] = a.level_;
output[AUTO] = a.description_;
return output;
}
// Alert processing handler
void 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 Data
output_buffer& operator<<(output_buffer& output, const Data& data)
{
output.write(data.write_buffer_, data.length_);
return output;
}
// Process handler for Data
void 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 HandShakes
input_buffer& operator>>(input_buffer& input, HandShakeBase& hs)
{
return hs.set(input);
}
// virtual output operator for HandShakes
output_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 Certificate
output_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 handler
void 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)
{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?