1 /*
2    Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
3 
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; version 2 of the License.
7 
8    This program is distributed in the hope that it will be useful,
9    but WITHOUT ANY WARRANTY; without even the implied warranty of
10    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11    GNU General Public License for more details.
12 
13    You should have received a copy of the GNU General Public License
14    along with this program; see the file COPYING. If not, write to the
15    Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
16    MA  02110-1301  USA.
17 */
18 
19 /*  yaSSL implementation header defines all strucutres from the SSL.v3
20  *  specification "draft-freier-ssl-version3-02.txt"
21  *  all page citations refer to this document unless otherwise noted.
22  */
23 
24 
25 #ifndef yaSSL_IMP_HPP
26 #define yaSSL_IMP_HPP
27 
28 #ifdef _MSC_VER
29     // disable truncated debug symbols
30     #pragma warning(disable:4786)
31 #endif
32 
33 #include "yassl_types.hpp"
34 #include "factory.hpp"
35 #include STL_LIST_FILE
36 
37 
38 namespace STL = STL_NAMESPACE;
39 
40 
41 namespace yaSSL {
42 
43 
44 class SSL;              // forward decls
45 class input_buffer;
46 class output_buffer;
47 
48 
49 struct ProtocolVersion {
50     uint8 major_;
51     uint8 minor_;     // major and minor SSL/TLS version numbers
52 
53     ProtocolVersion(uint8 maj = 3, uint8 min = 0);
54 };
55 
56 
57 // Record Layer Header for PlainText, Compressed, and CipherText
58 struct RecordLayerHeader {
59     ContentType     type_;
60     ProtocolVersion version_;
61     uint16          length_;             // should not exceed 2^14
62 };
63 
64 
65 // base for all messages
66 struct Message : public virtual_base {
67     virtual input_buffer& set(input_buffer&) =0;
68     virtual output_buffer& get(output_buffer&) const =0;
69 
70     virtual void Process(input_buffer&, SSL&) =0;
71     virtual ContentType get_type() const =0;
72     virtual uint16      get_length() const =0;
73 
~MessageyaSSL::Message74     virtual ~Message() {}
75 };
76 
77 
78 class ChangeCipherSpec : public Message {
79     CipherChoice type_;
80 public:
81     ChangeCipherSpec();
82 
83     friend input_buffer& operator>>(input_buffer&, ChangeCipherSpec&);
84     friend output_buffer& operator<<(output_buffer&, const ChangeCipherSpec&);
85 
86     input_buffer& set(input_buffer& in);
87     output_buffer& get(output_buffer& out) const;
88 
89     ContentType get_type()   const;
90     uint16      get_length() const;
91     void Process(input_buffer&, SSL&);
92 private:
93     ChangeCipherSpec(const ChangeCipherSpec&);            // hide copy
94     ChangeCipherSpec& operator=(const ChangeCipherSpec&); // and assign
95 };
96 
97 
98 
99 class Alert : public Message {
100     AlertLevel       level_;
101     AlertDescription description_;
102 public:
Alert()103     Alert() {}
104     Alert(AlertLevel al, AlertDescription ad);
105 
106     ContentType get_type()   const;
107     uint16      get_length() const;
108     void Process(input_buffer&, SSL&);
109 
110     friend input_buffer& operator>>(input_buffer&, Alert&);
111     friend output_buffer& operator<<(output_buffer&, const Alert&);
112 
113     input_buffer& set(input_buffer& in);
114     output_buffer& get(output_buffer& out) const;
115 private:
116     Alert(const Alert&);            // hide copy
117     Alert& operator=(const Alert&); // and assign
118 };
119 
120 
121 class Data : public Message {
122     uint16        length_;
123     opaque*       buffer_;         // read  buffer used by fillData input
124     const opaque* write_buffer_;   // write buffer used by output operator
125 public:
126     Data();
127     Data(uint16 len, opaque* b);
128 
129     friend output_buffer& operator<<(output_buffer&, const Data&);
130 
131     input_buffer& set(input_buffer& in);
132     output_buffer& get(output_buffer& out) const;
133 
134     ContentType   get_type()     const;
135     uint16        get_length()   const;
136     void          set_length(uint16 l);
137     opaque*       set_buffer();
138     void          SetData(uint16, const opaque*);
139     void Process(input_buffer&, SSL&);
140 private:
141     Data(const Data&);            // hide copy
142     Data& operator=(const Data&); // and assign
143 };
144 
145 
146 uint32 c24to32(const uint24);       // forward form internal header
147 void   c32to24(uint32, uint24&);
148 
149 
150 // HandShake header, same for each message type from page 20/21
151 class HandShakeHeader : public Message {
152     HandShakeType      type_;
153     uint24             length_;      // length of message
154 public:
HandShakeHeader()155     HandShakeHeader() {}
156 
157     ContentType   get_type()   const;
158     uint16        get_length() const;
159     HandShakeType get_handshakeType() const;
160     void Process(input_buffer&, SSL&);
161 
162     void set_type(HandShakeType hst);
163     void set_length(uint32 u32);
164 
165     friend input_buffer& operator>>(input_buffer&, HandShakeHeader&);
166     friend output_buffer& operator<<(output_buffer&, const HandShakeHeader&);
167 
168     input_buffer& set(input_buffer& in);
169     output_buffer& get(output_buffer& out) const;
170 private:
171     HandShakeHeader(const HandShakeHeader&);            // hide copy
172     HandShakeHeader& operator=(const HandShakeHeader&); // and assign
173 };
174 
175 
176 // Base Class for all handshake messages
177 class HandShakeBase : public virtual_base {
178     int     length_;
179 public:
180     int     get_length() const;
181     void    set_length(int);
182 
183     // for building buffer's type field
184     virtual HandShakeType get_type() const =0;
185 
186     // handles dispactch of proper >>
187     virtual input_buffer&  set(input_buffer& in) =0;
188     virtual output_buffer& get(output_buffer& out) const =0;
189 
190     virtual void Process(input_buffer&, SSL&) =0;
191 
~HandShakeBase()192     virtual ~HandShakeBase() {}
193 };
194 
195 
196 struct HelloRequest : public HandShakeBase {
197     input_buffer&  set(input_buffer& in);
198     output_buffer& get(output_buffer& out) const;
199 
200     void Process(input_buffer&, SSL&);
201 
202     HandShakeType get_type() const;
203 };
204 
205 
206 // The Client's Hello Message from page 23
207 class ClientHello : public HandShakeBase {
208     ProtocolVersion     client_version_;
209     Random              random_;
210     uint8               id_len_;                         // session id length
211     opaque              session_id_[ID_LEN];
212     uint16              suite_len_;                      // cipher suite length
213     opaque              cipher_suites_[MAX_SUITE_SZ];
214     uint8               comp_len_;                       // compression length
215     CompressionMethod   compression_methods_;
216 public:
217     friend input_buffer&  operator>>(input_buffer&, ClientHello&);
218     friend output_buffer& operator<<(output_buffer&, const ClientHello&);
219 
220     input_buffer&  set(input_buffer& in);
221     output_buffer& get(output_buffer& out) const;
222 
223     HandShakeType  get_type() const;
224     void Process(input_buffer&, SSL&);
225 
226     const opaque* get_random() const;
227     friend void buildClientHello(SSL&, ClientHello&);
228     friend void ProcessOldClientHello(input_buffer& input, SSL& ssl);
229 
230     ClientHello();
231     ClientHello(ProtocolVersion pv, bool useCompression);
232 private:
233     ClientHello(const ClientHello&);            // hide copy
234     ClientHello& operator=(const ClientHello&); // and assign
235 };
236 
237 
238 
239 // The Server's Hello Message from page 24
240 class ServerHello : public HandShakeBase {
241     ProtocolVersion     server_version_;
242     Random              random_;
243     uint8               id_len_;                 // session id length
244     opaque              session_id_[ID_LEN];
245     opaque              cipher_suite_[SUITE_LEN];
246     CompressionMethod   compression_method_;
247 public:
248     ServerHello(ProtocolVersion pv, bool useCompression);
249     ServerHello();
250 
251     friend input_buffer&  operator>>(input_buffer&, ServerHello&);
252     friend output_buffer& operator<<(output_buffer&, const ServerHello&);
253 
254     input_buffer&  set(input_buffer& in);
255     output_buffer& get(output_buffer& out) const;
256 
257     HandShakeType  get_type() const;
258     void Process(input_buffer&, SSL&);
259 
260     const opaque* get_random() const;
261     friend void buildServerHello(SSL&, ServerHello&);
262 private:
263     ServerHello(const ServerHello&);            // hide copy
264     ServerHello& operator=(const ServerHello&); // and assign
265 };
266 
267 
268 class x509;
269 
270 // Certificate could be a chain
271 class Certificate : public HandShakeBase {
272     const x509* cert_;
273 public:
274     Certificate();
275     explicit Certificate(const x509* cert);
276     friend output_buffer& operator<<(output_buffer&, const Certificate&);
277 
278     const opaque* get_buffer() const;
279 
280     // Process handles input, needs SSL
281     input_buffer&  set(input_buffer& in);
282     output_buffer& get(output_buffer& out) const;
283 
284     HandShakeType get_type() const;
285     void Process(input_buffer&, SSL&);
286 private:
287     Certificate(const Certificate&);            // hide copy
288     Certificate& operator=(const Certificate&); // and assign
289 };
290 
291 
292 
293 // RSA Public Key
294 struct ServerRSAParams {
295     opaque* rsa_modulus_;
296     opaque* rsa_exponent_;
297 };
298 
299 
300 // Ephemeral Diffie-Hellman Parameters
301 class ServerDHParams {
302     int pSz_;
303     int gSz_;
304     int pubSz_;
305     opaque* p_;
306     opaque* g_;
307     opaque* Ys_;
308 public:
309     ServerDHParams();
310     ~ServerDHParams();
311 
312     int get_pSize()   const;
313     int get_gSize()   const;
314     int get_pubSize() const;
315 
316     const opaque* get_p()   const;
317     const opaque* get_g()   const;
318     const opaque* get_pub() const;
319 
320     opaque* alloc_p(int sz);
321     opaque* alloc_g(int sz);
322     opaque* alloc_pub(int sz);
323 private:
324     ServerDHParams(const ServerDHParams&);            // hide copy
325     ServerDHParams& operator=(const ServerDHParams&); // and assign
326 };
327 
328 
329 struct ServerKeyBase : public virtual_base {
~ServerKeyBaseyaSSL::ServerKeyBase330     virtual ~ServerKeyBase() {}
buildyaSSL::ServerKeyBase331     virtual void build(SSL&) {}
readyaSSL::ServerKeyBase332     virtual void read(SSL&, input_buffer&) {}
333     virtual int  get_length() const;
334     virtual opaque* get_serverKey() const;
335 };
336 
337 
338 // Server random number for FORTEZZA KEA
339 struct Fortezza_Server : public ServerKeyBase {
340     opaque r_s_[FORTEZZA_MAX];
341 };
342 
343 
344 struct SignatureBase : public virtual_base {
~SignatureBaseyaSSL::SignatureBase345     virtual ~SignatureBase() {}
346 };
347 
348 struct anonymous_sa : public SignatureBase {};
349 
350 
351 struct Hashes {
352     uint8 md5_[MD5_LEN];
353     uint8 sha_[SHA_LEN];
354 };
355 
356 
357 struct rsa_sa : public SignatureBase {
358     Hashes hashes_;
359 };
360 
361 
362 struct dsa_sa : public SignatureBase {
363     uint8 sha_[SHA_LEN];
364 };
365 
366 
367 // Server's Diffie-Hellman exchange
368 class DH_Server : public ServerKeyBase {
369     ServerDHParams  parms_;
370     opaque*         signature_;
371 
372     int             length_;                // total length of message
373     opaque*         keyMessage_;            // total exchange message
374 public:
375     DH_Server();
376     ~DH_Server();
377 
378     void build(SSL&);
379     void read(SSL&, input_buffer&);
380     int  get_length() const;
381     opaque* get_serverKey() const;
382 private:
383     DH_Server(const DH_Server&);            // hide copy
384     DH_Server& operator=(const DH_Server&); // and assign
385 };
386 
387 
388 // Server's RSA exchange
389 struct RSA_Server : public ServerKeyBase {
390     ServerRSAParams params_;
391     opaque*         signature_;   // signed rsa_sa hashes
392 };
393 
394 
395 class ServerKeyExchange : public HandShakeBase {
396     ServerKeyBase* server_key_;
397 public:
398     explicit ServerKeyExchange(SSL&);
399     ServerKeyExchange();
400     ~ServerKeyExchange();
401 
402     void createKey(SSL&);
403     void build(SSL& ssl);
404 
405     const opaque* getKey()       const;
406     int           getKeyLength() const;
407 
408     input_buffer&  set(input_buffer& in);
409     output_buffer& get(output_buffer& out) const;
410 
411     friend output_buffer& operator<<(output_buffer&, const ServerKeyExchange&);
412 
413     void Process(input_buffer&, SSL&);
414     HandShakeType get_type() const;
415 private:
416     ServerKeyExchange(const ServerKeyExchange&);            // hide copy
417     ServerKeyExchange& operator=(const ServerKeyExchange&); // and assign
418 };
419 
420 
421 
422 class CertificateRequest : public HandShakeBase  {
423     ClientCertificateType         certificate_types_[CERT_TYPES];
424     int                           typeTotal_;
425     STL::list<DistinguishedName>  certificate_authorities_;
426 public:
427     CertificateRequest();
428     ~CertificateRequest();
429 
430     input_buffer&  set(input_buffer& in);
431     output_buffer& get(output_buffer& out) const;
432 
433     friend input_buffer&  operator>>(input_buffer&, CertificateRequest&);
434     friend output_buffer& operator<<(output_buffer&,
435                                      const CertificateRequest&);
436 
437     void Process(input_buffer&, SSL&);
438     HandShakeType get_type() const;
439 
440     void Build();
441 private:
442     CertificateRequest(const CertificateRequest&);              // hide copy
443     CertificateRequest& operator=(const CertificateRequest&);   // and assign
444 };
445 
446 
447 struct ServerHelloDone : public HandShakeBase {
448     ServerHelloDone();
449     input_buffer&  set(input_buffer& in);
450     output_buffer& get(output_buffer& out) const;
451 
452     void Process(input_buffer& input, SSL& ssl);
453 
454     HandShakeType get_type() const;
455 };
456 
457 
458 struct PreMasterSecret {
459     opaque  random_[SECRET_LEN];     // first two bytes Protocol Version
460 };
461 
462 
463 struct ClientKeyBase : public virtual_base {
~ClientKeyBaseyaSSL::ClientKeyBase464     virtual ~ClientKeyBase() {}
buildyaSSL::ClientKeyBase465     virtual void build(SSL&) {}
readyaSSL::ClientKeyBase466     virtual void read(SSL&, input_buffer&) {}
467     virtual int  get_length() const;
468     virtual opaque* get_clientKey() const;
469 };
470 
471 
472 class EncryptedPreMasterSecret : public ClientKeyBase {
473     opaque* secret_;
474     int     length_;
475 public:
476     EncryptedPreMasterSecret();
477     ~EncryptedPreMasterSecret();
478 
479     void    build(SSL&);
480     void    read(SSL&, input_buffer&);
481     int     get_length()    const;
482     opaque* get_clientKey() const;
483     void    alloc(int sz);
484 private:
485     // hide copy and assign
486     EncryptedPreMasterSecret(const EncryptedPreMasterSecret&);
487     EncryptedPreMasterSecret& operator=(const EncryptedPreMasterSecret&);
488 };
489 
490 
491 // Fortezza Key Parameters from page 29
492 // hard code lengths cause only used here
493 struct FortezzaKeys : public ClientKeyBase {
494     opaque  y_c_                      [128];    // client's Yc, public value
495     opaque  r_c_                      [128];    // client's Rc
496     opaque  y_signature_              [40];     // DSS signed public key
497     opaque  wrapped_client_write_key_ [12];     // wrapped by the TEK
498     opaque  wrapped_server_write_key_ [12];     // wrapped by the TEK
499     opaque  client_write_iv_          [24];
500     opaque  server_write_iv_          [24];
501     opaque  master_secret_iv_         [24];     // IV used to encrypt preMaster
502     opaque  encrypted_preMasterSecret_[48];     // random & crypted by the TEK
503 };
504 
505 
506 
507 // Diffie-Hellman public key from page 40/41
508 class  ClientDiffieHellmanPublic : public ClientKeyBase {
509     PublicValueEncoding public_value_encoding_;
510     int     length_;    // includes two byte length for message
511     opaque* Yc_;        // length + Yc_
512     // dh_Yc only if explicit, otherwise sent in certificate
513     enum { KEY_OFFSET = 2 };
514 public:
515     ClientDiffieHellmanPublic();
516     ~ClientDiffieHellmanPublic();
517 
518     void    build(SSL&);
519     void    read(SSL&, input_buffer&);
520     int     get_length()    const;
521     opaque* get_clientKey() const;
522     void    alloc(int sz, bool offset = false);
523 private:
524     // hide copy and assign
525     ClientDiffieHellmanPublic(const ClientDiffieHellmanPublic&);
526     ClientDiffieHellmanPublic& operator=(const ClientDiffieHellmanPublic&);
527 };
528 
529 
530 class ClientKeyExchange : public HandShakeBase {
531     ClientKeyBase*  client_key_;
532 public:
533     explicit ClientKeyExchange(SSL& ssl);
534     ClientKeyExchange();
535     ~ClientKeyExchange();
536 
537     void createKey(SSL&);
538     void build(SSL& ssl);
539 
540     const opaque* getKey()       const;
541     int           getKeyLength() const;
542 
543     friend output_buffer& operator<<(output_buffer&, const ClientKeyExchange&);
544 
545     input_buffer&  set(input_buffer& in);
546     output_buffer& get(output_buffer& out) const;
547 
548     HandShakeType  get_type() const;
549     void Process(input_buffer&, SSL&);
550 private:
551     ClientKeyExchange(const ClientKeyExchange&);            // hide copy
552     ClientKeyExchange& operator=(const ClientKeyExchange&); // and assign
553 };
554 
555 
556 class CertificateVerify : public HandShakeBase {
557     Hashes             hashes_;
558     byte*              signature_;  // owns
559 public:
560     CertificateVerify();
561     ~CertificateVerify();
562 
563     input_buffer&  set(input_buffer& in);
564     output_buffer& get(output_buffer& out) const;
565 
566     friend input_buffer&  operator>>(input_buffer&, CertificateVerify&);
567     friend output_buffer& operator<<(output_buffer&, const CertificateVerify&);
568 
569     void Process(input_buffer&, SSL&);
570     HandShakeType get_type() const;
571 
572     void Build(SSL&);
573 private:
574     CertificateVerify(const CertificateVerify&);              // hide copy
575     CertificateVerify& operator=(const CertificateVerify&);   // and assign
576 };
577 
578 
579 class Finished : public HandShakeBase {
580     Hashes hashes_;
581 public:
582     Finished();
583 
584     uint8* set_md5();
585     uint8* set_sha();
586 
587     friend input_buffer& operator>>(input_buffer&, Finished&);
588     friend output_buffer& operator<<(output_buffer&, const Finished&);
589 
590     input_buffer&  set(input_buffer& in);
591     output_buffer& get(output_buffer& out) const;
592 
593     void Process(input_buffer&, SSL&);
594 
595     HandShakeType get_type() const;
596 private:
597     Finished(const Finished&);            // hide copy
598     Finished& operator=(const Finished&); // and assign
599 };
600 
601 
602 class RandomPool;  // forward for connection
603 
604 
605 // SSL Connection defined on page 11
606 struct Connection {
607     opaque          *pre_master_secret_;
608     opaque          master_secret_[SECRET_LEN];
609     opaque          client_random_[RAN_LEN];
610     opaque          server_random_[RAN_LEN];
611     opaque          sessionID_[ID_LEN];
612     opaque          client_write_MAC_secret_[SHA_LEN]; // sha  is max size
613     opaque          server_write_MAC_secret_[SHA_LEN];
614     opaque          client_write_key_[AES_256_KEY_SZ]; // aes 256bit is max sz
615     opaque          server_write_key_[AES_256_KEY_SZ];
616     opaque          client_write_IV_[AES_IV_SZ];       // aes is max size
617     opaque          server_write_IV_[AES_IV_SZ];
618     uint32          sequence_number_;
619     uint32          peer_sequence_number_;
620     uint32          pre_secret_len_;                   // pre master length
621     bool            send_server_key_;                  // server key exchange?
622     bool            master_clean_;                     // master secret clean?
623     bool            TLS_;                              // TLSv1 or greater
624     bool            TLSv1_1_;                          // TLSv1.1 or greater
625     bool            sessionID_Set_;                    // do we have a session
626     bool            compression_;                      // zlib compression?
627     ProtocolVersion version_;                          // negotiated version
628     ProtocolVersion chVersion_;                        // client hello version
629     RandomPool&     random_;
630 
631     Connection(ProtocolVersion v, RandomPool& ran);
632     ~Connection();
633 
634     void AllocPreSecret(uint sz);
635     void CleanPreMaster();
636     void CleanMaster();
637     void TurnOffTLS();
638     void TurnOffTLS1_1();
639 private:
640     Connection(const Connection&);              // hide copy
641     Connection& operator=(const Connection&);   // and assign
642 };
643 
644 
645 struct Ciphers;   // forward
646 
647 
648 // TLSv1 Security Spec, defined on page 56 of RFC 2246
649 struct Parameters {
650     ConnectionEnd        entity_;
651     BulkCipherAlgorithm  bulk_cipher_algorithm_;
652     CipherType           cipher_type_;
653     uint8                key_size_;
654     uint8                iv_size_;
655     IsExportable         is_exportable_;
656     MACAlgorithm         mac_algorithm_;
657     uint8                hash_size_;
658     CompressionMethod    compression_algorithm_;
659     KeyExchangeAlgorithm kea_;                        // yassl additions
660     SignatureAlgorithm   sig_algo_;                   // signature auth type
661     SignatureAlgorithm   verify_algo_;                // cert verify auth type
662     bool                 pending_;
663     bool                 resumable_;                  // new conns by session
664     uint16               encrypt_size_;               // current msg encrypt sz
665     Cipher               suite_[SUITE_LEN];           // choosen suite
666     uint8                suites_size_;
667     Cipher               suites_[MAX_SUITE_SZ];
668     char                 cipher_name_[MAX_SUITE_NAME];
669     char                 cipher_list_[MAX_CIPHERS][MAX_SUITE_NAME];
670     bool                 removeDH_;                   // for server's later use
671 
672     Parameters(ConnectionEnd, const Ciphers&, ProtocolVersion, bool haveDH);
673 
674     void SetSuites(ProtocolVersion pv, bool removeDH = false,
675                    bool removeRSA = false, bool removeDSA = false);
676     void SetCipherNames();
677 private:
678     Parameters(const Parameters&);              // hide copy
679     Parameters& operator=(const Parameters&);   // and assing
680 };
681 
682 
683 input_buffer&  operator>>(input_buffer&,  RecordLayerHeader&);
684 output_buffer& operator<<(output_buffer&, const RecordLayerHeader&);
685 
686 input_buffer&  operator>>(input_buffer&,  Message&);
687 output_buffer& operator<<(output_buffer&, const Message&);
688 
689 input_buffer&  operator>>(input_buffer&,  HandShakeBase&);
690 output_buffer& operator<<(output_buffer&, const HandShakeBase&);
691 
692 
693 // Message Factory definition
694 // uses the ContentType enumeration for unique id
695 typedef Factory<Message> MessageFactory;
696 void    InitMessageFactory(MessageFactory&);     // registers derived classes
697 
698 // HandShake Factory definition
699 // uses the HandShakeType enumeration for unique id
700 typedef Factory<HandShakeBase> HandShakeFactory;
701 void    InitHandShakeFactory(HandShakeFactory&); // registers derived classes
702 
703 // ServerKey Factory definition
704 // uses KeyExchangeAlgorithm enumeration for unique  id
705 typedef Factory<ServerKeyBase> ServerKeyFactory;
706 void    InitServerKeyFactory(ServerKeyFactory&);
707 
708 // ClientKey Factory definition
709 // uses KeyExchangeAlgorithm enumeration for unique  id
710 typedef Factory<ClientKeyBase> ClientKeyFactory;
711 void    InitClientKeyFactory(ClientKeyFactory&);
712 
713 
714 // Message Creators
715 Message* CreateHandShake();
716 Message* CreateCipherSpec();
717 Message* CreateAlert();
718 Message* CreateData();
719 
720 
721 // HandShake Creators
722 HandShakeBase* CreateCertificate();
723 HandShakeBase* CreateHelloRequest();
724 HandShakeBase* CreateClientHello();
725 HandShakeBase* CreateServerHello();
726 HandShakeBase* CreateServerKeyExchange();
727 HandShakeBase* CreateCertificateRequest();
728 HandShakeBase* CreateServerHelloDone();
729 HandShakeBase* CreateClientKeyExchange();
730 HandShakeBase* CreateCertificateVerify();
731 HandShakeBase* CreateFinished();
732 
733 
734 // ServerKey Exchange Creators
735 ServerKeyBase* CreateRSAServerKEA();
736 ServerKeyBase* CreateDHServerKEA();
737 ServerKeyBase* CreateFortezzaServerKEA();
738 
739 // ClientKey Exchange Creators
740 ClientKeyBase* CreateRSAClient();
741 ClientKeyBase* CreateDHClient();
742 ClientKeyBase* CreateFortezzaClient();
743 
744 
745 
746 } // naemspace
747 
748 #endif // yaSSL_IMP_HPP
749