📄 yassl_int.hpp
字号:
/* yassl_int.hpp * * Copyright (C) 2003 Sawtooth Consulting Ltd. * * This file is part of yaSSL. * * yaSSL is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * yaSSL is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA *//* yaSSL internal header defines SSL supporting types not specified in the * draft along with type conversion functions and openssl compatibility */#ifndef yaSSL_INT_HPP#define yaSSL_INT_HPP#include "yassl_imp.hpp"#include "yassl_error.hpp"#include "crypto_wrapper.hpp"#include "cert_wrapper.hpp"#include "log.hpp"#include "lock.hpp"namespace yaSSL {// State Machine for Record Layer Protocolenum RecordLayerState { recordNotReady = 0, // fatal error, no more processing recordReady};// State Machine for HandShake Protocolenum HandShakeState { handShakeNotReady = 0, // fatal error, no more processing preHandshake, // initial state inHandshake, // handshake started handShakeReady // handshake done};// client input HandShake state, use if HandShakeState == inHandShakeenum ClientState { serverNull = 0, serverHelloComplete, serverCertComplete, serverKeyExchangeComplete, serverHelloDoneComplete, serverFinishedComplete };// server input HandShake state, use if HandShakeState == inHandShakeenum ServerState { clientNull = 0, clientHelloComplete, clientKeyExchangeComplete, clientFinishedComplete };// combines all statesclass States { enum {MAX_ERROR_SZ = 80 }; RecordLayerState recordLayer_; HandShakeState handshakeLayer_; ClientState clientState_; ServerState serverState_; char errorString_[MAX_ERROR_SZ]; YasslError what_;public: States(); const RecordLayerState& getRecord() const; const HandShakeState& getHandShake() const; const ClientState& getClient() const; const ServerState& getServer() const; const char* getString() const; YasslError What() const; RecordLayerState& useRecord(); HandShakeState& useHandShake(); ClientState& useClient(); ServerState& useServer(); char* useString(); void SetError(YasslError);private: States(const States&); // hide copy States& operator=(const States&); // and assign};// holds all factoriesclass sslFactory { MessageFactory messageFactory_; // creates new messages by type HandShakeFactory handShakeFactory_; // creates new handshake types ServerKeyFactory serverKeyFactory_; // creates new server key types ClientKeyFactory clientKeyFactory_; // creates new client key types sslFactory(); // only GetSSL_Factory createspublic: const MessageFactory& getMessage() const; const HandShakeFactory& getHandShake() const; const ServerKeyFactory& getServerKey() const; const ClientKeyFactory& getClientKey() const; friend sslFactory& GetSSL_Factory(); // singleton creatorprivate: sslFactory(const sslFactory&); // hide copy sslFactory& operator=(const sslFactory&); // and assign };#undef X509_NAME // wincrypt.h clash// openSSL X509 namesclass X509_NAME { char* name_;public: X509_NAME(const char*, size_t sz); ~X509_NAME(); char* GetName();private: X509_NAME(const X509_NAME&); // hide copy X509_NAME& operator=(const X509_NAME&); // and assign};// openSSL X509class X509 { X509_NAME issuer_; X509_NAME subject_;public: X509(const char* i, size_t, const char* s, size_t); ~X509() {} X509_NAME* GetIssuer(); X509_NAME* GetSubject();private: X509(const X509&); // hide copy X509& operator=(const X509&); // and assign};// openSSL bignumstruct BIGNUM { /* gcc 2.96 fix: because of two Integer classes (yaSSL::Integer and TaoCrypt::Integer), we need to explicitly state the namespace here to let gcc 2.96 deduce the correct type. */ yaSSL::Integer int_; void assign(const byte* b, uint s) { int_.assign(b,s); }};// openSSL sessionclass SSL_SESSION { opaque sessionID_[ID_LEN]; opaque master_secret_[SECRET_LEN]; Cipher suite_[SUITE_LEN]; uint bornOn_; // create time in seconds uint timeout_; // timeout in seconds RandomPool& random_; // will clean master secretpublic: explicit SSL_SESSION(RandomPool&); SSL_SESSION(const SSL&, RandomPool&); ~SSL_SESSION(); const opaque* GetID() const; const opaque* GetSecret() const; const Cipher* GetSuite() const; uint GetBornOn() const; uint GetTimeOut() const; void SetTimeOut(uint); SSL_SESSION& operator=(const SSL_SESSION&); // allow assign for resumptionprivate: SSL_SESSION(const SSL_SESSION&); // hide copy};// holds all sessionsclass Sessions { mySTL::list<SSL_SESSION*> list_; RandomPool random_; // for session cleaning Mutex mutex_; // no-op for single threaded Sessions() {} // only GetSessions can createpublic: SSL_SESSION* lookup(const opaque*, SSL_SESSION* copy = 0); void add(const SSL&); void remove(const opaque*); ~Sessions(); friend Sessions& GetSessions(); // singleton creatorprivate: Sessions(const Sessions&); // hide copy Sessions& operator=(const Sessions&); // and assign};Sessions& GetSessions(); // forward singletonssslFactory& GetSSL_Factory();// openSSL method and context typesclass SSL_METHOD { ProtocolVersion version_; ConnectionEnd side_; bool verifyPeer_; bool failNoCert_;public: explicit SSL_METHOD(ConnectionEnd ce, ProtocolVersion pv); ProtocolVersion getVersion() const; ConnectionEnd getSide() const; void setVerifyPeer(); void setFailNoCert(); bool verifyPeer() const; bool failNoCert() const;private: SSL_METHOD(const SSL_METHOD&); // hide copy SSL_METHOD& operator=(const SSL_METHOD&); // and assign};struct Ciphers { bool setSuites_; // user set suites from default byte suites_[MAX_SUITE_SZ]; // new suites int suiteSz_; // suite length in bytes Ciphers() : setSuites_(false), suiteSz_(0) {}};struct DH; // forward// save for SSL constructionstruct DH_Parms { Integer p_; Integer g_; bool set_; // if set by user DH_Parms() : set_(false) {}};enum StatsField { Accept, Connect, AcceptGood, ConnectGood, AcceptRenegotiate, ConnectRenegotiate, Hits, CbHits, CacheFull, Misses, Timeouts, Number, GetCacheSize, VerifyMode, VerifyDepth
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -