📄 yassl_imp.hpp
字号:
/* yassl_imp.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 implementation header defines all strucutres from the SSL.v3 * specification "draft-freier-ssl-version3-02.txt" * all page citations refer to this document unless otherwise noted. */#ifndef yaSSL_IMP_HPP#define yaSSL_IMP_HPP#ifdef _MSC_VER // disable truncated debug symbols #pragma warning(disable:4786)#endif#include "yassl_types.hpp"#include "factory.hpp"#include "list.hpp" // mySTL::listnamespace yaSSL {class SSL; // forward declsclass input_buffer;class output_buffer;struct ProtocolVersion { uint8 major_; uint8 minor_; // major and minor SSL/TLS version numbers ProtocolVersion(uint8 maj = 3, uint8 min = 0);};// Record Layer Header for PlainText, Compressed, and CipherTextstruct RecordLayerHeader { ContentType type_; ProtocolVersion version_; uint16 length_; // should not exceed 2^14};// base for all messagesstruct Message : public virtual_base { virtual input_buffer& set(input_buffer&) =0; virtual output_buffer& get(output_buffer&) const =0; virtual void Process(input_buffer&, SSL&) =0; virtual ContentType get_type() const =0; virtual uint16 get_length() const =0; virtual ~Message() {}};class ChangeCipherSpec : public Message { CipherChoice type_;public: ChangeCipherSpec(); friend input_buffer& operator>>(input_buffer&, ChangeCipherSpec&); friend output_buffer& operator<<(output_buffer&, const ChangeCipherSpec&); input_buffer& set(input_buffer& in); output_buffer& get(output_buffer& out) const; ContentType get_type() const; uint16 get_length() const; void Process(input_buffer&, SSL&);private: ChangeCipherSpec(const ChangeCipherSpec&); // hide copy ChangeCipherSpec& operator=(const ChangeCipherSpec&); // and assign};class Alert : public Message { AlertLevel level_; AlertDescription description_;public: Alert() {} Alert(AlertLevel al, AlertDescription ad); ContentType get_type() const; uint16 get_length() const; void Process(input_buffer&, SSL&); friend input_buffer& operator>>(input_buffer&, Alert&); friend output_buffer& operator<<(output_buffer&, const Alert&); input_buffer& set(input_buffer& in); output_buffer& get(output_buffer& out) const;private: Alert(const Alert&); // hide copy Alert& operator=(const Alert&); // and assign};class Data : public Message { uint16 length_; opaque* buffer_; // read buffer used by fillData input const opaque* write_buffer_; // write buffer used by output operatorpublic: Data(); Data(uint16 len, opaque* b); Data(uint16 len, const opaque* w); friend output_buffer& operator<<(output_buffer&, const Data&); input_buffer& set(input_buffer& in); output_buffer& get(output_buffer& out) const; ContentType get_type() const; uint16 get_length() const; const opaque* get_buffer() const; void set_length(uint16 l); opaque* set_buffer(); void Process(input_buffer&, SSL&);private: Data(const Data&); // hide copy Data& operator=(const Data&); // and assign};uint32 c24to32(const uint24); // forward form internal headervoid c32to24(uint32, uint24&);// HandShake header, same for each message type from page 20/21class HandShakeHeader : public Message { HandShakeType type_; uint24 length_; // length of messagepublic: HandShakeHeader() {} ContentType get_type() const; uint16 get_length() const; HandShakeType get_handshakeType() const; void Process(input_buffer&, SSL&); void set_type(HandShakeType hst); void set_length(uint32 u32); friend input_buffer& operator>>(input_buffer&, HandShakeHeader&); friend output_buffer& operator<<(output_buffer&, const HandShakeHeader&); input_buffer& set(input_buffer& in); output_buffer& get(output_buffer& out) const;private: HandShakeHeader(const HandShakeHeader&); // hide copy HandShakeHeader& operator=(const HandShakeHeader&); // and assign};// Base Class for all handshake messagesclass HandShakeBase : public virtual_base { int length_;public: int get_length() const; void set_length(int); // for building buffer's type field virtual HandShakeType get_type() const =0; // handles dispactch of proper >> virtual input_buffer& set(input_buffer& in) =0; virtual output_buffer& get(output_buffer& out) const =0; virtual void Process(input_buffer&, SSL&) =0; virtual ~HandShakeBase() {}};struct HelloRequest : public HandShakeBase { input_buffer& set(input_buffer& in); output_buffer& get(output_buffer& out) const; void Process(input_buffer&, SSL&); HandShakeType get_type() const;};// The Client's Hello Message from page 23class ClientHello : public HandShakeBase { ProtocolVersion client_version_; Random random_; uint8 id_len_; // session id length opaque session_id_[ID_LEN]; uint16 suite_len_; // cipher suite length opaque cipher_suites_[MAX_SUITE_SZ]; uint8 comp_len_; // compression length CompressionMethod compression_methods_; public: friend input_buffer& operator>>(input_buffer&, ClientHello&); friend output_buffer& operator<<(output_buffer&, const ClientHello&); input_buffer& set(input_buffer& in); output_buffer& get(output_buffer& out) const; HandShakeType get_type() const; void Process(input_buffer&, SSL&); const opaque* get_random() const; friend void buildClientHello(SSL&, ClientHello&, CompressionMethod); friend void ProcessOldClientHello(input_buffer& input, SSL& ssl); ClientHello(); explicit ClientHello(ProtocolVersion pv);private: ClientHello(const ClientHello&); // hide copy ClientHello& operator=(const ClientHello&); // and assign};// The Server's Hello Message from page 24class ServerHello : public HandShakeBase { ProtocolVersion server_version_; Random random_; uint8 id_len_; // session id length opaque session_id_[ID_LEN]; opaque cipher_suite_[SUITE_LEN]; CompressionMethod compression_method_;public: explicit ServerHello(ProtocolVersion pv); ServerHello(); friend input_buffer& operator>>(input_buffer&, ServerHello&); friend output_buffer& operator<<(output_buffer&, const ServerHello&); input_buffer& set(input_buffer& in); output_buffer& get(output_buffer& out) const; HandShakeType get_type() const; void Process(input_buffer&, SSL&); const opaque* get_random() const; friend void buildServerHello(SSL&, ServerHello&);private: ServerHello(const ServerHello&); // hide copy ServerHello& operator=(const ServerHello&); // and assign};class x509; // Certificate could be a chainclass Certificate : public HandShakeBase { const x509* cert_;public: Certificate(); explicit Certificate(const x509* cert); friend output_buffer& operator<<(output_buffer&, const Certificate&); const opaque* get_buffer() const; // Process handles input, needs SSL input_buffer& set(input_buffer& in); output_buffer& get(output_buffer& out) const; HandShakeType get_type() const; void Process(input_buffer&, SSL&);private: Certificate(const Certificate&); // hide copy Certificate& operator=(const Certificate&); // and assign};// RSA Public Keystruct ServerRSAParams { opaque* rsa_modulus_; opaque* rsa_exponent_;};// Ephemeral Diffie-Hellman Parametersclass ServerDHParams { int pSz_; int gSz_; int pubSz_; opaque* p_; opaque* g_; opaque* Ys_;public: ServerDHParams(); ~ServerDHParams(); int get_pSize() const; int get_gSize() const; int get_pubSize() const; const opaque* get_p() const; const opaque* get_g() const; const opaque* get_pub() const; opaque* alloc_p(int sz); opaque* alloc_g(int sz); opaque* alloc_pub(int sz);private: ServerDHParams(const ServerDHParams&); // hide copy ServerDHParams& operator=(const ServerDHParams&); // and assign};struct ServerKeyBase : public virtual_base { virtual ~ServerKeyBase() {} virtual void build(SSL&) {} virtual void read(SSL&, input_buffer&) {} virtual int get_length() const; virtual opaque* get_serverKey() const;};// Server random number for FORTEZZA KEAstruct Fortezza_Server : public ServerKeyBase { opaque r_s_[FORTEZZA_MAX];};struct SignatureBase : public virtual_base { virtual ~SignatureBase() {}};struct anonymous_sa : public SignatureBase {};struct Hashes { uint8 md5_[MD5_LEN]; uint8 sha_[SHA_LEN];}; struct rsa_sa : public SignatureBase { Hashes hashes_;};struct dsa_sa : public SignatureBase { uint8 sha_[SHA_LEN];};// Server's Diffie-Hellman exchangeclass DH_Server : public ServerKeyBase { ServerDHParams parms_; opaque* signature_;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -