📄 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 CertificateRequest
output_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 handler
void CertificateRequest::Process(input_buffer&, SSL& ssl)
{
CertManager& cm = ssl.useCrypto().use_certManager();
// make sure user provided cert and key before sending and using
if (cm.get_cert() && cm.get_privateKey())
cm.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 CertificateVerify
input_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 CertificateVerify
output_buffer& operator<<(output_buffer& output,
const CertificateVerify& verify)
{
output.write(verify.signature_, verify.get_length());
return output;
}
// CertificateVerify processing handler
void 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 ClientKeyExchange
output_buffer& operator<<(output_buffer& output, const ClientKeyExchange& ck)
{
output.write(ck.getKey(), ck.getKeyLength());
return output;
}
// Client Key Exchange processing handler
void 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 Finished
input_buffer& operator>>(input_buffer& input, Finished&)
{
/* do in process */
return input;
}
// output operator for Finished
output_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 handler
void 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 secret
void Connection::CleanMaster()
{
if (!master_clean_) {
volatile opaque* p = master_secret_;
clean(p, SECRET_LEN, random_);
master_clean_ = true;
}
}
// wipeout pre master secret
void 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 factory
Message* 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 factory
HandShakeBase* 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 factory
ServerKeyBase* 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 factory
ClientKeyBase* CreateRSAClient() { return NEW_YS
EncryptedPreMasterSecret; }
ClientKeyBase* CreateDHClient() { return NEW_YS
ClientDiffieHellmanPublic; }
ClientKeyBase* CreateFortezzaClient() { return NEW_YS FortezzaKeys; }
// Constructor calls this to Register compile time callbacks
void 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 callbacks
void 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 callbacks
void 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 callbacks
void 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 + -