embkernel
 All Classes Functions Variables Typedefs Groups Pages
Tls.cpp
1 //------------------------------------------------------------------------------
2 //This file is part of embKernel.
3 //See license.txt for the full license governing this code.
4 //------------------------------------------------------------------------------
5 
6 #include "Tls.hpp"
7 #include "LibEndian.hpp"
8 #include "LibRtc.hpp"
9 
10 const Tls::CIPHER_SUITE Tls::mCiphers[] = {
11  {
12  0x00, 0x05, 0 }, //TLS_RSA_WITH_RC4_128_SHA
13  {
14  0x00, 0x13, 0 } //TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
15 };
16 
17 Tls::Tls() {
18 }
19 
20 Tls::~Tls() {
21 }
22 
23 Tls::RESULT Tls::handshake(LibStreamIn& in, LibStreamOut& out) {
24  uint16_t len = (uint16_t) (sizeof(HANDSHAKE) + sizeof(RANDOM) + 1 + 2 + (CIPHER_COUNT * 2) + 2);
25 
26  {
27  TLS_HEADER tlsHeader;
28  tlsHeader.type = CT_HANDSHAKE;
29  tlsHeader.version.major = 3;
30  tlsHeader.version.minor = 1;
31  tlsHeader.length = LibEndian::hwToBe(len);
32  out.write(&tlsHeader, sizeof(tlsHeader));
33  }
34 
35  len -= 4;
36  {
37  HANDSHAKE handshake;
38  handshake.msg_type = AT_CLIENT_HELLO;
39  handshake.zero = 0;
40  handshake.length = LibEndian::hwToBe(len);
41  handshake.version.major = 3;
42  handshake.version.minor = 1;
43  out.write(&handshake, sizeof(handshake));
44  }
45 
46  {
47  RANDOM random;
48  random.gmt_unix_time = LibEndian::hwToBe(LibRtc::getGmtUnixTime());
49  //TODO random_bytes
50  out.write(&random, sizeof(random));
51  }
52 
53  { //Session id length
54  out.writeByte(0);
55  }
56 
57  { //Cipher
58  len = CIPHER_COUNT * 2;
59  len = LibEndian::hwToBe(len);
60  out.write(&len, sizeof(len));
61  for (int i = 0; i < CIPHER_COUNT; i++) {
62  out.write(&mCiphers[i].idHi, 2);
63  }
64  }
65 
66  { //Session id length
67  out.writeByte(1);
68  out.writeByte(0);
69  }
70 
71  return RES_SUCCESS;
72 }
73