Dependents:   oldheating gps motorhome heating

Committer:
andrewboyson
Date:
Sun Jan 20 20:31:41 2019 +0000
Revision:
111:3600389d1add
Child:
142:a8c0890a58d1
Started to add HTTPS. Not going to work as cannot get a free certificate for an internal server name.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 111:3600389d1add 1 #include <stdbool.h>
andrewboyson 111:3600389d1add 2
andrewboyson 111:3600389d1add 3 #include "http.h"
andrewboyson 111:3600389d1add 4 #include "tcpbuf.h"
andrewboyson 111:3600389d1add 5 #include "action.h"
andrewboyson 111:3600389d1add 6 #include "net.h"
andrewboyson 111:3600389d1add 7 #include "log.h"
andrewboyson 111:3600389d1add 8 #include "led.h"
andrewboyson 111:3600389d1add 9 #include "fault.h"
andrewboyson 111:3600389d1add 10
andrewboyson 111:3600389d1add 11 #define TLS_CONTENT_TYPE_ChangeCipher 20
andrewboyson 111:3600389d1add 12 #define TLS_CONTENT_TYPE_Alert 21
andrewboyson 111:3600389d1add 13 #define TLS_CONTENT_TYPE_Handshake 22
andrewboyson 111:3600389d1add 14 #define TLS_CONTENT_TYPE_Application 23
andrewboyson 111:3600389d1add 15 #define TLS_CONTENT_TYPE_Heartbeat 24
andrewboyson 111:3600389d1add 16
andrewboyson 111:3600389d1add 17 #define TLS_HANDSHAKE_HelloRequest 0
andrewboyson 111:3600389d1add 18 #define TLS_HANDSHAKE_ClientHello 1
andrewboyson 111:3600389d1add 19 #define TLS_HANDSHAKE_ServerHello 2
andrewboyson 111:3600389d1add 20 #define TLS_HANDSHAKE_NewSessionTicket 4
andrewboyson 111:3600389d1add 21 #define TLS_HANDSHAKE_EncryptedExtensions 8
andrewboyson 111:3600389d1add 22 #define TLS_HANDSHAKE_Certificate 11
andrewboyson 111:3600389d1add 23 #define TLS_HANDSHAKE_ServerKeyExchange 12
andrewboyson 111:3600389d1add 24 #define TLS_HANDSHAKE_CertificateRequest 13
andrewboyson 111:3600389d1add 25 #define TLS_HANDSHAKE_ServerHelloDone 14
andrewboyson 111:3600389d1add 26 #define TLS_HANDSHAKE_CertificateVerify 15
andrewboyson 111:3600389d1add 27 #define TLS_HANDSHAKE_ClientKeyExchange 16
andrewboyson 111:3600389d1add 28 #define TLS_HANDSHAKE_Finished 20
andrewboyson 111:3600389d1add 29
andrewboyson 111:3600389d1add 30 #define DO_SERVER_HELLO 100
andrewboyson 111:3600389d1add 31
andrewboyson 111:3600389d1add 32 static void logHandshakeType(char handshakeType)
andrewboyson 111:3600389d1add 33 {
andrewboyson 111:3600389d1add 34 switch (handshakeType)
andrewboyson 111:3600389d1add 35 {
andrewboyson 111:3600389d1add 36 case TLS_HANDSHAKE_HelloRequest: Log ("Hello request"); break;
andrewboyson 111:3600389d1add 37 case TLS_HANDSHAKE_ClientHello: Log ("Client hello"); break;
andrewboyson 111:3600389d1add 38 case TLS_HANDSHAKE_ServerHello: Log ("Server hello"); break;
andrewboyson 111:3600389d1add 39 case TLS_HANDSHAKE_NewSessionTicket: Log ("New session ticket"); break;
andrewboyson 111:3600389d1add 40 case TLS_HANDSHAKE_EncryptedExtensions: Log ("Encrypted extensions"); break;
andrewboyson 111:3600389d1add 41 case TLS_HANDSHAKE_Certificate: Log ("Certificate"); break;
andrewboyson 111:3600389d1add 42 case TLS_HANDSHAKE_ServerKeyExchange: Log ("Server key exchange"); break;
andrewboyson 111:3600389d1add 43 case TLS_HANDSHAKE_CertificateRequest: Log ("Certificate request"); break;
andrewboyson 111:3600389d1add 44 case TLS_HANDSHAKE_ServerHelloDone: Log ("Server hello done"); break;
andrewboyson 111:3600389d1add 45 case TLS_HANDSHAKE_CertificateVerify: Log ("Certificate verify"); break;
andrewboyson 111:3600389d1add 46 case TLS_HANDSHAKE_ClientKeyExchange: Log ("Client key exchange"); break;
andrewboyson 111:3600389d1add 47 case TLS_HANDSHAKE_Finished: Log ("Finished"); break;
andrewboyson 111:3600389d1add 48 default: LogF("%02hX", handshakeType); break;
andrewboyson 111:3600389d1add 49 }
andrewboyson 111:3600389d1add 50 }
andrewboyson 111:3600389d1add 51 static void logContentType(char contentType)
andrewboyson 111:3600389d1add 52 {
andrewboyson 111:3600389d1add 53 switch (contentType)
andrewboyson 111:3600389d1add 54 {
andrewboyson 111:3600389d1add 55 case TLS_CONTENT_TYPE_ChangeCipher: Log ("Change cipher"); break;
andrewboyson 111:3600389d1add 56 case TLS_CONTENT_TYPE_Alert: Log ("Alert"); break;
andrewboyson 111:3600389d1add 57 case TLS_CONTENT_TYPE_Handshake: Log ("Handshake"); break;
andrewboyson 111:3600389d1add 58 case TLS_CONTENT_TYPE_Application: Log ("Application"); break;
andrewboyson 111:3600389d1add 59 case TLS_CONTENT_TYPE_Heartbeat: Log ("Heartbeat"); break;
andrewboyson 111:3600389d1add 60 default: LogF("%02hX", contentType); break;
andrewboyson 111:3600389d1add 61 }
andrewboyson 111:3600389d1add 62 }
andrewboyson 111:3600389d1add 63
andrewboyson 111:3600389d1add 64 bool HttpsTrace = true;
andrewboyson 111:3600389d1add 65
andrewboyson 111:3600389d1add 66 void HttpsHandleRequest(int size, char* pRequestStream, uint32_t positionInRequestStream, int* pToDo)
andrewboyson 111:3600389d1add 67 {
andrewboyson 111:3600389d1add 68
andrewboyson 111:3600389d1add 69 if (HttpsTrace)
andrewboyson 111:3600389d1add 70 {
andrewboyson 111:3600389d1add 71 LogF("HTTPS <<< %d (%u)\r\n", size, positionInRequestStream);
andrewboyson 111:3600389d1add 72 }
andrewboyson 111:3600389d1add 73 //Handle request for the first packet of data received but leave todo the same after that.
andrewboyson 111:3600389d1add 74 if (size == 0) return;
andrewboyson 111:3600389d1add 75 if (positionInRequestStream != 0) return;
andrewboyson 111:3600389d1add 76 char contentType = pRequestStream[0];
andrewboyson 111:3600389d1add 77 if (HttpsTrace) Log(" content type: "); logContentType(contentType); Log("\r\n");
andrewboyson 111:3600389d1add 78 switch (contentType)
andrewboyson 111:3600389d1add 79 {
andrewboyson 111:3600389d1add 80 case TLS_CONTENT_TYPE_Handshake:
andrewboyson 111:3600389d1add 81 {
andrewboyson 111:3600389d1add 82 char handshakeType = pRequestStream[5];
andrewboyson 111:3600389d1add 83 if (HttpsTrace) Log(" handshake type: "); logHandshakeType(handshakeType); Log("\r\n");
andrewboyson 111:3600389d1add 84 *pToDo = DO_SERVER_HELLO;
andrewboyson 111:3600389d1add 85 return;
andrewboyson 111:3600389d1add 86 }
andrewboyson 111:3600389d1add 87 default:
andrewboyson 111:3600389d1add 88 Log("HTTPS - ignoring untreated content type\r\n");
andrewboyson 111:3600389d1add 89 *pToDo = 0;
andrewboyson 111:3600389d1add 90 return;
andrewboyson 111:3600389d1add 91 }
andrewboyson 111:3600389d1add 92 //ECDHE-RSA-AES128-GCM-SHA256
andrewboyson 111:3600389d1add 93 }
andrewboyson 111:3600389d1add 94 static void sendServerHello()
andrewboyson 111:3600389d1add 95 {
andrewboyson 111:3600389d1add 96 Log(" sending server hello\r\n");
andrewboyson 111:3600389d1add 97 }
andrewboyson 111:3600389d1add 98 void HttpsSendReply(int* pSize, char* pReplyStream, uint32_t positionInReplyStream, uint16_t mss, int todo)
andrewboyson 111:3600389d1add 99 {
andrewboyson 111:3600389d1add 100 TcpBufStart(positionInReplyStream, mss, pReplyStream);
andrewboyson 111:3600389d1add 101 if (todo == DO_SERVER_HELLO) sendServerHello();
andrewboyson 111:3600389d1add 102 *pSize = TcpBufLength();
andrewboyson 111:3600389d1add 103
andrewboyson 111:3600389d1add 104 if (HttpsTrace)
andrewboyson 111:3600389d1add 105 {
andrewboyson 111:3600389d1add 106 LogF("HTTPS >>> %d (%d)\r\n", *pSize, positionInReplyStream);
andrewboyson 111:3600389d1add 107 }
andrewboyson 111:3600389d1add 108 }