embkernel
 All Classes Functions Variables Typedefs Groups Pages
Tls.hpp
1 //------------------------------------------------------------------------------
2 //This file is part of embKernel.
3 //See license.txt for the full license governing this code.
4 //------------------------------------------------------------------------------
5 
6 #ifndef TLS_HPP_
7 #define TLS_HPP_
8 
9 #include "TlsChiper.hpp"
10 #include "LibStreamOut.hpp"
11 #include "LibStreamIn.hpp"
12 
13 class Tls {
14 public:
15  Tls();
16  ~Tls();
17 
18  typedef enum {
19  RES_SUCCESS = 0
20  } RESULT;
21 
22  RESULT handshake(LibStreamIn& in, LibStreamOut& out);
23 
24 private:
25  //See RFC2246
26  typedef struct {
27  uint8_t major;
28  uint8_t minor;
29  }__attribute__((packed)) PROTOCOL_VERSION;
30 
31  typedef enum :uint8_t {
32  CT_CHANGE_CIPHER_SPEC = 20,
33  CT_ALERT = 21,
34  CT_HANDSHAKE = 22,
35  CT_APPLICATION_DATA = 23
36  } CONTENT_TYPE;
37 
38  typedef struct {
39  CONTENT_TYPE type;
40  PROTOCOL_VERSION version;
41  uint16_t length;
42  }__attribute__((packed)) TLS_HEADER;
43 
44  typedef enum:uint8_t {
45  warning = 1,
46  fatal = 2
47  }ALERT_LEVEL;
48 
49  typedef enum :uint8_t {
50  AD_CLOSE_NOTIFY = 0,
51  AD_UNEXPECTED_MESSAGE = 10,
52  AD_BAD_RECORD_MAC = 20,
53  AD_DECRYPTION_FAILED = 21,
54  AD_RECORD_OVERFLOW = 22,
55  AD_DECOMPRESSION_FAILURE = 30,
56  AD_HANDSHAKE_FAILURE = 40,
57  AD_BAD_CERTIFICATE = 42,
58  AD_UNSUPPORTED_CERTIFICATE = 43,
59  AD_CERTIFICATE_REVOKED = 44,
60  AD_CERTIFICATE_EXPIRED = 45,
61  AD_CERTIFICATE_UNKNOWN = 46,
62  AD_ILLEGAL_PARAMETER = 47,
63  AD_UNKNOWN_CA = 48,
64  AD_ACCESS_DENIED = 49,
65  AD_DECODE_ERROR = 50,
66  AD_DECRYPT_ERROR = 51,
67  AD_EXPORT_RESTRICTION = 60,
68  AD_PROTOCOL_VERSION = 70,
69  AD_INSUFFICIENT_SECURITY = 71,
70  AD_INTERNAL_ERROR = 80,
71  AD_USER_CANCELED = 90,
72  AD_NO_RENEGOTIATION = 100,
73  }ALERT_DESCRIPTION;
74 
75  typedef struct {
76  ALERT_LEVEL level;
77  ALERT_DESCRIPTION description;
78  }__attribute__((packed)) Alert;
79 
80  typedef enum :uint8_t {
81  AT_HELLO_REQUEST = 0,
82  AT_CLIENT_HELLO = 1,
83  AT_SERVER_HELLO = 2,
84  AT_CERTIFICATE = 11,
85  AT_SERVER_KEY_EXCHANGE = 12,
86  AT_CERTIFICATE_REQUEST = 13,
87  AT_SERVER_HELLO_DONE = 14,
88  AT_CERTIFICATE_VERIFY = 15,
89  AT_CLIENT_KEY_EXCHANGE = 16,
90  AT_FINISHED = 20
91  }HANDSHAKE_TYPE;
92 
93  typedef struct {
94  HANDSHAKE_TYPE msg_type;
95  uint8_t zero;
96  uint16_t length;
97  PROTOCOL_VERSION version;
98  }__attribute__((packed)) HANDSHAKE;
99 
100  typedef struct {
101  uint32_t gmt_unix_time;
102  uint8_t random_bytes[28];
103  }__attribute__((packed)) RANDOM;
104 
105  typedef struct {
106  PROTOCOL_VERSION client_version;
107  RANDOM random;
108  //SessionID session_id;
109  //CipherSuite cipher_suites<2..2^16-1>;
110  //CompressionMethod compression_methods<1..2^8-1>;
111  }__attribute__((packed)) CLIENT_HELLO;
112 
113  typedef struct {
114  PROTOCOL_VERSION server_version;
115  RANDOM random;
116  //SessionID session_id;
117  //CipherSuite cipher_suite;
118  //CompressionMethod compression_method;
119  }__attribute__((packed)) SERVER_HELLO;
120 
121  typedef struct {
122  uint8_t idHi;
123  uint8_t idLo;
124  TlsChiper* chiper;
125  }CIPHER_SUITE;
126 
127  const static CIPHER_SUITE mCiphers[];
128 
129  const static int CIPHER_COUNT = 2;
130 };
131 
132 #endif /* TLS_HPP_ */