A simple library to support serving https.
Dependents: oldheating gps motorhome heating
tls/tls-connection.c@24:cb43290fc439, 2020-04-01 (annotated)
- Committer:
- andrewboyson
- Date:
- Wed Apr 01 12:48:52 2020 +0000
- Revision:
- 24:cb43290fc439
- Parent:
- 17:93feb2a51d58
Added check so that if the client closes the TCP connection before the TLS connection is established then respond that we have finished and the TCP connection is to be closed.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
andrewboyson | 5:ee5489ee1117 | 1 | #include <stdlib.h> |
andrewboyson | 5:ee5489ee1117 | 2 | |
andrewboyson | 5:ee5489ee1117 | 3 | #include "tls-connection.h" |
andrewboyson | 5:ee5489ee1117 | 4 | #include "mstimer.h" |
andrewboyson | 5:ee5489ee1117 | 5 | |
andrewboyson | 5:ee5489ee1117 | 6 | #define MAX_CONNECTIONS 4 |
andrewboyson | 5:ee5489ee1117 | 7 | |
andrewboyson | 5:ee5489ee1117 | 8 | static struct TlsConnection connections[MAX_CONNECTIONS]; |
andrewboyson | 5:ee5489ee1117 | 9 | |
andrewboyson | 8:5e66a6b4b38c | 10 | struct TlsConnection* TlsConnectionGetNext() |
andrewboyson | 8:5e66a6b4b38c | 11 | { |
andrewboyson | 8:5e66a6b4b38c | 12 | static struct TlsConnection* p = connections + MAX_CONNECTIONS - 1; //Initialise to last element |
andrewboyson | 8:5e66a6b4b38c | 13 | p++; |
andrewboyson | 8:5e66a6b4b38c | 14 | if (p >= connections + MAX_CONNECTIONS) p = connections; |
andrewboyson | 8:5e66a6b4b38c | 15 | return p; |
andrewboyson | 8:5e66a6b4b38c | 16 | } |
andrewboyson | 8:5e66a6b4b38c | 17 | |
andrewboyson | 5:ee5489ee1117 | 18 | static void zeroConnection(struct TlsConnection* p) |
andrewboyson | 5:ee5489ee1117 | 19 | { |
andrewboyson | 10:e269fd7b9500 | 20 | p->id = 0; |
andrewboyson | 10:e269fd7b9500 | 21 | p->lastUsed = 0; |
andrewboyson | 10:e269fd7b9500 | 22 | p->toDo = 0; |
andrewboyson | 10:e269fd7b9500 | 23 | p->sessionId = 0; |
andrewboyson | 14:03a0b8fd6ddc | 24 | p->resume = false; |
andrewboyson | 8:5e66a6b4b38c | 25 | Sha256Start(&p->handshakeSha); //This just clears any information previously calculated |
andrewboyson | 6:819c17738dc2 | 26 | p->clientEncrypted = false; |
andrewboyson | 6:819c17738dc2 | 27 | p->serverEncrypted = false; |
andrewboyson | 17:93feb2a51d58 | 28 | for (int i = 0; i < TLS_LENGTH_RANDOM; i++) p->clientRandom[i] = 0; |
andrewboyson | 17:93feb2a51d58 | 29 | for (int i = 0; i < TLS_LENGTH_RANDOM; i++) p->serverRandom[i] = 0; |
andrewboyson | 8:5e66a6b4b38c | 30 | for (int i = 0; i < TLS_DEFERRED_CONTENT_SIZE; i++) p->deferredContent[i] = 0; |
andrewboyson | 10:e269fd7b9500 | 31 | p->clientSequence = 0; |
andrewboyson | 10:e269fd7b9500 | 32 | p->serverSequence = 0; |
andrewboyson | 10:e269fd7b9500 | 33 | p->clientPositionInStreamOffset = 0; |
andrewboyson | 10:e269fd7b9500 | 34 | p->serverPositionInStreamOffset = 0; |
andrewboyson | 14:03a0b8fd6ddc | 35 | p->slotPriKeyDecryption = 0; |
andrewboyson | 5:ee5489ee1117 | 36 | } |
andrewboyson | 5:ee5489ee1117 | 37 | |
andrewboyson | 10:e269fd7b9500 | 38 | struct TlsConnection* TlsConnectionNew(int id) //Never fails so never returns NULL |
andrewboyson | 5:ee5489ee1117 | 39 | { |
andrewboyson | 5:ee5489ee1117 | 40 | struct TlsConnection* p; |
andrewboyson | 5:ee5489ee1117 | 41 | |
andrewboyson | 5:ee5489ee1117 | 42 | //Look for an existing connection |
andrewboyson | 5:ee5489ee1117 | 43 | for (p = connections; p < connections + MAX_CONNECTIONS; p++) |
andrewboyson | 5:ee5489ee1117 | 44 | { |
andrewboyson | 10:e269fd7b9500 | 45 | if (p->id == id) goto end; |
andrewboyson | 5:ee5489ee1117 | 46 | } |
andrewboyson | 5:ee5489ee1117 | 47 | |
andrewboyson | 5:ee5489ee1117 | 48 | //look for an empty connection |
andrewboyson | 5:ee5489ee1117 | 49 | { |
andrewboyson | 5:ee5489ee1117 | 50 | struct TlsConnection* pOldest = 0; |
andrewboyson | 5:ee5489ee1117 | 51 | uint32_t ageOldest = 0; |
andrewboyson | 5:ee5489ee1117 | 52 | for (p = connections; p < connections + MAX_CONNECTIONS; p++) |
andrewboyson | 5:ee5489ee1117 | 53 | { |
andrewboyson | 5:ee5489ee1117 | 54 | if (!p->id) goto end; |
andrewboyson | 5:ee5489ee1117 | 55 | |
andrewboyson | 5:ee5489ee1117 | 56 | //Otherwise record the oldest and keep going |
andrewboyson | 5:ee5489ee1117 | 57 | uint32_t age = MsTimerCount - p->lastUsed; |
andrewboyson | 5:ee5489ee1117 | 58 | if (age >= ageOldest) |
andrewboyson | 5:ee5489ee1117 | 59 | { |
andrewboyson | 5:ee5489ee1117 | 60 | ageOldest = age; |
andrewboyson | 5:ee5489ee1117 | 61 | pOldest = p; |
andrewboyson | 5:ee5489ee1117 | 62 | } |
andrewboyson | 5:ee5489ee1117 | 63 | } |
andrewboyson | 5:ee5489ee1117 | 64 | //No empty ones found so use the oldest |
andrewboyson | 5:ee5489ee1117 | 65 | p = pOldest; |
andrewboyson | 5:ee5489ee1117 | 66 | } |
andrewboyson | 10:e269fd7b9500 | 67 | |
andrewboyson | 5:ee5489ee1117 | 68 | |
andrewboyson | 5:ee5489ee1117 | 69 | end: |
andrewboyson | 5:ee5489ee1117 | 70 | zeroConnection(p); |
andrewboyson | 10:e269fd7b9500 | 71 | p->id = id; |
andrewboyson | 5:ee5489ee1117 | 72 | p->lastUsed = MsTimerCount; |
andrewboyson | 5:ee5489ee1117 | 73 | return p; |
andrewboyson | 5:ee5489ee1117 | 74 | } |
andrewboyson | 10:e269fd7b9500 | 75 | struct TlsConnection* TlsConnectionOrNull(int id) |
andrewboyson | 5:ee5489ee1117 | 76 | { |
andrewboyson | 5:ee5489ee1117 | 77 | for (struct TlsConnection* p = connections; p < connections + MAX_CONNECTIONS; p++) |
andrewboyson | 5:ee5489ee1117 | 78 | { |
andrewboyson | 10:e269fd7b9500 | 79 | if (p->id == id) |
andrewboyson | 5:ee5489ee1117 | 80 | { |
andrewboyson | 5:ee5489ee1117 | 81 | p->lastUsed = MsTimerCount; |
andrewboyson | 5:ee5489ee1117 | 82 | return p; |
andrewboyson | 5:ee5489ee1117 | 83 | } |
andrewboyson | 5:ee5489ee1117 | 84 | } |
andrewboyson | 5:ee5489ee1117 | 85 | return NULL; |
andrewboyson | 5:ee5489ee1117 | 86 | } |
andrewboyson | 10:e269fd7b9500 | 87 | void TlsConnectionReset(int id) |
andrewboyson | 5:ee5489ee1117 | 88 | { |
andrewboyson | 5:ee5489ee1117 | 89 | for (struct TlsConnection* p = connections; p < connections + MAX_CONNECTIONS; p++) |
andrewboyson | 5:ee5489ee1117 | 90 | { |
andrewboyson | 10:e269fd7b9500 | 91 | if (p->id == id) zeroConnection(p); |
andrewboyson | 5:ee5489ee1117 | 92 | } |
andrewboyson | 5:ee5489ee1117 | 93 | } |
andrewboyson | 8:5e66a6b4b38c | 94 |