📄 yassl_int.cpp
字号:
bool SSL_CTX::SetCipherList(const char* list){ if (!list) return false; bool ret = false; char name[MAX_SUITE_NAME]; char needle[] = ":"; char* haystack = const_cast<char*>(list); char* prev; const int suiteSz = sizeof(cipher_names) / sizeof(cipher_names[0]); int idx = 0; for(;;) { int len; prev = haystack; haystack = strstr(haystack, needle); if (!haystack) // last cipher len = min(sizeof(name), strlen(prev)); else len = min(sizeof(name), (size_t)(haystack - prev)); strncpy(name, prev, len); name[(len == sizeof(name)) ? len - 1 : len] = 0; for (int i = 0; i < suiteSz; i++) if (strncmp(name, cipher_names[i], sizeof(name)) == 0) { ciphers_.suites_[idx++] = 0x00; // first byte always zero ciphers_.suites_[idx++] = i; if (!ret) ret = true; // found at least one break; } if (!haystack) break; haystack++; } if (ret) { ciphers_.setSuites_ = true; ciphers_.suiteSz_ = idx; } return ret;}void SSL_CTX::IncrementStats(StatsField fd){ Lock guard(mutex_); switch (fd) { case Accept: ++stats_.accept_; break; case Connect: ++stats_.connect_; break; case AcceptGood: ++stats_.acceptGood_; break; case ConnectGood: ++stats_.connectGood_; break; case AcceptRenegotiate: ++stats_.acceptRenegotiate_; break; case ConnectRenegotiate: ++stats_.connectRenegotiate_; break; case Hits: ++stats_.hits_; break; case CbHits: ++stats_.cbHits_; break; case CacheFull: ++stats_.cacheFull_; break; case Misses: ++stats_.misses_; break; case Timeouts: ++stats_.timeouts_; break; case Number: ++stats_.number_; break; case GetCacheSize: ++stats_.getCacheSize_; break; case VerifyMode: ++stats_.verifyMode_; break; case VerifyDepth: ++stats_.verifyDepth_; break; default: break; }}Crypto::Crypto() : digest_(0), cipher_(0), dh_(0) {}Crypto::~Crypto(){ ysDelete(dh_); ysDelete(cipher_); ysDelete(digest_);}const Digest& Crypto::get_digest() const{ return *digest_;}const BulkCipher& Crypto::get_cipher() const{ return *cipher_;}const DiffieHellman& Crypto::get_dh() const{ return *dh_;}const RandomPool& Crypto::get_random() const{ return random_;}const CertManager& Crypto::get_certManager() const{ return cert_;} Digest& Crypto::use_digest(){ return *digest_;}BulkCipher& Crypto::use_cipher(){ return *cipher_;}DiffieHellman& Crypto::use_dh(){ return *dh_;}RandomPool& Crypto::use_random(){ return random_;}CertManager& Crypto::use_certManager(){ return cert_;}void Crypto::SetDH(DiffieHellman* dh){ dh_ = dh;}void Crypto::SetDH(const DH_Parms& dh){ if (dh.set_) dh_ = NEW_YS DiffieHellman(dh.p_, dh.g_, random_);}bool Crypto::DhSet(){ return dh_ != 0;}void Crypto::setDigest(Digest* digest){ digest_ = digest;}void Crypto::setCipher(BulkCipher* c){ cipher_ = c;}const MD5& sslHashes::get_MD5() const{ return md5HandShake_;}const SHA& sslHashes::get_SHA() const{ return shaHandShake_;}const Finished& sslHashes::get_verify() const{ return verify_;}const Hashes& sslHashes::get_certVerify() const{ return certVerify_;}MD5& sslHashes::use_MD5(){ return md5HandShake_;}SHA& sslHashes::use_SHA(){ return shaHandShake_;}Finished& sslHashes::use_verify(){ return verify_;}Hashes& sslHashes::use_certVerify(){ return certVerify_;}Buffers::Buffers() : rawInput_(0){}Buffers::~Buffers(){ STL::for_each(handShakeList_.begin(), handShakeList_.end(), del_ptr_zero()) ; STL::for_each(dataList_.begin(), dataList_.end(), del_ptr_zero()) ; ysDelete(rawInput_);}void Buffers::SetRawInput(input_buffer* ib){ assert(rawInput_ == 0); rawInput_ = ib;}input_buffer* Buffers::TakeRawInput(){ input_buffer* ret = rawInput_; rawInput_ = 0; return ret;}const Buffers::inputList& Buffers::getData() const{ return dataList_;}const Buffers::outputList& Buffers::getHandShake() const{ return handShakeList_;}Buffers::inputList& Buffers::useData(){ return dataList_;}Buffers::outputList& Buffers::useHandShake(){ return handShakeList_;}Security::Security(ProtocolVersion pv, RandomPool& ran, ConnectionEnd ce, const Ciphers& ciphers, SSL_CTX* ctx, bool haveDH) : conn_(pv, ran), parms_(ce, ciphers, pv, haveDH), resumeSession_(ran), ctx_(ctx), resuming_(false){}const Connection& Security::get_connection() const{ return conn_;}const SSL_CTX* Security::GetContext() const{ return ctx_;}const Parameters& Security::get_parms() const{ return parms_;}const SSL_SESSION& Security::get_resume() const{ return resumeSession_;}bool Security::get_resuming() const{ return resuming_;}Connection& Security::use_connection(){ return conn_;}Parameters& Security::use_parms(){ return parms_;}SSL_SESSION& Security::use_resume(){ return resumeSession_;}void Security::set_resuming(bool b){ resuming_ = b;}X509_NAME::X509_NAME(const char* n, size_t sz) : name_(0), sz_(sz){ if (sz) { name_ = NEW_YS char[sz]; memcpy(name_, n, sz); } entry_.data = 0;}X509_NAME::~X509_NAME(){ ysArrayDelete(name_); ysArrayDelete(entry_.data);}const char* X509_NAME::GetName() const{ return name_;}size_t X509_NAME::GetLength() const{ return sz_;}X509::X509(const char* i, size_t iSz, const char* s, size_t sSz, const char* b, int bSz, const char* a, int aSz) : issuer_(i, iSz), subject_(s, sSz), beforeDate_(b, bSz), afterDate_(a, aSz){} X509_NAME* X509::GetIssuer(){ return &issuer_;}X509_NAME* X509::GetSubject(){ return &subject_;}ASN1_STRING* X509::GetBefore(){ return beforeDate_.GetString();}ASN1_STRING* X509::GetAfter(){ return afterDate_.GetString();}ASN1_STRING* X509_NAME::GetEntry(int i){ if (i < 0 || i >= int(sz_)) return 0; if (entry_.data) ysArrayDelete(entry_.data); entry_.data = NEW_YS byte[sz_]; // max size; memcpy(entry_.data, &name_[i], sz_ - i); if (entry_.data[sz_ -i - 1]) { entry_.data[sz_ - i] = 0; entry_.length = sz_ - i; } else entry_.length = sz_ - i - 1; entry_.type = 0; return &entry_;}StringHolder::StringHolder(const char* str, int sz){ asnString_.length = sz; asnString_.data = NEW_YS byte[sz + 1]; memcpy(asnString_.data, str, sz); asnString_.type = 0; // not used for now}StringHolder::~StringHolder(){ ysArrayDelete(asnString_.data);}ASN1_STRING* StringHolder::GetString(){ return &asnString_;}#ifdef HAVE_LIBZ void* myAlloc(void* /* opaque */, unsigned int item, unsigned int size) { return NEW_YS unsigned char[item * size]; } void myFree(void* /* opaque */, void* memory) { unsigned char* ptr = static_cast<unsigned char*>(memory); yaSSL::ysArrayDelete(ptr); } // put size in front of compressed data int Compress(const byte* in, int sz, input_buffer& buffer) { byte tmp[LENGTH_SZ]; z_stream c_stream; /* compression stream */ buffer.allocate(sz + sizeof(uint16) + COMPRESS_EXTRA); c_stream.zalloc = myAlloc; c_stream.zfree = myFree; c_stream.opaque = (voidpf)0; c_stream.next_in = const_cast<byte*>(in); c_stream.avail_in = sz; c_stream.next_out = buffer.get_buffer() + sizeof(tmp); c_stream.avail_out = buffer.get_capacity() - sizeof(tmp); if (deflateInit(&c_stream, 8) != Z_OK) return -1; int err = deflate(&c_stream, Z_FINISH); deflateEnd(&c_stream); if (err != Z_OK && err != Z_STREAM_END) return -1; c16toa(sz, tmp); memcpy(buffer.get_buffer(), tmp, sizeof(tmp)); buffer.add_size(c_stream.total_out + sizeof(tmp)); return 0; } // get uncompressed size in front int DeCompress(input_buffer& in, int sz, input_buffer& out) { byte tmp[LENGTH_SZ]; in.read(tmp, sizeof(tmp)); uint16 len; ato16(tmp, len); out.allocate(len); z_stream d_stream; /* decompression stream */ d_stream.zalloc = myAlloc; d_stream.zfree = myFree; d_stream.opaque = (voidpf)0; d_stream.next_in = in.get_buffer() + in.get_current(); d_stream.avail_in = sz - sizeof(tmp); d_stream.next_out = out.get_buffer(); d_stream.avail_out = out.get_capacity(); if (inflateInit(&d_stream) != Z_OK) return -1; int err = inflate(&d_stream, Z_FINISH); inflateEnd(&d_stream); if (err != Z_OK && err != Z_STREAM_END) return -1; out.add_size(d_stream.total_out); in.set_current(in.get_current() + sz - sizeof(tmp)); return 0; }#else // LIBZ // these versions should never get called int Compress(const byte* in, int sz, input_buffer& buffer) { assert(0); return -1; } int DeCompress(input_buffer& in, int sz, input_buffer& out) { assert(0); return -1; } #endif // LIBZ} // namespaceextern "C" void yaSSL_CleanUp(){ TaoCrypt::CleanUp(); yaSSL::ysDelete(yaSSL::sslFactoryInstance); yaSSL::ysDelete(yaSSL::sessionsInstance); yaSSL::ysDelete(yaSSL::errorsInstance); // In case user calls more than once, prevent seg fault yaSSL::sslFactoryInstance = 0; yaSSL::sessionsInstance = 0; yaSSL::errorsInstance = 0;}#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATIONnamespace mySTL {template yaSSL::yassl_int_cpp_local1::SumData for_each<mySTL::list<yaSSL::input_buffer*>::iterator, yaSSL::yassl_int_cpp_local1::SumData>(mySTL::list<yaSSL::input_buffer*>::iterator, mySTL::list<yaSSL::input_buffer*>::iterator, yaSSL::yassl_int_cpp_local1::SumData);template yaSSL::yassl_int_cpp_local1::SumBuffer for_each<mySTL::list<yaSSL::output_buffer*>::iterator, yaSSL::yassl_int_cpp_local1::SumBuffer>(mySTL::list<yaSSL::output_buffer*>::iterator, mySTL::list<yaSSL::output_buffer*>::iterator, yaSSL::yassl_int_cpp_local1::SumBuffer);template mySTL::list<yaSSL::SSL_SESSION*>::iterator find_if<mySTL::list<yaSSL::SSL_SESSION*>::iterator, yaSSL::yassl_int_cpp_local2::sess_match>(mySTL::list<yaSSL::SSL_SESSION*>::iterator, mySTL::list<yaSSL::SSL_SESSION*>::iterator, yaSSL::yassl_int_cpp_local2::sess_match);template mySTL::list<yaSSL::ThreadError>::iterator find_if<mySTL::list<yaSSL::ThreadError>::iterator, yaSSL::yassl_int_cpp_local2::thr_match>(mySTL::list<yaSSL::ThreadError>::iterator, mySTL::list<yaSSL::ThreadError>::iterator, yaSSL::yassl_int_cpp_local2::thr_match);}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -