Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: oldheating gps motorhome heating
tcp/https/https.c@142:a8c0890a58d1, 2019-05-08 (annotated)
- Committer:
- andrewboyson
- Date:
- Wed May 08 12:15:13 2019 +0000
- Revision:
- 142:a8c0890a58d1
- Parent:
- 111:3600389d1add
- Child:
- 144:6bd5c54efc7d
Updated the lpc1768 module
Who changed what in which revision?
| User | Revision | Line number | New 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 | 142:a8c0890a58d1 | 9 | #include "restart.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 | } |