A simple library to support serving https.

Dependents:   oldheating gps motorhome heating

tls/tls-connection.h

Committer:
andrewboyson
Date:
2019-10-10
Revision:
17:93feb2a51d58
Parent:
14:03a0b8fd6ddc
Child:
19:f22327e8be7b

File content as of revision 17:93feb2a51d58:

#include <stdbool.h>
#include <stdint.h>

#include "tls-defs.h"
#include "sha256.h"

#define DO_WAIT_CLIENT_HELLO                0
#define DO_SEND_SERVER_HELLO_NEW            1
#define DO_SEND_SERVER_HELLO_RESUME         2
#define DO_WAIT_CLIENT_CHANGE               3
#define DO_WAIT_DECRYPT_MASTER_SECRET       4
#define DO_SEND_SERVER_CHANGE               5
#define DO_APPLICATION                      6
#define DO_SEND_ALERT_ILLEGAL_PARAMETER     7
#define DO_SEND_ALERT_INTERNAL_ERROR        8

#define TLS_DEFERRED_CONTENT_SIZE 100

struct TlsConnection
{
    int                id; //An id of zero means the record is empty
    uint32_t           lastUsed;
    int                toDo;
    uint32_t           sessionId;
    bool               resume;
    struct Sha256State handshakeSha;
    bool               clientEncrypted;
    bool               serverEncrypted;
    uint8_t            clientRandom[TLS_LENGTH_RANDOM];
    uint8_t            serverRandom[TLS_LENGTH_RANDOM];
    uint8_t            clientHandshakeHash[SHA256_HASH_SIZE];
    uint8_t            deferredContent[TLS_DEFERRED_CONTENT_SIZE];
    uint64_t           clientSequence;
    uint64_t           serverSequence;
    uint32_t           clientPositionInStreamOffset;
    uint32_t           serverPositionInStreamOffset;
    
    int                slotPriKeyDecryption;
    uint8_t            clientMacKey  [TLS_LENGTH_MAC_KEY];
    uint8_t            serverMacKey  [TLS_LENGTH_MAC_KEY];
    uint8_t            clientWriteKey[TLS_LENGTH_CIPHER_KEY];
    uint8_t            serverWriteKey[TLS_LENGTH_CIPHER_KEY];    
};

extern struct TlsConnection* TlsConnectionGetNext(void);

extern struct TlsConnection* TlsConnectionNew   (int id); //Never fails so never returns NULL
extern struct TlsConnection* TlsConnectionOrNull(int id);
extern void                  TlsConnectionReset (int id);